サポート » 使い方全般 » 記事一覧ページで「一度でも閲覧した事のある記事」を判別したい

  • お世話になります、初めて質問させていただきます。

    やりたい事

    お知らせ一覧ページ(category.php)で、
    3日以内に書かれた記事にはアイコンを表示しています。
    そのお知らせ一覧ページにて、
    一度でも閲覧した事がある記事の全リンク要素に、
    任意のclassを付ける or 条件分岐させてアイコンを非表示にしたいと思っています。
    どのような方法で実現出来るでしょうか?

    構成

    • お知らせ一覧 (/news) = category.php
    • 記事 = single.php
    • パーマリンク = /%category%/p%post_id%/
    • PHP Ver = 5.4.4

    です。
    お手数おかけいたしますが、何かアイディアを教えていただけると幸いです。

    補足

    mypacecreatorさんが下記トピックで書かれていた、
    http://ja.forums.wordpress.org/topic/25467

    たとえば手動でブラウザの閲覧履歴、cookieを削除してしまう、もしくは何らかの理由で保存期限切れになると、実際は前に訪問したことがあっても初訪問って判定になってしまいます。
    この点はご了承ください。

    上記については了承しております。
    クッキーやセッションを用いて、n日間限定になってしまう。という事でも構いません。

    よろしくお願いいたします。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • 力技で手っ取り早いのがページを見る際に(single.phpの頭にでも)クッキーでpage_idを保存する処理をしておいて、一覧を表示する際にクッキーをチェックする形でしょう。
    ただしこれは最初はいいですが記事数が増えていくとクッキーが肥大化してしまいます。
    すでに3日たった記事はクッキーから削除するような処理も必要になると思います。

    もう一つ考えられるのがCSSで a:visitedフィルターを使い既読時にスタイルを変更する方法です。
    これの場合はクッキーを使うことなくCSSだけで処理することができます。
    コチラの処理については下記サイトが参考になるかもしれません。
    http://www.lucky-bag.com/archives/2005/09/visited_link.html

    トピック投稿者 sou4473

    (@sou4473)

    gogowebさん

    ありがとうございます!遅くなってすみません。
    a:visitedの存在をすっかり忘れていたため試しました。
    結論から言うと display: noneなどのスタイルは効きませんでした。

    知らなかったのですが、どうやら:visitedセレクタはブラウザ側でかなりのスタイルが制限されているみたいです。
    CSS の :visited に行われるプライバシー対策
    これが使えれば楽だったのですが…。

    次にクッキーで処理する方法なのですが、
    もしよろしければ具体的な方法を教えていただけないでしょうか?
    現在下記のようにsingle.phpに書きましたが、
    変数には直前のpage_idしか入らず、直前以外のpage_idが取得出来ませんでした。

    single.phpの頭

    if (isset($_COOKIE["count"])) {
        $count = get_the_ID(); // 2度目以降
      } else {
        $count = get_the_ID(); // 初回
      }
      setcookie("count", $count, time()+60*60*24*30, "/news/");
    ?>

    3日以内の記事にはアイコンを表示する部分

    <?php
      $days = 3;
      $today = date_i18n('U');
      $entry = get_the_time('U');
      $kiji = date('U',($today - $entry)) / 86400 ;
    
      if ($days > $kiji) {
        echo '<span class="icon">icon</span>';
      } ?>

    のようにしています。
    一覧側でクッキーをチェックする処理もわかっておらず、
    お手数おかけいたしますが、良ければ教えていただけると助かります。
    よろしくお願いいたします。

    現在下記のようにsingle.phpに書きましたが、
    変数には直前のpage_idしか入らず、直前以外のpage_idが取得出来ませんでした。

    これ、変ですね。何か特別なことをやっていますか? single.php で get_the_ID() したら、該当記事の ID 番号が取れるはずです(post_count が 1 だから、unique のはず)。それはともかく、if … else … は必要ないみたいですね。sou4473 さんの目的は、訪問したかどうかだけなので、カウントする必要もないですしね。それに、expire が 30 日というのも長すぎるように思います。gogoweb さんの言うのは、

    $id = get_the_ID();
    if (!isset($_COOKIE[$id])) {
        setcookie($id, 'visited', (time()+60*60*24*3), '/');
    }

    のように、記事毎のクッキーを送るということでしょう。だから、記事が多くなると、クッキーが増えてしまうのです。クッキーが存在するかどうかが問題なので、’visited’ はなんでもかまいません。

    category.php の方は、個別の投稿 ID がループの中でとれるはずなので、それを使って分岐条件に追加すればよいと思います。

    $cookies = array();
    if (isset($_COOKIE)) {
        $cookies = $_COOKIE;
    }
    略...
    if ($days > $kiji && !array_key_exists($post_id, $cookies)) {
        echo '<span class="icon">icon</span>';
    }

    $post_id にはそれぞれの投稿 ID が入るようにしてください。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「記事一覧ページで「一度でも閲覧した事のある記事」を判別したい」には新たに返信することはできません。