投稿のタイトルは入力されているけど、サイト名がない!ということでサイト名もつけてみたい。
いきなりだけど以下のように対策した。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関数のコール元がわかる。さらにコール元が関数内なら、その関数のコール元をトレースしてくれる。
トレースの結果は配列で返すので、文字列に変換したいためにhttp_build_query関数を通す。
$backtrace = http_build_query(debug_backtrace());
wp_social_bookmarking_light_the_content 関数を通っているか確認。
strpos($backtrace,'wp_social_bookmarking_light_the_content')