書き換え規則に迷ってしまったので、どうぞ助けてください。
カスタムメタ「ブランド」を使用してカスタム投稿タイプ「商品」を作成しました。
milk という製品のURLはmysite.com/products/milk
になります。URLにはこのようなブランドを含める必要があります、mysite.com/brand-brandname/milk
いくつかの例: mysite.com/brand-supermilk/milk
"supermilk"は牛乳のカスタムメタのブランドです。
良い商品がブランドであるmysite.com/brand-goodproducts/coffe
私はこの規則を持って書き直す:
$args = array(
'rewrite' => array('slug' => 'brand-%brand_name%', 'with_front' => false),
);
register_post_type('products', $args);
function wptuts_custom_tags() {
add_rewrite_rule("^brand-([^/]+)?",'index.php?post_type=products&brand_name=$matches[1]','top');
flush_rewrite_rules();
}
add_action('init','wptuts_custom_tags');
function my_post_type_link_filter_function($post_link, $id = 0, $leavename = FALSE) {
if (strpos('%brand_name%', $post_link) === FALSE) {
$post = &get_post($id);
$brand_name =get_post_meta($post->ID,'brand',true);
if(empty($brand_name)){$brand_name = 'default';}
$post_link = str_replace('%brand_name%',$brand_name, $post_link);
return $post_link;
}
}
add_filter('post_type_link', 'my_post_type_link_filter_function', 1, 3);
これにより、新しい商品投稿を追加したときに管理者に正しいURLが表示されますが、404または投稿の商品リストが表示されますが、商品ページは表示されません。
register_post_type
のslug
引数にもっと複雑なフォーマットを使用すると、WordPressは正しい規則を生成できないようです。この場合、 add_permastruct
を使用する必要があります。
この例では、投稿タイプと追加の規則を追加して、正しいURLで単一の商品とブランドのアーカイブを有効にします。
function wpd_products_post_type() {
// post type args
// rewrite and has_archive must be true!
$args = array(
'public' => true,
'rewrite' => true,
'has_archive' => true,
'supports' => array( 'title', 'custom-fields' ),
);
register_post_type(
'products',
$args
);
// so WP will parse brand_name into query vars
add_rewrite_tag(
'%brand_name%',
'([^&]+)'
);
// this sets the actual structure the post type will use
add_permastruct(
'products',
'brand-%brand_name%/%products%',
array( 'with_front' => false )
);
// to enable product archives by brand
add_rewrite_rule(
"^brand-([^/]+)?",
'index.php?post_type=products&brand_name=$matches[1]',
'top'
);
}
add_action( 'init','wpd_products_post_type' );
メタ値を単数形の製品URLに挿入するには、post_type_link
フィルタがまだ必要です。
pre_get_posts
のメタクエリを追加するには、製品アーカイブ用に brand_name
フィルタ も追加する必要があります。
URLに欲しい値をブランド名として追加してもクエリが成功することがわかっているので、単数製品に追加のpre_get_posts
フィルタを追加してメタクエリに追加することもできます。デフォルト。