2020.03.23

WordPressの記事公開時にTwitterで自動ツイートさせる方法【自作】

こんにちは、webエンジニアのゾノ( @ozonosho )です。

今日のブログではプラグインを使わずに、WordPressの記事公開時にTwitterで自動ツイートさせる方法を紹介したいと思います。

記事公開時にSNSと連携させるプラグインは「Jetpack」を筆頭にいくつかありますが、JetpackをSNS連携のためだけに導入するとサイトが必要以上に遅くなってしまうので、今回は自作で機能を作ってみました。

TwitterのAPIを使って出来ることを知れたので、今後、サイトのSNS運営を効率化できそうな機能を色々と実装できそうです!

WordPressの記事公開時にTwitterで自動ツイートさせる方法

実装手順は下記の2ステップになります。

  1. TwitterAPIに登録して各種キーを取得
  2. 記事公開時に自動ツイートする処理を実装

それぞれ解説していきます。

①TwitterAPIに登録して各種キーを取得

まずはTwitterアカウントとサイトを連携させるために、TwitterAPIの登録をおこなう必要があります。

TwitterAPIの登録をすることで、外部からTwitterアカウントを操作するための各種キーを取得することができるためです。

TwitterAPIの登録方法は下記サイトの情報が分かりやすかったのでぜひ参考にしてみてください。

※参考サイト
『Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ』

尚、必要なキーは下記の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」を読み込むときにレンタルサーバーでは絶対パスが許可されていないことが多いので、相対パスで指定してあげたほうが確実です。

うまく動作すると、サイト内でコンテンツが投稿されると下記のようなツイートが自動で投稿されます。

おわりに

以上、今回の記事ではWordPressの記事公開時にTwitterで自動ツイートさせる方法を紹介させていただきました。

当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。

あなたのサイトに理想の機能を実装!WordPressカスタマイズサービス

本サービスはあなたのWordPressサイトに理想の機能を実装するサービスとなります。 どのような機能・要望でも実現可能です! Wo......

→この記事を読む