カスタム投稿タイプで新規作成時をpageidを自動でスラッグ名に設定する方法

      2013/03/01

通常の固定ページや投稿タイプの場合は設定→パーマリンクで設定した名称でスラッグ名(URL)が決まるが、カスタム投稿タイプの場合はタイトルの名称をそのまま割り当てるものとなります。日本語タイトルだと日本語 URL となり見にくくなるし、毎度スラッグ名を考えるのも手間なので自動的にポスト ID をスラッグ名に割り当てる方法を考えました。

フォーラムで調べてフィルター フックから wp_unique_post_slug を呼び出せば良いことが分かったのですが、実際に導入すると目的の機能は動作するけど「プレビュー」ボタンでプレビューができなくなってしまったので回避を考えました。 以下のコードを function.php に追加することで、固定ページ以外の投稿が新規に行われた場合に限り自動的に postid をスラッグ名に割り当てます。

//固定ページ以外の投稿タイプを新規作成した際に自動的にスラッグ名を変更
function change_slug()
{
  global $post;
  if(get_post_type($post) != 'page')
    {
      $post->post_name = $post->ID;
    }
}
add_action('admin_print_styles-post-new.php', 'change_slug', 1000);

 

2013年2月21日追記

上記の操作だと、下位権限のユーザが [レビュー待ちとして送信] して上位権限のユーザがレビュー用に表示すると、スラッグ名が消えてしまい、デフォルトのタイトルをもってくるようになります。

その後調べたら add_filter 関数の第3引数を下げるとプレビュー動作が動くようになりました。

//スラッグ名の自動変更
////ja.forums.wordpress.org/topic/11432?replies=3
function change_slug( $slug, $post_ID, $post_status, $post_type ) {
	if ( $post_type != 'page' ) {
		$slug = $post_ID;
	}
	return $slug;
}
add_filter('wp_unique_post_slug','change_slug', 100, 4 );

 

<2013年3月1日追記

やはり add_filter('wp_unique_post_slug','change_slug', 100, 4 ); の呼び出しだと数日後プレビューができない問題が再発。原因は不明だけど、スラッグ名が消えてしまう問題が解決できたので add_action('admin_print_styles-post-new.php', 'change_slug', 1000); の呼び出しに戻すことにしました。

 - Web