web開発

[WordPress]下書きから一括予約投稿をする関数を使って自動化する

こんにちは。もんしょー(@sima199407)です。

記事投稿を自動化したい人
記事投稿を自動化したい人
WordPressで自動で予約投稿できるようにしたいです

こんな疑問にあるかと思います。
自分でブログを書いている人は投稿画面から設定するのでほとんど使うことはないかもしれませんが、メディアを運営されている方は使えるかもです。
また今回はレンタルサーバーを使っていますので、root権限などはいりません。

ポイントとしては、
①WordPress関数を使う方法
②予約投稿をする時間の設定
③記事を更新する

上記のようになります。

自動投稿をするワケ

webメディアを作っているときに大量の記事を一気に流すより、すこしインターバルをつけて投稿したほうがユーザーのアクセスがのびてきます。

そこで手動で1つ1つ設定してたら骨の折れる作業になりますよね。。

そういった面倒なことはプログラミング任せることが一番です。

【完成】自動投稿のコード

先にコードだけみたい人はこちら

require_once '../wp-load.php'; //wordpress関数を使うときの外部ファイル
date_default_timezone_set('Asia/Tokyo’); //タイムゾーンを日本に設定

for ($i=1; $i < 50; $i++) { //50件回す     $post = get_posts( array(         'numberposts' => 1,
'post_status' => 'draft',
'orderby' => 'ID’, // デフォルトは’date'
) );
$post = $post[0];

if (($i%10) == 0) {
// 10件あたり6時間単位
$post_time += 6; //何時間ごとに投稿したいか
}
$target_time = '+ '.$post_time.'hour';
var_dump($target_time);

$publish_date =date( 'Y-m-d H:i:s',  strtotime( $target_time) );
var_dump($publish_date);

// 時間をセットする
if (isset($post)) {
$post->post_status = 'future';
$post->post_date = $publish_date;
$post->edit_date = true;
$post->post_date_gmt = gmdate( 'Y-m-d H:i:s', strtotime($publish_date) );

$post_id = wp_update_post( $post );
echo $post_id."を更新しました"."\n";
}

}
?>

それでは解説していきます。

WordPress関数を使う方法

WordPressには便利な関数が多数存在しますがそれを使うときは「wp-load.php」を呼び出す必要があります。
wp-load.phpはpublic_htmlの直下のフォルダーにありますので、そこに合わせてファイルを読み込んで上げればいいわけですね。

require_once '../wp-load.php’; //public_htmlの1階層下の場合
require_once ‘../../wp-load.php’; //public_htmlの2階層下の場合

という感じです。
それかマジック定数というものを使うのも便利です。

require_once( dirname(dirname( __FILE__ )) . '/wp-load.php' ); //これでもOK

get_posts()を使う

まずは、[get_posts()]DBから下書きの記事を取得します。
例を使うと、「ID順に並び替えたときの1記事の下書きになっているものを取得する」

$post = get_posts( array(
'posts_per_page' => 1, //取得するページ数
'post_status' => 'draft’, //下書き
'orderby' => 'ID’, // デフォルトは’date'
) );
$post = $post[0];

参考:テンプレートタグ/get posts

[orderby]の設定は投稿者やカテゴリー、ランダムなど設定が豊富です。

また、[$post = $post[0];]として多重配列を取り出している部分を取り出しています。

予約投稿をする時間の設定

次に時間の設定になります。

例では、「10件ごと6時間ごとに投稿する」ようにしています。

if (($i%10) == 0) {
// 10件あたり6時間単位
$post_time += 6; //何時間ごとに投稿したいか
}
$target_time = '+ '.$post_time.'hour';
var_dump($target_time);

$publish_date =date( 'Y-m-d H:i:s',  strtotime( $target_time) );
var_dump($publish_date);

($i%10) == 0というのは「10で割り切って0ならtrue」ということです。

ここのポイントは[strtotime()]になります。

date( 'Y-m-d H:i:s',  strtotime( $target_time) );

日付のデータ型にしてあげることで無事に読み込まれます。

上記では、時間単位していますが、日別や分単位にすることもできます。

詳しくは参考サイトから確認ください

記事を更新する

最後に記事を更新します。

// 時間をセットする
if (isset($post)) {
$post->post_status = 'future';
$post->post_date = $publish_date; //上記で設定した時間
$post->edit_date = true;
$post->post_date_gmt = gmdate( 'Y-m-d H:i:s', strtotime($publish_date) );

$post_id = wp_update_post( $post ); //$postの内容で記事更新
echo $post_id."を更新しました"."\n";
}

ここで初めて知ったのが、WordPressからとってきた$postは配列ではなく、オブジェクトということです。

つまり、[array_push]や[array_merge]を使っても$postを更新できないということ。

なので、「$post->[パラメータ] = ~」と書く必要があります。

また、「$post->edit_date = true;」を入れないと予約投稿ができないということ。ドキュメントにも大きく取り上げられてないので注意です。

まとめ

自動予約投稿ができるようになるとWordPressの使える幅も広がってくるかと思います。
お役に立てば幸いです。