Jetpack for WordPressのパブリサイズ共有を色々カスタマイズしてみた

様々な追加機能を用意してくれるJetpack for WordPressですが、その中のTwitterやFacebook等のSNSに投稿時に自動的に共有をしてくれるパブリサイズ共有で色々とカスタマイズしたい所があったので、調べたことのメモを残しておきます。

Jetpack

インストール方法や設定方法は、丁寧に説明されているページがありますので割愛させていただきます。

パブリサイズ共有

ソースを追ってみたところ、デフォルトでは「title url」で共有され、投稿内容と共有するサービスをwordpress.comに送信してそこから発信しているようなので、各サービス毎に内容を変更する、と言ったことは難しそうです。

ちなみに今回調べてみた内容は下記の通り。

カスタム投稿タイプでも適用させる

単純にインストール→有効化しただけでは、通常の「投稿」だけしかパブリサイズ共有は行えません。

管理画面上でも追加する欄はありませんので、functions.phpに追記する必要があります。

/** カスタム投稿タイプにもパブリサイズ共有を対応 */
function add_jetpack_custom_post_publicize()
{
    add_post_type_support( 'report', 'publicize' );
    add_post_type_support( 'topics', 'publicize' );
}
add_action( 'init', 'add_jetpack_custom_post_publicize' );

参考

共有する文言を変更する

前述のとおりカスタムメッセージを入力しなかった場合は「title url」で共有されますが、「ブログを更新:title url」とかにしたい、という時もあるかと思います。

その場合は、メッセージ全体のwpas_default_message、接頭語wpas_default_prefix、接尾語wpas_default_suffix、それぞれをフィルタリングするフックが用意されています。

しかし、このフックが処理されるのが__construct内なので、functions.phpに記載しても適用されません。
何か方法は無いかと調べていると、必須プラグインディレクトリに作ってしまえば通常のプラグインより実行されるので、ココでadd_filterをすることで何とかなりました。

「wp-content/mu-plugins/」ディレクトリを作成し、下記のPHPを格納すると、「ブログ更新:『title』ぜひ見てね」という文言に変わります、が、パブリサイズ共有の「編集」を押した時に「カスタムメッセージ」に自動的に入る文言しか変わりませんでした。ぐぬぬ…。

<?php
/**
 * JetPackFilters
 * JetPack向けフィルター
 *
 * @package WordPress
 */

class JetPackFilters
{
    public function __construct()
    {
        add_filter( 'wpas_default_message', array( $this, 'wpas_custom_message' ), 10, 1 );
        add_filter( 'wpas_default_prefix',  array( $this, 'wpas_custom_prefix'  ), 10, 1 );
        add_filter( 'wpas_default_suffix',  array( $this, 'wpas_custom_suffix'  ), 10, 1 );
    }

    /**
     * messageの変更
     *
     * @param  string $message
     * @return string
     */
    function wpas_custom_message( $message ) {
        return '『'.$message.'』';
    }

    /**
     * prefixの変更
     *
     * @param  string $prefix
     * @return string
     */
    function wpas_custom_prefix( $prefix ) {
        return 'ブログ更新:';
    }

    /**
     * suffixの変更
     *
     * @param  string $suffix
     * @return string
     */
    function wpas_custom_suffix( $suffix ) {
        return 'ぜひ見てね';
    }
}

new JetPackFilters();

参考

強制的に文言を変更する

注意

どのタイミングかわからないのですが、仕様が変更になったようで、以前に公開していたコードでは文言の変更が出来ない状態になっていました。(2015年9月10日時点)

現状の下記コードでは修正を行っていますので、強制的に変更が出来るようになっているはずです。

具体的には、下記のような変更がなされていました。

if ( ( $from_web || defined( 'POST_BY_EMAIL' ) ) && !empty( $_POST['wpas_title'] ) )
	update_post_meta( $post_id, $this->POST_MESS, trim( stripslashes( $_POST['wpas_title'] ) ) );

前までは上のように、登録だけするはずだったのですが、

if ( ( $from_web || defined( 'POST_BY_EMAIL' ) ) && isset( $_POST['wpas_title'] ) ) {
	if ( empty( $_POST['wpas_title'] ) ) {
		delete_post_meta( $post_id, $this->POST_MESS );
	} else {
		update_post_meta( $post_id, $this->POST_MESS, trim( stripslashes( $_POST['wpas_title'] ) ) );
	}
}

