| ブログトップ | WEB関連全般 |

スラッグ名の重複対策

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

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

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

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

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

 

要するに

  • 下書きやレビューなどの場合は、後ろに文字列を付ける。
  • 公開や予約公開など、スラッグ名が確定する場合は、その文字列を削除して保存し直す。
  • 編集画面などでスラッグ名を表示する場合も、後ろの文字列は非表示にする(わずらわしいので)

という対応となります。

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

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

日々の生活にhappyをプラスする|ハピタス

このエントリーをはてなブックマークに追加

LINEで送る

総合管理者 | 2017年12月14日 | コメント(0) | トラックバック(1) | WEB関連全般

トラックバック

トラックバックURL

トラックバック一覧

[…] 上記の対策方法を、こちらの記事「スラッグ名の重複対策」で書かせてもらいましたが、よくよく考えてみたら、こんなに複雑に考える必要はありませんでした。 […]

コメントする

※メールアドレスが公開されることはありません。

名前 *
メール*
URL
Copyright(c) 2010 - 2018 ダリの雑記