single.php

Revive Old Postsの最小間隔が5時間になってしまったので過去記事のツイート機能を自作した

WordPressに投稿した過去記事をランダムに選んでSNSに投稿してくれるプラグイン「Revive Old Posts」のバージョンアップで、無償版で投稿する間隔の最小値が5時間になってしまったので、同じ機能をPHPで自作した時の記録です。

Revive Old Posts

WordPressに投稿された過去の記事をカテゴリーやタグで抽出して、一定間隔でFacebookやTwitterなどのSNSに投稿してくれるプラグイン「Revive Old Posts」を使っていましたが、バージョンアップしたところ、無償版での最小間隔が 5時間という制限が追加されています。

例えば、Revive Old Postsの[General Settings]で[Minimum Interval Between Shares]の値を、2(二時間)に設定することができますが

実際には投稿が実行されず、ログに[Lowest allowed value for “Minimum Interval Between Shares” is 5 hours … Upgrade to Business Plan or higher to fine tune posting times and days.]と記録されるようになります。

つまり、投稿の最低間隔は5時間となり、変更するにはビジネスプランを契約することになりました。

PHPとCronが利用できれば自作可能

例えば、WordPressを稼働させているサーバーでcronが利用できるのであれば、同じような機能をPHPで自作することができます。

特に専門的な知識はなくても、Twitter APIが使えるアカウントを作成して、コードをコピペするだけで、一定間隔でWordPressの過去記事をツイートすることができるようになります。

また、PHPはWordPressを稼働させているサーバーであれば動作しますが、お名前.comなどのレンタルサーバーではcronが使えない場合があるので、事前に確認しておく必要があります。

一定間隔でランダムに記事を抽出してする

実際に、PHPでWordPressに投稿されている記事をランダムに抽出して、Twitterにツイート投稿するプログラムは次の手順で作ることができます。

例えば[get-wp-post.php]を作成して次のコードを追加します。これで、WordPress内でIDが123のタグが設定された記事がランダムで抽出されるようになります。

<?php
    $url = "https://sample.com/wp-json/wp/v2/posts?tags=123";

    //ヘッダーから総記事数を取得
    $headerarr = get_headers($url, 1);
    $articles = $headerarr["X-WP-Total"];
    
    //乱数で記事をランダムに取得
    $min = 1;
    $max = $articles;
    $rnd = mt_rand ($min, $max);

    $url = "https://sample.com/wp-json/wp/v2/posts?tags=123&per_page=1&page=" . $rnd";
    $json = file_get_contents($url);
    $arr = json_decode($json, true);
?>

Twitter APIでリンクをツイートする

記事の抽出ができたら、Twitter APIを使ってPHPから投稿するようにします。

APIを利用するには、事前に開発者アカウントとアプリの申請が必要になります。

Twitter アプリの申請についての詳細は、別記事をご覧ください。

アプリの申請を行い、各種キーを発行したら[get-wp-post.php]に次のコードを追加します。これで、WordPress内の記事リンクをツイッターに投稿できるようになります。

API_KEY, API_SECRET, ACCESS_TOKEN, ACCESS_SECRET にはアプリ申請時に発行できる各種キーを貼り付けます。

<?php
    $consumerKey = API_KEY;
    $consumerSecret = API_SECRET;
    $accessToken = ACCESS_TOKEN;
    $accessTokenSecret = ACCESS_SECRET;

    require_once("twitteroauth-master/autoload.php");
    use Abraham\TwitterOAuth\TwitterOAuth;

    $twitterOAuth = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
    $content = $twitterOAuth->get("account/verify_credentials");
    $status = $twitterOAuth->getLastHttpCode();
    if ($status == 200) {
        //つぶやく
        $tweet = "こんにちわ";
        $status = $twitterOAuth->post("statuses/update", array("status" => $tweet));
    } else {
        // 失敗時の処理
        echo "Failed: " . $status;
    }
?>

