WordPress の投稿を自動で Facebook ページに投稿したい案件があり、当初、自動投稿に特化し機能も豊富な NextScripts: Social Networks Auto-Poster (SNAP) というプラグインを使用しようと設定を進めていましたが、“Invalid Scopes: manage_pages, publish_pages.” という警告が出て、どうにも連携することができず。

どうも、テストアプリを作成したり、レビュー申請ビデオを作成して Facebook の審査を受けなければならないなど、いろいろ面倒っぽいので、SNAP の利用は諦め、API が不要な Jetpack プラグインを利用することにしました。Jetpack はアクセス解析やセキュリティ対策など、30種類以上もの機能がパックになっているプラグインですが、この中にある Facebook や Twitter などの SNS と連携できる「パブリサイズ共有」の機能を使用します。

ただ、自動投稿に特化したプラグインではないので、デフォルトではカスタム投稿タイプに対応していません。また、今回カスタム投稿タイプの投稿全てと、標準の投稿の内、特定のカテゴリの投稿のみを Facebook に自動投稿せる必要があるのですが、カテゴリを選択できる機能もないので、カスタマイズしてみました。

まず、カスタム投稿タイプに対応させる方法は検索するとすぐに、沢山見つかりました。

// カスタム投稿タイプをパブリサイズ共有に対応させる
function custom_publicize_share() {
  add_post_type_support( 'custom_post_slug', 'publicize' );
}
add_action( 'init', 'custom_publicize_share' );

一方、特定のカテゴリの投稿のみに対応させる方法は検索しても見つかりません。ただ、記事投稿時のパブリサイズ共有チェックボックスのデフォルトを無効にする方法は見つかりました。

add_filter( 'publicize_checkbox_default', '__return_false' );

これを流用して、標準の投稿はパブリサイズ共有のデフォルトを無効にし、jQuery を使って、特定のカテゴリがチェックされた場合にパブリサイズ共有を有効にするようにしました。

まず、先のパブリサイズ共有チェックボックスのデフォルトを無効にする記述を、標準の投稿のみに適用させます。パブリサイズ共有を標準の投稿でしか使わないのであれば、先の記述のままでOKです。

// パブリサイズ共有のデフォルト設定
add_filter( 'publicize_checkbox_default', 'my_publicize_default' );
function my_publicize_default($post) {
  if ( get_post_type() == 'post' ){  // 投稿のみ
    return false;
  }
  return $post;
}

そして、jQuery で特定のカテゴリのチェックを検出して、パブリサイズ共有を有効にします。

// カテゴリの選択によってパブリサイズ共有のON/OFFを切り替える
add_action( 'admin_print_footer_scripts', 'publicize_checkbox' );
function publicize_checkbox() {
?>
<script>
jQuery( function($){
  $('input#in-category-XX').click(function(){  // XX はカテゴリID
    if ( $(this).prop('checked') ) {
      $('input.wpas-submit-facebook').attr('checked', true);
      $('#publicize-defaults').html('<strong>Facebook: Facebookページの名前</strong>');
    } else {
      $('input.wpas-submit-facebook').attr('checked', false);
      $('#publicize-defaults').html('');
    }
  });
});
</script>
<?php
}

これでとりあえず目的は達成できました。

ただ、Jetpack のパブリサイズ共有は API 不要で自動投稿が可能なので、いつ Facebook 側の仕様が変更されて使えなくなるかわかりません。Facebook に限らず外部サービスとの連携は注意が必要です。