そもそもの原因についてはこちら
【WordPress】スラッグ名が重複すると、公開中の投稿ページが404になる
上記の対策方法を、こちらの記事「スラッグ名の重複対策」で書かせてもらいましたが、よくよく考えてみたら、こんなに複雑に考える必要はありませんでした。
つまり、下書きだろうが、スラッグ名を確定させてしまえばよい!(というか、なぜそうなってないのか)
プログラム修正版はこちらです。
[PHP]
function change_post_name($post_id){
if(!wp_is_post_revision($post_id)){
$get_post = get_post($post_id);
if(!empty($get_post->post_name)){
remove_action('save_post', 'change_post_name', 13, 2 );
if($get_post->post_status == "draft" || $get_post->post_status == "pending"){
$post_name = wp_unique_post_slug($get_post->post_name, $post_id, "publish", $get_post->post_type, $get_post->post_parent);
wp_update_post( array( 'ID' => $post_id, 'post_name' => $post_name) );
}
add_action('save_post', 'change_post_name', 13, 2 );
}
}
}
add_action('save_post', 'change_post_name', 13, 2 );
[/PHP]
7行目のwp_unique_post_slugは、wp_insert_post関数内で使用されてる、ユニークなスラッグ名を付けてくれる関数です。
この関数の第3引数が、下書きの場合は、ユニークにしてくれません(第1引数のスラッグ名をそのまま返します)
ということであれば、第3引数だけ「publish」にして、ユニークなスラッグ名を取得し、保存し直せばよい!
ということで、作ってみたのですが、とりあえず大丈夫っぽい。
※このプログラムについて責任はとれませんので、自己責任でお願いします。