-
投稿者投稿
-
2025年7月13日 1:17 AM #145799
【お使いの 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"
♥ 0Who liked: No user2025年7月14日 9:46 AM #145806以下、確認お願いします!
– 「関連記事の取得クエリを操作する」のコードを削除した場合も、「同じタクソノミー内の記事が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 )
に書き換えると、変化はありますか?♥ 0Who liked: No user2025年7月14日 9:07 PM #145808「関連記事の取得クエリを操作する」のコードを削除しても変化無しでした。
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 )
に書き換えると、表示されました。♥ 0Who liked: No user2025年7月15日 12:05 PM #145813- 根本原因としては、
$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 );
♥ 0Who liked: No user2025年7月15日 2:04 PM #1458152025年7月16日 12:12 PM #1458222025年7月16日 2:02 PM #1458262025年7月16日 3:02 PM #145827テーマのアップデートをして確認してみました。
前提条件として関連投稿に表示されるのは「同一のタクソノミーの記事」なので
$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 ) {
- 根本原因としては、
-
投稿者投稿
- トピック「同一のタクソノミーの記事が無い場合でも関連投稿を表示させたい」には新しい返信をつけることはできません。