Bien que ce ne soit pas la structure d'URL souhaitée, vous pouvez obtenir:
/ produits
»Voir tous les articles personnalisés
/ produits / type / téléphones portables
»Voir tous les articles personnalisés avec la taxonomie des téléphones portables
/ produits / type / téléphones portables / marque / samsung
»Voir tous les articles personnalisés où la taxonomie est téléphones portables ET samsung
/ brand / samsung
»Voir tous les articles personnalisés où la taxonomie est samsung
/ product / test-product-1
»Voir le produit (publication personnalisée unique)
sans avoir à spécifier de règles de réécriture personnalisées.
Cela nécessite cependant que vous enregistriez vos taxonomies et types de publication personnalisés dans un ordre particulier. L'astuce consiste à enregistrer toute taxonomie où le slug commence par le slug de votre type de publication avant d'enregistrer ce type de publication personnalisé. Par exemple, supposons les limaces suivantes:
product_type taxonomy slug = products/type
product custom_post_type slug = product
product custom_post_type archive slug = products
product_brand taxonomy slug = brand
Ensuite, vous pouvez les enregistrer dans cet ordre:
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,
)
);
Si vous devez absolument avoir une URL comme:
/ produits / type / téléphones portables / marque / samsung / test-product-1
»Voir le produit (publication personnalisée unique)
Ensuite, vous auriez besoin d'une règle de réécriture quelque chose comme ceci:
add_rewrite_rule(
'/products/type/*/brand/*/([^/]+)/?',
'index.php?pagename='product/$matches[1]',
'top' );
MISE À JOUR
/programming/3861291/multiple-custom-permalink-structures-in-wordpress
Voici comment vous redéfinissez correctement l'URL de publication unique.
Définissez la réécriture sur false pour le type de publication personnalisé. (Laissez l'archive telle quelle), puis après avoir enregistré les taxonomies et les publications, enregistrez également les règles de réécriture suivantes.
'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);
Ensuite, filtrez post_type_link pour créer la structure d'URL souhaitée - en tenant compte des valeurs de taxonomie non définies. En modifiant le code de la publication liée, vous auriez:
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);
Maintenant, je dois juste comprendre comment réécrire l'URL de taxonomie de la marque sans la balise de marque principale, et je dois correspondre exactement à l'URL souhaitée.