wp_nav_menu()が出力するliタグ内に独自css名を入れたい
-
複数のカテゴリがあり、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>
-
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の判定は書き換えないと動作しないかもしれません。
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 として希望していた動作ができました。ありがとうございました。
- トピック「wp_nav_menu()が出力するliタグ内に独自css名を入れたい」には新たに返信することはできません。