既存のパンくずの機能をアーカイブなどのループの中で各投稿に利用する方法

0
いいねをした人: 居ません
2件の投稿を表示中 - 1 - 2件目 (全2件中)
  • 投稿者
    投稿
  • #141922
    Hajime Megane Ogushi
    参加者
    19

    【お使いの 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
    いいねをした人: 居ません
    #141931
    アバター画像キタジマ タカシ
    参加者
    2421

    調査してみたところ、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
    いいねをした人: 居ません
2件の投稿を表示中 - 1 - 2件目 (全2件中)
  • トピック「既存のパンくずの機能をアーカイブなどのループの中で各投稿に利用する方法」には新しい返信をつけることはできません。

ドキュメント

Snow Monkey の設定方法やマニュアルを掲載しています。

ドキュメント

フォーラム

Snow Monkey の使い方やカスタマイズについてのご質問・ご要望等はサポートフォーラムで行っています。サポートフォーラムは誰でも閲覧できますが、書き込みできるのは Snow Monkey 購入者のみとなります。

サポートフォーラム

よくあるご質問

Snow Monkey のサービスについて不明な点がある場合は、まずはよくあるご質問をご確認ください。

よくあるご質問

お問い合わせ

よくあるご質問を見ても解決しなかった場合、試用版の申請については問い合わせフォームからお願いいたします。

お問い合わせ

Snow Monkey は Gutenberg ブロックエディターに対応した 100%GPL の WordPress テーマです。拡張性を意識した開発をおこなっており、カスタマイザーとブロックでスピーディーにサイトを立ち上げるだけでなく、CSS やフックを駆使した高度なカスタマイズにも柔軟に対応できます。