コメント拡張プラグインのwpDiscuzをadd_filter(フィルターフック)でカスタマイズするまでの流れ

add_filterうろ覚えだったnanamiです。

このブログではコメントにwpDiscuzを使用していますが、ちょっと気に入らないことがあったのでadd_filterで少しだけ修正してみました。

コメント拡張プラグイン

コメントを拡張しようとしてどのプラグインを入れるかでWordPressコメント拡張プラグイン「Disqus Comment System」VS 「Comments – wpDiscuz」を参考にさせていただきました。って今気づいたけど参考先もwpDiscuzですね。

Disqusを使用するとコメントは外部サービスに保存され、WordPress内で完結しなくなるのが嫌でwpDiscuzを導入することに。

wpDiscuzで困る

wpDiscuzはモダンなUIでそこそこ気に入っています。が、一つだけ不満が。

ここのリンクです。

wpDiscuz Disable Profiles URL

特にプロフィールページは設けていないのでこのオプションにチェックを付けてリンクしないようにしました。

wpDiscuz Disable Profiles URL

このブログのコメントは下記構成になっています。

wpDiscuz

コメント投稿者のURLを入れる欄を設けているのですが、投稿されたコメントのどこにもそのリンクがありません。コメントを書いてくれた方のWebサイトを見たいのに、そのリンクがない。これは困った。

wpdiscuz

なんで入力欄があるのにリンクがないんだろうと不思議に思ったんですが、もしやと思って「Disable Profiles URL」オプションのチェックを外してみるとリンク出現。

wpdiscuz

えーこのオプションでコメント投稿者のURLのON/OFF切り替えるのっておかしくないか・・・。意味的にはまぁ外れてはいないと思うけれど。

このオプションを外したことで望むリンクは得られるようになったんだけど、今度は自分のプロフィールページへのリンクが出現。いや、そのページ無いから。

というわけで、add_filterでプラグインをカスタマイズする

まずはHTMLの確認。アバター画像のimgタグに「class=”avatar avatar-64 photo”」が設定されている。
wpDiscuzの問題箇所があるテンプレートを見つけたいので勘で「photo」をチョイスしてwpDiscuzのディレクトリ内を文字列で検索。
(検索文字列はavatarとphotoどっちでもよかったんだけど、適当にphotoにしました。avatar-64の数値部分は動的っぽいので除外。)

すると「wpdiscuz/templates/comment/class.WpdiscuzWalker.php」の128行目に発見。

$authorAvatar = '<img class="avatar avatar-64 photo" width="64" height="64" src="' . plugins_url(WPDISCUZ_DIR_NAME . '/assets/img/trackback.png') . '" alt="trackback">';

たぶんこの近くにアバター画像にaタグを設定している部分があるんだろうなとコードを読んでいくと予想通り131行目に問題の箇所を発見。

if ($profileUrl && !$this->optionsSerialized->disableProfileURLs) {
    $commentAuthorAvatar = "<a href='$profileUrl' target='_blank'>$authorAvatar</a>";
} else {
    $commentAuthorAvatar = $authorAvatar;
}

ここそのまま書き換えてaタグを取っ払ってやりたいけど、それだとプラグインのアップデートで上書きされるから我慢。
$commentAuthorAvatarはどう処理されているのかなと「$commentAuthorAvatar」で同ファイル内を検索すると161行目に発見。

$output .= '<div class="wc-comment-left ' . $commentLeftClass . '">' . $commentAuthorAvatar;

$output に結合されてるのか・・・。

add_filterでフィルターフックするためにフックを登録するapply_filtersを探します。
ベストなのは編集したい$commentAuthorAvatarを渡しているapply_filters。無かった\(^o^)/
仕方がないので$commentAuthorAvatarの文字列を結合されている$outputを渡しているapply_filtersは・・・あった! 196行目。

$output = apply_filters('wpdiscuz_before_comment_link', $output, $comment, $user, $current_user);

フック名はwpdiscuz_before_comment_link。

というわけでfunctions.phpにadd_filterを追加します。

add_filter('wpdiscuz_before_comment_link','commentAuthorAvatarLink');

今思えばcommentAuthorAvatarLinkって関数名適当すぎた・・・。人目につかないからと思ってw

続いて、functions.phpにcommentAuthorAvatarLinkの関数を追加。

function commentAuthorAvatarLink ($output){
    $output = preg_replace('/<a.*\/author\/.*?>(.*?)<\/a>/', "$1", $output);
    return $output;
}

$outputには除外したいプロフィールページ以外のaタグも含まれているので、hrefに/author/を含むaタグのみをpreg_replace()で置換しています。厳密にやるなら自サイトのドメインを含めればいいと思いますが、そこまでやらなくても今は困ら無さそうなのでOK。困ったら直します。

これで、「Disable Profiles URL」のチェックを外しても自分のプロフィールページへのリンクは無くなり、コメント投稿者のリンクが残るようになりました。

wpdiscuz

プラグインをadd_filterでカスタマイズする一連の流れを公開している記事が少なかったので皆様のお役に立てればと今回記事にいたしました。
また、今回のカスタマイズで参考にさせていただいたのが下記の記事です。add_filterとapply_filtersへの理解を深めることが出来てとても感謝です。ありがとうございます。

WordPress プラグインをカスタマイズする場合は、apply_filters() を探せ!
【WordPress】apply_filters と add_filter の使い方を理解できると便利だと思う【PHP】

この記事へのコメント

avatar
wpDiscuz
トップページへ戻る