WordPressの採番について。

記事のURLがランダムな数字であれば問題ないという場合、
記事ごとのパーマリンクの設定を%post_id%とする事は多いと思います。

しかし、この%post_id%はたしかに記事固有IDなのですがいろいろな問題があります。
ひとまず直面した問題は以下の通り

・特定の記事のURLを変えたい時があったとしても変更ができない
・サーバー移転時にパーマリンクが変わる

その為、%postname%を使用しつつ、新規投稿時のみ%post_id%が入る形ができるように頑張ってみました。

パーマリンクの修正

WordPress管理画面の
設定 -> パーマリンク設定
から%post_id%としていた部分を %postname% に変更します。

meta-boxes.phpの修正

wp-admin/includes/meta-boxes.php の post_slug_meta_box関数を編集します。
おそらく500~510行目あたりです。

[code]
function post_slug_meta_box($post) {
?>
<label class=”screen-reader-text” for=”post_name”><?php _e(‘Slug’) ?></label><input name=”post_name” type=”text” size=”13″ id=”post_name” value=”<?php echo esc_attr( $post->post_name ); ?>” />
<?php
}
[/code]

こちらを以下のように修正します。

[code]
function post_slug_meta_box($post) {
?>
<label class=”screen-reader-text” for=”post_name”><?php _e(‘Slug’) ?></label><input name=”post_name” type=”text” size=”13″ id=”post_name” value=”<?php
if(get_post_status() == ‘publish’ || get_post_status() == ‘future’ || get_post_status() == ‘draft’ ){
echo esc_attr( $post->post_name );
} else {
echo $post->ID;}
?>” />
<?php
}
[/code]

変更点はvalueの部分ですが、少し解説です。
まず条件分岐している部分ですが、get_post_status() で現在のpostの状態を取得できます。
このpost状態が「公開」「予約投稿」「下書き」の場合とそれ以外の場合で条件分岐させています。
なぜこんな条件分岐を入れているかと言うと、
すでに投稿された記事以外はあらたな番号を採番する必要がないからです。
この条件分岐がなければ、記事を更新する度に記事のパーマリンクが変更されてしまう事となります。

つまり、すでに投稿されていれば、入力されているスラッグを表示、
新規の投稿であれば自動採番 といった形です。

以上でpostnameでの自動採番は完了です

(おまけ)自動連番

試してないのですが、googleで検索したサイトなどを確認したら
get_usernumposts で そのユーザーの投稿数を+1する方法が多く見つかりました。
ただget_usernumpostsは今は非推奨、との事なのでcount_user_postsをつかう方がよさそう。
連番にしたい場合は上記のソースのecho $post->ID を echo count_user_posts(1) + 1 に変更すればOKだと思われます。
おそらく記事を完全に削除したりするとIDが狂いそうな気もしますが、、

未検証です。
[code]
function post_slug_meta_box($post) {
?>
<label class=”screen-reader-text” for=”post_name”><?php _e(‘Slug’) ?></label><input name=”post_name” type=”text” size=”13″ id=”post_name” value=”<?php
if(get_post_status() == ‘publish’ || get_post_status() == ‘future’ || get_post_status() == ‘draft’ ){
echo esc_attr( $post->post_name );
} else {
echo count_user_posts(1) + 1;}
?>” />
<?php
}
[/code]