日付ベースのパーマリンク設定(スラッグ版)

  • 今日はギー杉に入居希望者が京都から一人見学にきて、明後日入居することになった。これでギー杉は空きがあと一人になった。ギー丸子はあと二人だけど、こちらはそのまま様子見の予定。
  • 明日は超巨大な台風並みの低気圧で大変な風邪と雨になるらしい。ダルいなぁ…。
  • 首藤さんがけっこう見る人が見たら怒り心頭になるようなこと書いてる、すご。
    http://www.shudo.net/article/201203-biases-around-startups/
  • effy.jpのWordPressの日付ベースのパーマリンクをスラッグで作ることにした。

前回(日付ベースのパーマリンク設定(アーカイブ無効版))、日別アーカイブを無効にするのは色々と問題があることが分かったので、やはりスラッグを使ってパーマリンクを作ったほうがいい!と思い直し、今日は投稿時に日付ベースのスラッグを自動的に作るプラグインを作ってみた。

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のコードは汚くていやだなぁ。