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組み込みのサイトマップと競合している
- カスタム投稿タイプの
publicがfalseになっており、サイトマップから自動的に除外されている 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_entryでlastmodを追加、③カスタムURLはadd_rewrite_rule()+template_redirectで独自サイトマップXMLを生成・priorityとlastmodを含める、④SEOプラグインとの競合はwp_sitemaps_enabledフィルターで切り替え・robots_txtフィルターでサイトマップURLをSitemap:行に追加、⑤wp_sitemaps_max_urlsでURL数制限・wp_sitemaps_posts_query_argsで下書き/noindex除外・save_postフックでキャッシュクリアの手順で解決します。