こちらの記事で自作すると宣言していた機能を実装してみました。
やりたいことはこれです。
- WordPressで記事を投稿した時にTwitterへ自動投稿する
- ツイート内容に、記事のタグをハッシュタグとして追加する
基本的な内容を参考にさせていただいたのはこちらの記事です。
上記記事では twitter_api.php というファイルを作成するのですが、私の方でもまるごと使わせて頂いてます。(修正ナシ)
ツイートのタイミングですが、
- 「新規追加」から「公開」
- 「下書き保存」から「公開」
- 「レビュー待ち」から「公開」
- 「予約投稿」から「公開」
これら全てに対応してくださっているので助かります!
実装する時に、何度か試してみた際の動きとしてはこんな感じでした。
- 140文字をオーバーするとツイートされない
- ゴミ箱から復元した段階では投稿されない
(あくまでも「公開」ボタンを押した時だけ発動?) - 過去に投稿された記事でも、公開し直すと再度投稿される
それと、ハッシュタグを追加する場合の記述はこちらを参考にしました。
私の場合、タグをたくさん使うことが多いので、もし全部入れちゃうと、文字数オーバーになるなぁ、と思い、制限いっぱいまではハッシュタグを追加するような仕様にしてみました。
/* --------------------------------------------------
// Twitter自動投稿
-------------------------------------------------- */
include('path/twitter_api.php');
// Twitter APIキー
define('TW_CONSUMER_KEY', '**********');
define('TW_CONSUMER_SECRET', '**********');
define('TW_ACCESS_TOKEN', '**********');
define('TW_ACCESS_TOKEN_SECRET', '**********');
add_action('transition_post_status', 'hook_transition_post_status', 10, 3);
function hook_transition_post_status($new_status, $old_status, $post) {
// 投稿のステータスが「新規追加」または「下書き保存」または「レビュー待ち」または「予約投稿」から
// 「公開」へ変わった時にTwitterに自動投稿する
if (($old_status == 'auto-draft'
|| $old_status == 'draft'
|| $old_status == 'pending'
|| $old_status == 'future')
&& $new_status == 'publish' && $post->post_type == 'post') {
// Twitter API
$twitter = new TwitterApi(TW_CONSUMER_KEY, TW_CONSUMER_SECRET, TW_ACCESS_TOKEN, TW_ACCESS_TOKEN_SECRET);
// アイキャッチ画像が設定されているならば画像のアップロード
if (has_post_thumbnail($post->ID)) {
$image_url = _get_post_thumbnail_url($post->ID, 'large');
$json = $twitter->post_media($image_url);
// 添付画像のIDを取得
$media_id = $twitter->get_media_id($json);
} else {
// 添付画像なし
$media_id = null;
}
// ツイートを投稿
$limit = 140;
$status = '新着記事 『{{TITLE}}』{{BR}}{{URL}}'; // TODO: ツイート本文のテンプレートを適当なところから取得
$status = str_replace('{{TITLE}}', $post->post_title, $status);
$status = str_replace('{{URL}}', get_permalink($post->ID), $status);
$status = str_replace('{{BR}}', "\n", $status);
if( mb_strlen( $status ) < $limit ){// 文字数がオーバーしていなければ
//ハッシュタグを設定
$posttags = wp_get_post_tags( $post->ID );
if( $posttags ){
foreach( $posttags as $tag ){
if (preg_match("/^[ぁ-んァ-ヶーa-zA-Z0-9一-龠0-9_]+$/u",$tag->name)) {
$hashtag = " #" . $tag->name;
if( ( mb_strlen( $status ) + mb_strlen( $hashtag ) ) <= $limit ){
$status = $status.$hashtag;
}else{
break;
}
}
}
}
}
$twitter->tweet($status, $media_id);
}
}
/**
* アイキャッチ画像のURLを取得します
*/
function _get_post_thumbnail_url($post_id, $size) {
$image_id = get_post_thumbnail_id($post_id);
$images = wp_get_attachment_image_src($image_id, $size);
$image_url = $images[0];
return $image_url;
}
何度かテストすると、ハッシュタグとして認識してくれないタグが幾つかありました。
ハッシュタグとして認識してくれない文字は除外しなければ、ということになり、 preg_match するしかない…と正規表現が苦手な私には大変な苦行が待っていました。
ハッシュタグでは殆どの記号が使えないようです。「_(アンダースコア)」ぐらい。
使いそうな記号を実際に入力してみました。
「_(アンダースコア)」と「ー(長音)」は無事ですね。(長音は記号ではないですが)
これをどういう正規表現にしたら良いのかさーっぱりわからなかったのですが、こちらに素敵な記事がありました。
こちらでは「、」や「。」改行も許可されていたので、それを外し、「_(アンダースコア)」を許可するよう変更しました。(たぶんできている…と思います)
preg_match("/^[ぁ-んァ-ヶーa-zA-Z0-9一-龠0-9_]+$/u",$tag->name)
私がタグに使うのは半角英数と漢字ひらがなカタカナ、「.(ドット)」なんかの一部の記号ぐらいなのでこれでなんとか大丈夫なのではないかと思ってます。
ドットを半角スペースに置き換えようかとも考えましたが、ドットを使うのは基本ファイル名なので、半角スペースにするとなんだかわからないものになってしまうため、ドットが入ったタグは無視することにしました。
テストとして、以下のタグが入った記事をWordPressで投稿してみました。
- Twitter 自動投稿(半角スペースが入っている)
- WP 4.9.1(半角スペース、ドットが入っている)
- functions.php(半角ドットが入っている)
- WordPress(半角英字のみ)
- プラグイン不使用(カタカナ、漢字のみ)
- 点、と丸。(、。が入っている)
- ワードプレス(WordPress)(半角カッコが入っている)
- ツイッター(Twitter)(全角カッコが入っている)
- @na72tu(半角アットマークが入っている)
- 2017/12/4(半角スラッシュが入っている)
- wp_head(半角アンダーバーが入っている)
テスト投稿はこちら(Twitter 自動投稿テスト)
で、実際のツイートがこちらです。
新着記事 『Twitter 自動投稿テスト』https://t.co/53W9MUc3jQ #WordPress #wp_head #プラグイン不使用 pic.twitter.com/Ga1B76hpTa
— なつ (@na27tu) 2017年12月4日
記号が入っているタグが除外されてますね!
しばらくはこれで様子見しようかと思います。
Twitterにハッシュタグ付きで自動投稿する場合はできるだけ除外されないようなタグを付けるよう少し注意が必要ですね。

