カテゴリ別・投稿別にディスクリプションを動的に設定するWordPress関数

SEO対策として、各ページに最適なディスクリプションを設定することは非常に重要です。
今回ご紹介するコードでは、カテゴリや投稿内容に応じたディスクリプションを
自動生成する仕組みを解説します。
特にAll in One SEOプラグインのカスタムフィールドを活用することで、
より柔軟なディスクリプションの管理が可能になります。

カスタムディスクリプション設定のコード

以下は、投稿やアーカイブごとに異なるディスクリプションを設定するための全体的なコードです。
このコードはWordPressテーマの functions.php ファイルに追加します。

// カスタムディスクリプションを設定する関数
function my_change_description( $description ) {
    // All in One SEO のカスタムディスクリプションがあれば使用
    $aioseo_description = get_post_meta(get_the_ID(), '_aioseo_description', true);
    if (!empty($aioseo_description)) {
        // {title} プレースホルダを投稿タイトルに置き換え
        $post_title = get_the_title();
        return str_replace('{title}', $post_title, $aioseo_description);
    }

    // カテゴリのスラッグを初期化
    $a_catslug = '';
    $s_catslug = '';

    // カテゴリページの場合のディスクリプション設定
    if (is_category()) {
        $a_cats = get_queried_object();
        if (!empty($a_cats)) {
            $a_catslug = $a_cats->slug;
        }

        // カテゴリスラッグに応じたディスクリプション
        if ($a_catslug === 'news') {
            $description = 'ディスクリプションの内容が入ります。ディスクリプションの内容が入ります。ディスクリプションの内容が入ります。';
        } elseif ($a_catslug === 'voice') {
            $description = 'ディスクリプションの内容が入ります。ディスクリプションの内容が入ります。ディスクリプションの内容が入ります';
        }
        // 必要に応じて他のカテゴリのディスクリプションもここに追加

        return $description;
    }

    // 投稿ページのディスクリプション設定
    if (is_single()) {
        $post_id = get_the_ID();
        $s_cats = get_the_category();
        if (!empty($s_cats)) {
            $s_category = $s_cats[0];
            $s_catslug = $s_category->slug;
        }

        // 投稿コンテンツとカスタムフィールドの内容を取得
        $content = wp_strip_all_tags(get_post_field('post_content', $post_id));
        $voice_thoughts = get_post_meta($post_id, 'voice-thoughts', true);

        // コンテンツが空でカスタムフィールドがある場合、フィールド内容を使用
        if (empty($content) && !empty($voice_thoughts)) {
            $description = wp_trim_words(wp_strip_all_tags($voice_thoughts), 110, '...');
        } elseif (!empty($content)) {
            $description = wp_trim_words($content, 110, '...');
        }
    }

    // 年別・月別アーカイブページのディスクリプション設定
    elseif (is_year()) {
        $description = get_the_time("Y年") . 'の情報をまとめています';
    } elseif (is_month()) {
        $description = get_the_time("Y年m月") . 'の記事一覧。';
    }

    return $description;
}

// カスタムディスクリプションを All in One SEO に適用
add_filter('aioseo_description', 'my_change_description');

関数概要とカスタマイズ方法

このコードでは、WordPressの add_filter() フィルターを使用してディスクリプションを設定するカスタム関数 my_change_description() を作成しています。この関数は、投稿、アーカイブ、カテゴリなどのページタイプに応じて異なるディスクリプションを設定します。

All in One SEOのカスタムディスクリプション

最初に、All in One SEOのカスタムフィールド _aioseo_description に記載されている内容があれば、
その内容が優先的に使用されます。また、{title} のプレースホルダを投稿タイトルに置き換えることで、ページ固有の情報を含めたディスクリプションが生成されます。

$aioseo_description = get_post_meta(get_the_ID(), '_aioseo_description', true);

カテゴリページのディスクリプション設定

カテゴリページでは、カテゴリのスラッグ(URLの一部となる識別名)を使ってディスクリプションを設定しています。たとえば、スラッグが voice の場合には、「お客様の声」関連の内容が表示されるように設定されています。これにより、特定のカテゴリごとにSEO効果の高い内容を設定できます。

if ($a_catslug === 'news') {
    $description = 'ディスクリプションの内容が入ります。ディスクリプションの内容が入ります。ディスクリプションの内容が入ります。';
}

投稿ページのカスタムディスクリプション設定

シングル投稿ページでは、投稿の内容をもとにディスクリプションが生成されます。
投稿内容が空の場合、カスタムフィールド voice-thoughts の内容を切り取って使用します。
このフィールドは、特定の感想やコメントを入れるためのものであり、
SEO的に有効なディスクリプション生成に役立ちます。

if (empty($content) && !empty($voice_thoughts)) {
    $description = wp_trim_words(wp_strip_all_tags($voice_thoughts), 110, '...');
}

年・月別アーカイブページのディスクリプション

年や月のアーカイブページでは、それぞれの期間の記事一覧であることをディスクリプションに記載します。ユーザーにとっても検索エンジンにとっても、どの期間の記事かをわかりやすく表現できます。

if (is_year()) {
    $description = get_the_time("Y年") . 'の記事一覧です。地域に役立つ情報を毎月提供しています。';
}

まとめ

このコードを活用することで、WordPressサイトにおけるディスクリプション管理がより柔軟に、
かつ効率的に行えます。特定のカテゴリや投稿内容に応じたディスクリプションを自動生成することは、
SEOやUXの向上に非常に有効です。