2026年7月30日

2026年7月30日

WordPressのサイトマップエラーを解決する方法

はじめに

WordPressの/wp-sitemap.xmlにアクセスすると404エラーになる・サイトマップにカスタム投稿タイプの記事が含まれていない・Googleサーチコンソールで「サイトマップを読み取れませんでした」エラーになる・固定ページがサイトマップから除外されているといった問題は、WordPress 5.5以降に搭載されたサイトマップAPIの仕組みを正しく理解することで解決できます。

症状・原因

  • パーマリンクが「基本」(?p=123形式)に設定されており、サイトマップのリライトルールが機能していない
  • SEOプラグイン(Yoast SEO、All in One SEO)が独自のサイトマップを生成しているが、WordPress組み込みのサイトマップと競合している
  • カスタム投稿タイプのpublicfalseになっており、サイトマップから自動的に除外されている
  • wp_sitemaps_enabledフィルターで誤ってサイトマップが無効化されている

解決手順

ステップ1:サイトマップの状態を診断する

# WordPress組み込みサイトマップを確認
wp eval "echo home_url('/wp-sitemap.xml');"

# サイトマップが有効かどうか確認
wp eval "echo function_exists('wp_sitemaps_get_server') ? 'enabled' : 'disabled';"

# パーマリンク構造を確認(基本では動作しない)
wp option get permalink_structure

# サイトマップに含まれる投稿タイプを確認
wp eval "
\$server = wp_sitemaps_get_server();
\$providers = \$server->registry->get_providers();
foreach (\$providers as \$name => \$provider) {
    echo \$name . PHP_EOL;
}
"

# リライトルールにサイトマップが含まれるか確認
wp rewrite list | grep sitemap
wp rewrite flush --hard

ステップ2:サイトマップの基本設定

// ✅ WordPress組み込みサイトマップAPIを使う(WP 5.5+)
// パーマリンク設定を「基本」以外にすれば /wp-sitemap.xml が有効になる

// ✅ サイトマップに含める投稿タイプを制御
add_filter('wp_sitemaps_post_types', function(array $post_types): array {
    // カスタム投稿タイプをサイトマップに追加
    if (post_type_exists('product')) {
        $post_types['product'] = get_post_type_object('product');
    }
    // 特定の投稿タイプを除外
    unset($post_types['attachment']); // メディアページを除外
    return $post_types;
});

// ✅ サイトマップに含めるタクソノミーを制御
add_filter('wp_sitemaps_taxonomies', function(array $taxonomies): array {
    unset($taxonomies['post_tag']);   // タグを除外
    unset($taxonomies['category']);   // カテゴリを除外(必要に応じて)
    return $taxonomies;
});

// ✅ サイトマップのURLエントリを変更(最終更新日や優先度を追加)
add_filter('wp_sitemaps_posts_entry', function(array $entry, WP_Post $post): array {
    $entry['lastmod'] = get_the_modified_date('c', $post);
    return $entry;
}, 10, 2);

ステップ3:カスタムサイトマッププロバイダーを追加

// ✅ カスタムサイトマッププロバイダーを登録
add_filter('wp_sitemaps_add_provider', function(WP_Sitemaps_Provider $provider, string $name): WP_Sitemaps_Provider {
    return $provider;
}, 10, 2);

// ✅ カスタムURLをサイトマップに追加するシンプルな方法
// wp-sitemap.xml とは別にカスタムサイトマップを作成
add_action('init', function(): void {
    add_rewrite_rule('^custom-sitemap\.xml$', 'index.php?custom_sitemap=1', 'top');
    add_rewrite_tag('%custom_sitemap%', '1');
});

add_action('template_redirect', function(): void {
    if (!get_query_var('custom_sitemap')) {
        return;
    }

    header('Content-Type: application/xml; charset=UTF-8');
    header('X-Robots-Tag: noindex');

    $urls = [];

    // カスタム固定ページ
    $urls[] = ['loc' => home_url('/about/'), 'lastmod' => '2024-01-01', 'priority' => '0.8'];
    $urls[] = ['loc' => home_url('/contact/'), 'lastmod' => '2024-01-01', 'priority' => '0.7'];

    // カスタム投稿タイプのURL
    $posts = get_posts(['post_type' => 'product', 'posts_per_page' => -1, 'fields' => 'ids']);
    foreach ($posts as $id) {
        $urls[] = [
            'loc'     => get_permalink($id),
            'lastmod' => get_the_modified_date('c', $id),
            'priority' => '0.6',
        ];
    }

    echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";
    echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
    foreach ($urls as $url) {
        echo '<url>' . "\n";
        echo '<loc>' . esc_url($url['loc']) . '</loc>' . "\n";
        if (!empty($url['lastmod'])) {
            echo '<lastmod>' . esc_html($url['lastmod']) . '</lastmod>' . "\n";
        }
        echo '</url>' . "\n";
    }
    echo '</urlset>';
    exit;
});

