
さてさて、以前このブログでは記事を公開するとき、以下のツイッターでお知らせしていました。
実は当時、あるサービスで自動投稿していたのですが、Twitter
の仕様が変更になった影響で残念ながら利用できなくなってしまいました…。
そして、長らくTwitter
との連携はしてなかったのですが、せっかく記事を書くからには多くの人に読んでもらいたと思いこの度、再開することにしました。
そのため、wordpress
のプラグインを試したのですが、なぜか上手くいかなかったので、もうこの際、自動ツイート機能を自前で作ることにしました。
そこで❗
今回はプラグインなしでwordpress
からTwitter
に自動投稿する機能の作り方をご紹介します。
ぜひ皆さんのお役に立てると嬉しいです😊✨
「試しにツイートしたら「イイネ」をいただいてしまい、
調子にのってすぐ記事を書きました😆」
開発環境: WordPress 5.4
目次
前提として
自動投稿に必要なTwitter API
のトークンを「ツイッターでAPIキーとアクセス・トークンを取得する」を参考にして用意しておいてください。
また、トークンを取得したら、どこからでも呼び出せるようにwp-config.php
に次のよう書き込んでおいてください。
/wp-config.php
// Twitter API define('TWITTER_CONSUMER_KEY', '(ここにAPI key)'); define('TWITTER_CONSUMER_SECRET', '(ここにAPI secret key)'); define('TWITTER_ACCESS_TOKEN', '(ここにAccess token)'); define('TWITTER_ACCESS_SECRET', '(ここにAccess token secret)');
composerでパッケージをインストールする
今回はcomposer
を使ってパッケージをインストールするので、まずwordpress
のフォルダ内で以下のコマンドを実行してcomposer.json
を作成します。
composer init
すると、いくつか質問を聞かれますが、適当にEnter
やn
などでもOKです。
そして、composer.json
が作成されたら、以下のコマンドでパッケージを保存します。
composer require abraham/twitteroauth
これで「/vendor」フォルダにパッケージがインストールされました。
子テーマをつくる
wordpress
ではよく知られたテクニックですが、テーマ本体を改造してしまうと、その後アップデートがあると変更部分を全て失ってしまうことになるため、「子テーマ」という部分的に改変されないファイルをつくります。
子テーマ用のフォルダをつくる
「/wp-content/themes」フォルダ内に子テーマのフォルダを作ります。
今回は、twentyseventeen
の子テーマを作るので、twentyseventeen-child
というフォルダを作りますが、名前はお好みで変更してください。
必要なファイルを用意する
次に作成した子テーマのフォルダに移動し、以下2つのファイルを作成します。
- functions.php
- style.css
そして、それぞれ中身を次のように変更します。
/wp-content/themes/twentyseventeen-child/functions.php
<?php add_action('wp_enqueue_scripts', function(){ wp_enqueue_style('parent-style', get_template_directory_uri() .'/style.css'); });
/wp-content/themes/twentyseventeen-child/style.css
/* Theme Name: Twenty Seventeen Child Theme URL: http://example.com Description: Twenty Seventeen Child Theme Author: Your Name Author URL: http://example.com Template: twentyseventeen Version: 1.0.0 Text Domain: twentyseventeen-child */
そして、wordpress
にログインし、ページ左側にあるメニューから「外観」をクリック。
すると、テーマ一覧の中に先ほど作った子テーマがあるのでマウスを合わせて「有効化」ボタンをクリックしてください。
これで、子テーマの部分は完了です。
Twitterを自動送信する部分をつくる
では、記事が投稿されたらTwitter
に自動投稿する部分を作っていきましょう。
投稿内容のイメージは、こんなカンジです。
「●●●●●●」という記事を公開しました! 👈 記事タイトル http://****/**** 👈 URL #Laravel #Vue.js 👈 カテゴリ名がハッシュタグ
では実際のコードです。
/wp-content/themes/twentyseventeen-child/functions.php
add_action('transition_post_status', function($new_status, $old_status, $post){ global $wpdb; if($new_status === 'publish' && $old_status !== 'publish' && $post->post_type === 'post') { // 👈 初回投稿の時だけ $tweet = "「{$post->post_title}」という記事を公開しました!\n\n{$post->guid}"; // 👇 ハッシュタグ $categories = get_the_category($post->ID); if(count($categories) > 0) { $tweet .= "\n\n"; foreach($categories as $category) { if(intval($category->term_id) === 1) { // 👈 未分類は除外 continue; } $category_name = str_replace(['.'], '', $category->name); $tweet .= "#{$category_name} "; } } // 👇 アイキャッチ画像 $table = $wpdb->prefix .'postmeta'; $thumbnail_meta = $wpdb->get_row( $wpdb->prepare("SELECT * FROM {$table} WHERE post_id = %d AND meta_key = %s", [ $post->ID, '_thumbnail_id' ]) ); $image_path = ''; if(!is_null($thumbnail_meta)) { $thumbnail_id = $thumbnail_meta->meta_value; $attachment = wp_get_attachment_metadata($thumbnail_id); $image_path = wp_upload_dir()['basedir'] .'/'. $attachment['file']; } // Twitter投稿 require_once ABSPATH .'vendor/autoload.php'; $connection = new \Abraham\TwitterOAuth\TwitterOAuth( TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET, TWITTER_ACCESS_TOKEN, TWITTER_ACCESS_SECRET ); $parameters = ['status' => $tweet]; if(!empty($image_path)) { // 👈 画像アップロード $connection->setTimeouts(15, 30); // タイムアウト時間を伸ばす try { $media = $connection->upload('media/upload', [ 'media' => $image_path ]); $parameters['media_ids'] = $media->media_id_string; } catch (\Exception $e) {} } $connection->post('statuses/update', $parameters); // 👈 Twitterに投稿 } }, 10, 3);
【追記:2022.2.27】
カテゴリ名に「ドット」が入っているとハッシュタグが途中で切れてしまうので、ドットは取り除く処理を入れました。
ここで、先に言っておかないといけないのが、初回投稿の場合、タイトルとURLだけしかツイートできないことがある😫ということです。
実は、こちらのバグ報告ページであるようにRest API
で初回投稿したときは、設定されたカテゴリが取得できません。(transition_post_status
が実行された後でカテゴリ登録されるみたいです)そして、これはアイキャッチ画像についても同じです。
そのため、もしハッシュタグとアイキャッチ画像も一緒に自動ツイートしたい場合は、予約投稿にする必要があります。
※予約投稿とは、今すぐに投稿するのではなくあらかじめ公開する日時を決めておく設定のことです。(すみません、グーテンベルクは好きじゃないので下の画像はクラシックバージョンですが、ほぼ同じものがあると思います😊)
【追記:2020.4.10】wordpress 5.4
で試したところ、予約投稿であっても画像は投稿できないようでしたので、直接DBからデータ取得するよう変更しました。
【追記:2020.4.15】プラグインによっては登録時にTwitter投稿
が実行されてしまうので、$post->post_type
のチェックを追加しました。
※なお、classic editorではRest API
を使っていないようで、初回投稿でもカテゴリと画像を投稿できました。
では、コードの内容です。
まずtransition_post_status
が用意してくれる$new_status
と$old_status
で初回投稿を判別し、自動投稿を実行します。(つまり、更新のときはツイートされない)
そして、先ほどの通常の初回投稿の問題があるので、ハッシュタグに使うカテゴリとアイキャッチ画像は、もし情報が取得できた時だけ一緒に投稿するようにしています。
後は、パッケージがほとんどの部分をやってくれるのでpost()
メソッドを呼び出すだけで完了します。
テストしてみる
ということで、ダミーの投稿をしてタイムラインをチェックしてみると次のように表示されていました。
成功です😊✨
ちなみに:エラーが出たら
ちなみに画像のアップロードで以下のようなエラーがでたら、それは、画像をアップロードしようとしたけど時間内に完了できませんでした。という意味になります。
Uncaught Abraham\TwitterOAuth\TwitterOAuthException: Operation timed out after (数字)
もしこのエラーが発生した場合は、setTimeouts()
を調整してください。
$connection->setTimeouts(15, 30);
1つめの引数が接続の最大秒数、2つ目がリクエスト(この場合アップロード)の最大秒数になります。
おわりに
ということで、今回はwordpress
に独自の自動ツイート機能を追加してみました。
もちろんプラグインを使ってもうまくいくんでしょうが、プラグインは何かとレスポンスを遅くする原因になるので、それがイヤな方はぜひ今回のコードを使ってみてくださいね。
なお、冒頭でも紹介しましたが今後は記事が公開されたタイミングで以下のツイッターでお知らせをしますので、ぜひフォローしてくださいね。
ではでは〜!
「約3年もツイッターを放置してました😂」


開発効率を上げるための機材・まとめ