• 解決済 mino2010

    (@mino2010)


    複数のカテゴリがあり、1ヶ月以内の投稿があるのもだけ、
    wp_nav_menu()が出力するliタグ内のcssに、
    例えばnew-postなどという独自class名を入れたいと考えています。
    PHP勉強不足ですみません、教えていただけますと助かります。

    ▼例
    AAAカテゴリに投稿があり、1ヶ月以内であれば、classにnew-postが付く。

    <ul id="aaa" class="bbb">
    <li id="menu-item-0000" class="new-post menu-item menu-item-type-taxonomy menu-item-object-category menu-item-0000"><a href="http://www.xyz.com/category/AAA">AAAカテゴリ名</a>
    <li id="menu-item-1000" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-1000"><a href="http://www.xyz.comcategory/category/BBB">BBBカテゴリ名</a></li>
    </ul>

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • classを追加するだけなら、nav_menu_css_classフィルタを使えばよいのですが、過去30日のようなタイムスパンを指定してカテゴリを得るクエリを発行できるAPIがないかもしれません。

    そこを自作すると、下のような感じでしょうか。

    add_filter('nav_menu_css_class', 'special_nav_class', 10, 2);
    function special_nav_class($classes, $item) {
      global $wpdb;
      $result = $wpdb->get_col("
        SELECT DISTINCT
          t.name
        FROM
          $wpdb->terms AS t,
          $wpdb->term_taxonomy AS tt,
          $wpdb->term_relationships AS tr
        WHERE
             t.term_id=tt.term_id
           AND
             tt.taxonomy='category'
           AND
             tr.term_taxonomy_id=tt.term_taxonomy_id
           AND
             tr.object_id IN ( SELECT ID FROM $wpdb->posts AS p WHERE p.post_status='publish' AND DATE_SUB(NOW(), INTERVAL 30 DAY) <= p.post_modified )
      ");
      if (empty($result)) return $classes;
      foreach ($result as $cat_name) {
        if ($item->title == $cat_name) {
          $classes[] = "new-post";
        }
      }
      return $classes;
    }

    全てのページでこれが動作するのは、ちょっといまいちですね。wp_get_recent_posts()を適当な数だけ取ってきて、日付を比較するというのも考えられますが、データベースにアクセスしちゃうのは同じなので、変わらないと思います。どちらも、お勧めはいたしません。

    なお、$item->titleの判定は書き換えないと動作しないかもしれません。

    トピック投稿者 mino2010

    (@mino2010)

    kjmtshさん

    ありがとうございます。

    試したところ、new-post と表示されるのですが、
    期日が過ぎた記事も表示されます。

    1.DATE_SUB(NOW(), INTERVAL 30 DAY) を、
    DATE_SUB(NOW(), INTERVAL 1 MONTH) に変更しても変化なく、

    2.DATE_SUB(NOW(), INTERVAL 30 DAY) を、
    NOW()-60 に変更したところ機能しているようです。

    ご報告でした。

    【追記】
    先ほどから更に試してみました。
    DATE_SUB(NOW(), INTERVAL 30 DAY) <= p.post_modified を、
    DATE_SUB(NOW(), INTERVAL 1 MONTH)<= p.post_date として希望していた動作ができました。

    ありがとうございました。

    トピック投稿者 mino2010

    (@mino2010)

    kjmtshさん

    ありがとうございました。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「wp_nav_menu()が出力するliタグ内に独自css名を入れたい」には新たに返信することはできません。