Как зафиксировать двойную наклонную черту в пользовательских постоянных ссылках с иерархической таксономией?

После решения от Jeff Пользовательские постоянные ссылки - отправляют тип - иерархическая таксономия

Мне удалось переписать мой URL для пользовательской таксономии. Однако у меня действительно есть одна вещь, которая беспокоит меня, и это - двойная наклонная черта в выводе из-за разделителя.

http://www.domain.nl/product/televisies/led/55-inch//product-naam-4/

Я не могу изменить это в разделе постоянных ссылок в de администраторе. (/%category % / % постимени %/)

register_post_type( "products", 
            array(  'label'             => CUSTOM_MENU_TITLE,
                    'labels'            => array(   'name'                  =>  CUSTOM_MENU_NAME,
                                                    'singular_name'         =>  CUSTOM_MENU_SIGULAR_NAME,
                                                    'add_new'               =>  CUSTOM_MENU_ADD_NEW,
                                                    'add_new_item'          =>  CUSTOM_MENU_ADD_NEW_ITEM,
                                                    'edit'                  =>  CUSTOM_MENU_EDIT,
                                                    'edit_item'             =>  CUSTOM_MENU_EDIT_ITEM,
                                                    'new_item'              =>  CUSTOM_MENU_NEW,
                                                    'view_item'             =>  CUSTOM_MENU_VIEW,
                                                    'search_items'          =>  CUSTOM_MENU_SEARCH,
                                                    'not_found'             =>  CUSTOM_MENU_NOT_FOUND,
                                                    'not_found_in_trash'    =>  CUSTOM_MENU_NOT_FOUND_TRASH ),
                    'public'            => true,
                    'can_export'        => true,
                    'show_ui'           => true, // UI in admin panel
                    '_builtin'          => false, // It's a custom post type, not built in
                    '_edit_link'        => 'post.php?post=%d',
                    'capability_type'   => 'post',
                    'menu_icon'         => get_bloginfo('template_url').'/images/favicon.ico',
                    'hierarchical'      => true,
                    'rewrite'           => array('slug' => 'product/%taxonomy_name%','with_front' => true,'hierarchical'=>true), // Permalinks
                    'query_var'         => "products", // This goes to the WP_Query schema
                    'supports'          => array(   'title',
                                                    'author', 
                                                    'excerpt',
                                                    'thumbnail',
                                                    'comments',
                                                    'editor', 
                                                    'trackbacks',
                                                    'custom-fields',
                                                    'revisions') ,
                    'show_in_nav_menus' => true ,
                    'taxonomies'        => array("pcategory","ptags")
                )
            );

// Register custom taxonomy
register_taxonomy(  "pcategory", 
            array(  "products"  ), 
            array ( "hierarchical"      => true, 
                    "label"             => CUSTOM_MENU_CAT_LABEL, 
                    'labels'            => array(   'name'              =>  CUSTOM_MENU_CAT_TITLE,
                                                    'singular_name'     =>  CUSTOM_MENU_SIGULAR_CAT,
                                                    'search_items'      =>  CUSTOM_MENU_CAT_SEARCH,
                                                    'popular_items'     =>  CUSTOM_MENU_CAT_SEARCH,
                                                    'all_items'         =>  CUSTOM_MENU_CAT_ALL,
                                                    'parent_item'       =>  CUSTOM_MENU_CAT_PARENT,
                                                    'parent_item_colon' =>  CUSTOM_MENU_CAT_PARENT_COL,
                                                    'edit_item'         =>  CUSTOM_MENU_CAT_EDIT,
                                                    'update_item'       =>  CUSTOM_MENU_CAT_UPDATE,
                                                    'add_new_item'      =>  CUSTOM_MENU_CAT_ADDNEW,
                                                    'new_item_name'     =>  CUSTOM_MENU_CAT_NEW_NAME,   ), 
                    'public'            => true,
                    'show_ui'           => true,
                    "rewrite"           => array('slug' => 'product','with_front' => true,'hierarchical'=>true))
            ); 

Мой functions.php включает:

add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
$newRules  = array();
$newRules['product/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?products=$matches[4]';
$newRules['product/(.+)/?$']                = 'index.php?pcategory=$matches[1]'; 

return array_merge($newRules, $rules);
}
function filter_post_type_link($link, $post)
{
if ($post->post_type != 'products')
    return $link;

if ($cats = get_the_terms($post->ID, 'pcategory'))
{
    $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'pcategory', false, '/', true), $link);
}
return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) {    
$chain = '';   
$parent = &get_term($id, $taxonomy);

if (is_wp_error($parent)) {
    return $parent;
}

if ($nicename)    
    $name = $parent -> slug;        
else    
    $name = $parent -> name;

if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {    
    $visited[] = $parent -> parent;    
    $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);
}

if ($link) {
    // nothing, can't get this working :(
} else    
    $chain .= $name . $separator;
return $chain;    
}

Кто-либо знает, как решить это?

2
13.04.2017, 15:37
3 ответа

После изменения чего-то у меня есть заключительный код, который заставляет его работать.

Это - то, где Вы регистрируете типы сообщения. (не измененный)

