うちはJetpackの機能でPV表示に切り替えました

Simplicityの特徴 フォーラム 要望・機能追加など うちはJetpackの機能でPV表示に切り替えました

19件の返信スレッドを表示中
  • 投稿者
    投稿
    • #50471
      Mori
      ゲスト

      いつもお世話になります。
      MixHostが快適に機能しています。
      Popular postsを停止しました

      これはPVを表示するのに便利だったのですが・・・代わりに、公式プラグインのJetpackの統計情報を利用しています。
      こちらはWordPressサーバーにデータが蓄積されるのでデータベース負荷がありません。
      それを使って、PVを表示するようにしてみました

      コード

      <?php if ( is_user_logged_in() ) : ?>
      d-<?php 
       $jetpack_views = stats_get_csv('postviews', array('days' => 1, 'limit' => 1, 'post_id' => $post->ID )); 
       echo $jetpack_views[0]['views']; 
      ?>
       w-<?php 
       $jetpack_views = stats_get_csv('postviews', array('days' => 7, 'limit' => 1, 'post_id' => $post->ID )); 
       echo $jetpack_views[0]['views']; 
      ?>
       t-<?php 
       $jetpack_views = stats_get_csv('postviews', array('days' => -1, 'limit' => 1, 'post_id' => $post->ID )); 
       echo $jetpack_views[0]['views']; 
      ?>
       <a href="http://mori-room.com/wp-admin/admin.php?page=stats&view=post&post=<?php echo get_the_ID() ?>" target="_blank">■</a>
      <?php endif; ?>

      順に1日、7日、トータルのPV表示になっており、■はその記事の個別統計ページにいけます。
      Jetpackの導入は必要ですが、公式であることと、サーバー負担がないことを考えると、脱Popular postsを進めるほうがいいのではないかなと思ってやっています。
      Jetpackの統計を使うことで、人気記事の一覧も作れるようですので、こちらの方向でSimplicityのバージョンアップもいいのかなと勝手に思っております。

      ので、うちでやっているカスタマイズでした。(コードは素人なので、無駄が多い気がしますが・・・)
      参考↓
      https://amiten.net/archives/998

      Attachments:
    • #50473
      Mori
      ゲスト

      ちなみに、人気記事の方は、functions.phpに書き込み、

      function my_pop_list( $target_days, $n ) {
      	$i = 0;
      	$args = array( 'days'=>$target_days, 'limit'=>$n+2 );
      	$top_posts = stats_get_csv( 'postviews', $args );
      	echo "<ol>\n";
      	foreach ( $top_posts as $value ) {
      		$my_id = $value['post_id']; //投稿ID取得
      		if ( $my_id != 0 && $my_id != get_the_ID() && get_post_type($my_id) == 'post' ) { //homeと現在のページは除外で、投稿のみ
      			if( has_post_thumbnail($my_id) ) { //サムネイルの有無
      				$pop_img = get_the_post_thumbnail( $my_id, array(75, 75), array('alt'=>get_the_title($my_id)) );
      			} else {
      				$pop_img = '<img src="noimage.png" width="75" height="75" />';
      			}
      			echo '<li><a href="'.$value['post_permalink'].'">'.$pop_img.$value['post_title'].'</a>('.$value['views']."views)</li>\n";
      			$i++;
      			if ( $i >= $n ) { break; } //指定数を超えたら終了
      		}	
      	}
      	echo "</ol>\n";
      }
      

      表示したい箇所のテンプレートに、

      <?php my_pop_list( 7, 5 ); ?>

      を打ち込むことで、人気記事をJetpackの統計データから読み取って表示することが可能です。
      参考↓
      https://ateitexe.com/jetpack-popular-post/

    • #50474
      Mori
      ゲスト

      いろいろと試してみていますが、この方法では、Jetpackからのデータ読み込みに時間がかかるので、キャッシュされないと、管理人のみ最初の表示が遅いのがネックですね。(一般の訪問者には表示されないので、おそらく快適な表示のはず)

    • #50475
      Mori
      ゲスト

      何度もすいません。

      結局、速度が遅いので、「Jetpack Post Views」プラグインを導入して、API認証をして、以下のようなコードを書くとJetpackの日、週、月、合計のPVを何のストレスもなく表示できるようになりました。

      <?php if ( is_user_logged_in() ) : ?>
      d-<?php echo get_post_meta( $post->ID, 'jetpack-post-views-Day', true ); ?>
       w-<?php echo get_post_meta( $post->ID, 'jetpack-post-views-Week', true ); ?>
       m-<?php echo get_post_meta( $post->ID, 'jetpack-post-views-Month', true ); ?>
       t-<?php echo get_post_meta( $post->ID, 'jetpack-post-views', true ); ?>
       <a href="https://tetrapot-labo.com/wp-admin/admin.php?page=stats&view=post&post=<?php echo get_the_ID() ?>" target="_blank">■</a>
      <?php endif; ?>

      もはや自己満足な投稿で申し訳ないです。。。
      脱Popular postsはなかなか大変ですね。。。

      stats_get_csvでの取得が時間がかかるようで、ループ処理の前に関数を取得しておいて、あとループ処理の中で表示だけにすると速くなるようですが、、、そこまではさっぱりですね。
      Jetpackとこのプラグインで、人気記事と記事ごとのPV数の取得は問題なさそうにできそうです。

      ということで、要望というよりも、こうやってカスタマイズしてPVを表示しています、ということです
      何かの参考になれば。

    • #50478
      Mori
      ゲスト

      ※ 上記投稿はミスしたので、削除してもらうと助かります・・・。
      もう一度投稿しておきます。

      何度もすいません。

      結局、速度が遅いので、「Jetpack Post Views」プラグインを導入して、API認証をして、以下のようなコードを書くとJetpackの日、週、月、合計のPVを何のストレスもなく表示できるようになりました。

      <?php if ( is_user_logged_in() ) : ?>
      d-<?php echo get_post_meta( $post->ID, 'jetpack-post-views-Day', true ); ?>
       w-<?php echo get_post_meta( $post->ID, 'jetpack-post-views-Week', true ); ?>
       m-<?php echo get_post_meta( $post->ID, 'jetpack-post-views-Month', true ); ?>
       t-<?php echo get_post_meta( $post->ID, 'jetpack-post-views', true ); ?>
       <a href="https://mori-room.com/wp-admin/admin.php?page=stats&view=post&post=<?php echo get_the_ID() ?>" target="_blank">■</a>
      <?php endif; ?>

      もはや自己満足な投稿で申し訳ないです。。。
      脱Popular postsはなかなか大変ですね。。。

      stats_get_csvでの取得が時間がかかるようで、ループ処理の前に関数を取得しておいて、あとループ処理の中で表示だけにすると速くなるようですが、、、そこまではさっぱりですね。
      Jetpackとこのプラグインで、人気記事と記事ごとのPV数の取得は問題なさそうにできそうです。

      ということで、要望というよりも、こうやってカスタマイズしてPVを表示しています、ということです
      何かの参考になれば。

    • #50480
      アバター画像わいひら
      キーマスター

      Jetpackの統計情報のそういった取得方法もあるんですね。
      Popular Postsがインストールされていなかったら、Jetpackの統計情報を利用するというのはありかもしてませんね。
      とりあえず、アクセス数表示のところは、ちょっと試してみようと思います。

    • #50485
      アバター画像わいひら
      キーマスター

      ちょっと実装してみたんですけど、最初の取得時間が長すぎて、機能について知らない人は(テーマもしくはサーバーの)不具合を疑われるレベルなので、機能としての実装はしないと思います。

      ただ、せっかくコードを書いたので、後で記事を書くために、カスタマイズ方法のメモを残しておきます。

      functions.phpに以下を追記。

      //Jetpackがインストールされているかどうか
      function is_jetpack_sgc_enable(){
        return function_exists('stats_get_csv');
      }

      admin-pv.phpテンプレートの中身を以下のコードと入れ替える。

      <?php //管理者のみにPV表示 ?>
      <?php if ( is_admin_pv_visible() &&
                 is_user_logged_in() &&
                 (is_wpp_enable() || is_jetpack_sgc_enable()) &&
                 !(is_front_page() && is_page()) ): ?>
        <div class="admin-pv">
        <?php //全体、月別、週別、日別のPV表示
          $views_all = 0;
          $views_monthly = 0;
          $views_weekly = 0;
          $views_daily = 0;
          if (is_wpp_enable()) {//Wordpress Popular Posts利用時
            $views_all = wpp_get_views ( get_the_ID(), 'all' );
            $views_monthly = wpp_get_views ( get_the_ID(), 'monthly' );
            $views_weekly = wpp_get_views ( get_the_ID(), 'weekly' );
            $views_daily = wpp_get_views ( get_the_ID(), 'daily' );
          } elseif (is_jetpack_sgc_enable()) {//Jetpack利用時
      
            $jetpack_views = stats_get_csv('postviews', array('days' => -1, 'limit' => 1, 'post_id' => $post->ID ));
            if (isset($jetpack_views[0]['views'])) {
              $views_all = $jetpack_views[0]['views'];
            }
            $jetpack_views = stats_get_csv('postviews', array('days' => 30, 'limit' => 1, 'post_id' => $post->ID ));
            if (isset($jetpack_views[0]['views'])) {
              $views_monthly = $jetpack_views[0]['views'];
            }
            $jetpack_views = stats_get_csv('postviews', array('days' => 7, 'limit' => 1, 'post_id' => $post->ID ));
            if (isset($jetpack_views[0]['views'])) {
              $views_weekly = $jetpack_views[0]['views'];
            }
            $jetpack_views = stats_get_csv('postviews', array('days' => 1, 'limit' => 1, 'post_id' => $post->ID ));
            if (isset($jetpack_views[0]['views'])) {
              $views_daily = $jetpack_views[0]['views'];
            }
          }
          echo '<span class="all">全体:<span class="pv-count">', $views_all, '</span></span>';
          echo '<span class="monthly">月:<span class="pv-count">', $views_monthly, '</span></span>';
          echo '<span class="weekly">週:<span class="pv-count">', $views_weekly, '</span></span>';
          echo '<span class="daily">日:<span class="pv-count">', $views_daily, '</span></span>';
          if (is_jetpack_sgc_enable()) {
            echo '<span class="jp-page"><a href="'.admin_url().'admin.php?page=stats&view=post&post='.get_the_ID().'" target="_blank"><span class="fa fa-bar-chart"></span></a></span>';
          }
        ?>
        </div>
      <?php endif ?>
    • #50487
      Hidekichi
      ゲスト

      jetpackが使われているかどうかは、

      if { is_user_logged_in()
      && class_exists( ‘jetpack’ )
      && Jetpack::is_module_active( ‘stats’ ) ) {
      //ログイン、かつjetpack使ってる、かつ統計使ってる
      }

      みたいな感じで行けるかも。試してないですが。

      参考: Jetpack::is_module_active( $module );

    • #50488
      Hidekichi
      ゲスト

      うほう盛大に間違ってた(笑)

      if (
        is_user_logged_in() &&
        class_exists( 'jetpack' ) &&
        Jetpack::is_module_active( 'stats' )
      ) {
        //ログイン、かつjetpack使ってる、かつ統計使ってる
      }
    • #50489
      アバター画像わいひら
      キーマスター

      とりあえず以下のように修正してみました。
      一覧で表示しないようにしたら、あまりストレスなく利用できるようになりました。

      functions.phpに以下を追記。

      //Jetpackがインストールされているかどうか
      function is_jetpack_stats_module_active(){
        return class_exists( 'jetpack' ) &&
          Jetpack::is_module_active( 'stats' );
      }

      admin-pv.phpテンプレートの中身を以下のコードと入れ替える。

      <?php //管理者のみにPV表示 ?>
      <?php if ( is_admin_pv_visible() &&
                 is_user_logged_in() &&
                 (is_wpp_enable() || (is_jetpack_stats_module_active() && is_singular())) &&
                 !(is_front_page() && is_page()) ): ?>
        <div class="admin-pv">
        <?php //全体、月別、週別、日別のPV表示
          $views_all = 0;
          $views_monthly = 0;
          $views_weekly = 0;
          $views_daily = 0;
          if (is_wpp_enable()) {//Wordpress Popular Posts利用時
            $views_all = wpp_get_views ( get_the_ID(), 'all' );
            $views_monthly = wpp_get_views ( get_the_ID(), 'monthly' );
            $views_weekly = wpp_get_views ( get_the_ID(), 'weekly' );
            $views_daily = wpp_get_views ( get_the_ID(), 'daily' );
          } elseif (is_jetpack_stats_module_active()) {//Jetpack利用時
      
            $jetpack_views = stats_get_csv('postviews', array('days' => -1, 'limit' => 1, 'post_id' => $post->ID ));
            if (isset($jetpack_views[0]['views'])) {
              $views_all = $jetpack_views[0]['views'];
            }
            $jetpack_views = stats_get_csv('postviews', array('days' => 30, 'limit' => 1, 'post_id' => $post->ID ));
            if (isset($jetpack_views[0]['views'])) {
              $views_monthly = $jetpack_views[0]['views'];
            }
            $jetpack_views = stats_get_csv('postviews', array('days' => 7, 'limit' => 1, 'post_id' => $post->ID ));
            if (isset($jetpack_views[0]['views'])) {
              $views_weekly = $jetpack_views[0]['views'];
            }
            $jetpack_views = stats_get_csv('postviews', array('days' => 1, 'limit' => 1, 'post_id' => $post->ID ));
            if (isset($jetpack_views[0]['views'])) {
              $views_daily = $jetpack_views[0]['views'];
            }
          }
          echo '<span class="all">全体:<span class="pv-count">', $views_all, '</span></span>';
          echo '<span class="monthly">月:<span class="pv-count">', $views_monthly, '</span></span>';
          echo '<span class="weekly">週:<span class="pv-count">', $views_weekly, '</span></span>';
          echo '<span class="daily">日:<span class="pv-count">', $views_daily, '</span></span>';
          if (is_jetpack_stats_module_active()) {
            echo '<span class="jp-page"><a href="'.admin_url().'admin.php?page=stats&view=post&post='.get_the_ID().'" target="_blank"><span class="fa fa-bar-chart"></span></a></span>';
          }
        ?>
        </div>
      <?php endif ?>

      これなら使えるかも。ということで暫く当サイトで実装して使い勝手を検証してみたいと思います。

    • #50490
      Mori
      ゲスト

      おおーーーありがとうございます!!
      試してみましたが、やはりPV取得に時間がかかってしまうのがネックですね・・・
      便利ではあるんですが。。。

      ちなみに、Jetpack Post Viewsを入れると別の関数ができるので、こちらは本当にさっくりと動きますよ。

      <?php if ( is_user_logged_in() ) : ?>
      d-<?php echo get_post_meta( $post->ID, 'jetpack-post-views-Day', true ); ?>
       w-<?php echo get_post_meta( $post->ID, 'jetpack-post-views-Week', true ); ?>
       m-<?php echo get_post_meta( $post->ID, 'jetpack-post-views-Month', true ); ?>
       t-<?php echo get_post_meta( $post->ID, 'jetpack-post-views', true ); ?>
       <a href="URL/wp-admin/admin.php?page=stats&view=post&post=<?php echo get_the_ID() ?>" target="_blank">■</a>
      <?php endif; ?>

      こちらの方がおすすめでありますが、このプラグインが3年も更新されていないのが心配でありますが・・・。
      JetpackでAPI認証をかけるとデータ取得が簡単になるんでしょうか。

      参考↓
      https://www.imamura.biz/blog/18748

    • #50491
      アバター画像わいひら
      キーマスター

      とりあえず、#50489の方法で、機能追加しようかなと思っています。
      投稿・個別ページだけのPVの取得ならそこまで負担でもないですし。

      #50490
      Jetpack Post Viewsというのは使ったことがないのですが、get_post_metaでカスタムフィールド値を取得しているのであれば、カスタムフィールドに何かを書き込んでいるのではないかと推測します。
      なので、負荷軽減でJetpackを利用するのであれば、あまり軽減にならないのではないかと思います。
      このプラグインについては、#50490に掲載されているコードを見たくらいしか情報を知らないので、あっているかはわかりませんが。

    • #50492
      Mori
      ゲスト

      了解です!!ありがとうございます。
      Jetpack Post Viewsは負荷をかけているかもしれないんですね。
      関数を見ても何のことやらわからずでした。

      でしたら、個別ページに書き込むのがいいですね

      あと、、、、できたら、、、人気記事一覧を作っていただけると助かります・・・。

      test版を人気記事10をサイトのサイドバーに置いてますが、デザインがうまくいかずでして・・・
      https://mori-room.com/

      functions.phpに

      function my_pop_list( $target_days, $n ) {
      	$i = 0;
      	$args = array( 'days'=>$target_days, 'limit'=>$n+2 );
      	$top_posts = stats_get_csv( 'postviews', $args );
      	echo "<ol>\n";
      	foreach ( $top_posts as $value ) {
      		$my_id = $value['post_id']; //投稿ID取得
      		if ( $my_id != 0 && $my_id != get_the_ID() && get_post_type($my_id) == 'post' ) { //homeと現在のページは除外で、投稿のみ
      			if( has_post_thumbnail($my_id) ) { //サムネイルの有無
      				$pop_img = get_the_post_thumbnail( $my_id, array(75, 75), array('alt'=>get_the_title($my_id)) );
      			} else {
      				$pop_img = '<img src="noimage.png" width="75" height="75" />';
      			}
      			echo '<li><a href="'.$value['post_permalink'].'">'.$pop_img.$value['post_title'].'</a>('.$value['views']."views)</li>\n";
      			$i++;
      			if ( $i >= $n ) { break; } //指定数を超えたら終了
      		}	
      	}
      	echo "</ol>\n";
      }

      あとは、7日間の人気記事トップ10表示の場合は、

      <?php my_pop_list( 7, 10 ); ?>

      を好きな場所に入れ込みだけなんですが、、、画像の横にテキストがこずに、、、困っております。
      ここまでできると、代替は完了するんですが・・・うーんです。

      もしも気が向けばでかまいませんので。。。気にされず・・・

    • #50493
      Hidekichi
      ゲスト

      実はrest apiで、statsの値を拾えるんですけどね。jetpackにjson apiってあるでしょう?
      あやつを使えばoAuthでwordpress.comに接続して統計の情報とか取れるのです。

      速いかどうかは試してないので知りませんが、一挙にデータを取得できるのは便利だと思います。
      参考2のResponse参照。

      セキュリティ云々でrest apiやらを無効にするという傾向にありますが、これらは試してみる価値はあると思います。

      参考1: [WordPress] Jetpack の JSON API を使ってみる
      ※ 2015年の記事なのでエンドポイントが変わっているかも

      参考2: rest api | stats – Get a site’s stats

    • #50494
      Mori
      ゲスト

      >Hidekichiさん

      これは・・・・無理ですね・・・さっぱりとわかりません・・・。
      そもそも論で言うとGoogle AnalyticsのAPIが取得できるので、こちらからやりたいところではあるんですが、意味不明で・・・さっぱりです。
      (うちのサイドバーの人気記事はSimple GA Rankingでアナリティクスデータを使用していますが、カスタマイズが難しすぎて・・)

      簡易と言う意味では、Popular Postsは本当にありがたいですね。
      データーベースにも負担をかけず、簡単カスタマイズとはなかなかいかないものですかね

    • #50513
      アバター画像わいひら
      キーマスター

      とりあえず実装してみました。
      https://wp-simplicity.com/wp-content/uploads/2017/02/simplicity2-3.zip
      テーマカスタマイザーの「管理者機能」項目から再設定する必要があります。

      当トピックで書いたコードなどでカスタマイズをしている場合は、エラーが出る可能性があるので元に戻す必要があるかもしれません。

    • #50533
      Mori
      ゲスト

      こんばんは!
      試してみたところ動きました!!
      支障なしです、たぶん。

      表示に関しては、ちょっとの重さは感じますが、PVが見られることを思えば問題なしの範囲でしょうか。
      訪問者には重くないですし。
      これでPopular postsがなくなっても寂しさが紛れますね 笑

      ありがとうございます。
      わがままを言うとJetpack経由で人気記事が出るウィジェットがあるとありがたいです
      実装してみた感じでは、全然重くないです。
      ただ、Jetpackの統計データはリアルタイムではなくて、ちょっとしたタイム差があるようなので、数値の更新は遅い感じです

    • #50621
      アバター画像わいひら
      キーマスター

      申し訳ないですが、人気記事ウィジェットの作成は、最も面倒な機能追加の部類に入ります。どういった設定項目を追加できるかの検証も必要になりますし。
      なので、今のところ機能追加は考えていません。
      やるとしても、よほど時間的余裕があるときになると思うので、あまり期待しないでいただければと思います。

    • #50630
      Mori
      ゲスト

      こんばんは!
      なるほど、いろいろ作業の難易度があるんですね。
      わいひらさんの判断されるようにやってください。

      自分はカスタマイズを進めてみようと思います!
      ありがとうございます!!

    • #50646
      アバター画像わいひら
      キーマスター

      とりあえず、TODOリストには入れておいたので、空いている時間があればJetpackが利用できる機能の検証はしてみようと思います。

19件の返信スレッドを表示中
  • トピック「うちはJetpackの機能でPV表示に切り替えました」には新しい返信をつけることはできません。