-
投稿者投稿
-
2024年9月28日 11:00 AM #141922
【お使いの Snow Monkey のバージョン】
Version: 26.0.1### 実現したいこと
– なるべく既存のパンくずの機能活かしたい(詳細ページと同じパンくずの出力結果にしたい)
– アーカイブなどのループの中で各投稿に対してパンくずを表示したい### 発生している問題
– アーカイブのループの中にパンくずのコードをいれると、アーカイブ自体のパンくずが出る
Helper::get_template_part( ‘template-parts/common/breadcrumbs’ );
で呼び出すファイルにおいて wp_parse_args が利用されており、それがパンくずの出力の主体になるためだと理解している。### 試したこと
なにかしら以下の
Helper::get_breadcrumbs_items
は、活かしたままで、ループ内のそれぞれの記事において、wp_parse_argsと同じような動きする関数を探してみたが見つからなかった。$args = wp_parse_args( // phpcs:disable VariableAnalysis.CodeAnalysis.VariableAnalysis.UndefinedVariable $args, // phpcs:enable array( '_items' => Helper::get_breadcrumbs_items(), ) );
ということで、直接の解決方法が思いつかなかったので、
結局自前でアーカイブ用にパンくずを書いたのですが
なにかうまい方法があれば共有いただけるとありがたいです。♥ 0いいねをした人: 居ません2024年9月28日 4:14 PM #141931調査してみたところ、2つの要因がありました。
1つ目は、Snow Monkey のパンくずはページのクエリを参照してリストを生成しているということです。例えば、詳細ページ用のリストはページが
is_single()
のときに生成され、アーカイブページ用のリストはページがis_archive()
のときに生成されます。ループの中だとしてもページのクエリはis_arhive()
がtrue
になるので、アーカイブページ用のリストが出力されてしまう、ということになります。2つ目は、Snow Monkey のパンくずは一度生成したリストをキャッシュするようになっているので、↑の対策をしたとしてもキャッシュされたパンくずを出力してしまうために同じリストが繰り返し表示されてしまうということです。
上記2つに対して対策してみたコードが下記になります。
/** * ループのメタ情報部分にパンくずを追加する。 */ add_filter( 'snow_monkey_template_part_render_template-parts/loop/entry-summary/meta/meta', function( $html ) { query_posts( array( 'p' => get_the_ID() ) ); // これが重要。クエリを記事用に再生成する。 ob_start(); \Framework\Helper::get_template_part( 'template-parts/common/breadcrumbs' ); $breadcrumbs = ob_get_clean(); wp_reset_query(); // クエリをもとに戻す return $html . $breadcrumbs; } ); /** * パンくずを都度生成するようにする。 */ add_filter( 'snow_monkey_get_template_part_args_template-parts/common/breadcrumbs', function( $args ) { $breadcrumbs = new \Inc2734\WP_Breadcrumbs\Bootstrap(); $breadcrumbs_items = $breadcrumbs->get(); // $breadcrumbs_items = apply_filters( 'snow_monkey_breadcrumbs', $breadcrumbs_items ); // 必要ならコメントアウト $args['vars']['_items'] = $breadcrumbs_items; return $args; } );
なんとなくあんまりきれいな処理ではない気がするので、気になるようなら自作したほうが良いかもしれません…。
♥ 0いいねをした人: 居ません -
投稿者投稿
- このトピックに返信するにはログインが必要です。