前回(日付ベースのパーマリンク設定(アーカイブ無効版))、日別アーカイブを無効にするのは色々と問題があることが分かったので、やはりスラッグを使ってパーマリンクを作ったほうがいい!と思い直し、今日は投稿時に日付ベースのスラッグを自動的に作るプラグインを作ってみた。
function id_from_slug($slug)
{
global $wpdb;
$post_id = $wpdb->get_var(
$wpdb->prepare("SELECT ID FROM ".$wpdb->posts.
" WHERE post_name = %s".
" AND post_type = 'post'".
" AND post_status = 'publish' LIMIT 1"
, $slug));
return $post_id;
}
function date_slug($data, $postarr)
{
if($data['post_type'] == 'post') {
$slug = $original_slug = date_i18n('Ymd', strtotime($data['post_date']));
$alt_num = 2;
while(1) {
$post_id = id_from_slug($slug);
if(!$post_id || $post_id == $postarr['ID']) {
break;
}
$slug = $original_slug."-$alt_num";
$alt_num++;
}
$data['post_name'] = $slug;
}
return $data;
}
add_filter('wp_insert_post_data', 'date_slug', 5, 2);
よりによってスラッグがすでに使われているかどうかがDBを直接いじる方法しか思いつかなかったのでこんなコードになってしまった。
wp-includes/post.php にも似たようなコードがあるんだけど再利用しにくい感じになっているので結局自分で同じようなコードを書いてしまった。WordPressのコードは汚くていやだなぁ。