希望する正確なURL構造ではありませんが、以下を取得できます。
/ products
»すべてのカスタム投稿を表示
/ products / type / cell-phones
»分類法の携帯電話に関するすべてのカスタム投稿を表示
/ products / type / cell-phones / brand / 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が絶対に必要な場合:
/ products / type / cell-phones / brand / samsung / test-product-1
»製品を表示(単一のカスタム投稿)
次に、次のような書き換えルールが必要になります。
add_rewrite_rule(
'/products/type/*/brand/*/([^/]+)/?',
'index.php?pagename='product/$matches[1]',
'top' );
アップデート
/programming/3861291/multiple-custom-permalink-structures-in-wordpress
シングルポストURLを正しく再定義する方法は次のとおりです。
カスタム投稿タイプのre-writeを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と正確に一致させる必要があります。