お問い合わせ

WordPress popular posts|特定のIPを除外して記録するカスタマイズ

  • URLをコピーしました!

WordPress popular postsは大変便利なプラグインなのでお気に入りです。

しかし、Wordpress popular postsは、viewの記録の条件が3種類しかありません。

WordPress popular postsがviewを記録する条件
  • 訪問者のみ
  • ログインユーザーのみ
  • 全員

ダッシュボードにログインしている時には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つの条件のいずれかです。

WordPress popular postsがviewを記録する条件
  • 訪問者のみ
  • ログインユーザーのみ
  • 全員

設定した条件に当てはまらない時には、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");
    }

ここまでのまとめ

viewを記録しないためにはpost_IDを0 or nullで返せばいい

特定の条件時のみ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データを変更して実現するものでした。

もし、静的キャッシュプラグインを併用していると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の場合は、処理をスキップします。

add_actionは値を返せないので、die()で処理を中断します。

REST APIで呼び出される側でカスタマイズすれば、静的キャッシュプラグインの影響は受けません。このカスタマイズの方が汎用性が高いと思います。

ユニークユーザーによるPVをカウントするカスタマイズ

Google AnalyticsのようにユニークユーザーによるPVのみをカウントしたい場合のカスタマイズは以下の記事をご覧ください。

まとめ

この記事では、Wordpress popular postのviewのカウント条件を細かく制御するカスタマイズをご紹介しました。

ログアウト状態の自分のIPアドレスからのviewを記録しないようにすることで、スマホからのアクセスなども除外できるようになるでしょう。

他の人にもシェアしてね
  • URLをコピーしました!
  • URLをコピーしました!
コメントを閉じる

コメント

コメントする

コメントは日本語で入力してください。(スパム対策)

クリックできる目次