WP Social Bookmarking Light によるTwitter ボタン 投稿内容にサイト名も表示


WordPressで簡単にソーシャルボタンの設置できるプラグイン “WP Social Bookmarking Light”  これでTwitterボタンも設置してみた。しかし、Twitterボタン をクリックすると次のような表示になる。

wp_021
投稿のタイトルは入力されているけど、サイト名がない!ということでサイト名もつけてみたい。

実装コード

いきなりだけど以下のように対策した。function.php に記述する。
[function.php]

/**
 * WP Social Bookmarking Light プラグインを拡張
 *   ※タイトル表示を変更する
 */
function wsbl_title_change( $title=null ) {
    $backtrace = http_build_query(debug_backtrace());
    if(false === strpos($backtrace,'wp_social_bookmarking_light_the_content')){
        return $title;
    }
    elseif(false === is_single()){
        return $title;
    }
    return $title . " | " . get_bloginfo() ;
}
add_filter( 'the_title', 'wsbl_title_change' );
解説
プラグインのコアを触ればいくらでも変更することができる。しかしプラグインの更新が止まってしまう、又は更新しても同じ改変をまたしないといけないことになるのでプラグインのコアは触りたくなかった。
とりあえずプラグインを解析したが、特にプラグイン独自のフックなどはなさそうなのでどのように改変しようか迷った。

[プラグイン | content.php]

function wp_social_bookmarking_light_the_content( $content )
{
    if( is_feed() || is_404() || is_robots() || is_comments_popup() || (function_exists( 'is_ktai' ) && is_ktai()) ){
       return $content;
    }

    $options = wp_social_bookmarking_light_options();
    if( $options['single_page'] && !is_singular() ){
        return $content;
    }
    if( !$options['is_page'] && is_page() ){
        return $content;
    }

    $out = wp_social_bookmarking_light_output( $options['services'], get_permalink(), get_the_title() );
    if( $out == '' ){
       return $content;
    }
    if( $options['position'] == 'top' ){
        return "{$out}{$content}";
    }
    else if( $options['position'] == 'bottom' ){
        return "{$content}{$out}";
    }
    else if( $options['position'] == 'both'){
        return "{$out}{$content}{$out}";
    }
    return $content;
}

プラグイン解析していくと、投稿タイトル取得に get_the_title() を使っている。
ということはフィルターフック  ‘the_title’ で投稿タイトルを書き換えることができる。
そこで次の対応をした。

add_filter( 'the_title', 'wsbl_title_change' );

コールバック関数 ‘wsbl_title_change’ で投稿タイトルにサイト名を追加っと。

return $title . " | " . get_bloginfo() ;

これで無事サイト名も表示されるようになったが問題が。get_the_title 関数を使っている箇所全てに適用されてしまう。今回の対応は、WP Social Bookmarking Light に対する対応なのでここだけに適用したい。さて、どうやってプラグインの wp_social_bookmarking_light_the_content 関数内の get_the_title() に対してだけ適用させたらいいのか。
プラグインのコアを改変したくないので、パラメータやグローバル変数を使って判定させるのは難しそうだ。ということで仕事でもちょくちょくお世話になっている PHPの debug_backtrace 関数を使った。バックトレース関数だ。つまりコール元をずっと追いかけてくれる。今回は wsbl_title_change関数内で記述したので、wsbl_title_change関数のコール元がわかる。さらにコール元が関数内なら、その関数のコール元をトレースしてくれる。wp_022
トレースの結果は配列で返すので、文字列に変換したいためにhttp_build_query関数を通す。

$backtrace = http_build_query(debug_backtrace());

wp_social_bookmarking_light_the_content 関数を通っているか確認。

strpos($backtrace,'wp_social_bookmarking_light_the_content')
あとは、wp_social_bookmarking_light_the_content関数がトレース内に含まれている場合のみ判定してサイト名を追加する。なんとかこれで動作することは確認した。いろいろ検証して特に問題なければプラグイン化する。function.php で記述できているのでプラグイン化はすぐだ。これでいろいろなサイトでも処理を使いまわせる。

wp_023

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です