web-dev-qa-db-ja.com

カスタム投稿タイプのスラッグの書き換え規則

書き換え規則に迷ってしまったので、どうぞ助けてください。

カスタムメタ「ブランド」を使用してカスタム投稿タイプ「商品」を作成しました。

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または投稿の商品リストが表示されますが、商品ページは表示されません。

1
seelescript

register_post_typeslug引数にもっと複雑なフォーマットを使用すると、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フィルタを追加してメタクエリに追加することもできます。デフォルト。

4
Milo