ダリの雑記:WEBプログラム版

スラッグ名の重複対策

【WordPress】スラッグ名が重複すると、公開中の投稿ページが404になる

の記事で、スラッグ名を任意に設定した場合で、そのスラッグ名が重複し、下書き保存すると、すでに公開している同スラッグ名の記事が404エラーになることがある不具合について記述いたしました。

今のところWordpressでその対策が打たれている様子は無さそうです。

ということで、若干無理やりですが下記の方法で対応することにしました。

functions.phpに下記を追記します。

[php]
//保存した時、重複対策の文字列(_draft_記事ID_現在の日付)を追記する
function change_post_name($post_id){
if(!wp_is_post_revision($post_id) && !wp_is_post_autosave($post_id)){
$get_post = get_post($post_id);
if(!empty($get_post->post_name)){
remove_action('save_post', 'change_post_name', 13, 2 );
$explode_word = "__savedraft__".$post_id."_";

//下書き・レビュー待ちの場合は対策の文字列追加
if($get_post->post_status == "draft" || $get_post->post_status == "pending"){
$tmp_post_name = explode($explode_word, $get_post->post_name);
$post_name = $tmp_post_name[0]."__savedraft__".$post_id."_".date_i18n("YmdHis");

wp_update_post( array( 'ID' => $post_id, 'post_name' => $post_name) );
}
//公開・非公開・予約済の場合は対策の文字列を外す
elseif($get_post->post_status == "publish" || $get_post->post_status == "private" || $get_post->post_status == "future"){
$tmp_post_name = explode($explode_word, $get_post->post_name);
$post_name = $tmp_post_name[0];

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 );

//編集を開いた時、重複対策の文字列を削除する
function restore_post_name($post_name, $post){
if(is_admin()){
//postとは限らないので投稿データかを確認
if(!empty($post->post_name)){
$explode_word = "__savedraft__".$post->ID."_";
$tmps = explode($explode_word, $post_name);
$post_name = $tmps[0];
}
}

return $post_name;
}
add_filter('editable_slug', 'restore_post_name', 99, 2);
[/php]

 

要するに

という対応となります。

こんなんで本当に大丈夫かな~と思いますが、とりあえずはちゃんと動いてるっぽい。
注意点としては、スラッグ名(postname)はデータベース上200文字しかいれることが出来ないので、この重複対策の文字列を入れることで超えるようなら不具合が起こりえます。(重複対策文字列は、上記の例だと最長48文字。なので152文字(全角で76文字)より多くスラッグ名を設定すると、多分バグる)

動作保証はいたしませんのであしからず!

モバイルバージョンを終了