Steamer Lane Studio技術備忘録WordPress

mastodonでのWordPress連携自動投稿

wordpress mastodonでのWordPress連携自動投稿
最終更新日: 2024年5月6日

Twitterがこうした連携=URL貼り投稿に対し、画像のみの表示とする。
そんな発表をしている。
実際PC版やXにアプデしていない当方のものは普通に投稿してタイトルから必要に応じたものが表示されてはいるが、何れ発表の通りとなるのだろう。
bot対策だのAPIの有料化だの、こうしたCMS連携だけ(中には激しく連投する者もいたらしいが)で使っている人間には甚だ迷惑な話で、Twitterがいよいよその利用価値を自ら無くしてしまった時に際し、他のSNSを漁った。
Tumblrが良いかと思ったこともあるが、ここもIfttt連携だが夏ごろにfeed読み込みによる連携自動投稿に制限がかかり、txt・URL・photoなどどれか一つしか投稿できなくなった。
SNSで拡散してサイトに集客といったことを考えると、写真・タイトルにURLが貼られていないと弱い。

Thredsはそもそもリンク貼れない、meta社ものはダメだな。Thredsやるなら別にオワコンのFacebookでもいいわけだしね。

でmastodonを見つけた、昔なんだこれって一見でシカトした記憶があったが、アカウント作ってみて使ったらほぼTwitterと同じ。
使い込んでないからわからないが、500文字までOKという部分からTumblrにより近いのかもしれない。

で肝心のCMS連携だが、Twitterの様にtokenなど取得しなければいけないが、Wordpressならfunction.phpにコード書けばそれで簡単に連携できた。
前提として、OGP記載でURLのみ送る形(別にタイトルだの送るコードもあるが、OGP使うのが楽)だが以下がそのコード。
冒頭のURLとtokenだけ自分のアカウントのものにしてfunction.phpに追記すれば投稿と同時にmastodonへも投稿される。

// functions.php ファイル内に追加
// Mastodonへの投稿関数(URLのみ)
function post_url_to_mastodon($postUrl) {
$apiUrl = 'https://mastodon.example.com/api/v1/statuses';
$accessToken = 'YOUR_ACCESS_TOKEN';
$data = array( 'status' => $postUrl, );
$ch = curl_init($apiUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Authorization: Bearer ' . $accessToken, ));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch); curl_close($ch);
// レスポンスを処理したりエラーハンドリングを追加できます
return $response;
}
// 投稿保存後にMastodonへURLを投稿
function mastodon_post_on_publish($ID, $post) {
// 投稿のURLを取得
$postUrl = get_permalink($ID);
// MastodonへのURL投稿
post_url_to_mastodon($postUrl); } add_action('publish_post', 'mastodon_post_on_publish', 10, 2);

んな感じ。
例えば行政とかでもTwitterアカウントがあって、そこから災害時とか情報発信してるけど、仔細はURLからってなるでしょ。
現状リンク付き投稿はフォロワー側の設定で画像のみとするか、タイトルなども含めて表示するかという選択制らしいが、デフォルトは画像のみで、選択制を知らない/Xからのお知らせなんていちいち見ないと判らないじゃん。
画像にタイトルと簡単な説明埋め込むといっても面倒で文字数はスマホの画面内の画像にとなるとかなり限られる、情報不足だしなにより手間が多い。
一気にThredsユーザーが増えたといっても、所詮はFaceBookの公に匿名OK版でしかない。商用や行政の告知なんかで使う場合は最低限今の姿を維持していないとダメだからTwitterがいよいよダメになったら代替えの選択肢の一つとしてmastodon、その際もそうだが、インスタンスが.jpもあって汎用性も高そうだから自動投稿で済ますSNSのセカンドとしても使えると思う。

追記
Mastodonの仕様変更により更新毎投稿されるようになったので同一記事の重複投稿を禁止したコード// Mastodonへの自動投稿関数(URLのみ)function post_url_to_mastodon($postUrl) {$apiUrl = 'https://mastodon.social/api/v1/statuses';$accessToken = 'J-KRkeeCnWWi1JBylP8_3WC7Bc9taKsd20e7VefkOJc';

$data = array('status' => $postUrl,);

$ch = curl_init($apiUrl);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $accessToken,));curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);curl_close($ch);

// レスポンスを処理したりエラーハンドリングを追加できます

return $response;}

// 投稿保存後にMastodonへURLを投稿(特定のカテゴリーを除外)function mastodon_post_on_publish($ID, $post) {// 除外するカテゴリーのIDを指定$excluded_category_ids = array(15); // 除外したいカテゴリーのIDを指定

// 記事が特定のカテゴリーに属さない場合のみ投稿$post_categories = get_the_category($ID);$post_belongs_to_excluded_category = false;foreach ($post_categories as $category) {if (in_array($category->cat_ID, $excluded_category_ids)) {$post_belongs_to_excluded_category = true;break;}}

// 特定のカテゴリーに属さない場合にのみMastodonへのURL投稿if (!$post_belongs_to_excluded_category) {// 投稿IDを取得$postId = $post->ID;

// 過去の投稿IDリストを取得$postedPostIds = get_option('mastodon_posted_post_ids', array());

// 過去の投稿IDに含まれていない場合のみ投稿if (!in_array($postId, $postedPostIds)) {// 投稿URLを取得$postUrl = get_permalink($ID);

// MastodonへのURL投稿post_url_to_mastodon($postUrl);

// 投稿IDを過去の投稿IDリストに追加$postedPostIds[] = $postId;update_option('mastodon_posted_post_ids', $postedPostIds);}}}

add_action('publish_post', 'mastodon_post_on_publish', 10, 2);

// Mastodonへの自動投稿に使用するオプションを初期化add_action('admin_init', 'mastodon_posted_post_ids_init');function mastodon_posted_post_ids_init() {add_option('mastodon_posted_post_ids', array());}