web-dev-qa-db-ja.com

カスタム投稿タイプ、wp_get_archivesおよびadd_rewrite_rule

誰かが私が抱えている特有の問題に対する解決策を思いつくかどうかを確かめるために検索しましたが、私の場合に起こっていたことに近いものは見つけられませんでした。

私は2つのカスタム投稿タイプを持っています - それらをDiaryとJournalと呼びましょう。両方ともhas_archivetrueに、rewriteを同じ名前のslugで、with_frontfalse)に正しく設定しています。

私のパーマリンク構造は年/月/ポスト名でセットされています。それぞれのためのスラッグ '日記'と '日誌'で私はプレースホルダーページをセットアップしました。 archive.php - そのため、domain/diary /またはdomain/journalに移動すると、それに応じてロードされますので、ここでは追加のテンプレートは作成しません - 単にtwentyelevenという子テーマを作成し、archive.phpを使用します。

カスタム投稿タイプを操作するにはwp_get_archivesを使用する必要があり、追加のオプションpost_typeを操作するには、さらに一歩進んでcustom_wp_get_archives関数を作成して後で必要になるので、出力をカスタマイズできます。

デフォルトのwp_get_archiveに​​ post_type *オプションを追加するか、custom_wp_get_archivesを使用すると、問題が発生します。どちらかによって出力されるURLはdomain/year/month)です。結構ですが、それに '?post_type = POST_TYPE'を付け加えればそれに応じた結果が得られます - それでも十分公平です。

それで、私はcustom_wp_get_archivesを使って '?post_type = POST_TYPE'を出力URLに挿入しましたが、うまくいきました。

私の質問は - wp_get_archivesに上記の条件で正しいURLを出力させる方法はありますか?

また、修正方法としてadd_rewrite_rulegenerate_rewrite_rulesを調べてみました。domain/post_type_slug/year/monthなど、ここで見いだしたほとんどすべての例に従っただけで、うまくいきません。私もパーマリンクをフラッシュしました - 行かない。

私が見つけたコードは、ルールを書き直すことで実行したいものに近いように思えますが、ここでも機能しません。

function register_post_type_rewrite_rules($wp_rewrite) {

$args = array('public' => true, '_builtin' => false);   //get all public custom post types
$output = 'names';
$operator = 'and';
$post_types = get_post_types($args,$output,$operator);

$url_base = ($url_base == '') ? $url_base : $url_base . '/';
$custom_rules = array();

$post_types = implode('|', $post_types);
    $custom_rules = array( "$url_base($post_types)/([0-9]+)/([0-9]{1,2})/([0-9]{1,2})/?$" =>
            'index.php?post_type_index=1&post_type=' . $wp_rewrite->preg_index(1) . '&year=' . $wp_rewrite->preg_index(2) . '&monthnum=' . $wp_rewrite->preg_index(3) . '&day=' . $wp_rewrite->preg_index(4),       //year month day

                            "$url_base($post_types)/([0-9]+)/([0-9]{1,2})/?$"  =>
            'index.php?post_type_index=1&post_type=' . $wp_rewrite->preg_index(1) . '&year=' . $wp_rewrite->preg_index(2) . '&monthnum=' . $wp_rewrite->preg_index(3),          //year month
                            "$url_base($post_types)/([0-9]+)/?$" =>
            'index.php?post_type_index=1&post_type=' . $wp_rewrite->preg_index(1) . '&year=' . $wp_rewrite->preg_index(2)   //year
                        );

$wp_rewrite->rules = array_merge($custom_rules, $wp_rewrite->rules); // merge existing rules with custom ones

return $wp_rewrite;
}

add_filter('generate_rewrite_rules', 'register_post_type_rewrite_rules', 100);

これに関する手がかりは素晴らしいでしょう。

2
george.n

カスタム投稿タイプは、デフォルトでは日付ベースのアーカイブを持っていません(私は本当に彼らが日付アーカイブのためのパーマリンク構造を持っていないことを意味する)。例えば:

www.example.com?post_type=journal&year=2012&monthnum=4

2012年4月に発行されたジャーナルのアーカイブを提供してください。

www.example.com/journal/2012/04

書き換えルールとして存在しないため、おそらく404を指定します。追加する必要があります。

add_action('init', 'wpse50530_journal_archive_rewrite');
function wpse50530_journal_archive_rewrite(){
   add_rewrite_rule('^journal/([0-9]{4})/([0-9]{2})/?','index.php?post_type=journal&year=$matches[1]&monthnum=$matches[2]','top');
   add_rewrite_rule('^journal/([0-9]{4})/?','index.php?post_type=journal&year=$matches[1]','top');
}

月と年のアーカイブを提供します。 ( 上記は完全にテストされていないことに注意してください )。これを追加した後は、書き換えルールを1回フラッシュする必要があります([設定]> [パーマリンク]を参照)。

5
Stephen Harris