スラッグいじり完了

ググったりいじったりでなんとか完了_(:3」∠)_

やっとスラッグを思い通りのものにできたのでこれで満足✌✌

はてなブログだと、「年/月/日/時分秒」って形だから、可能ならそれと同じ感じにしたかったのと、投稿IDを過去から順番になるようにしたかったけど、

wordpressにまだ慣れてないこともあり、投稿IDについてはそのままにして、スラッグを「年月日時分秒」って形にした。

で、スラッグいじりが終わったこともあり、本格的にこっちのみで記事投稿しよう・・・と思ったんだけど、

前回の記事で、はてなブログにも投稿するってこと書いてたっぽいね(忘れてた

とりあえず、PHPの学習も兼ねて作るのもありだよね多分🤔

で、スラッグを日付ベースのものにするためにやったこととしては、

テーマに入ってるfunctions.phpをいじることと、データベースのpost_nameの部分を置換することの2つだね。

試行錯誤してる最中にやったこととしては、archive.htmlの削除とか、プラグイン入れてみたりとかあったけど、それらについては結果として効果がなかったというか、思い通りの結果にはならなかった_(:3」∠)_

んで、functions.phpに追加した内容としてはこんな感じ。

PHP
function b2n_replace_slug( $slug, $post_ID, $post_status, $post_type ){

	if($post_type !== 'post'){
		return $slug;
	}

	$get_post = get_post($post_ID);
	if( !empty($get_post->post_name) ){
		return $slug;
	}
	date_default_timezone_set('Asia/Tokyo'); 
	$date_slug = date("YmdHis");
	$post_id = get_page_by_path($date_slug, "OBJECT", "post");

	if( $post_id !== null ){
		$i = 1;
		while( $post_id !== null ){
			++$i;
			$post_id = get_page_by_path($date_slug.'-'.$i, "OBJECT", "post");
		}
		$date_slug = $date_slug.'-'.$i;
	}

	return $date_slug;

}
add_filter( 'wp_unique_post_slug', 'b2n_replace_slug' , 10, 4 );

以下の記事にあるコードを丸コピしてちょっと書き換えた

参考:スラッグ(投稿名)を自動的に日付にするカスタマイズ – TIPS

んで次に過去記事のスラッグをSQLから一括変更する

まず、一応試しでやってみるためにコピーして、コピー先で試す。

wordpressの記事がおかしくならないためにも、間違えてもコピー元でやらないこと。

ただ、データベースのpost_date_gmtやpost_modified_gmtに0000-00-00 00:00:00みたいなのがあったら1970-01-01 00:00:00などに変更しとくかレコードごと削除するかしないとコピーがうまくいかない

それなりの権限があれば他の方法もあるんだけど、僕の持つ権限だとその方法が使えないっぽい

なので、

SQL
select * from blogposts where post_date_gmt = 0 or post_modified_gmt = 0;

↑これで探して確認して、

↓で削除か変更する(下のは変更の場合のもの)

SQL
update blogposts set post_date_gmt = "1970-01-01 00:00:00" where post_date_gmt = 0;
SQL
update blogposts set post_modified_gmt = "1970-01-01 00:00:00" where post_modified_gmt = 0;

phpmyadminとか使えるなら、それを使ったほうが安心安全かもね。

んで、やっとコピー。

あくまで試しでやってみるだけなんで、コピー先となる、これから作成するテーブルの名前はなんでもいい。

僕はとりあえずblogposts2にした。

コピー元の名前はblogpostsなのでblogpostsで固定

SQL
CREATE TABLE blogposts2 AS SELECT * FROM blogposts;

参考:MySQL テーブル複製とテーブル比較の方法をユースケース交えて説明します! #MySQL8.0 – Qiita

とりあえずコピー先の名前はblogposts2にしたので、blogposts2で操作するけど、別のテーブル名にした人は適宜読み替えてくれください

SQL
update blogposts2 set post_name = replace(replace(replace(post_date," ","") ,"-",""),":","") where post_status = "publish" and post_type = "post";

はい、これで思い通りの結果になったら、blogposts2のとこをblogpostsにして実行すればおしまい!(

post_dateの中身が1970-01-01 00:00:00だとして説明すると、

テーブルのblogposts2を指定し、そこからpost_statusがpublishかつ、post_typeがpostなレコードを探して、

該当レコードのpost_dateから日付をひっぱりだしてきて、

一番内側にあるreplaceで半角スペース削除

1970-01-01 00:00:00→1970-01-0100:00:00

真ん中のreplaceで「-」を削除

1970-01-0100:00:00→1970010100:00:00

一番外側にあるreplaceで「:」を削除して

1970010100:00:00→19700101000000

で、出来上がった「19700101000000」を、

post_nameに突っ込む。

・・・って感じ。

というわけで以上!


コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です