Simple XML sitemap
標準準拠のhreflang XMLサイトマップを生成してSEOを強化し、IndexNowやサイトマップpingプロトコルを通じてウェブサイトの変更を検索エンジンに通知し、カスタムサイトマップタイプを開発するためのフレームワークを提供します。
simple_sitemap
インストール
composer require 'drupal/simple_sitemap:^4.2'
composer require 'drupal/simple_sitemap:^4.1'
概要
Simple XML Sitemapは、Googleのhreflang標準に準拠したXMLサイトマップを生成する包括的なSEOモジュールです。Node、Taxonomy Term、Menu Link、User、Commerce Productなどの貢献モジュールのEntityタイプを含む、ほとんどのDrupalコンテンツEntityタイプを標準でインデックス化します。
このモジュールは、異なるタイプと設定を持つ複数のサイトマップインスタンス、多言語hreflangサポート、画像のインデックス化、カスタムリンク、サブモジュールを通じたViewsとの統合をサポートしています。サイトマップの生成は、大規模サイトで最適なパフォーマンスを得るためにQueue処理を介して実行されます。
2つのオプションのサブモジュールが機能を拡張します:Simple XML Sitemap (Search engines)は、IndexNowプロトコルと従来のサイトマップpingを介した検索エンジンへの自動送信を可能にし、Simple XML Sitemap (Views)は、引数を持つViewsのインデックス化のためにViewsモジュールとの統合を提供します。
このモジュールは、Entityとカスタムリンクの設定、サイトマップの生成、カスタムSitemap GeneratorおよびURL Generatorプラグインによるプラグイン拡張性など、プログラムによるサイトマップ管理のための広範なAPIメソッドを提供します。
Features
- 多言語サイト向けにGoogleのhreflang仕様に従った標準準拠のXMLサイトマップを生成
- Node、Taxonomy Term、Menu Link、User、Commerce Productを含むすべてのコンテンツEntityタイプをインデックス化
- 一意のURLでアクセス可能な異なる設定を持つ複数のサイトマップインスタンスをサポート
- 設定可能な間隔でのCronによる自動サイトマップ生成
- 管理UI、Drushコマンド、またはプログラムAPIを介した手動生成
- 最大リンク数のしきい値を超えた場合の自動インデックス生成によるサイトマップのチャンク化
- Entityタイプごと、Bundleごと、Entityごとのインデックス含有、優先度、変更頻度、画像含有の上書き設定
- サイトマップに任意の内部パスを追加するためのカスタムリンクサポート
- サイトマップブラウジング用のソート可能な列を持つ人間が読めるXSLスタイルシート
- コンテンツ変更の即時検索エンジン通知のためのIndexNowプロトコルサポート
- 検索エンジンへの従来のサイトマップping送信(非推奨)
- 引数を持つViewsページを含むViewsのインデックス化のための統合
- カスタムサイトマップジェネレーターとURLジェネレーター用の拡張可能なプラグインアーキテクチャ
- 数十万のリンクを持つ大規模サイトを処理するためのQueueベースの生成
- Queueアイテムごとのエンティティ数や生成時間設定を含むパフォーマンスチューニングオプション
- 重複リンクの検出と削除
- 未翻訳コンテンツをスキップするオプション付きの言語固有リンク生成
- サイトマップ生成とQueue管理のためのDrushコマンド
Use Cases
コンテンツウェブサイトの基本的なSEOセットアップ
ArticleとPageコンテンツタイプのサイトマップサポートを有効化します。/admin/config/search/simplesitemap/entitiesに移動し、Content (node) Entityタイプを有効化してから「設定」をクリックします。各コンテンツタイプで「インデックス」にチェックを入れ、適切な優先度を設定します(重要なランディングページは1.0、通常のコンテンツは0.5)。サイトマップはCron中に自動的に生成され、/sitemap.xmlでアクセスできます。
hreflang付き多言語サイト
多言語サイトでは、モジュールはすべての翻訳のhreflang代替URLを自動的に生成します。設定で「存在しない翻訳をスキップ」を有効にすると、コンテンツが実際に存在する言語のリンクのみを含めます。オプションで「HTMLからhreflangマークアップを削除」を有効にすると、Googleが推奨するようにHTMLかサイトマップのどちらかにhreflangを持つことができます(両方は非推奨)。
大規模サイトのパフォーマンス最適化
数十万のエンティティを持つサイトの場合:データベースクエリを減らすために設定で「Queueアイテムごとのエンティティ数」を200-500に増やし、より管理しやすいチャンクを作成するために「サイトマップの最大リンク数」を10000に設定し、PHPのタイムアウトが許せば「サイトマップ生成最大時間」を30秒に増やし、メモリが限られている場合は「重複リンクを除外」を無効にすることを検討してください。
IndexNowによる即時検索エンジン通知
simple_sitemap_enginesサブモジュールを有効にし、/admin/config/search/simplesitemap/engines/settingsに移動し、「IndexNow対応エンジンに変更を送信」を有効にして、確認キーを生成します。コンテンツが作成または更新されると、検索エンジンに即座に通知されます。本番環境では、キーをsettings.phpに追加します:$settings['simple_sitemap_engines.index_now.key'] = 'your-key';
引数付きViewsのサイトマップ
simple_sitemap_viewsサブモジュールを有効にしてViewsページをインデックス化します。Viewsを編集し、Display設定に移動して「Simple XML Sitemap」設定を構成します。引数を持つViews(Taxonomy Termフィルターなど)の場合、モジュールは訪問者が使用した引数の組み合わせを追跡し、各バリエーションのサイトマップエントリを生成します。インデックス化される引数の組み合わせ数を制限するには「最大Displayバリエーション」を設定します。
異なるコンテンツタイプ用の複数サイトマップ
異なるオーディエンス向けに別々のサイトマップを作成します(例:eコマース用の製品サイトマップ、コンテンツ用のブログサイトマップ)。/admin/config/search/simplesitemap/variants/addで新しいサイトマップを追加し、Entity Bundle設定を通じてどのEntity Bundleを各サイトマップにインデックス化するかを設定します。サイトマップインデックスタイプを使用して、すべてのサイトマップを一覧表示するインデックスを作成します。
プログラムによるサイトマップ管理
Generator サービスAPIを使用してプログラムでサイトマップを管理します:$generator = \Drupal::service('simple_sitemap.generator'); Entityタイプを有効化:$generator->entityManager()->enableEntityType('commerce_product'); Bundle設定を設定:$generator->entityManager()->setSitemaps(['default'])->setBundleSettings('commerce_product', 'default', ['index' => TRUE, 'priority' => 0.8]); 再生成をトリガー:$generator->rebuildQueue()->generate();
Entity以外のページ用カスタムリンク
Entityではないカスタム内部パスをサイトマップに追加します。/admin/config/search/simplesitemap/customに移動し、「/about-us 0.8 monthly」(パス、優先度、changefreq)のようなパスを入力します。プログラムでカスタムリンクを追加:$generator->customLinkManager()->setSitemaps(['default'])->add('/custom-page', ['priority' => '0.7', 'changefreq' => 'weekly']);
Tips
- XSLスタイルシートオプションを使用すると、サイトマップをソート可能な列で人間が読める形式にできます - デバッグやクライアントプレゼンテーションに便利です
- サイトマップインデックス機能を使用すると、複数のサイトマップのインデックスを作成できます - 有効にしてデフォルトに設定すると、/sitemap.xmlがすべてのサイトマップを一覧表示します
- 編集フォームでのEntityインスタンス設定により、Bundleのデフォルトを上書きできます - 特定のページを除外したり、重要なコンテンツをブーストしたりするのに便利です
- 含まれているパフォーマンステストスクリプトを実行して生成速度を測定できます:drush scr modules/simple_sitemap/tests/scripts/performance_test.php
- IndexNowは従来のサイトマップpingよりも推奨されます。単一のリクエストで複数の検索エンジンに通知し、即時インデックス化を提供するためです
- 環境同期間の永続性を向上させるために、IndexNowキーをstateではなくsettings.phpに保存することを検討してください
- モジュールは自動的にEntityアクセスを尊重します - 匿名ユーザーがアクセス可能なコンテンツのみがサイトマップに含まれます
- UIでは達成できない複雑なフィルタリングロジックにはhook_simple_sitemap_links_alter()を使用してください
- カスタムEntityタイプや外部データソースをサポートするカスタムURL Generatorプラグインを作成できます
- モジュールのQueueベースのアプローチにより、進捗を失うことなく複数のCron実行にわたって生成を続行できます
Technical Details
Admin Pages 10
/admin/config/search/simplesitemap
すべての設定済みサイトマップをステータス、生成進捗、アクションとともに一覧表示するメイン概要ページ。各サイトマップのリンク数、チャンク数、最終生成タイムスタンプを表示します。
/admin/config/search/simplesitemap/settings
生成動作、パフォーマンスチューニング、言語オプション、詳細設定を含むグローバルサイトマップ設定を構成します。
/admin/config/search/simplesitemap/entities
Entityタイプのサイトマップサポートを有効化し、各サイトマップで現在インデックス化されているBundleを表示します。
/admin/config/search/simplesitemap/entities/{entity_type_id}
Entityタイプの各Bundleのサイトマップ設定を構成します。設定は各Bundleのサイトマップごとに構成できます。
/admin/config/search/simplesitemap/custom
オプションの優先度と変更頻度設定を持つカスタム内部Drupalパスを特定のサイトマップに追加します。
/admin/config/search/simplesitemap/types
サイトマップが使用する構造とURLジェネレーターを定義するサイトマップタイプを管理します。
/admin/config/search/simplesitemap/variants/add
特定のタイプで新しいサイトマップインスタンスを作成します。
/admin/config/search/simplesitemap/types/add
特定のジェネレータープラグインで新しいサイトマップタイプを作成します。
/admin/config/search/simplesitemap/engines/settings
IndexNow即時通知と検索エンジンへのサイトマップping送信を設定します(simple_sitemap_enginesサブモジュールが必要)。
/admin/config/search/simplesitemap/views
サイトマップに含まれるViewsの概要(simple_sitemap_viewsサブモジュールが必要)。
権限 3
Hooks 9
hook_simple_sitemap_entity_process
サイトマップ生成のためにEntityが処理される前に動作します。Entityを変更したり、SkipElementExceptionをスローしてサイトマップから除外したりできます。
hook_simple_sitemap_links_alter
サイトマップチャンクが保存される前に生成されたリンクデータを変更します。サイトマップチャンクごとに生成中に呼び出されます。
hook_simple_sitemap_arbitrary_links_alter
サイトマップに任意のリンクを追加します。「arbitrary」URLジェネレータープラグインを使用するサイトマップで動作します。リンクは検証されません。
hook_simple_sitemap_attributes_alter
ドキュメント生成前にサイトマップXML属性を変更します。XML名前空間宣言の追加、変更、削除を可能にします。
hook_simple_sitemap_index_attributes_alter
ドキュメント生成前にサイトマップインデックスXML属性を変更します。
hook_simple_sitemap_url_generators_alter
URL Generatorプラグインのプロパティを変更するか、完全に削除します。
hook_simple_sitemap_sitemap_generators_alter
Sitemap Generatorプラグインのプロパティを変更するか、完全に削除します。
hook_entity_query_tag__simple_sitemap_alter
サイトマップ生成用のエンティティ取得に使用されるEntityクエリを変更します。Drupalのタグ付きクエリシステムを使用します。
hook_entity_query_tag__ENTITY_TYPE__simple_sitemap_alter
サイトマップ生成中に特定のEntityタイプのEntityクエリを変更します。
Drush Commands 2
drush simple-sitemap:generate
すべてのサイトマップを再生成するか、Queueからの生成を続行します。何もQueueに入っていない場合、まずすべてのサイトマップのQueueを再構築します。
drush simple-sitemap:rebuild-queue
既存のQueueを削除し、次回の生成用にすべてまたは特定のサイトマップの要素をQueueに追加します。
Troubleshooting 6
Entityタイプが/admin/config/search/simplesitemap/entitiesで有効になっており、Bundleがインデックス化されるよう設定されていることを確認してください。目的のBundleで「インデックス」がチェックされていることを確認してください。コンテンツが存在し、匿名ユーザーがアクセス可能であることを確認してください。Cronを実行するか、サイトマップページで手動で生成をトリガーしてください。
メモリ使用量を減らすために設定の「Queueアイテムごとのエンティティ数」を減らしてください。より小さなチャンクを作成するために「サイトマップの最大リンク数」を減らしてください。より小さなBatchを完了するために「サイトマップ生成最大時間」を減らしてください。通常Webリクエストよりも制限が高いDrush(drush ssg)での生成の実行を検討してください。
詳細設定の「デフォルトベースURL」を設定して、自動検出されたURLを上書きしてください。これは、DrupalがCorrect サイトURLを判断できないコマンドラインからCronを実行する場合に特に重要です。
/admin/config/search/simplesitemap/engines/settingsで確認キーが生成されていることを確認してください。キーファイルが/simple_sitemap_engines/index_now_key/[key]でアクセス可能であることを確認してください。エンティティがサイトマップ設定に含まれていることを確認してください。本番環境では、デプロイメント間の永続性のためにキーをsettings.phpに保存してください。
simple_sitemap_viewsサブモジュールを有効にしてください。「views」URL Generatorがサイトマップタイプに追加されていることを確認してください。Viewを編集し、Display オプションでサイトマップ設定を構成してください。引数を持つViewsの場合、インデックス化される前に訪問者がまずそれらの引数でViewにアクセスする必要があります。
詳細設定で「重複リンクを除外」を有効にしてください。重複パスを作成する可能性のあるパスエイリアスやURLリライトを確認してください。URLを変更している可能性のあるhook実装を確認してください。EntityのcanonicalURLが正しく設定されていることを確認してください。
Security Notes 4
- 「administer sitemap settings」パーミッションは管理機能のため制限付きアクセスとしてマークされています
- サイトマップはデフォルトで匿名ユーザーがアクセス可能なコンテンツのみを含みますが、カスタムhookはアクセスチェックをバイパスする可能性があります
- IndexNow確認キーは機密として扱う必要があります - 本番環境では設定ではなくsettings.phpに保存してください
- hookを介して追加されたカスタムリンクはアクセスの検証が行われません - 公開アクセス可能なコンテンツを指していることを確認してください