WordPressの記事公開時にTwitterで自動ツイートさせる方法【自作】
こんにちは、webエンジニアのゾノ( @ozonosho )です。
今日のブログではプラグインを使わずに、WordPressの記事公開時にTwitterで自動ツイートさせる方法を紹介したいと思います。
記事公開時にSNSと連携させるプラグインは「Jetpack」を筆頭にいくつかありますが、JetpackをSNS連携のためだけに導入するとサイトが必要以上に遅くなってしまうので、今回は自作で機能を作ってみました。
TwitterのAPIを使って出来ることを知れたので、今後、サイトのSNS運営を効率化できそうな機能を色々と実装できそうです!
WordPressの記事公開時にTwitterで自動ツイートさせる方法
実装手順は下記の2ステップになります。
- TwitterAPIに登録して各種キーを取得
- 記事公開時に自動ツイートする処理を実装
それぞれ解説していきます。
①TwitterAPIに登録して各種キーを取得
まずはTwitterアカウントとサイトを連携させるために、TwitterAPIの登録をおこなう必要があります。
TwitterAPIの登録をすることで、外部からTwitterアカウントを操作するための各種キーを取得することができるためです。
TwitterAPIの登録方法は下記サイトの情報が分かりやすかったのでぜひ参考にしてみてください。
尚、必要なキーは下記の4つになります。
- API key
- API secret key
- Access token
- Access token secret
すべてのキーを取得できたら、一旦どこかにコピーでもしておいてください。
②記事公開時に自動ツイートする処理を実装
各種キーを取得できたら、TwitterAPIを利用して記事公開時に自動ツイートする処理を実装していきます。
まずは、APIの処理をまとめたphpファイルを作成しましょう。
「twitter_api.php」と名付けたファイルを作り、下記のコードをコピペして保存してください。
<?php class TwitterApi { const TWEET_URL = 'https://api.twitter.com/1.1/statuses/update.json'; private $_consumer_key; private $_consumer_secret; private $_access_token; private $_access_token_secret; public function __construct($consumer_key, $consumer_secret, $access_token, $access_token_secret) { $this->_consumer_key = $consumer_key; $this->_consumer_secret = $consumer_secret; $this->_access_token = $access_token; $this->_access_token_secret = $access_token_secret; } private function _create_signature($url, $params) { $signature_key = rawurlencode($this->_consumer_secret).'&'.rawurlencode($this->_access_token_secret); $oauth_params = array( 'oauth_token' => $this->_access_token, 'oauth_consumer_key' => $this->_consumer_key, 'oauth_signature_method' => 'HMAC-SHA1', 'oauth_timestamp' => time(), 'oauth_nonce' => md5(uniqid(rand(), true)), 'oauth_version' => '1.0' ); // 署名の作成 $merge_params = array_merge($params, $oauth_params); ksort($merge_params); $req_params = http_build_query($merge_params); $req_params = str_replace(array('+', '%7E'), array('%20', '~'), $req_params); $req_params = rawurlencode($req_params); $encoded_req_method = rawurlencode('POST'); $encoded_url = rawurlencode($url); $signature_data = $encoded_req_method.'&'.$encoded_url.'&'.$req_params; $hash = hash_hmac('sha1', $signature_data, $signature_key, TRUE); $signature = base64_encode($hash); $merge_params['oauth_signature'] = $signature; return $merge_params; } public function tweet($status) { $post_params = array( 'status' => $status ); $params = $this->_create_signature(TwitterApi::TWEET_URL, $post_params); // 送信データの作成 $options = array('http' => array( 'method' => 'POST', 'header' => array( 'Authorization: OAuth '.http_build_query($params, '', ',') ), 'content' => http_build_query($post_params) )); $options = stream_context_create($options); // 送信 $json = file_get_contents(TwitterApi::TWEET_URL, false, $options); return $json; } } ?>
※参考記事はこちら
作成したファイルは、テーマ内にアップロードしてください。
(僕は分かりやすく「テーマ/lib/twitter/twitter_api.php」に設置しました)
続いて、functions.phpに下記のようなコードを追加してください。
/* -------------------------------------------------- // Twitter自動投稿 -------------------------------------------------- */ include('twitter_api.phpファイルを設置したフォルダまでのパス/twitter_api.php'); //TwitterAPIキー define('TW_CONSUMER_KEY', 'API keyの値'); define('TW_CONSUMER_SECRET', 'API secret keyの値'); define('TW_ACCESS_TOKEN', 'Access tokenの値'); define('TW_ACCESS_TOKEN_SECRET', 'Access token secretの値'); function auto_post_tweet($new_status, $old_status, $post) { //新規公開時のみツイート(投稿のみ対象) if($old_status != 'publish' && $new_status == 'publish' && $post->post_type == 'post') { $twitter = new TwitterApi(TW_CONSUMER_KEY, TW_CONSUMER_SECRET, TW_ACCESS_TOKEN, TW_ACCESS_TOKEN_SECRET); //ツイート本文 $content = '◆新着記事を公開!' . "\n\n" . '『' . $post->post_title . '』' . "\n" . get_permalink($post->ID); //ツイート実行 $twitter->tweet($content); } } add_action('transition_post_status', 'auto_post_tweet', 10, 4);
アクションフック「transition_post_status」を利用すれば投稿データのステータスが変更した際に処理を走らせることができるので、投稿を新規公開した時にツイート処理を実行させています。
投稿オブジェクトも引数で渡されているので、記事のタイトルやURL等も自由に投稿させることができます。
僕の運営するサイト『未来地図』では、投稿タイプごとにツイート内容を変更したかったので実際の実装は下記コードになりました。
/* -------------------------------------------------- // Twitter自動投稿 -------------------------------------------------- */ include(dirname(__FILE__).'/../lib/twitter/twitter_api.php'); //TwitterAPIキー define('TW_CONSUMER_KEY', 'API keyの値'); define('TW_CONSUMER_SECRET', 'API secret keyの値'); define('TW_ACCESS_TOKEN', 'Access tokenの値'); define('TW_ACCESS_TOKEN_SECRET', 'Access token secretの値'); function auto_post_tweet($new_status, $old_status, $post) { //新規公開時のみツイート if($old_status != 'publish' && $new_status == 'publish' && ($post->post_type == 'post' || $post->post_type == 'topic' || $post->post_type == 'info')) { $twitter = new TwitterApi(TW_CONSUMER_KEY, TW_CONSUMER_SECRET, TW_ACCESS_TOKEN, TW_ACCESS_TOKEN_SECRET); //ツイート本文 switch ($post->post_type) { case 'post': //投稿の場合 $title = '◆新着コラムを公開!'; $content = '『' . $post->post_title . '』' . "\n\n" . get_permalink($post->ID); break; case 'topic': //カスタム投稿タイプ「topic」の場合 $title = '◆不登校生の子育てに悩むママからの相談'; $content = '『' . $post->post_title . '』' . "\n" . get_permalink($post->ID) . "\n\n" . '皆さまからのコメントを募集しています(*´`)'; break; case 'info': //カスタム投稿タイプ「info」の場合 $title = '◆' . $post->post_title; $content = get_permalink($post->ID); break; default: $title = ''; $content = ''; break; } $tweet_contents = $title . "\n\n" . $content; //ツイート実行 $twitter->tweet($tweet_contents); } } add_action('transition_post_status', 'auto_post_tweet', 10, 4);
注意点としては、ファイル「twitter_api.php」を読み込むときにレンタルサーバーでは絶対パスが許可されていないことが多いので、相対パスで指定してあげたほうが確実です。
うまく動作すると、サイト内でコンテンツが投稿されると下記のようなツイートが自動で投稿されます。
◆不登校生の子育てに悩むママからの相談
『気分転換方法を教えてください』https://t.co/B5qkulo3ny
皆さまからのコメントを募集しています(*´`)
— 不登校生のママたちが運営するサイト『未来地図』 (@miraitizu_com) March 23, 2020
おわりに
以上、今回の記事ではWordPressの記事公開時にTwitterで自動ツイートさせる方法を紹介させていただきました。
当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。