業務システム開発・オーダーメイドシステム開発・WEBシステム開発なら朝吉システムズにお任せください!

システム開発(大阪)朝吉システムズ

システム開発に関するお問い合せ・ご相談
わからないことも悩む前にお気軽にご相談下さい。
無料相談
事務所案内
リンク
サイトマップ
訪問サポートエリア
大阪市内
大阪府北部
箕面・池田・茨木・高槻・枚方・豊中・吹田・摂津・寝屋川・交野・守口・門真・四條畷
大阪府中部
大東・東大阪・八尾・藤井寺・柏原
大阪府南部
堺・高石・泉大津・和泉・岸和田・貝塚・泉佐野・泉南・阪南
大阪府東部
松原・富田林・河内長野・羽曳野・大阪狭山
奈良県 奈良・生駒他
兵庫県 神戸他

朝吉システムズTOP › welcart › welcartとカスタム投稿タイプの月別アーカイブ取得

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;
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.

ページの先頭へ戻る