サポート » 使い方全般 » プラグインを使用せずに人気記事一覧を作成したい

  • プラグインを使用せずに”更新ボタンの連打はカウントから除外した”人気記事一覧を作成したいと思っています。

    「プラグイン無しで記事のアクセス数をカウントする関数と、アクセスランキングの表示を行うスニペット」
    https://increment-log.com/wordpress-access-count/

    functions.php

    //アクセス数の取得
    function get_post_views( $postID ) {
        $count_key = 'post_views_count';
        $count     = get_post_meta( $postID, $count_key, true );
        if ( $count == '' ) {
            delete_post_meta( $postID, $count_key );
            add_post_meta( $postID, $count_key, '0' );
     
            return "0 views";
        }
     
        return $count . '';
    }
     
    //アクセス数の保存
    function set_post_views( $postID ) {
        $count_key = 'post_views_count';
        $count     = get_post_meta( $postID, $count_key, true );
        if ( $count == '' ) {
            $count = 0;
            delete_post_meta( $postID, $count_key );
            add_post_meta( $postID, $count_key, '0' );
        } else {
            $count ++;
            update_post_meta( $postID, $count_key, $count );
        }
    }

    アクセス数表示箇所
    アクセス数: <?php echo get_post_views( get_the_ID() ); set_post_views( get_the_ID() ); ?>

    ランキング表示箇所

    <h3>アクセスランキング</h3>
    <?php
    $args = array(
        'post_type'     => 'post',  //投稿タイプ
        'numberposts'   => 5,       //表示数
        'meta_key'      => 'post_views_count',
        'orderby'       => 'meta_value_num',
        'order'         => 'DESC',
    );
    $posts = get_posts( $args );
    if($posts) : ?>
        <ul>
        <?php foreach( $posts as $post ) : setup_postdata( $post ); ?>
            <li>
             <a href="<?php the_permalink(); ?>"><?php the_post_thumbnail( 'thumbnail' ); ?></a>
             <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
            </li>
        <?php endforeach; ?>
        <?php wp_reset_postdata(); ?>
        </ul>
    <?php else : ?>
        <p>アクセスランキングはまだ集計されていません。</p>
    <?php endif; ?>

    の通りに追記したらアクセスランキング自体は簡単に実装できたのですが、これだと更新ボタン連打でもカウントできてしまいます。

    ここに$_SESSION["visited"];を組み合わせれば何とかなるんじゃないかと思い、
    「WordPressでセッションが保存されない時はfunctions.phpにごにょごにょ」
    //http://techtabosque.tumblr.com/post/126559949723/WordPressでセッションが保存されない時はfunctions.phpにごにょごにょ
    の通りに

    function init_sessions() {
      if (!session_id()) {
        session_start();
      }
    }
    add_action('init','init_sessions');

    をfunctions.phpに書くところまで行けたのですが、そこから先へ進めていない状態です。

    セッションのカウントが1のとき以外はカウント機能自体を動かさないなどの処置でうまくいきそうな気がしたんですが…どう記述すればいいでしょうか?
    それともこのやり方では無理でしょうか?

    • このトピックは7年、 6ヶ月前にd.w.cが編集しました。理由: 文字化け
    • このトピックはd.w.cが7年、 6ヶ月前に変更しました。
    • このトピックはd.w.cが7年、 6ヶ月前に変更しました。
