[PHP]WordPress用のサイトマップを独自に動的生成

WordPress のサイトマップは通常プラグインを使って作るのが一般的ですが、
条件を自由に設定する必要があったり、WordPress をサブディレクトリにインストールしている場合や、
好きな階層にサイトマップを置きたい場合、プラグインだけでは実現できないことが有ります。

サイトマップの生成には以前作った SitemapGenerator クラスを使用します。
まずはそちらを参考に sitemap_generator.php を用意して下さい。

<?php
// wp-load.php を読み込む(環境に応じて書き換えて下さい)
require_once __DIR__ . '/../wordpress/wp-load.php';

require_once __DIR__ . '/sitemap_generator.php';

$sitemap = new SitemapGenerator();

// 取得する記事の設定
$args = array(
	'posts_per_page'   => -1, // すべての記事
	'offset'           => 0,
	'category_name'    => '',
	'orderby'          => 'post_date', // 投稿順
	'order'            => 'DESC',
	'include'          => '',
	'exclude'          => '',
	'meta_key'         => '',
	'meta_value'       => '',
	'post_type'        => ['post', 'page'],	// ブログ記事と固定ページ
	'post_mime_type'   => '',
	'post_parent'      => '',
	'post_status'      => 'publish', // 公開されている記事のみ
	'suppress_filters' => false
);

// WordPress ホームページを登録
$datetime1 = new DateTime(get_lastpostmodified());
$home = array(
	'loc' => home_url(),
	'last_mod' => $datetime1->format('c'),
	'changefreq' => 'daily',
	'priority' => 1.0
);
$sitemap->add($home);

// 投稿と固定ページを登録
$posts = get_posts( $args );

foreach($posts as $post){
    $permalink = get_permalink($post->ID);
    if($permalink === false) $permalink = $post->guid;
    $datetime2 = new DateTime($post->post_modified);
    $param = array(
        'loc' => $permalink,
        'lastmod' => $datetime2->format('c'),
        'changefreq' => 'monthly',
        'priority' => 0.5
    );
    $sitemap->add($param);
}

$sitemap->generate();
exit;

「wp-load.php」は WordPress のフォルダ内にあるファイルで、これを読み込むと WordPress の関数が利用できるようになります。
設置場所の環境に合わせて正しいファイルパスに書き換えて下さい。

「http://example.com/sitemap/index.php」のように配置しておけば、「http://example.com/sitemap」にアクセスした時、自動的にサイトマップが生成され、XML として表示されます。
もしアクセスが頻繁で負荷が高いようなら generate() にファイルパスを渡して sitemap.xml としてファイルに保存しておくのも良いと思います。

WordPress シンタックスハイライト

新しくプログラミング系のブログをはじめるにあたって、
ソースコードを見やすく表示する必要があったので、
WordPressのプラグイン「Crayon Syntax Highlighter」と
Syntax Hightlighter for WordPress
試して見ることにしました。

どちらもカラーリングをテーマの中から簡単に設定できるので便利です。