Несмотря на то, что вы не имеете желаемой структуры URL, вы можете получить:
/ продукты
»Просмотреть все пользовательские сообщения
/ продукты / тип / мобильные телефоны
»Просмотреть все пользовательские сообщения с мобильными телефонами таксономии
/ продукты / тип / мобильные телефоны / бренд / Samsung
»Просмотреть все пользовательские сообщения, где таксономия мобильных телефонов и Samsung
/ brand / samsung
»Просмотреть все пользовательские сообщения, где таксономия samsung
/ product / test-product-1
»Просмотреть товар (один пользовательский пост)
без указания пользовательских правил перезаписи.
Это требует, чтобы вы регистрировали свои таксономии и пользовательские типы записей в определенном порядке. Хитрость заключается в том, чтобы зарегистрировать любую таксономию, где слаг начинается с слага вашего пост-типа, прежде чем регистрировать этот пользовательский тип поста. Например, предположим следующие слагы:
product_type taxonomy slug = products/type
product custom_post_type slug = product
product custom_post_type archive slug = products
product_brand taxonomy slug = brand
Тогда вы можете зарегистрировать их в следующем порядке:
register_taxonomy(
'products_type',
'products',
array(
'label' => 'Product Type',
'labels' => $product_type_labels,
'public' => true,
'show_ui' => true,
'show_in_nav_menus' => true,
'args' => array( 'orderby' => 'term_order' ),
'rewrite' => array( 'slug' => 'products/type', 'with_front' => false ),
'has_archive' => true,
'query_var' => true,
)
);
register_post_type('products', array(
'labels' =>$products_labels,
'singular_label' => __('Product'),
'public' => true,
'show_ui' => true,
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => array('slug' => 'product', 'with_front' => false ),
'has_archive' => 'products',
'supports' => array('title', 'editor', 'thumbnail', 'revisions','comments','excerpt'),
));
register_taxonomy(
'products_brand',
'products',
array(
'label' => 'Brand',
'labels' => $products_brand_labels,
'public' => true,
'show_ui' => true,
'show_in_nav_menus' => true,
'args' => array( 'orderby' => 'term_order' ),
'rewrite' => array( 'slug' => 'brand', 'with_front' => false ),
'has_archive' => true,
'query_var' => true,
)
);
Если вам абсолютно необходим URL-адрес, например:
/ продукты / тип / мобильные телефоны / бренд / Samsung / тест-продукт-1
»Просмотреть продукт (один пользовательский пост)
Тогда вам потребуется правило переписывания примерно так:
add_rewrite_rule(
'/products/type/*/brand/*/([^/]+)/?',
'index.php?pagename='product/$matches[1]',
'top' );
ОБНОВЛЕНИЕ
/programming/3861291/multiple-custom-permalink-structures-in-wordpress
Вот как правильно переопределить URL-адрес одного сообщения.
Установите для перезаписи значение false для пользовательского типа записи. (Оставьте архив как есть), а затем после регистрации таксономий и сообщений также зарегистрируйте следующие правила перезаписи.
'rewrite' => false
global $wp_rewrite;
$product_structure = '/%product_type%/%brand%/%product%';
$wp_rewrite->add_rewrite_tag("%product%", '([^/]+)', "product=");
$wp_rewrite->add_permastruct('product', $product_structure, false);
Затем отфильтруйте post_type_link, чтобы создать желаемую структуру URL - с учетом неустановленных значений таксономии. Изменив код из связанного поста, вы получите:
function product_permalink($permalink, $post_id, $leavename){
$post = get_post($post_id);
if( 'product' != $post->post_type )
return $permalink;
$rewritecode = array(
'%product_type%',
'%brand%',
$leavename? '' : '%postname%',
$leavename? '' : '%pagename%',
);
if('' != $permalink && !in_array($post->post_status, array('draft', 'pending', 'auto-draft'))){
if (strpos($permalink, '%product_type%') !== FALSE){
$terms = wp_get_object_terms($post->ID, 'product_type');
if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0]))
$product_type = $terms[0]->slug;
else
$product_type = 'unassigned-artist';
}
if (strpos($permalink, '%brand%') !== FALSE){
$terms = wp_get_object_terms($post->ID, 'brand');
if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0]))
$brand = $terms[0]->slug;
else
$brand = 'unassigned-brand';
}
$rewritereplace = array(
$product_type,
$brand,
$post->post_name,
$post->post_name,
);
$permalink = str_replace($rewritecode, $rewritereplace, $permalink);
}
return $permalink;
}
add_filter('post_type_link', 'product_permalink', 10, 3);
Теперь мне просто нужно выяснить, как переписать URL таксономии бренда без лидирующего тега бренда, и я должен точно соответствовать желаемому URL.