WordPress popular postsは大変便利なプラグインなのでお気に入りです。
しかし、Wordpress popular postsは、viewの記録の条件が3種類しかありません。
- 訪問者のみ
- ログインユーザーのみ
- 全員
ダッシュボードにログインしている時にはviewは増えないのですが、一旦ログアウトしてしまうと自分のサイトを見ている時でもviewが増えてしまいます。
この記事では、Wordpress popular postsでview記録の条件をカスタマイズして、自分のIPアドレスを除外するカスタマイズをご紹介します。
この記事のカスタマイズを拡張することで、Wordpress popular postsのviewの記録条件を複雑な条件にすることも可能です。
WordPress popular postsはIPアドレスを記録していない
WordPress popular postsはviewを記録する時にIPアドレスをDBに保存していません。もし、特定のIPアドレスを除外してランキングを表示したいという場合、viewを記録する時点で除外する必要があります。
WordPress popular postsがviewを記録する仕組み
WordPress popular postsはviewを記録する条件を設定できます。設定できるのは、以下の3つの条件のいずれかです。
- 訪問者のみ
- ログインユーザーのみ
- 全員
設定した条件に当てはまらない時には、viewを記録しません。
ソースコードを追ってみます。
①viewの記録条件を参照してpost_IDをインラインjavascript変数として出力
$this->config['tools']['log']['level']
に設定値が記録されており、その条件に当てはまる時にはHelper::is_single()
を実行しpost_IDを取得し、$is_singleに保存します。
$is_singleはインラインスクリプトにてjavascript変数として出力されます。
// Enqueue WPP's library.
$is_single = 0;
if (
( 0 == $this->config['tools']['log']['level'] && ! is_user_logged_in() )
|| ( 1 == $this->config['tools']['log']['level'] )
|| ( 2 == $this->config['tools']['log']['level'] && is_user_logged_in() )
) {
$is_single = Helper::is_single();
}
$wpp_js = ( defined('WP_DEBUG') && WP_DEBUG )
? plugin_dir_url(dirname(dirname(__FILE__))) . 'assets/js/wpp.js'
: plugin_dir_url(dirname(dirname(__FILE__))) . 'assets/js/wpp.min.js';
wp_register_script('wpp-js', $wpp_js, [], WPP_VERSION, false);
$params = [
'sampling_active' => (int) $this->config['tools']['sampling']['active'],
'sampling_rate' => (int) $this->config['tools']['sampling']['rate'],
'ajax_url' => esc_url_raw(rest_url('wordpress-popular-posts/v1/popular-posts')),
'api_url' => esc_url_raw(rest_url('wordpress-popular-posts')),
'ID' => (int) $is_single,
'token' => wp_create_nonce('wp_rest'),
'lang' => function_exists('PLL') ? $this->translate->get_current_language() : 0,
'debug' => (int) WP_DEBUG
];
wp_enqueue_script('wpp-js');
wp_add_inline_script('wpp-js', json_encode($params), 'before');
②javascriptでpost_IDを参照して、post_IDがあればREST APIを起動してDBに記録
インラインjavascript変数はwpp.paramとして参照されます。
wpp_params.IDが0 or nullでなければREST APIを起動してDBに記録します。
(function(){
try {
var wpp_json = document.querySelector("script#wpp-json"),
do_request = true;
wpp_params = JSON.parse(wpp_json.textContent);
if ( wpp_params.ID ) {
if ( '1' == wpp_params.sampling_active ) {
var num = Math.floor(Math.random() * wpp_params.sampling_rate) + 1;
do_request = ( 1 === num );
}
if ( do_request ) {
WordPressPopularPosts.post(
wpp_params.ajax_url,
"_wpnonce=" + wpp_params.token + "&wpp_id=" + wpp_params.ID + "&sampling=" + wpp_params.sampling_active + "&sampling_rate=" + wpp_params.sampling_rate,
function( response ) {
wpp_params.debug&&window.console&&window.console.log&&window.console.log(JSON.parse(response));
}
);
}
}
} catch (err) {
console.error("WPP: Couldn't read JSON data");
}
ここまでのまとめ
特定の条件時のみpost_IDを0 or nullで返すカスタマイズ
自分のIPアドレスを指定して、そのIPアドレスからのアクセスの場合はviewの記録を停止するために、post_IDを”0″ or nullになるようにしなければなりません。
先ほども触れましたが、post_IDを返すのは、以下のis_single()
関数です。
public static function is_single()
{
$trackable = [];
$registered_post_types = get_post_types(['public' => true], 'names');
foreach( $registered_post_types as $post_type ) {
$trackable[] = $post_type;
}
$trackable = apply_filters('wpp_trackable_post_types', $trackable);
if (
is_singular($trackable)
&& ! is_front_page()
&& ! is_preview()
&& ! is_trackback()
&& ! is_feed()
&& ! is_robots()
&& ! is_customize_preview()
) {
return get_queried_object_id();
}
return false;
}
is_single()
の出力を操作するために、$trackable に仕掛けられているフックを使います。
$trackable = apply_filters('wpp_trackable_post_types', $trackable);
add_filter('wpp_trackable_post_types', function($trackable){
if($_SERVER['REMOTE_ADDR']=="143.177.xxx.xxx"){
return array('null');
}
return $trackable;
});
カラクリとしては、wordpress popular postsがviewをカウントする条件にpost_typeの指定があります。
そのpost_typeではないviewに対してはviewを記録しません。
なので、特定の条件の時だけ、存在しないpost_typeを指定してあげれば、viewの記録は行われません。
注意しなければならないのは、return falseにしてしまうと、is_singular()がtrueを返してしまうので、存在しないpost_typeを返す必要があります。
【おすすめ】静的ページキャッシュプラグインと併用する場合のカスタマイズ
今までご紹介したカスタマイズは、訪問者ごとに、Wordpress popular postsが投稿毎にHTML内に出力するjsonデータを変更して実現するものでした。
そこで、キャッシュされてしまうjsonデータを加工するのではなく、REST APIで呼び出されるPHPの方で動きを変えます。
<?php
add_action('wpp_pre_update_views', function($post_ID, $views){
if($_SERVER['REMOTE_ADDR']=="143.177.xxx.xxx"){
die();
}
}10,2);
DBに値を書き込む前に、IPアドレス判定をして除外するIPの場合は、処理をスキップします。
REST APIで呼び出される側でカスタマイズすれば、静的キャッシュプラグインの影響は受けません。このカスタマイズの方が汎用性が高いと思います。
ユニークユーザーによるPVをカウントするカスタマイズ
Google AnalyticsのようにユニークユーザーによるPVのみをカウントしたい場合のカスタマイズは以下の記事をご覧ください。

まとめ
この記事では、Wordpress popular postのviewのカウント条件を細かく制御するカスタマイズをご紹介しました。
ログアウト状態の自分のIPアドレスからのviewを記録しないようにすることで、スマホからのアクセスなども除外できるようになるでしょう。
コメント