アーカイブページと単一投稿のカスタム書き換えルール


8

いくつかのカスタム投稿タイプを使用してWordpressサイトを構築しています。すべての投稿タイプは異なる雑誌です。雑誌の年号用のカスタムメタフィールドもあります。

私はURLを使用したいと思います(archive.phpを使用):

http://my_site/magazine/name/
http://my_site/magazine_name/year/
http://my_site/magazine_name/year/issue/

私はコードでそれを作りました:

function magazine_rewrite_tag() {
    add_rewrite_tag('%issue_year%', '([0-9]{4})');
    add_rewrite_tag('%issue%', '([0-9])');
}
add_action('init', 'magazine_rewrite_tag', 10, 0);

そして:

function magazine_rewrite_rules() {
    add_rewrite_rule('^([a-z]+)/([0-9]{4})/([0-9])?', 'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]', 'top');
    add_rewrite_rule('^([a-z]+)/([0-9]{4})?', 'index.php?post_type=$matches[1]&issue_year=$matches[2]', 'top');
}
add_action('init', 'magazine_rewrite_rules');

もちろん、archive.phpにもカスタムクエリがあります。そしてそれはうまくいきます。

しかし、今、私の単一の記事のURLは機能しません。デフォルトでは、次のとおりです。

http://my_site/magazine/post-title

しかしそれはurlのような雑誌からのすべての記事を表示します(そしてそれはarchive.phpテンプレートを使用しました):

http://my_site/magazine/

単一のカスタム投稿に適切に書き換えルールを追加するにはどうすればよいですか?可能です。次の形式で単一の投稿(選択したカスタム投稿タイプのみ)のURLが必要です。

http://my_site/magazine/year/issue/post-title

複数の注記:(1)4番目の引数は、フィルターまたはアクションが取る引数の数です。そして10デフォルトの優先順位です。その場合は、両方ともオフにしておくか、それより大きい数を試してください。(2)結果の書き換えルールを確認しましたか?また、これらのルールは順序どおりに処理されるため、それらの順序を確認してください。ダンプ$GLOBALS['wp_rewrite']。(3)query_vars 競合する可能性のあるものを追加しましたか?
カイザー

回答:


4

私は解決策を見つけました!Monkeyman Rewrite Analyzurプラグインは非常に役に立ちました:https ://wordpress.org/plugins/monkeyman-rewrite-analyzer/

だから今、私はそのようなワーキングURLを持っています...

single.php:

/magazine-name/issue-year/issue/article-name

archive.php:

/magazine-name/issue-year/issue
/magazine-name/issue-year
/magazine-name

wp-adminのカスタム投稿エディターページで、発行年と発行にAdvanced Custom Fieldsプラグインを使用します。自分でメタフィールドを定義することもできます。

次に、発行年と発行の書き換えタグを追加しました。

function custom_rewrite_tag() {
    add_rewrite_tag('%issue_year%', '([0-9]{4})' );
    add_rewrite_tag('%issue%', '([0-9]+)' );
}

add_action('init', 'custom_rewrite_tag');

次に、URLの任意の組み合わせに書き換え書き換えルールを追加しました。

function custom_rewrite_rule() {
    // URL: /magazine/year/issue/title
    add_rewrite_rule('^([^/]+)/([0-9]{4})/([0-9])/(.?.+?)?(:/([0-9]+))?/?$', 'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]&name=$matches[4]', 'top');

    // URL: /magazine/year/issue
    add_rewrite_rule('^([^/]+)/([0-9]{4})/([0-9])?$', 'index.php?post_type=$matches[1]&issue_year=$matches[2]&issue=$matches[3]', 'top');

    // URL: /magazine/year
    add_rewrite_rule('^([^/]+)/([0-9]{4})?$', 'index.php?post_type=$matches[1]&issue_year=$matches[2]', 'top');
}

add_action('init', 'custom_rewrite_rule');

最後に、自分の標準のURLを発行年と発行日で置き換えます

function custom_permalink($url, $post) {
    if ($post->post_type == 'magazine-name-1' || $post->post_type == 'magazine-name-2' || $post->post_type == 'magazine-name-2' ) {
        global $post;

        $post_type = $post->post_type;
        $issue_year = get_field('issue_year', $post->ID); // ACF; for meta: get_post_meta($post->ID, '$issue', true);
        $issue = get_field('issue', $post->ID); // ACF

        $url = str_replace( $post_type . '/', $post_type . '/' . $issue_year . '/' . $issue . '/' , $url);
    }
    return $url;
}
add_filter('post_type_link', 'custom_permalink', 10, 2);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.