ググったりいじったりでなんとか完了_(:3」∠)_
この記事にあるコードなどを実際に実行して何か問題が起きたとしても責任は負えません。
自己責任でお願いいたします。
やっとスラッグを思い通りのものにできたのでこれで満足✌✌
はてなブログだと、「年/月/日/時分秒」って形だから、可能ならそれと同じ感じにしたかったのと、投稿IDを過去から順番になるようにしたかったけど、
wordpressにまだ慣れてないこともあり、投稿IDについてはそのままにして、スラッグを「年月日時分秒」って形にした。
で、スラッグいじりが終わったこともあり、本格的にこっちのみで記事投稿しよう・・・と思ったんだけど、
前回の記事で、はてなブログにも投稿するってこと書いてたっぽいね(忘れてた
とりあえず、PHPの学習も兼ねて作るのもありだよね多分🤔
で、スラッグを日付ベースのものにするためにやったこととしては、
テーマに入ってるfunctions.phpをいじることと、データベースのpost_nameの部分を置換することの2つだね。
試行錯誤してる最中にやったこととしては、archive.htmlの削除とか、プラグイン入れてみたりとかあったけど、それらについては結果として効果がなかったというか、思い通りの結果にはならなかった_(:3」∠)_
んで、functions.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などに変更しとくかレコードごと削除するかしないとコピーがうまくいかない
それなりの権限があれば他の方法もあるんだけど、僕の持つ権限だとその方法が使えないっぽい
なので、
select * from blogposts where post_date_gmt = 0 or post_modified_gmt = 0;
↑これで探して確認して、
↓で削除か変更する(下のは変更の場合のもの)
update blogposts set post_date_gmt = "1970-01-01 00:00:00" where post_date_gmt = 0;
update blogposts set post_modified_gmt = "1970-01-01 00:00:00" where post_modified_gmt = 0;
phpmyadminとか使えるなら、それを使ったほうが安心安全かもね。
んで、やっとコピー。
あくまで試しでやってみるだけなんで、コピー先となる、これから作成するテーブルの名前はなんでもいい。
僕はとりあえずblogposts2にした。
コピー元の名前はblogpostsなのでblogpostsで固定
CREATE TABLE blogposts2 AS SELECT * FROM blogposts;
参考:MySQL テーブル複製とテーブル比較の方法をユースケース交えて説明します! #MySQL8.0 – Qiita
とりあえずコピー先の名前はblogposts2にしたので、blogposts2で操作するけど、別のテーブル名にした人は適宜読み替えてくれください
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に突っ込む。
・・・って感じ。
というわけで以上!
コメントを残す