1. カスタム投稿タイプ・タクソノミーのSEO課題とは?
WordPressでは「ニュース」「イベント」「商品」など、独自の投稿タイプ(カスタム投稿タイプ:CPT)を作成できます。
また、「ブランド」「ジャンル」「地域」などのカスタムタクソノミー(独自分類)も自由に追加可能です。
しかし、これらのカスタム投稿タイプやタクソノミーアーカイブには、SEO上の以下の課題があります。
- 薄いコンテンツページが増えやすい
投稿数が少ないターム(分類単位)や、アーカイブの最終ページに投稿がほとんどないページができやすいです。 - ページネーション対応が不十分
2ページ目以降で適切なcanonicalタグが設定されていないと、検索エンジンから重複コンテンツとみなされる恐れがあります。 - 重複コンテンツによる評価分散
同じような内容が複数のURLに存在すると、検索エンジンが評価対象に迷い、SEO全体の評価が下がる可能性があります。
2. canonicalタグの適切な設定ポイント
canonicalタグは検索エンジンに「正規ページのURL」を伝える重要な役割を持ちます。
- カスタム投稿タイプ・タクソノミーの基本URLを正確に指定する
例:https://example.com/news/
やhttps://example.com/brand/apple/
- ページネーションがある場合はページ番号付きURLも指定する
例:https://example.com/news/page/2/
やhttps://example.com/brand/apple/page/2/
これにより、検索エンジンは「複数ページはそれぞれ独立したページ」と認識し、重複コンテンツ判定を防げます。
3. noindex制御の重要性と実装のコツ
投稿数が少なく内容が薄いページは、検索結果に表示させないほうがサイト全体の評価維持に役立ちます。
- 投稿数が3件未満のタームページやカスタム投稿タイプアーカイブには noindex を付与
- ページネーションの最終ページで投稿数が1件以下のときも noindex を指定
空に近いページや意味の薄いページを検索結果から除外し、薄いコンテンツによる評価分散を防ぎます。
4. カスタム投稿タイプアーカイブのSEO最適化
主な対応ポイント
- canonicalタグはアーカイブの基本URLとページ番号付きURLを正確に出力
- 投稿数3件未満のアーカイブはnoindex付与で検索除外
- ページネーション最終ページで投稿数が1件以下のページもnoindex
サンプルコード(functions.phpに追加可能)
add_action('wp_head', 'custom_seo_tags_cpt_archive', 1);
function custom_seo_tags_cpt_archive() {
if (is_post_type_archive()) {
output_canonical_for_cpt_archive();
output_noindex_for_cpt_or_paged();
}
}
function output_canonical_for_cpt_archive() {
$post_type = get_query_var('post_type');
$base_url = get_post_type_archive_link($post_type);
if (is_paged()) {
$paged = max(1, get_query_var('paged'));
if ($paged > 1) {
$canonical_url = trailingslashit($base_url) . 'page/' . $paged . '/';
} else {
$canonical_url = $base_url;
}
} else {
$canonical_url = $base_url;
}
echo '<link rel="canonical" href="' . esc_url($canonical_url) . '">' . "\n";
}
function output_noindex_for_cpt_or_paged() {
global $wp_query;
if (is_post_type_archive() && $wp_query->found_posts < 3) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
return;
}
if (is_paged()) {
$total_posts = $wp_query->found_posts;
$posts_per_page = get_query_var('posts_per_page');
$current_page = max(1, get_query_var('paged'));
$total_pages = $wp_query->max_num_pages;
if ($current_page < $total_pages) {
$posts_on_this_page = $posts_per_page;
} elseif ($current_page === $total_pages) {
$posts_on_this_page = $total_posts - $posts_per_page * ($total_pages - 1);
} else {
$posts_on_this_page = 0;
}
if ($posts_on_this_page <= 1) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
}
}
}
5. カスタムタクソノミーアーカイブのSEO最適化
主な対応ポイント
- canonicalタグはタームの基本URLおよびページ番号付きURLを正しく出力
- 投稿数3件未満のタームはnoindexで評価分散防止
- ページネーション最終ページで投稿数1件以下はnoindex指定
完全版サンプルコード
add_action('wp_head', 'custom_seo_tags_custom_taxonomy_archive', 1);
function custom_seo_tags_custom_taxonomy_archive() {
if (is_tax()) {
output_canonical_for_custom_taxonomy_archive();
output_noindex_for_taxonomy_or_paged();
}
}
function output_canonical_for_custom_taxonomy_archive() {
$term = get_queried_object();
if (!$term || !isset($term->taxonomy)) {
return;
}
$base_url = get_term_link($term);
if (is_wp_error($base_url)) {
return;
}
if (is_paged()) {
$paged = max(1, get_query_var('paged'));
if ($paged > 1) {
$canonical_url = trailingslashit($base_url) . 'page/' . $paged . '/';
} else {
$canonical_url = $base_url;
}
} else {
$canonical_url = $base_url;
}
echo '<link rel="canonical" href="' . esc_url($canonical_url) . '">' . "\n";
}
function output_noindex_for_taxonomy_or_paged() {
global $wp_query;
if (is_tax() && $wp_query->found_posts < 3) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
return;
}
if (is_paged()) {
$total_posts = $wp_query->found_posts;
$posts_per_page = get_query_var('posts_per_page');
$current_page = max(1, get_query_var('paged'));
$total_pages = $wp_query->max_num_pages;
if ($current_page < $total_pages) {
$posts_on_this_page = $posts_per_page;
} elseif ($current_page === $total_pages) {
$posts_on_this_page = $total_posts - $posts_per_page * ($total_pages - 1);
} else {
$posts_on_this_page = 0;
}
if ($posts_on_this_page <= 1) {
echo '<meta name="robots" content="noindex,follow">' . "\n";
}
}
}
6. カスタム投稿タイプ単一ページのSEO最適化設計
なぜ個別管理が必要か?
- 投稿タイプごとに公開制御やnoindex例外が異なることが多い
- 専用テンプレートを用いて管理しやすくなる
- 構造化データやカスタムSEOタグなど細かな制御が可能
設計ポイント
項目 | 内容 |
---|---|
対象ページ | is_singular('カスタム投稿タイプスラッグ') で判定 |
canonical | 投稿のパーマリンクURLを正規URLとして出力 |
noindex | 非公開・下書き・特定条件でnoindex指定 |
拡張性 | 投稿タイプごとに条件分岐やカスタムタグを追加可能 |
実装例(functions.phpに追加可能)
add_action('wp_head', 'custom_seo_tags_for_custom_single', 1);
function custom_seo_tags_for_custom_single() {
// 管理したいカスタム投稿タイプスラッグを配列で指定(例: 'event', 'product')
$custom_post_types = ['event', 'product'];
foreach ($custom_post_types as $cpt) {
if (is_singular($cpt)) {
global $post;
// 非公開・下書きは noindex
if ($post->post_status !== 'publish') {
echo '<meta name="robots" content="noindex,follow">' . "\n";
return;
}
// 例: 特定投稿IDや条件で noindex 指定も可能(必要に応じて追記)
// canonical は投稿URLを指定
$canonical_url = get_permalink($post);
echo '<link rel="canonical" href="' . esc_url($canonical_url) . '">' . "\n";
// 投稿タイプ固有のタグをここに追加可能
return;
}
}
}
7. まとめ
カスタム投稿タイプやカスタムタクソノミーはWordPressの強力な機能です。
しかし、SEO対策には専用のメタタグ制御が欠かせません。
アーカイブページではcanonicalタグを正しくページネーション対応し、薄いコンテンツはnoindexで評価分散を防ぎましょう。
単一投稿ページでは投稿タイプごとの公開状態に応じたnoindex制御と正確なcanonical指定が必要です。
今回ご紹介した設計例とサンプルコードを活用すれば、SEO課題を大幅に軽減し、検索エンジンからの評価安定・向上につながります。
7-1. SEO対策のご相談について
カスタム投稿タイプやカスタムタクソノミーを活用している方は、ぜひ本記事を参考にSEO設計を見直してみてください。
もし具体的なコードのカスタマイズや運用のご相談がありましたら、お気軽にお問い合わせください。
専門スタッフがあなたのサイトのSEO強化を全力でサポートいたします。