という感じに、$_POST['wpas_title']が空だった場合は、post_metaを削除する処理が追加されていました。

前述の方法だと「編集」を押さないと反映されないので、うっかり忘れてしまうコトを考慮するとやはり自動的に変更できた方が良いかと思います。

処理を追ってみると「_wpas_mess」というカスタムフィールドに入力しておくと、カスタムメッセージを入力した状態と同様になるようなので、公開時の処理にフックすることで対応できますので、強制的にカスタムメッセージを入力させたことにして対応してみました。

既に同様のコトを考えていらっしゃる方もいらっしゃいましたが、記事内に記載の通り、

publicize_save_metaは共有しているサービスxアカウントの数だけ呼ばれるので若干無駄な気もした

という処理だったので、ちょっと強引ですが、JetPackのsave_postより優先度の高い位置で処理をする方法を取ってみました。

/** パブリサイズ共有の文言を変更 */
function change_jetpack_publicize_content( $post_id, $post )
{
    $POST_MESS = '_wpas_mess';

    /** 投稿,下書き,スケジュール待ちのみ */
    if ( !in_array( $post->post_status, array( 'publish', 'future' ) ) ) {
        return;
    }

    /** カスタムメッセージのPOSTがあったら無視 */
    if ( !empty( $_POST['wpas_title'] ) ) {
        return;
    }

    /** カスタムメッセージがある場合は無視 */
    if( get_post_meta( $post_id, $POST_MESS, TRUE ) ) {
        return;
    }

    /** 共有する文言の成形 */
    $publicize_custom_message = sprintf( 'ブログ投稿:『%s』ぜひ見てね %s', $post->post_title, wp_get_shortlink( $post->ID ) );
    
    /** カスタムメッセージとして登録 */
    update_post_meta( $post_id, $POST_MESS, $publicize_custom_message );
    
    /** postmetaが削除されないように$_POSTにも代入 */
    $_POST['wpas_title'] = $publicize_custom_message;
}
/** JetPackのパブリサイズ共有のsave_postに対する処理の優先度は「20」 */
add_action( 'save_post', 'change_jetpack_publicize_content', 19, 2 );

ちなみにこの時点では$postが取得できるので、投稿タイプやカテゴリーによって内容を変えたりすることも可能です。

共有するURLを変更する

あまり需要は無いと思いますが、共有するURLを変更すること出来なくはありません。
例えば邪道な方法ですが、WordPressを管理画面としてだけ利用し、詳細ページはWPの外から投稿内容だけ読み取っている、といった場合はパーマリンクのURLとは別のアドレスになると思います。

というよりも、結論から申すとパーマリンクの向き先を該当のURLに切り替える事で共有するURLも切り替わります。

まずはパーマリンクのURLを変更する場合は、post_type_linkにフィルタリングします。

function change_post_type_link( $link, $post )
{
    // 投稿だけ変更
    if ( 'post' === $post->post_type ) {
    	/* $linkを変更する処理 */
    }
    return esc_url( $link );
}
add_filter( 'post_type_link', array( $this, 'change_post_type_link' ), 1, 2 );

また、投稿内容に利用されるURLはショートリンク(http://example.net/?p=***)なので、そちらも変更します。

function change_short_link( $dummy, $post_id, $context )
{
    if ( 'post' == $context ) {
        $post = get_post( $post_id );
        // 投稿だけ変更
        if( $post->post_type === 'post' ) {
            /* $urlを変更する処理 */
            return esc_url( $url );
        }
    }
    return FALSE;
}
add_filter( 'pre_get_shortlink', 'change_short_link', 10, 3 );

the_permalinkで指定のURLにリンクするようにもなるので、一石二鳥じゃないでしょうか?

雑感

流石AutomatticのプラグインだけあってWordPressの機能をコレでもかという位使ってあって追うのが大変、ですがフィルターやフックもいたるところに用意されていてかなり親切な作りです。

パブリサイズ共有だけでなく、他の処理でもちょっとココだけ何とかしたい…!といったことも意外と何とかなるかもしれません。