web-dev-qa-db-ja.com

カスタム投稿タイプURLのメタボックス値の追加を書き換える

これらのカスタム投稿タイプ(CPT)とメタボックスがあります。

  • 映画(CPT)
    • ジャンル(メタボックス)
  • ジャンル(CPT)

ある映画がDie hardと呼ばれるのなら、パーマリンクは/ genres/action/die-hardにします。

これはmovie-CPTを 'rewrite' => falseに設定して代わりにこのコードを使うことで簡単に修正できます。

add_action('init', 'rb_add_rewrite_rules');
add_filter('post_type_link', 'rb_create_permalinks', 10, 3);

function rb_add_rewrite_rules() {
    global $wp_rewrite;
    $wp_rewrite->add_rewrite_tag('%movies%', '([^/]+)', 'movies=');
    $wp_rewrite->add_rewrite_tag('%genre%', '([^/]+)', 'genre=');

    $wp_rewrite->add_permastruct('movies', '/genres/%genre%/%movies%', false);
}

function rb_create_permalinks($permalink, $post, $leavename) {
    $no_data = 'no-data';
    $post_id = $post->ID;

    if($post->post_type != 'movies' || empty($permalink) || in_array($post->post_status, array('draft', 'pending', 'auto-draft')))
    return $permalink;

    $event_id = get_post_meta($post_id, 'genre', true);
    $var1 = basename(get_permalink($event_id));
    $var1 = sanitize_title($var1);

    if(!$var1)
        $var1 = $no_data;

    $permalink = str_replace('%genre%', $var1, $permalink);

    return $permalink;
}

さて、これが問題です。 Die Hardパーマリンクとarchive-genres.php(すべてのジャンルを表示する)は見栄えが良いですが、single-genres.phpは見つかりません - 代わりに、/ genres/actionを実行するとindex.phpコードが表示されます。

私の問題は私の書き換えが衝突することであると思います、多分これをすることは不可能です:

「映画」のCPTパーマリンク

/custom base name/custom field meta box value)/'movies' CPT post name

「ジャンル」CPTパーマリンク

/custom post type name (same value as the custom base name above!!)/'genres' CPT post name

WordPressで/ genres/actionなどにsingle-genres.phpを使用させるにはどうすればよいですか?

1
Richard B

それはあなたがここに非常に接近しているように聞こえます、そしてあなたの唯一の残りの問題はジャンルと映画のためのあなたのパーマリンクが衝突するということです。

'movies' CPT permalink
/genres/%custom field meta box value%/%movie%/

'genres' CPT permalink
/genres/%genre%/

ここでの問題はadd_permastructを使うことです。それが映画のための規則を作成するとき、彼らはこのようなものに見えます:

genres/([^/]+)/([^/]+)(/[0-9]+)?/?$
  => index.php?genre=$matches[1]&movies=$matches[2]&page=$matches[3]

WordPressでリクエスト処理が機能する方法、同じURLに複数の投稿タイプを設定することはできません - WordPressは最初の投稿の後で停止します。つまり、これらはきれいなURLに含めることができますが、リクエストとクエリを生成する「醜い」URLには含めることができませんmovies=を含む書き換え規則には、genre=を含めることはできません。以下はrb_add_rewrite_rulesの完全な、徹底的な見直しです。添付URL、フィードURLなど、必要のないルールはすべて引き出すことができます。書き換えを変更する場合は、通常、[設定] - > [パーマリンク]に移動して[変更を保存]をクリックしてパーマリンクをフラッシュしてください。また、'rewrite' => falseが両方のカスタム投稿タイプで設定されていることを確認してください。

function rb_add_rewrite_rules() {
    add_rewrite_rule( 'genres/[^/]+/[^/]+/attachment/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/[^/]+/attachment/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'top' );
    add_rewrite_rule( 'genres/[^/]+/[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/([^/]+)/trackback/?$', 'index.php?movies=$matches[1]&tb=1', 'top' );
    add_rewrite_rule( 'genres/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?movies=$matches[1]&feed=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?movies=$matches[1]&feed=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/([^/]+)/page/?([0-9]{1,})/?$', 'index.php?&movies=$matches[1]&paged=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/([^/]+)(/[0-9]+)?/?$', 'index.php?movies=$matches[1]&page=$matches[3]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/[^/]+/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/[^/]+/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'top' );
    add_rewrite_rule( 'genres/[^/]+/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/attachment/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/attachment/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'top' );
    add_rewrite_rule( 'genres/[^/]+/attachment/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/attachment/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/attachment/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/([^/]+)/trackback/?$', 'index.php?genre=$matches[1]&tb=1', 'top' );
    add_rewrite_rule( 'genres/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?genre=$matches[1]&feed=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?genre=$matches[1]&feed=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/([^/]+)/page/?([0-9]{1,})/?$', 'index.php?genre=$matches[1]&paged=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/([^/]+)(/[0-9]+)?/?$', 'index.php?genre=$matches[1]&page=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/([^/]+)/?$', 'index.php?attachment=$matches[1]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/([^/]+)/trackback/?$', 'index.php?attachment=$matches[1]&tb=1', 'top' );
    add_rewrite_rule( 'genres/[^/]+/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/([^/]+)/(feed|rdf|rss|rss2|atom)/?$', 'index.php?attachment=$matches[1]&feed=$matches[2]', 'top' );
    add_rewrite_rule( 'genres/[^/]+/([^/]+)/comment-page-([0-9]{1,})/?$', 'index.php?attachment=$matches[1]&cpage=$matches[2]', 'top' );
}
2
Matthew Boynes

私はあなたがデータ構造の観点から間違ったアプローチを取っていると思います。 Genresというカスタム分類法を作成し、映画のCPTをGenresのカスタム分類法にバインドしてから、その映画が属するGenresを選択します。

既存のコードに関する質問に対処する。 single-XXX.phpテンプレートは、XXXというCPTのコンテンツを表示するために使用されます。だから映画を表示するには、あなたはsingle-movies.phpを使用する必要があります。そして、特定のpost_metaのためにコンテンツを具体的にアドレス指定すると、次のことができます。

if(get_post_meta($post_id, 'genres', false) == 'action') {
   //Do Stuff Here
}
1
Angela