4件の返信を表示中 - 1 - 4件目 (全4件中)
  • こんにちは

    以下のコードではどうでしょうか。
    セッションに投稿IDがあればカウントしないようにしています。

    一度も動かしていないので、エラーが発生したり、うまく動作しないかもしれません。
    参考程度にお願いします。

    //アクセス数の保存
    function set_post_views( $postID ) {
    
        if( ! isset($_SESSION[$postID]) ){
            $_SESSION[$postID] = true;
    
            $count_key = 'post_views_count';
            $count     = get_post_meta( $postID, $count_key, true );
            if ( $count == '' ) {
                $count = 0;
                delete_post_meta( $postID, $count_key );
                add_post_meta( $postID, $count_key, '0' );
            } else {
                $count ++;
                update_post_meta( $postID, $count_key, $count );
            }
        }
    
    }
    トピック投稿者 d.w.c

    (@dwc-1)

    ありがとうございます!

    教えていただいたものをそのまま差し替えるだけだと動作に変化はなく、更新すればするだけカウントが回りました。
    そこで下記のように$_SESSION[$postID] = true;の位置をif文の前に変えたらカウントが止まりました。

    //アクセス数の保存
    function set_post_views( $postID ) {
    
        $_SESSION[$postID] = true;
        if( ! isset($_SESSION[$postID]) ){
    
            $count_key = 'post_views_count';
            $count     = get_post_meta( $postID, $count_key, true );
            if ( $count == '' ) {
                $count = 1;
                delete_post_meta( $postID, $count_key );
                add_post_meta( $postID, $count_key, '1' );
            } else {
                $count ++;
                update_post_meta( $postID, $count_key, $count );
            }
        }
    
    }

    ただ、この場合は当然if( ! isset($_SESSION[$postID]) )の条件は初回から該当しなくなってしまうので意味がなくなり、カウントが止まるのは当然でした。
    どうやら教えていただいたコードのようにif文の中に入れた場合は$_SESSION[$postID] = true;が仕事をしていないように見えるんですが…原因は何でしょうか?

    ちなみに$_SESSION[$postID]が各ページで独立して動いているのか確認のため、試しに訪問回数をカウントする下記のphpコードをpage.phpに相当するオリジナルテンプレートに下記のように追記してみました。

    <?php
    
    if (!isset($_SESSION[$postID])){
    print('初回の訪問です。セッションを開始します。');
    
    $_SESSION[$postID] = 1;
    $_SESSION["date"] = date('c');
    }else{
    $visited = $_SESSION[$postID];
    $visited++;
    
    print('訪問回数は'.$visited.'です。<br>');
    
    $_SESSION[$postID] = $visited;
    
    if (isset($_SESSION["date"])){
    print('前回の訪問日時は'.$_SESSION["date"].'です。<br>');
    }
    
    $_SESSION["date"] = date('c');
    }
    
    ?>

    その結果、訪問回数のカウントはページをまたいで数字が継続されていました。
    functions.phpからsession_start();を削除してheader.phpに追記してみたのですが、結果は同じでした。
    どうやら$_SESSION[$postID]は1度のアクセスでどのページにとんでも同一のセッションとして扱われてしまうような雰囲気です。

    $_SESSION[$postID]が投稿ページを移動しても同一のもの扱いでカウントが継続される意味がよくわからないのですが…
    これはどういったことなんでしょうか?
    関係あるのかわかりませんが、投稿はカスタム投稿タイプを使用していて、Xamppを使ったローカル環境です。

    • この返信は7年、 6ヶ月前にd.w.cが編集しました。理由: code表示のエラー
    • この返信は7年、 6ヶ月前にd.w.cが編集しました。理由: 追記
    • この返信は7年、 6ヶ月前にd.w.cが編集しました。理由: 不要文削除
    • この返信は7年、 6ヶ月前にd.w.cが編集しました。

     私のコードはその関数が実行されるときにはセッションが開始している前提ですが、セッションは本当に開始できているでしょうか?

    あるいは、引数の$postIDに何がセットされているかをチェックしてみてはどうでしょうか。

    サンプル程度に提供させていただいたコードですので、そのままで正しく動作するかどうかは分かりません。
    ご自身で作成したコードと同じようにデバッグをお願いします。

    申し訳ありませんが、確認のために記述されたコードの意図が私にはちょっと分かりませんでした・・・

    • この返信は7年、 6ヶ月前にmunyaguが編集しました。
    トピック投稿者 d.w.c

    (@dwc-1)

    すみません、冷静になったら意味ないことをしているのに気づきました。
    教えていただいたアドバイスをもとにもう少しいじってみます。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「プラグインを使用せずに人気記事一覧を作成したい」には新たに返信することはできません。