最後に、WordPressから取得した記事の内容を文字列として成形して変数に代入します。

    foreach($arr as $data):
        $title = $data["title"]["rendered"];
        $link = $data["link"];
        $tags = $data["tags"];
        $taglist = "";        
        foreach($tags as $tagid):
            $url = "https://blog.janjan.net/wp-json/wp/v2/tags/" . $tagid;
            $json = file_get_contents($url);
            $tag = json_decode($json, true);
            $name = $tag["name"];

            $taglist = $taglist . "#" . $name . " ";
        endforeach;
    endforeach;

    $tweet = $title . "\n" . $taglist . "\n" . $link;

最終的に[get-wp-post.php]は次のようになります。



<?php
    $url = "https://sample.com/wp-json/wp/v2/posts?tags=123";

    //ヘッダーから総記事数を取得
    $headerarr = get_headers($url, 1);
    $articles = $headerarr["X-WP-Total"];
    
    //乱数で記事をランダムに取得
    $min = 1;
    $max = $articles;
    $rnd = mt_rand ($min, $max);


    //記事を取得
    $url = "https://sample.com/wp-json/wp/v2/posts?tags=123&per_page=1&page=" . $rnd";
    $json = file_get_contents($url);
    $arr = json_decode($json, true);



    //記事をタグ名やリンク部分に成形
    foreach($arr as $data):
        $title = $data["title"]["rendered"];
        $link = $data["link"];
        $tags = $data["tags"];
        $taglist = "";        
        foreach($tags as $tagid):
            $url = "https://blog.janjan.net/wp-json/wp/v2/tags/" . $tagid;
            $json = file_get_contents($url);
            $tag = json_decode($json, true);
            $name = $tag["name"];

            $taglist = $taglist . "#" . $name . " ";
        endforeach;
    endforeach;

    $tweet = $title . "\n" . $taglist . "\n" . $link;

    //Twitter APIで記事をツイート
    $consumerKey = API_KEY;
    $consumerSecret = API_SECRET;
    $accessToken = ACCESS_TOKEN;
    $accessTokenSecret = ACCESS_SECRET;

    require_once("twitteroauth-master/autoload.php");
    use Abraham\TwitterOAuth\TwitterOAuth;

    $twitterOAuth = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
    $content = $twitterOAuth->get("account/verify_credentials");
    $status = $twitterOAuth->getLastHttpCode();
    if ($status == 200) {
        //つぶやく
        $status = $twitterOAuth->post("statuses/update", array("status" => $tweet));
    } else {
        // 失敗時の処理
        echo "Failed: " . $status;
    }
?>

PHPを実行して、登録したTwitterアカウントにWordPressの記事が投稿されれば成功です。

Cronで繰り返し処理

最後に定期的にPHPファイルが処理されるように、サーバーのcronを設定します。サーバーの設定がcPanelであれば[Cron ジョブ]設定で繰り返し処理を行います。

1. 作成した[get-wp-post.php]ファイルをWordPress内の適当な場所(今回は[wp-content]フォルダー内に[myoldposts]サブフォルダーを作成)にコピーします。

2.[Cron ジョブ]設定内の[新しい cron ジョブの追加|共通設定]から[1時間に1回]を選択します。

3. 表示された[コマンド部分]に次のように入力します。

/usr/bin/php /home/aqyuhnuw/public_html/sample.com/wp-content/myoldposts/get-wp-post.php

4.[新しい cron ジョブの追加]をクリックします。

1時間毎にPHPファイルが実行され、ツイッターに投稿が行われるようになります。

まとめ

今回は 「Revive Old Posts」のバージョンアップで、無償版で投稿する間隔の最小値が5時間になってしまったので、同じ機能をPHPで自作してみました。

WordPressとTwitter API(どちらも無償)を組み合わせて利用して、少しだけPHPのコードを追加することで、WordPressに過去に投稿した記事のリンクをTwitterに投稿するプログラムを作成することができます。

また、サーバー側の設定で[Cron ジョブ]が使えるようであれば、手軽に投稿スケジュールを追加することができ、例えば1時間毎にWordPress内の過去に投稿した記事をランダムに抽出してTwitterに投稿する機能を追加することができます。

Revive Old Postの投稿の最小間隔が5時間になり困っている人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

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