フォーラムへの返信
-
投稿者投稿
-
テーマのアップデートをして確認してみました。
前提条件として関連投稿に表示されるのは「同一のタクソノミーの記事」なので
$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こんにちは。
トップページ以外の固定ページや投稿、アーカイブページのヘッダーにあるロゴのタグをdivからh1に変更したい。
ということですが、その場合、
c-site-branding__title
とc-entry__title
の両方が h1 タグになりますが、あえてそうしたいということでしょうか?
この場合、致命的なペナルティを受けるわけではありませんが、SEOのベストプラクティスとは言えません。
理由は以下の通りです。- h1タグの役割が希薄化する
検索エンジンに対して、そのページに最も重要な見出しが2つあるという、曖昧なシグナルを送ってしまいます。「サイト名」と「そのページの固有タイトル」のどちらが本当に重要なのか、判断を迷わせる可能性があります。 - サイト全体で同じh1タグが重複する
サイトロゴの h1 は、サイト内のどのページでも同じ内容(サイト名)になります。これにより、例えば「会社概要」のページも、「お問い合わせ」のページも、「(サイト名)」という h1 を持つことになり、各ページの独自性が薄れてしまいます。ページの主題とは関係のない h1 が全ページに存在することになります。 - ページの主要なテーマが伝わりにくい
検索エンジンは、そのページが「何について書かれているか」を h1 タグから強く読み取ろうとします。
ページ固有のタイトル(例:「美味しいカルボナーラの作り方」)だけが h1 であればテーマは明確ですが、そこにサイト名(例:「山田さんの料理ブログ」)の h1 が加わると、シグナルが分散してしまいます。 - アクセシビリティ的にもマイナス
支援技術(スクリーンリーダー)では最初の h1 を重視します。また、アクセシビリティやマークアップ評価ツールで指摘されやすくなります。
何か特別な理由が無いかぎりは、Snow Monkey のデフォルトのままで使用されることをおすすめします。
補足:SEO対策として考えるのなら
上のコードそのままだとトップページのH1が「メディア上で設定した個別のALT」になってしまう<h1 class="c-site-branding__title"> <a href="https://example.com/" class="custom-logo-link" rel="home" aria-current="page"> <img width="484" height="98" src="https://example.com/wp-content/uploads/2023/05/logo-horizontal.png" class="custom-logo" alt="メディア上で設定した個別のALT"> </a> </h1>
条件分岐してトップページでは、
<span class="screen-reader-text"><?php bloginfo( 'name' ); ?></span>
のようにH1にサイトネームが入るようにする必要があると思います。<h1 class="c-site-branding__title"> <a href="https://example.com/" class="custom-logo-link" rel="home" aria-current="page"> <img width="484" height="98" src="https://example.com/wp-content/uploads/2023/05/logo-horizontal.png" class="custom-logo" alt="メディア上で設定した個別のALT"> <span class="screen-reader-text"><?php bloginfo( 'name' ); ?></span> </a> </h1>
/** * WordPressのコア関数 the_custom_logo() が使用する * wp_get_attachment_image_attributes フィルターを利用して * サイトロゴのALT属性をカスタマイズします。 */ add_filter( 'wp_get_attachment_image_attributes', function ( $attr, $attachment ) { // カスタムロゴのIDを取得 $custom_logo_id = get_theme_mod( 'custom_logo' ); // 現在処理中の画像がサイトロゴかどうか確認 if ( $custom_logo_id && $attachment->ID === (int) $custom_logo_id ) { // メディアライブラリで設定されたALT属性を取得 $custom_alt = get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true ); // カスタムALT属性が存在する場合は、それを使用 if ( ! empty( $custom_alt ) ) { $attr['alt'] = $custom_alt; } } return $attr; }, 10, 3 );
こちらのコードを My Snow Monkey に追加すれば、メディアに設定した代替テキストと入れ替えることが出来ますが、SEO目的ならトップページの
H1
をどうするか?もう少し考える必要がありそうです。マニュアルの通りです。
GTM-〇〇〇〇〇〇〇〇 を入力して公開をクリックすると、テーマ側で自動的に出力してくれます。
個別に残す場合
/** * YouTube と LINE だけを残す */ function my_customize_sns_accounts( $accounts ) { $custom_accounts = array(); // YouTube と LINE だけを保持 if ( isset( $accounts['youtube'] ) ) { $custom_accounts['youtube'] = $accounts['youtube']; } if ( isset( $accounts['line'] ) ) { $custom_accounts['line'] = $accounts['line']; } return $custom_accounts; } add_filter( 'inc2734_wp_profile_box_sns_accounts', 'my_customize_sns_accounts', 99 );
こちらの方法ではどうでしょうか?
snow_monkey_template_part_render_<slug>
snow_monkey_pre_template_part_render_<slug>
のどちらかのフィルターフックを使用されてはどうでしょうか?/** * @param $html テンプレートパーツの出力HTML * @param $name テンプレートパーツの名前 * @param $vars テンプレートパーツのリクエスト配列 */ add_filter( 'snow_monkey_template_part_render_template-parts/loop/entry-summary/title/title', function( $html ) { $html = str_replace( '書き換え前の文字列', '書き換え後の文字列', $html ); return $html; }, 10 );
/** * @param $html テンプレートパーツの出力HTML * @param $name テンプレートパーツの名前 * @param $vars テンプレートパーツのリクエスト配列 */ add_filter( 'snow_monkey_pre_template_part_render_template-parts/loop/entry-summary/title/title', function( $html ) { return 'New HTML'; }, 10 );
- 根本原因としては、
-
投稿者投稿