この投稿では、WordPressのWP_Queryを使用して投稿データを取得して、管理画面からサイトマップをボタンを押したら作成できるようにする手順の備忘記録です。サイトマップとしての必要最低限の項目を作成しています。プラグインを使用すると楽ですが、全体的に重くなることが多いので今回考えてみました。
サイトマップのメニュー項目を管理画面へ追加する。
先ずは、add_menu_pageの関数を使用して、管理画面メニューへサイトマップのメニュー項目を追加します。編集するファイルはテーマ内のfunctions.phpです。
add_action('admin_menu', 'sitemap_add_menu_items'); function sitemap_add_menu_items() { add_menu_page('サイトマップ', 'サイトマップ', 'manage_options', 'sitemap_list', 'sitemap_render_page', 'dashicons-location'); }
サイトマップのメニュー画面の作成
続いてサイトマップの画面を作成します。関数名(function sitemap_render_page( )の部分)はadd_menu_pageの関数で指定した、5番目のパラメータと同じ文字列を指定する必要があります。wp_nonce_fieldの関数はフォームの内容が現在のサイトからPOSTされたかの認証に使用します。編集するファイルはテーマ内のfunctions.phpです。
function sitemap_render_page(){ ?> <div class="wrap"> <div id="icon-users" class="icon32"><br/></div> <h2 style="margin-bottom: 48px;">サイトマップ作成・変更</h2> <div style="margin-bottom: 48px;"> <p>・別ウインドウでsitemapを開き確認できます。</p> <a href="<?php echo home_url('/sitemap.xml') ?>" target="_blank" class="button button-secondary">サイトマップを確認</a> </div> <div style="margin-bottom: 48px;"> <p>・別ウインドウでGoogle Search Consoleを開きます。</p> <a href="//www.google.com/webmasters/tools/home?hl=ja" target="_blank" class="button button-secondary">Search Consoleへ</a> </div> <div style="margin-bottom: 48px;"> <p>・投稿や固定ページを新規追加した場合にサイトマップを作成・更新します。</p> <form id="sitemap-form" method="post" action="#"> <?php wp_nonce_field(wp_create_nonce(__FILE__), 'le_nonce'); ?> <?php submit_button('サイトマップを作成または更新', 'primary', 'submit', false); ?> </form> </div> </div> <?php }
POST後の機能の作成
最後にサイトマップの画面からサイトマップを作成または更新ボタンが押されてPOSTされた後の機能を作成します。編集するファイルはテーマ内のfunctions.phpでsitemap_render_pageの関数内です。実際の動作確認時は上コードの2行目?>の前に挿入をしています。
nonceを確認して不一致なら終了。WP_Queryのパラメータを指定。サイトマップのHTMLを作成。fopenでファイルを開くか、なければ新規作成。fwriteで書き込み。最後にfcloseで閉じる流れです。
if ($_SERVER['REQUEST_METHOD'] === 'POST') { $le_nonce = isset($_POST['le_nonce']) ? $_POST['le_nonce'] : null; if (!wp_verify_nonce($le_nonce, wp_create_nonce(__FILE__))) { wp_die('Die'); } $args = array( 'posts_per_page' => -1, //全件取得 'post_type' => array('page', 'post'), //固定ページと投稿を指定 'post_status' => 'publish', //公開されているものだけを指定 'orderby' => 'modified', //更新日時 'order' => 'DESC' //降順 ); $query = new WP_Query($args); $sitemap = '<?xml version="1.0" encoding="UTF-8"?>'; $sitemap .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'; if ($query->have_posts()) { while ($query->have_posts()) { $query->the_post(); $sitemap .= '<url>'; $sitemap .= '<loc>' . get_permalink() . '</loc>'; $sitemap .= '<lastmod>' . get_the_modified_date('Y-m-d') . '</lastmod>'; $sitemap .= '<changefreq>monthly</changefreq>'; if (get_post_type() === 'page') { $sitemap .= '<priority>0.5</priority>'; } else { $sitemap .= '<priority>1.0</priority>'; } $sitemap .= '</url>'; } $sitemap .= '</urlset>'; } if (!$fp = fopen(ABSPATH . "sitemap.xml", 'w')) { wp_die('ファイルが開けませんでした。'); } if (!fwrite($fp, $sitemap)) { wp_die('ファイルに書き込みができませんでした。'); } if (fclose($fp)) { echo '<script>alert(\'サイトマップの作成・更新に成功しました。\');</script>'; } else { echo '<script>alert(\'サイトマップの作成・更新に失敗しました。\');</script>'; } }
上手くできていれば下の画像のようになります。

priorityは固定ページと投稿で変更しただけのざっくりな感じです。サイトマップを手動で作るよりは大分楽でした。作成したサイトマップはGoogle Search Console忘れずに送信しましょう!