メインコンテンツへ移動

同一のタクソノミーの記事が無い場合でも関連投稿を表示させたい

0
Who liked: No user
8件の投稿を表示中 - 1 - 8件目 (全8件中)
  • 投稿者
    投稿
  • #145799
    まーちゅう
    参加者
    390

    【お使いの Snow Monkey のバージョン】 29.1.3
    【お使いの Snow Monkey Blocks のバージョン】 24.0.4
    【お使いの Snow Monkey Editor のバージョン】 11.0.2
    【お使いのブラウザ】 chrome
    【当該サイトのURL】

    以下のようにカスタマイズのコードを書いています。
    interview、job-postsのカスタム投稿タイプで、同じタクソノミー内の記事が1件しかない時に、関連投稿が表示されないので、表示したいです。

    /**
     * 関連記事の取得クエリを操作する
     *
     * @param $args テンプレート取得クエリ
     * @return $args テンプレート取得クエリ
     */
    add_filter(
    	'snow_monkey_get_template_part_args_template-parts/content/related-posts',
    	function ( $args ) {
    		$_post_type = get_post_type();
    		if ( 'post' === $_post_type || 'works-and-voices' === $_post_type ) {
    			$args['vars']['_entries_layout'] = 'simple';
    		}
    		if ( 'interview' === $args['name'] ) {
    			$args['vars']['_entries_layout'] = 'carousel';
    			$args['vars']['_title']          = '他の社員を見る';
    			$args['vars']['_posts_query']->set( 'tax_query', false );
    			$args['vars']['_posts_query']->set( 'posts_per_page', 10 );
    			$args['vars']['_posts_query']->query( $args['vars']['_posts_query']->query_vars );
    		}
    		if ( 'job-posts' === $args['name'] ) {
    			$args['vars']['_entries_layout'] = 'rich-media';
    			$args['vars']['_title']          = '他の募集を見る';
    			$args['vars']['_posts_query']->set( 'tax_query', false );
    			$args['vars']['_posts_query']->set( 'posts_per_page', 3 );
    			$args['vars']['_posts_query']->query( $args['vars']['_posts_query']->query_vars );
    		}
    		return $args;
    	}
    );
    

    関連投稿が表示される場合の var_dump( $args['vars']['_posts_query'] ); の中身は以下のようになっていますが、表示されない場合は <footer class="c-entry__footer"> </footer> が空で出力されて var_dump も表示されません。

    object(WP_Query)#15141 (54) {
      ["query"]=>
      array(69) {
        ["post_type"]=>
        string(9) "interview"
        ["posts_per_page"]=>
        int(10)
        ["orderby"]=>
        string(4) "rand"
        ["post__not_in"]=>
        array(1) {
          [0]=>
          int(1053)
        }
        ["tax_query"]=>
        bool(false)
        ["ignore_sticky_posts"]=>
        bool(true)
        ["no_found_rows"]=>
        bool(true)
        ["suppress_filters"]=>
        bool(true)
        ["error"]=>
        string(0) ""
        ["m"]=>
        string(0) ""
        ["p"]=>
        int(0)
        ["post_parent"]=>
        string(0) ""
        ["subpost"]=>
        string(0) ""
        ["subpost_id"]=>
        string(0) ""
        ["attachment"]=>
        string(0) ""
        ["attachment_id"]=>
        int(0)
        ["name"]=>
        string(0) ""
        ["pagename"]=>
        string(0) ""
        ["page_id"]=>
        int(0)
        ["second"]=>
        string(0) ""
        ["minute"]=>
        string(0) ""
        ["hour"]=>
        string(0) ""
        ["day"]=>
        int(0)
        ["monthnum"]=>
        int(0)
        ["year"]=>
        int(0)
        ["w"]=>
        int(0)
        ["category_name"]=>
        string(0) ""
        ["tag"]=>
        string(0) ""
        ["cat"]=>
        string(0) ""
        ["tag_id"]=>
        string(0) ""
        ["author"]=>
        string(0) ""
        ["author_name"]=>
        string(0) ""
        ["feed"]=>
        string(0) ""
        ["tb"]=>
        string(0) ""
        ["paged"]=>
        int(0)
        ["meta_key"]=>
        string(0) ""
        ["meta_value"]=>
        string(0) ""
        ["preview"]=>
        string(0) ""
        ["s"]=>
        string(0) ""
        ["sentence"]=>
        string(0) ""
        ["title"]=>
        string(0) ""
        ["fields"]=>
        string(3) "all"
        ["menu_order"]=>
        string(0) ""
        ["embed"]=>
        string(0) ""
        ["category__in"]=>
        array(0) {
        }
        ["category__not_in"]=>
        array(0) {
        }
        ["category__and"]=>
        array(0) {
        }
        ["post__in"]=>
        array(0) {
        }
        ["post_name__in"]=>
        array(0) {
        }
        ["tag__in"]=>
        array(0) {
        }
        ["tag__not_in"]=>
        array(0) {
        }
        ["tag__and"]=>
        array(0) {
        }
        ["tag_slug__in"]=>
        array(0) {
        }
        ["tag_slug__and"]=>
        array(0) {
        }
        ["post_parent__in"]=>
        array(0) {
        }
        ["post_parent__not_in"]=>
        array(0) {
        }
        ["author__in"]=>
        array(0) {
        }
        ["author__not_in"]=>
        array(0) {
        }
        ["search_columns"]=>
        array(0) {
        }
        ["cache_results"]=>
        bool(true)
        ["update_post_term_cache"]=>
        bool(true)
        ["update_menu_item_cache"]=>
        bool(false)
        ["lazy_load_term_meta"]=>
        bool(true)
        ["update_post_meta_cache"]=>
        bool(true)
        ["nopaging"]=>
        bool(false)
        ["comments_per_page"]=>
        string(2) "50"
        ["taxonomy"]=>
        string(8) "job-dept"
        ["term_id"]=>
        int(40)
        ["order"]=>
        string(0) ""
      }
      ["query_vars"]=>
      array(69) {
        ["post_type"]=>
        string(9) "interview"
        ["posts_per_page"]=>
        int(10)
        ["orderby"]=>
        string(4) "rand"
        ["post__not_in"]=>
        array(1) {
          [0]=>
          int(1053)
        }
        ["tax_query"]=>
        bool(false)
        ["ignore_sticky_posts"]=>
        bool(true)
        ["no_found_rows"]=>
        bool(true)
        ["suppress_filters"]=>
        bool(true)
        ["error"]=>
        string(0) ""
        ["m"]=>
        string(0) ""
        ["p"]=>
        int(0)
        ["post_parent"]=>
        string(0) ""
        ["subpost"]=>
        string(0) ""
        ["subpost_id"]=>
        string(0) ""
        ["attachment"]=>
        string(0) ""
        ["attachment_id"]=>
        int(0)
        ["name"]=>
        string(0) ""
        ["pagename"]=>
        string(0) ""
        ["page_id"]=>
        int(0)
        ["second"]=>
        string(0) ""
        ["minute"]=>
        string(0) ""
        ["hour"]=>
        string(0) ""
        ["day"]=>
        int(0)
        ["monthnum"]=>
        int(0)
        ["year"]=>
        int(0)
        ["w"]=>
        int(0)
        ["category_name"]=>
        string(0) ""
        ["tag"]=>
        string(0) ""
        ["cat"]=>
        string(0) ""
        ["tag_id"]=>
        string(0) ""
        ["author"]=>
        string(0) ""
        ["author_name"]=>
        string(0) ""
        ["feed"]=>
        string(0) ""
        ["tb"]=>
        string(0) ""
        ["paged"]=>
        int(0)
        ["meta_key"]=>
        string(0) ""
        ["meta_value"]=>
        string(0) ""
        ["preview"]=>
        string(0) ""
        ["s"]=>
        string(0) ""
        ["sentence"]=>
        string(0) ""
        ["title"]=>
        string(0) ""
        ["fields"]=>
        string(3) "all"
        ["menu_order"]=>
        string(0) ""
        ["embed"]=>
        string(0) ""
        ["category__in"]=>
        array(0) {
        }
        ["category__not_in"]=>
        array(0) {
        }
        ["category__and"]=>
        array(0) {
        }
        ["post__in"]=>
        array(0) {
        }
        ["post_name__in"]=>
        array(0) {
        }
        ["tag__in"]=>
        array(0) {
        }
        ["tag__not_in"]=>
        array(0) {
        }
        ["tag__and"]=>
        array(0) {
        }
        ["tag_slug__in"]=>
        array(0) {
        }
        ["tag_slug__and"]=>
        array(0) {
        }
        ["post_parent__in"]=>
        array(0) {
        }
        ["post_parent__not_in"]=>
        array(0) {
        }
        ["author__in"]=>
        array(0) {
        }
        ["author__not_in"]=>
        array(0) {
        }
        ["search_columns"]=>
        array(0) {
        }
        ["cache_results"]=>
        bool(true)
        ["update_post_term_cache"]=>
        bool(true)
        ["update_menu_item_cache"]=>
        bool(false)
        ["lazy_load_term_meta"]=>
        bool(true)
        ["update_post_meta_cache"]=>
        bool(true)
        ["nopaging"]=>
        bool(false)
        ["comments_per_page"]=>
        string(2) "50"
        ["taxonomy"]=>
        string(8) "job-dept"
        ["term_id"]=>
        int(40)
        ["order"]=>
        string(0) ""
      }
      ["tax_query"]=>
      object(WP_Tax_Query)#14983 (6) {
        ["queries"]=>
        array(0) {
        }
        ["relation"]=>
        string(3) "AND"
        ["table_aliases":protected]=>
        array(0) {
        }
        ["queried_terms"]=>
        array(0) {
        }
        ["primary_table"]=>
        string(8) "wp_posts"
        ["primary_id_column"]=>
        string(2) "ID"
      }
      ["meta_query"]=>
      object(WP_Meta_Query)#15151 (9) {
        ["queries"]=>
        array(0) {
        }
        ["relation"]=>
        NULL
        ["meta_table"]=>
        NULL
        ["meta_id_column"]=>
        NULL
        ["primary_table"]=>
        NULL
        ["primary_id_column"]=>
        NULL
        ["table_aliases":protected]=>
        array(0) {
        }
        ["clauses":protected]=>
        array(0) {
        }
        ["has_or_relation":protected]=>
        bool(false)
      }
      ["date_query"]=>
      bool(false)
      ["request"]=>
      string(252) "SELECT   wp_posts.ID
    					 FROM wp_posts 
    					 WHERE 1=1  AND wp_posts.ID NOT IN (1053) AND ((wp_posts.post_type = 'interview' AND (wp_posts.post_status = 'publish' 
    OR wp_posts.post_status = 'private')))
    					 
    					 ORDER BY RAND()
    					 LIMIT 0, 10"
    
    0
    Who liked: No user
    #145806
    アバター画像キタジマ タカシ
    参加者
    2605

    以下、確認お願いします!

    – 「関連記事の取得クエリを操作する」のコードを削除した場合も、「同じタクソノミー内の記事が1件しかない時に、関連投稿が表示されない」という現象はそのままでしょうか?
    snow-monkey/template-parts/content/entry/footer/footer.php 内の、if ( get_option( 'mwt-google-matched-content' ) || $related_posts_query->have_posts() )if ( get_option( 'mwt-google-matched-content' ) ) に書き換えると、変化はありますか? ← すみません、間違えました
    snow-monkey/template-parts/content/entry/footer/footer.php 内の、if ( get_option( 'mwt-google-matched-content' ) || $related_posts_query->have_posts() )if ( get_option( 'mwt-google-matched-content' ) || 1 ) に書き換えると、変化はありますか?

    0
    Who liked: No user
    #145808
    まーちゅう
    参加者
    390

    「関連記事の取得クエリを操作する」のコードを削除しても変化無しでした。

    snow-monkey/template-parts/content/entry/footer/footer.php 内の、if ( get_option( 'mwt-google-matched-content' ) || $related_posts_query->have_posts() )if ( get_option( 'mwt-google-matched-content' ) || 1 ) に書き換えると、表示されました。

    0
    Who liked: No user
    #145813
    まーちゅう
    参加者
    390
    • 根本原因としては、$related_posts_query->have_posts()false になることで、関連投稿セクション全体が非表示になる
    • 条件を || 1 にすると強制的に表示できる

    以上のことを考慮して、関連投稿が少ない場合のフォールバック機能を追加することで表示できるようになりました。

    /**
     * 関連記事の取得クエリを操作する
     *
     * @param array $args テンプレート取得クエリ.
     * @return array テンプレート取得クエリ.
     */
    add_filter(
    	'snow_monkey_get_template_part_args_template-parts/content/related-posts',
    	function ( $args ) {
    		$_post_type = get_post_type();
    		if ( 'post' === $_post_type || 'works-and-voices' === $_post_type ) {
    			$args['vars']['_entries_layout'] = 'simple';
    		}
    		if ( 'interview' === $args['name'] ) {
    			$args['vars']['_entries_layout'] = 'carousel';
    			$args['vars']['_title']          = '他の社員を見る';
    			$args['vars']['_posts_query']->set( 'tax_query', false );
    			$args['vars']['_posts_query']->set( 'posts_per_page', 10 );
    			$args['vars']['_posts_query']->query( $args['vars']['_posts_query']->query_vars );
    		}
    		if ( 'job-posts' === $args['name'] ) {
    			$args['vars']['_entries_layout'] = 'rich-media';
    			$args['vars']['_title']          = '他の募集を見る';
    			// $args['vars']['_posts_query']->set( 'tax_query', false );
    			$args['vars']['_posts_query']->set( 'posts_per_page', 3 );
    			$args['vars']['_posts_query']->query( $args['vars']['_posts_query']->query_vars );
    		}
    		return $args;
    	}
    );
    
    /**
     * 関連投稿のクエリ引数をカスタマイズ
     * interview、job-postsで関連投稿が少ない場合のフォールバック機能
     *
     * @param array $args WP_Query の引数配列
     * @return array 修正されたクエリ引数
     */
    add_filter(
    	'snow_monkey_related_posts_args',
    	function ( $args ) {
    		// グローバルの$postから現在の投稿情報を取得
    		global $post;
    
    		if ( ! $post ) {
    			return $args;
    		}
    
    		// 投稿IDと投稿タイプの型チェック
    		$post_id   = (int) $post->ID;
    		$post_type = (string) $post->post_type;
    
    		// 無効な投稿IDの場合は早期リターン
    		if ( $post_id <= 0 ) {
    			return $args;
    		}
    
    		// interview、job-postsのカスタム投稿タイプの場合のみ処理
    		if ( ! in_array( $post_type, array( 'interview', 'job-posts' ), true ) ) {
    			return $args;
    		}
    
    		// 投稿タイプ別の最小表示件数設定
    		$min_posts_config = array(
    			'interview' => 8,
    			'job-posts' => 3,
    		);
    
    		// 投稿タイプに応じた最小表示件数を取得
    		if ( ! isset( $min_posts_config[ $post_type ] ) ) {
    			return $args;
    		}
    		$min_posts = $min_posts_config[ $post_type ];
    
    		// 元の関連投稿を取得
    		$related_posts = get_posts( $args );
    
    		// カウント処理
    		if ( ! is_array( $related_posts ) ) {
    			$related_posts = array();
    		}
    		$related_count = count( $related_posts );
    
    		// 関連投稿が少ない場合はフォールバック処理を実行
    		if ( $related_count < $min_posts ) {
    			// フォールバック用のクエリ引数を作成
    			$fallback_args = array(
    				'post_type'      => $post_type,
    				'posts_per_page' => $min_posts,
    				'post__not_in'   => array( $post_id ), // 現在の投稿を除外
    			);
    
    			// 既に取得した関連投稿のIDを除外
    			if ( ! empty( $related_posts ) ) {
    				$existing_ids = wp_list_pluck( $related_posts, 'ID' );
    
    				// wp_list_pluck の結果が配列かチェック
    				if ( is_array( $existing_ids ) && ! empty( $existing_ids ) ) {
    					$fallback_args['post__not_in'] = array_merge( $fallback_args['post__not_in'], $existing_ids );
    				}
    			}
    
    			// フォールバック記事を取得
    			$fallback_posts = get_posts( $fallback_args );
    
    			// 安全性チェック
    			if ( ! is_array( $fallback_posts ) ) {
    				$fallback_posts = array();
    			}
    
    			// 元の関連投稿とフォールバック記事をマージ
    			$all_related_posts = array_merge( $related_posts, $fallback_posts );
    
    			// 重複を除去し、指定件数まで調整
    			$unique_posts   = array();
    			$post_ids_added = array(); // 連想配列として使用してO(1)検索に
    
    			foreach ( $all_related_posts as $related_post ) {
    				// 既に必要件数に達してたら早期終了
    				if ( count( $unique_posts ) >= $min_posts ) {
    					break;
    				}
    
    				// 投稿オブジェクトの存在チェック
    				if ( ! is_object( $related_post ) || ! property_exists( $related_post, 'ID' ) ) {
    					continue;
    				}
    
    				$related_post_id = (int) $related_post->ID;
    
    				// 重複チェック
    				if ( ! isset( $post_ids_added[ $related_post_id ] ) ) {
    					$unique_posts[]                     = $related_post;
    					$post_ids_added[ $related_post_id ] = true;
    				}
    			}
    
    			// 最終的な投稿IDの配列を作成
    			if ( ! empty( $unique_posts ) ) {
    				$final_post_ids = wp_list_pluck( $unique_posts, 'ID' );
    
    				// IDの配列が有効かチェック
    				if ( ! empty( $final_post_ids ) && is_array( $final_post_ids ) ) {
    					// 元のクエリ引数を更新
    					$args['post__in'] = $final_post_ids;
    					$args['orderby']  = 'post__in'; // post__inの順序を保持
    
    					// tax_queryを削除(post__inを使用するため)
    					unset( $args['tax_query'] );
    				}
    			}
    		}
    
    		return $args;
    	},
    	10,
    	1
    );
    
    0
    Who liked: No user
    #145815
    アバター画像キタジマ タカシ
    参加者
    2605

    返事遅くなってすみません!

    if 文の書き換えで表示されたということで気づいたのですが、根本の原因は、ご指摘の通り snow-monkey/template-parts/content/entry/footer/footer.php では通常のクエリで関連記事の有無を判定してるのに、呼び出した related-posts.php でクエリを書き換えてるからなので、footer.php の if 文を消す修正を入れようかなと思います。

    1
    Who liked:
    #145822
    アバター画像キタジマ タカシ
    参加者
    2605

    v29.1.4 で変更を入れました。アップデートして確認をお願いします!

    1
    Who liked:
    #145826
    まーちゅう
    参加者
    390

    ありがとうございます!
    確認します。

    1
    Who liked:
    #145827
    まーちゅう
    参加者
    390

    テーマのアップデートをして確認してみました。

    前提条件として関連投稿に表示されるのは「同一のタクソノミーの記事」なので
    $args['vars']['_posts_query']->set( 'tax_query', false );
    の条件を追加しないと「同一のタクソノミーの記事が無い場合」は何も表示されない。

    上記を踏まえて、以下のコードで思った通りの表示になりました。

    <?php
    /**
     * 関連記事のクエリをカスタマイズ
     *
     * @package my-snow-monkey+
     */
    
    /**
     * 関連記事の取得クエリを操作する
     *
     * @param array $args テンプレート取得クエリ.
     * @return array テンプレート取得クエリ.
     */
    add_filter(
    	'snow_monkey_get_template_part_args_template-parts/content/related-posts',
    	function ( $args ) {
    		$_post_type = get_post_type();
    		if ( 'post' === $_post_type || 'works-and-voices' === $_post_type ) {
    			$args['vars']['_entries_layout'] = 'simple';
    		}
    		if ( 'interview' === $args['name'] ) {
    			$args['vars']['_entries_layout'] = 'carousel';
    			$args['vars']['_title']          = '他の社員を見る';
    			$args['vars']['_posts_query']->set( 'tax_query', false );
    			$args['vars']['_posts_query']->set( 'posts_per_page', 10 );
    			$args['vars']['_posts_query']->query( $args['vars']['_posts_query']->query_vars );
    		}
    		if ( 'job-posts' === $args['name'] ) {
    			$args['vars']['_entries_layout'] = 'rich-media';
    			$args['vars']['_title']          = '他の募集を見る';
    			// $args['vars']['_posts_query']->set( 'tax_query', false );
    			$args['vars']['_posts_query']->set( 'posts_per_page', 3 );
    			$args['vars']['_posts_query']->query( $args['vars']['_posts_query']->query_vars );
    
    			// 関連投稿が見つからない場合、または3件未満の場合のフォールバック処理
    			if ( $args['vars']['_posts_query']->found_posts < 3 ) {
    				$current_post_id = get_the_ID();
    				if ( ! $current_post_id ) {
    					global $post;
    					$current_post_id = $post ? $post->ID : 0;
    				}
    				$args['vars']['_posts_query'] = new WP_Query(
    					array(
    						'post_type'      => 'job-posts',
    						'posts_per_page' => 3,
    						'post__not_in'   => array( $current_post_id ),
    					)
    				);
    			}
    		}
    		return $args;
    	}
    );
    

    他の方の参考になると思うので、フォールバック処理の判定条件を追記しておきます。
    (表示件数は、デフォルトのままの4件表示の場合)

    // 1: シンプルに件数のみで判定。4件未満は全てフォールバック処理するので、常に4件表示される。
    if ( $args['vars']['_posts_query']->found_posts < 4 ) {
    
    // 2: 0件の時にだけフォールバック処理。1件~3件の時はそのまま表示。
    if ( ! $args['vars']['_posts_query']->have_posts() && $args['vars']['_posts_query']->found_posts < 4 ) {
    1
    Who liked:
8件の投稿を表示中 - 1 - 8件目 (全8件中)
  • トピック「同一のタクソノミーの記事が無い場合でも関連投稿を表示させたい」には新しい返信をつけることはできません。

ドキュメント

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

ドキュメント

フォーラム

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

サポートフォーラム

よくあるご質問

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

よくあるご質問

お問い合わせ

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

お問い合わせ

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