【WordPressカスタマイズ相談】現役プログラマが解決策を教えます

WordPress(ワードプレス)のお悩み、うまくいかなくてお困りなこと、不具合調査、新規制作依頼まで、ウェブアプリケーションエンジニアがあなたをサポートします。

【WordPress Popular Posts】ランキング一覧のHTMLをフィルターフックでカスタマイズ

f:id:jsaz:20170704213435j:plain

PV集計を行いランキングを表示してくれるプラグイン
WordPress Popular Posts」
とても簡単にランキングを構築することができて便利ですよね。
ja.wordpress.org


一覧を表示(出力)する場合、ウィジェットやショートコード、関数などで
post_htmlにHTMLをセットしてランキングを表示するのが一般的かと思います。


パラメータ(表示させる記事の項目)は名前やリンク、
閲覧数やコメント数などいくつかの基本的な項目として用意されています。
下記、「post_htmlのパラメーター」項目を参照

hani-wordpress.biz


表示できる項目は限られているので、

カスタムフィールドを使いたい!

記事IDを取得してどうこうした!

というようなケースでは上記のpost_htmlパラメータでは実現できないんです。

ココナラやWow!meでも結構たくさんの方からご相談をいただきます。

そんな時でも対応できるのが「フィルターフック」です。
プラグインが予めフィルター適用を可能にしてくれています。


それでは実際の使い方をご説明します。

wpp_postフィルター

wpp_post」フィルターで表示制御を行います。
スクリプトの記述はfunctions.phpが良いと思います。

<?php
add_filter( 'wpp_post', 'custom_wpp_post');
function custom_wpp_post($post_html, $post, $instance ){
	//ここにHTMLを記述しreturnする
}

引数 $post に記事情報とランキング情報

$post_html ... post_htmlパラメータにセットした文字列がそのまま入ります
$post ... 記事情報とランキング情報が入る
$instance ... オプション(無視してOK)

$postからID,Titleなどの基本情報を取得でき、
$post->pageviews, $post->comment_countとするとランキング情報を取得できます。


実際の使い方

<?php
add_filter( 'wpp_post', 'custom_wpp_post');
function custom_wpp_post($post_html, $post, $instance ){
    $format_html = <<<EOM
<li>
    <a href="%s" class="title" title="%s">%s</a> 
    <div class="date">%s</div>
</li>
EOM;
    $output = sprintf($format_html, 
        get_the_permalink($post->id), 
        esc_attr($post->title), 
        $post->title, 
        date( 'Y-m-d', strtotime($post->date))
    );
    return $output;
}

PHPヒアドキュメントを使いわかりやすくHTMLを記述しています。


wpp_postというのは1行ごとに呼ばれます。
wpp_custom_htmlフィルターを使うと、
引数 $mostpopularに全ランキング情報が入ってきます。

ループで$mostpopularを回すことができるので、
1位、2位。。。という順位をPHPで表示させることも可能です。
(記事IDは$mostpopular[i]->id で取得できるっぽい)

github.com


記事IDを取得できれば、カテゴリやタグ、カスタムフィールドなどもテンプレートで書くような感覚で取得・カスタマイズできますね。