WordPressでカテゴリ別にdescriptionを出し分ける方法【All in One SEO対応・サンプルコード付き】

SEO対策の基本でもある「meta description」。
WordPressではAll in One SEO(AIOSEO)プラグインを使えばdescriptionの管理ができますが、
「投稿ごとにカテゴリに応じて内容を変えたい」と思ったことはありませんか?

この記事では、特定のカテゴリに属する投稿だけdescriptionをカスタムフィールドから生成し、
それ以外は本文から自動抜粋する方法を、サンプルコード付きで解説します。

想定シナリオ

  • WordPress + AIOSEO を使用中
  • 投稿ページで表示する description を柔軟に制御したい
  • カテゴリごとに下記のような分岐を実現したい:
カテゴリ使用するフィールド内容
newscustom_excerpt投稿の要約
companycompany_name, company_location, company_message3つの項目を結合して紹介文に
eventevent_summaryイベント概要を抜粋
その他本文本文冒頭から120文字を自動生成

事前準備:必要なカスタムフィールドを用意

Advanced Custom Fields(ACF)などを使って、
各投稿に必要なカスタムフィールドを追加しておきましょう。

  • custom_excerpt(newsカテゴリ用)
  • company_name, company_location, company_message(companyカテゴリ用)
  • event_summary(eventカテゴリ用)

実装コード(functions.php)

以下のコードを functions.php に追加するだけで、投稿のカテゴリごとにdescriptionが動的に切り替わります。

function my_change_description( $description ) {
global $area_description;

if ( is_category() ) {
// カテゴリーページの処理
$cat = get_queried_object();
$cat_id = $cat->term_id;
$cat_name = $cat->cat_name;
$cat_custom_description = get_term_meta( $cat_id, 'cat_description_self', true );

if ( $cat_custom_description ) {
$description = $cat_custom_description;
} else {
$description = $cat_name . '一覧。' . $area_description;
}

} elseif ( is_single() ) {
$post_id = get_the_ID();
$custom_description = get_post_meta( $post_id, '_aioseo_description', true );

if ( $custom_description ) {
$description = $custom_description;

} else {
$categories = get_the_category( $post_id );
$slugs = wp_list_pluck( $categories, 'slug' );

if ( in_array( 'news', $slugs, true ) ) {
// newsカテゴリ用カスタム抜粋
$description = get_post_meta( $post_id, 'custom_excerpt', true );

} elseif ( in_array( 'company', $slugs, true ) ) {
// companyカテゴリ用複数フィールド結合
$name = get_post_meta( $post_id, 'company_name', true );
$location = get_post_meta( $post_id, 'company_location', true );
$message = get_post_meta( $post_id, 'company_message', true );
$description = "{$name}({$location})|{$message}";

} elseif ( in_array( 'event', $slugs, true ) ) {
// eventカテゴリ用
$description = get_post_meta( $post_id, 'event_summary', true );

} else {
// それ以外は本文から抜粋
$content = get_post_field( 'post_content', $post_id );
$content = strip_tags( $content );
$content = preg_replace( '/\s+/', ' ', $content );
$description = $content;
}

// 共通:120文字制限
$description = strip_tags( $description );
if ( mb_strlen( $description, 'UTF-8' ) > 120 ) {
$description = mb_substr( $description, 0, 120, 'UTF-8' ) . '…';
}
}
}

return $description;
}
add_filter( 'aioseo_description', 'my_change_description' );

出力例

投稿カテゴリ:company の場合

カスタムフィールド入力

  • company_name: 株式会社フタバ
  • company_location: 横浜市南区
  • company_message: 地域密着の葬儀サービスを提供しています。

➡ 出力される description:

株式会社フタバ(横浜市南区)|地域密着の葬儀サービスを提供しています。

注意点と補足

  • カスタムフィールドが空だった場合は description が空にならないよう、必要に応じてフォールバック処理を追加してください。
  • カテゴリ判定は slug(スラッグ)で行っています。スラッグは WordPress のカテゴリ編集画面で確認できます。
  • get_post_meta() は ACF フィールドにも対応しています。ACFを使っている場合は get_field() に書き換えてもOKです。

まとめ

カテゴリ別に description を出し分けることで、よりSEOに最適化されたページを作成できます。
特に情報の種類が明確に分かれているサイトでは、検索結果でのクリック率向上も期待できます。

AIOSEOのdescriptionフィルターを活用して、投稿内容に最適な説明文を動的に制御していきましょう!