メインコンテンツへ移動

まーちゅう

フォーラムへの返信

15件の投稿を表示中 - 1 - 15件目 (全256件中)
  • 投稿者
    投稿
  • まーちゅう
    参加者
    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:
    まーちゅう
    参加者
    390

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

    1
    Who liked:
    まーちゅう
    参加者
    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
    まーちゅう
    参加者
    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
    まーちゅう
    参加者
    390

    一応コードも置いておきます。

    /**
     * _title_tag タグをh1に変更
     */
    add_filter(
    	'snow_monkey_get_template_part_args_template-parts/header/site-branding',
    	function ( $args ) {
    		$args['vars']['_title_tag'] = 'h1';
    
    		return $args;
    	},
    	10,
    	1
    );
    2
    Who liked:
    まーちゅう
    参加者
    390

    こんにちは。

    トップページ以外の固定ページや投稿、アーカイブページのヘッダーにあるロゴのタグをdivからh1に変更したい。

    ということですが、その場合、c-site-branding__titlec-entry__title の両方が h1 タグになりますが、あえてそうしたいということでしょうか?
    この場合、致命的なペナルティを受けるわけではありませんが、SEOのベストプラクティスとは言えません。
    理由は以下の通りです。

    1. h1タグの役割が希薄化する
      検索エンジンに対して、そのページに最も重要な見出しが2つあるという、曖昧なシグナルを送ってしまいます。「サイト名」と「そのページの固有タイトル」のどちらが本当に重要なのか、判断を迷わせる可能性があります。
    2. サイト全体で同じh1タグが重複する
      サイトロゴの h1 は、サイト内のどのページでも同じ内容(サイト名)になります。これにより、例えば「会社概要」のページも、「お問い合わせ」のページも、「(サイト名)」という h1 を持つことになり、各ページの独自性が薄れてしまいます。ページの主題とは関係のない h1 が全ページに存在することになります。
    3. ページの主要なテーマが伝わりにくい
      検索エンジンは、そのページが「何について書かれているか」を h1 タグから強く読み取ろうとします。
      ページ固有のタイトル(例:「美味しいカルボナーラの作り方」)だけが h1 であればテーマは明確ですが、そこにサイト名(例:「山田さんの料理ブログ」)の h1 が加わると、シグナルが分散してしまいます。
    4. アクセシビリティ的にもマイナス
      支援技術(スクリーンリーダー)では最初の h1 を重視します。また、アクセシビリティやマークアップ評価ツールで指摘されやすくなります。

    何か特別な理由が無いかぎりは、Snow Monkey のデフォルトのままで使用されることをおすすめします。

    2
    Who liked:
    まーちゅう
    参加者
    390

    補足: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>
    1
    Who liked:
    まーちゅう
    参加者
    390

    カスタムタクソノミーページ && ! is_tax( 'work-all' ) の条件分岐が抜けているからではないですか?

    2
    Who liked:
    まーちゅう
    参加者
    390
    /**
     * 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 をどうするか?もう少し考える必要がありそうです。

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

    マニュアルの通りです。

    GTM-〇〇〇〇〇〇〇〇 を入力して公開をクリックすると、テーマ側で自動的に出力してくれます。

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

    一括非表示

    /**
     * すべてのSNSアカウント入力欄を削除
     */
    function my_remove_all_sns_accounts( $accounts ) {
        return array(); // 空の配列を返すことですべてのSNSアカウント入力欄を削除
    }
    add_filter( 'inc2734_wp_profile_box_sns_accounts', 'my_remove_all_sns_accounts', 99 );
    2
    Who liked:
    まーちゅう
    参加者
    390
    まーちゅう
    参加者
    390

    個別に残す場合

    /**
     * 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 );
    2
    Who liked:
    まーちゅう
    参加者
    390
    まーちゅう
    参加者
    390

    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
    );
    2
    Who liked:
15件の投稿を表示中 - 1 - 15件目 (全256件中)

ドキュメント

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

ドキュメント

フォーラム

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

サポートフォーラム

よくあるご質問

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

よくあるご質問

お問い合わせ

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

お問い合わせ

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