ステップ4:SEOプラグインとの競合解消

// ✅ Yoast SEOのサイトマップを使う場合はWP組み込みを無効化
add_filter('wp_sitemaps_enabled', function(): bool {
    // Yoast SEO が有効な場合は組み込みサイトマップを無効化
    return !defined('WPSEO_VERSION');
});

// ✅ All in One SEOとの共存設定
add_filter('aioseo_sitemap_priority', function(float $priority, int $post_id): float {
    // 重要なページの優先度を上げる
    if (in_array($post_id, [1, 2, 3], true)) {
        return 1.0;
    }
    return $priority;
}, 10, 2);

// ✅ サイトマップインデックスにカスタムサイトマップを追加
add_filter('wp_sitemaps_index_entry', function(array $sitemap_entry, string $object_type, string $object_subtype, int $page): array {
    return $sitemap_entry;
}, 10, 4);

// ✅ robots.txt にサイトマップURLを追加
add_filter('robots_txt', function(string $output): string {
    $sitemap_url = home_url('/wp-sitemap.xml');
    if (!str_contains($output, 'Sitemap:')) {
        $output .= "\nSitemap: " . esc_url($sitemap_url) . "\n";
    }
    return $output;
});

ステップ5:サイトマップのパフォーマンス最適化

// ✅ サイトマップの1ページあたりのURL数を制限
add_filter('wp_sitemaps_max_urls', function(int $max_urls, string $object_type): int {
    // デフォルト2000から変更(Google推奨: 50000以下)
    return $object_type === 'post' ? 1000 : 500;
}, 10, 2);

// ✅ サイトマップから下書きや非公開投稿を確実に除外
add_filter('wp_sitemaps_posts_query_args', function(array $args, string $post_type): array {
    $args['post_status']     = 'publish';
    $args['meta_query'][]    = [
        'key'     => '_noindex',  // noindexメタが設定された投稿を除外
        'compare' => 'NOT EXISTS',
    ];
    return $args;
}, 10, 2);

// ✅ サイトマップキャッシュを手動クリア(投稿更新時)
add_action('save_post', function(int $post_id): void {
    if (wp_is_post_revision($post_id) || wp_is_post_autosave($post_id)) {
        return;
    }
    // WP組み込みサイトマップのキャッシュをクリア
    delete_transient('wp_sitemap_post_' . get_post_type($post_id) . '_1');
});

注意事項

  • WordPress組み込みのサイトマップ(/wp-sitemap.xml)はパーマリンク設定が「基本」(?p=123形式)の場合には機能しません。サイトマップを使用するには、管理画面の「設定 > パーマリンク設定」で「投稿名」などのパーマリンク構造に変更してください
  • YoastSEOやAll in One SEOなどのSEOプラグインは独自のサイトマップ機能を持っており、WordPress組み込みのサイトマップと重複する場合があります。両方が有効になっているとGoogleが混乱する可能性があるため、wp_sitemaps_enabledフィルターでどちらかを無効化してください

まとめ

WordPressサイトマップエラーの解決は①パーマリンク設定が「基本」でないか確認・wp_sitemaps_get_server()でプロバイダー確認・wp rewrite flushでルールを更新、②wp_sitemaps_post_typesフィルターでカスタム投稿タイプを追加・attachmentを除外・wp_sitemaps_posts_entrylastmodを追加、③カスタムURLはadd_rewrite_rule()+template_redirectで独自サイトマップXMLを生成・prioritylastmodを含める、④SEOプラグインとの競合はwp_sitemaps_enabledフィルターで切り替え・robots_txtフィルターでサイトマップURLをSitemap:行に追加、⑤wp_sitemaps_max_urlsでURL数制限・wp_sitemaps_posts_query_argsで下書き/noindex除外・save_postフックでキャッシュクリアの手順で解決します。

お気軽にご相談ください

お見積りへ お問い合わせへ