welcart
welcartとカスタム投稿タイプの月別アーカイブ取得
カスタム投稿タイプの月別アーカイブを取得する方法はウェブを検索すると沢山見つかります。
これらを参考に getarchives_where を フックするフィルタを functions.php に書いて試してみましたが取得できませんでした。
あれこれ調べてみて取得出来るようになりましたので書き記します。
公式のフォーラムにもコードがありますが同じ機能(というか更に洗練されていそうなコード)を Custom Post Type Permalinks プラグインが内包しています(公式フォーラムに掲載されているコードもこのプラグイン作者の方が纏めているようです)ので Welcart を使っていないなら、自分で functions.php にコードを書くよりもこのプラグインを使う方が良さそうです。
Custom Post Type Permalinks プラグインも試してみましたが welcart が居ると月別アーカイブを取得することが出来ません。
調べて分かったことは welcart も getarchives_where をフックしていて カスタム投稿タイプの月別アーカイブ取得用に記述した getarchives_where の結果を welcart の getarchvies_where が上書きしてしまっているということでした。(普通は書き変えたい条件が成立した時に元の値に新しい値を書き加えたり、書き換えたりするものなのですが welcart では無条件に「上書き」してしまいます。)
説明が前後しますがWordPress にはプログラムの当該部分を直接編集せずに振る舞いをある程度制御出来るようにアクション、フィルタという機能が備わっています。
カスタム投稿タイプ用の月別アーカイブ取得用に getarchives_where をフックする際に実行優先順位は記述していませんでしたから初期値の 10 が採用され、welcart の getarchives_where をフックも実行優先順位が記述されていませんでしたから初期値の 10 が採用されました。
実行優先順位が同じ場合は実行される順番は保証されません。
従ってカスタム投稿タイプ月別アーカイブ取得用に書き換えた getarchives_where の返却値を welcart が「上書き」してしまっていたために期待しているカスタム投稿タイプ月別アーカイブが取得出来なかったのです。
対策としては welcart がフックする getarchives_where よりも後に実行されるように優先順位を明示的に指定しました。
例)add_filter( ‘getarchives_where’, ‘my_getarchives_where’, 11, 2 );
優先順位は3番目の引数
/***********************************************************
* カスタム投稿タイプで年月アーカイブ
***********************************************************/
global $my_archives_post_type;
add_filter( 'getarchives_where', 'my_getarchives_where', 11, 2 );
function my_getarchives_where( $where, $r ) {
global $my_archives_post_type;
if ( isset($r['post_type']) ) {
$my_archives_post_type = $r['post_type'];
$where = str_replace( '\'post\'', '\'' . $r['post_type'] . '\'', $where );
} else {
$my_archives_post_type = '';
}
return $where;
}
add_filter( 'get_archives_link', 'my_get_archives_link', 11 );
function my_get_archives_link( $link_html ) {
global $my_archives_post_type;
if ( '' != $my_archives_post_type ){
$add_link .= '?post_type=' . $my_archives_post_type;
}
$link_html = preg_replace("/href=\'(.+)\'/u", "href='$1" . $add_link . "'", $link_html);
return $link_html;
}