フォーラムへの返信
-
投稿者投稿
-
固定ページなので、
post=46
じゃなくてpage_id=46
だと思うんですが、/wp-json/wp/v2/pages
で見ると商品紹介ページはpage_id=38です。
https://nokanoka.jp/?page_id=38page_id=46は、商品一覧のページのようです。
https://nokanoka.jp/?page_id=46すみません。上のウィジェットは、サイドバーがあると全幅にならないですね。
「個別投稿(記事)ページ上部」にウィジェットを表示したい のコードを以下のように修正してください。
### ウィジェットエリアを定義
add_action( 'widgets_init', function () { register_sidebar( array( 'name' => '個別投稿の上部のサイドバー', 'id' => 'my-single-top-sidebar', // ウィジェットエリアの名前 'before_widget' => '<div id="%1$s" class="c-widget %2$s">', 'after_widget' => '</div>', 'before_title' => '<h2 class="c-widget__title">', 'after_title' => '</h2>', ) ); register_sidebar( array( 'name' => 'アーカイブページ上部のサイドバー', 'id' => 'my-archive-top-sidebar', // ウィジェットエリアの名前 'description' => 'カテゴリー、タグ、日付アーカイブページの上部に表示されるウィジェットエリア', 'before_widget' => '<div id="%1$s" class="c-widget %2$s">', 'after_widget' => '</div>', 'before_title' => '<h2 class="c-widget__title">', 'after_title' => '</h2>', ) ); } );
### ウィジェットエリアを表示
add_action( 'snow_monkey_before_contents_inner', function () { // 個別投稿の場合 if ( is_single() ) { // my-single-top-sidebar ウィジェットエリアを表示 dynamic_sidebar( 'my-single-top-sidebar' ); } // アーカイブページまたは投稿一覧ページの場合 if ( is_archive() || is_home() ) { // my-archive-top-sidebar ウィジェットエリアを表示 dynamic_sidebar( 'my-archive-top-sidebar' ); } } );
投稿一覧ページは「投稿ページ上部」、それ以外のアーカイブページは「アーカイブページ上部」のウィジェットがあるので、使用してみてください。
♥ 0Who liked: No userコンテンツの最大幅550pxだと、参考サイトのように文字サイズの調整をしないと窮屈になるので、自分だったらコンテンツの最大幅はリセットして、「コンテンツの幅をスリム幅にする」の方を使うと思います。
♥ 0Who liked: No userdrop-nav.js の
window.addEventListener("resize:width", (() => n()), !1);
が原因のようです。
n()
はaria-hidden
を"true"
にしてhideDropNav
イベント飛ばしてるので幅が変わるたびに非表示になる。♥ 0Who liked: No userドロップナビが表示されている状態で、windowのリサイズをすると
<div class="l-header__drop-nav" aria-hidden="true">
になるので、ドロップナビは表示されなくなります。
そのまま下にスクロールしてもドロップナビは表示されませんが、一旦ページ最上部まで戻ってからスクロールするとドロップナビが表示されるようです。♥ 0Who liked: No user「カスタマイズ」 > 「デザイン」 > 「ヘッダー」で、一番下にある「ドロップナビゲーションにサイトロゴを表示する」にチェックを入れてみてください。
テーマのアップデートをして確認してみました。
前提条件として関連投稿に表示されるのは「同一のタクソノミーの記事」なので
$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 ) {
- 根本原因としては、
$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 user「関連記事の取得クエリを操作する」のコードを削除しても変化無しでした。
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 user - 根本原因としては、
-
投稿者投稿