WordPressで記事URLを定期的に自動変更する方法

こんにちは、webエンジニアのゾノ( @ozonosho )です。
今日のブログではWordPressで記事URLを定期的に自動変更する方法を紹介したいと思います。
利用場面としては、
・indeedなどのロボット巡回型の記事紹介サイトで同じ記事を定期的に新着掲載させたい
などのニーズを想定しています。
実際に僕のサイトにも数ヶ月に1件ぐらいのペースでこの内容の相談が届くので、今回実装方法を記事にまとめてみました。
WordPressで記事URLを定期的に自動変更する方法
実装手順としては、
- 記事のURL末尾を変更する関数を作る
- 作った関数をwp-cron等で定期実行する
という流れになります。
①記事のURL末尾を変更する関数を作る
まずは記事のURLを一定のルールに沿って変更する関数を作りましょう。
今回は実際に依頼を受けた2つのケースを例として実装方法をご紹介いたします。
1.記事URLに現在日付を足す
- 依頼内容
-
https://〇〇〇/recruit01
https://〇〇〇/recruit02
上記のようにスラッグの中に「recruit」が含まれる記事のURL末尾に、現在日付を足して定期的にURLを自動変更させたい。
(自動変更後)
https://〇〇〇/recruit01_20190720
https://〇〇〇/recruit02_20190720
https://〇〇〇/recruit02
上記のようにスラッグの中に「recruit」が含まれる記事のURL末尾に、現在日付を足して定期的にURLを自動変更させたい。
(自動変更後)
https://〇〇〇/recruit01_20190720
https://〇〇〇/recruit02_20190720
このようなケースだとfunctions.phpに下記のようなソースを追加します。
function update_post_slug() {
$args = array(
'posts_per_page' => -1,
'post_type' => 'post'
);
$posts = get_posts($args);
foreach ($posts as $post) {
if(preg_match('/recruit/', $post->post_name)) { //※1
date_default_timezone_set('Asia/Tokyo');
$today = date("Ymd");
$base_slug = $post->post_name;
if(strpos($base_slug,'_')) { //※2
$base_slug = substr($base_slug, 0, strcspn($base_slug, '_'));
}
$my_post = array(
'ID' => $post->ID,
'post_name' => $base_slug . '_' . $today,
);
wp_update_post($my_post);
}
}
}
add_action ('update_post_slug_cron', 'update_post_slug'); //※3
※1について
ここではpreg_matchを利用してスラッグ内に文字列「recruit」が含まれている記事のみを対象にしていますが、すべての記事を対象にする場合は「if(preg_match)~」のif文は消しちゃってください。
※2について
過去にURLが自動変更された記事のURLは「https://〇〇〇/recruit01_日付」となっているので、日付のついているURLの場合には一度URLから「_日付」を取り除いたうえで最新の日付をURLに追加するようにしています。
※3について
最後に、作った関数をWordPressの疑似cron「wp-cron」で呼び出すためにアクションフックにしておきます。
2.記事URLに数字を足す
- 依頼内容
-
https://〇〇〇〇.com/abcd01
https://〇〇〇〇.com/abcd02
上記のようにスラッグの中に「abcd」が含まれる記事のURL末尾に、数字を足して定期的にURLを自動変更させたい。
(初回の自動変更後)
https://〇〇〇/abcd01_1
https://〇〇〇/abcd02_1
(2回目の自動変更後)
https://〇〇〇/abcd01_2
https://〇〇〇/abcd01_2
https://〇〇〇〇.com/abcd02
上記のようにスラッグの中に「abcd」が含まれる記事のURL末尾に、数字を足して定期的にURLを自動変更させたい。
(初回の自動変更後)
https://〇〇〇/abcd01_1
https://〇〇〇/abcd02_1
(2回目の自動変更後)
https://〇〇〇/abcd01_2
https://〇〇〇/abcd01_2
このようなケースだとfunctions.phpに下記のようなソースを追加します。
function update_post_slug() {
$args = array(
'posts_per_page' => -1,
'post_type' => 'post',
);
$posts = get_posts($args);
foreach ($posts as $post) {
if(preg_match('/abcd/', $post->post_name)) {
$base_slug = $post->post_name;
$count = 1;
if(strpos($base_slug, '_') !== false) {
$start = strcspn($base_slug, '_') + 1;
$end = strlen($base_slug);
$now_count = substr($base_slug, $start, $end);
$count = (int)$now_count + 1;
$base_slug = substr($base_slug, 0, strcspn($base_slug, '_'));
}
$my_post = array(
'ID' => $post->ID,
'post_name' => $base_slug . '_' . $count,
);
wp_update_post($my_post);
}
}
}
add_action ('update_post_slug_cron', 'update_post_slug');
②作った関数をwp-cron等で定期実行する
関数さえ作ってしまえば、あとはwp-cronにアクションフックを登録するだけです。
functions.phpに下記のようなソースを追加します。
if ( !wp_next_scheduled( 'update_post_slug_cron' ) ) {
wp_schedule_event( time(), 'daily', 'update_post_slug_cron' ); //※1
}
※1について
wp_schedule_eventの引数は「第1引数:最初に実行する時間」「第2引数:実行間隔」「第3引数:実行する処理のフック名」です。今回は毎日実行する処理だったのでdailyとしましたが、毎時や毎週などの設定も可能です。
おわりに
以上、今回の記事ではWordPressで記事URLを定期的に自動変更する方法を紹介させていただきました。
当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。