register_post_type( "products", 
            array(  'label'             => CUSTOM_MENU_TITLE,
                    'labels'            => array(   'name'                  =>  CUSTOM_MENU_NAME,
                                                    'singular_name'         =>  CUSTOM_MENU_SIGULAR_NAME,
                                                    'add_new'               =>  CUSTOM_MENU_ADD_NEW,
                                                    'add_new_item'          =>  CUSTOM_MENU_ADD_NEW_ITEM,
                                                    'edit'                  =>  CUSTOM_MENU_EDIT,
                                                    'edit_item'             =>  CUSTOM_MENU_EDIT_ITEM,
                                                    'new_item'              =>  CUSTOM_MENU_NEW,
                                                    'view_item'             =>  CUSTOM_MENU_VIEW,
                                                    'search_items'          =>  CUSTOM_MENU_SEARCH,
                                                    'not_found'             =>  CUSTOM_MENU_NOT_FOUND,
                                                    'not_found_in_trash'    =>  CUSTOM_MENU_NOT_FOUND_TRASH ),
                    'public'            => true,
                    'can_export'        => true,
                    'show_ui'           => true, // UI in admin panel
                    '_builtin'          => false, // It's a custom post type, not built in
                    '_edit_link'        => 'post.php?post=%d',
                    'capability_type'   => 'post',
                    'menu_icon'         => get_bloginfo('template_url').'/images/favicon.ico',
                    'hierarchical'      => true,
                    'rewrite'           => array('slug' => 'product/%taxonomy_name%','with_front' => true,'hierarchical'=>true), // Permalinks
                    'query_var'         => "products", // This goes to the WP_Query schema
                    'supports'          => array(   'title',
                                                    'author', 
                                                    'excerpt',
                                                    'thumbnail',
                                                    'comments',
                                                    'editor', 
                                                    'trackbacks',
                                                    'custom-fields',
                                                    'revisions') ,
                    'show_in_nav_menus' => true ,
                    'taxonomies'        => array("pcategory","ptags")
                )
            );

// Register custom taxonomy
register_taxonomy(  "pcategory", 
            array(  "products"  ), 
            array ( "hierarchical"      => true, 
                    "label"             => CUSTOM_MENU_CAT_LABEL, 
                    'labels'            => array(   'name'              =>  CUSTOM_MENU_CAT_TITLE,
                                                    'singular_name'     =>  CUSTOM_MENU_SIGULAR_CAT,
                                                    'search_items'      =>  CUSTOM_MENU_CAT_SEARCH,
                                                    'popular_items'     =>  CUSTOM_MENU_CAT_SEARCH,
                                                    'all_items'         =>  CUSTOM_MENU_CAT_ALL,
                                                    'parent_item'       =>  CUSTOM_MENU_CAT_PARENT,
                                                    'parent_item_colon' =>  CUSTOM_MENU_CAT_PARENT_COL,
                                                    'edit_item'         =>  CUSTOM_MENU_CAT_EDIT,
                                                    'update_item'       =>  CUSTOM_MENU_CAT_UPDATE,
                                                    'add_new_item'      =>  CUSTOM_MENU_CAT_ADDNEW,
                                                    'new_item_name'     =>  CUSTOM_MENU_CAT_NEW_NAME,   ), 
                    'public'            => true,
                    'show_ui'           => true,
                    "rewrite"           => array('slug' => 'product','with_front' => true,'hierarchical'=>true))
            ); 

Мой functions.php включает:

add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
$newRules  = array();
$newRules['product/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?products=$matches[4]';
$newRules['product/(.+)/?$']                = 'index.php?pcategory=$matches[1]'; 

return array_merge($newRules, $rules);
}
function filter_post_type_link($link, $post)
{
if ($post->post_type != 'products')
    return $link;

if ($cats = get_the_terms($post->ID, 'pcategory'))
{
    $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'pcategory', false, '/', true), $link);
}
return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $nicename = false, $visited = array()) {    
// removed $seperator="/" after $link, otherwise there was a double slash before the post name in the link    
$chain = '';   
$parent = &get_term($id, $taxonomy);

if (is_wp_error($parent)) {
    return $parent;
}

if ($nicename)    
    $name = $parent -> slug;        
else    
    $name = $parent -> name;

if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {    
    $visited[] = $parent -> parent;    
    $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $nicename, $visited); //removed $seperator after $link
    $chain .= "/"; //add a / after every category
}

if ($link) {
    // nothing, can't get this working :(
} else    
    $chain .= $name; //don't need the . $separator anymore
return $chain;    
}
0
19.02.2020, 22:32

Существует быстрое и несколько грязное потенциальное решение этого. Я говорю 'потенциал', потому что я не могу определить проблему путем рассмотрения кода. У меня только есть свои подозрения. Вместо того, чтобы передать разделитель как этот. Попробовать trailingslashit.

} else    
    $chain .= trailingslashit($name);
return $chain;  

Я предполагаю, где проблема основана на Вашем описании, но это - единственное место это $separator применяется.

Существует случай, где это простая фиксация не будет работать. Если $name пусто, Вы получите дополнительную наклонную черту в своей строке, таким образом, было бы лучше проверить на это на всякий случай.

} elseif (!empty($name))     
    $chain .= trailingslashit($name);
return $chain;

Попробуйте это.

1
19.02.2020, 22:32
  • 1
    Это не работало, я попробовал его несколькими способами. Я также использовал untrailingslashit. То, что действительно работало, добавляет $chain .= "/"; после $chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited); и удаление $separator в этом. –  jochem 06.12.2012, 18:00
  • 2
    Ну, довольный Вы получили его. –  s_ha_dum 06.12.2012, 18:03
    $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'pcategory', false, '/', true), $link);

потребности стать

    $link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'pcategory', false, true), $link);

Иначе пересмотренные функциональные ошибки, ища разделитель.

1
19.02.2020, 22:32

Теги

Похожие вопросы