前提
WordPressで個人サイトを作っています。
使用テンプレートは「First」です。
http://themehaus.net/ja/themes/first/
「ダッシュボード>外観>メニュー」にて
「メニュー設定>メニューの位置>ナビゲーションバー」のメニューを作成しました。
実現したいこと
メニューには4個の項目があり、
1個は固定ページ、残り3個はカテゴリーです。
各項目に新着情報がある
(固定ページなら固定ページ最終更新日が7日以内である、
カテゴリーなら、そのカテゴリー内のポスト投稿日または最終更新日が7日以内である)
場合に、そのメニュー項目にTwitterの通知バッジ風の赤い丸印を表示したいです。
発生している問題・エラーメッセージ
固定ページについては、functions.phpとstyle.cssに下記を追記することで、
実現できました。
php
1function special_nav_class($classes, $item,$args){ 2 if ( $args->theme_location !== 'primary' ) 3 return $classes; 4 if(($item->object == 'category') or ($item->object == 'page') or ($item->object == 'post' )){ 5 if($item->object =='page'){ 6 if ( ( $post = get_post( $item->object_id ) ) ) { 7 $now_date = date( 'U' ); 8 $post_date = mysql2date( 'U', $post->post_modified ); // 投稿日なら $post->post_date 9 $diff_date = date( 'U', ( $now_date - $post_date )) / 86400; 10 if ( (int)$diff_date <= 7 ) 11 $classes[] = 'new';} 12 } 13 return $classes; 14 } 15} 16add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 3); 17
css
1/* Menus 2------------------------------------------------------------ */ 3 4/* Navigation Bar */ 5.site-bar, 6.menu-item.new a:after { content: "\25CF"; color: red; vertical-align: super; }
メニュー項目がカテゴリーの場合に意図する表示ができない
PHP
1function special_nav_class($classes, $item,$args){ 2 if ( $args->theme_location !== 'primary' ) 3 return $classes; 4 if(($item->object == 'category') or ($item->object == 'page') or ($item->object == 'post' )){ 5 if($item->object =='page'){ 6 if ( ( $post = get_post( $item->object_id ) ) ) { 7 $now_date = date( 'U' ); 8 $post_date = mysql2date( 'U', $post->post_modified ); // 投稿日なら $post->post_date 9 $diff_date = date( 'U', ( $now_date - $post_date )) / 86400; 10 if ( (int)$diff_date <= 7 ) 11 $classes[] = 'new';} 12 } 13 if(($item->object == 'category')){ 14 $cat_id = get_category( $item->object_id ); 15 if( $cat_id == 7 ) 16 $classes[] = 'new'; 17 } 18 return $classes; 19 } 20} 21add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 3);
固定ページのときのソースコードを真似て、
まずはカテゴリ内記事のdate関連データには関係無く、
カテゴリーIDが「7」のメニュー項目には「new」表示をする、
というテストをしてみましたが、「new」表示がされませんでした。
(メニューに表示している3個のカテゴリーのカテゴリーIDは5、6、7です)
試したこと
カテゴリーIDに関係なく、メニュー項目がカテゴリーの場合、
「new」表示をするというテストをしてみたところ、
「new」表示ができました。
PHP
1function special_nav_class($classes, $item,$args){ 2 if ( $args->theme_location !== 'primary' ) 3 return $classes; 4 if(($item->object == 'category') or ($item->object == 'page') or ($item->object == 'post' )){ 5 if($item->object =='page'){ 6 if ( ( $post = get_post( $item->object_id ) ) ) { 7 $now_date = date( 'U' ); 8 $post_date = mysql2date( 'U', $post->post_modified ); // 投稿日なら $post->post_date 9 $diff_date = date( 'U', ( $now_date - $post_date )) / 86400; 10 if ( (int)$diff_date <= 7 ) 11 $classes[] = 'new';} 12 } 13 if(($item->object == 'category')){ 14 $classes[] = 'new';} 15 return $classes; 16 } 17} 18add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 3); 19
補足情報(FW/ツールのバージョンなど)
カテゴリーIDは、ブラウザ(グーグルクローム)の編集画面から読み取りました。
https://open-cage.com/wp-category_id-investigate/
WordPress・PHPともに初心者のため、かなり回り道をしているかもしれません。
お手数をお掛けしますが、修正点を教えていただけますでしょうか。
以上、よろしくお願いいたします。
追加の質問(2020/11/27)
困っていること
「実現したいこと」は実現できましたが、下記エラーメッセージが出ます。
Warning: Creating default object from empty value in functions.php on line 583
エラーメッセージを解消するために必要な情報を教えていただきたく質問しています。
ソースコード
date関連データでソートするために、下記、二つの独自関数を記述しました。
PHP
1function return_latest_id($cat_id=null) { 2 global $wpdb; 3 4 if(empty($cat_id)) { 5 // 最新記事idの取得 6 $row = $wpdb->get_row("SELECT ID FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_modified DESC"); 7 } else { 8 // カテゴリを指定した最新記事idの取得 9 $cat_id = intval($cat_id); 10 $row = $wpdb->get_row("SELECT p.ID FROM $wpdb->posts p LEFT JOIN $wpdb->term_relationships r ON p.ID=r.object_id WHERE p.post_type = 'post' AND p.post_status = 'publish' AND r.term_taxonomy_id = '$cat_id' ORDER BY p.post_modified DESC"); 11 } 12 return !empty( $row ) ? $row->ID : '0'; 13} 14 15function sort_by_postdate($a, $b) { 16 // 2つのカテゴリの最新の投稿(newest_postメンバ)の日付の大小関係を返す 17 return ($a->newest_post->post_modified == $b->newest_post->post_modified) ? 0 : 18 ($a->newest_post->post_modified < $b->newest_post->post_modified) ? 1 : -1; 19}
以上の独自関数の後に、先日カテゴリIDの取得で躓いていた関数を大幅に追記しました。
PHP
1function special_nav_class($classes, $item,$args){ 2 if ( $args->theme_location !== 'primary' ) 3 return $classes; 4 if(($item->object == 'category') or ($item->object == 'page') or ($item->object == 'post' )){ 5 if($item->object =='page'){ 6 if ( ( $post = get_post( $item->object_id ) ) ) { 7 $now_date = date( 'U' ); 8 $post_date = mysql2date( 'U', $post->post_modified ); // 投稿日なら $post->post_date 9 $diff_date = date( 'U', ( $now_date - $post_date )) / 86400; 10 if ( (int)$diff_date <= 30 ) 11 $classes[] = 'new'; 12 } 13 } 14 if(($item->object == 'category')){ 15 if( $cat_id = $item->object_id ){ 16 $cat_data = get_category( $cat_id ); 17 $cat_data->category_parent; 18 $parent_id = $cat_data->category_parent; 19 if( empty($parent_id)==false ){ 20 if( $post_id = return_latest_id( $cat_id ) ){ 21 if ( ( $post = get_post( $post_id ) ) ) { 22 $now_date = date( 'U' ); 23 $post_date = mysql2date( 'U', $post->post_modified ); // 投稿日なら $post->post_date 24 $diff_date = date( 'U', ( $now_date - $post_date )) / 86400; 25 if ( (int)$diff_date <= 30 ) 26 $classes[] = 'new'; 27 } 28 } 29 } 30 if( empty($parent_id)==true ){ 31 // 投稿があるカテゴリをすべて読み込む 32 $cats = get_categories($parent_id); 33 // カテゴリの数を得る 34 $count = count($cats); 35 // カテゴリの数だけ繰り返す 36 for ($i = 0; $i < $count; $i++) { 37 // 各カテゴリの最も新しい投稿を読み込む 38 $where = array('category' => $cats[$i]->term_id, 'orderby' => 'post_modified', 'order' => 'desc', 'numberposts' => 1); 39 $newest_posts = get_posts($where); 40 // カテゴリのオブジェクトに「newest_post」というメンバを追加して、最新の投稿を代入する 41 $cats[$i]->newest_post = $newest_posts[0]; //エラーが出ている「line 583」はこの行です 42 // 各カテゴリの最も古い投稿を読み込む 43 $where['order'] = 'asc'; 44 $oldest_posts = get_posts($where); 45 // カテゴリのオブジェクトに「oldest_post」というメンバを追加して、最新の投稿を代入する 46 $cats[$i]->oldest_post = $oldest_posts[0]; 47 } 48 // カテゴリを、最新の投稿の日付が新しい順に並べ替える 49 usort($cats, 'sort_by_postdate'); 50 // 結果を返す 51 $newest_child_cat_id = $cats[0]->object_id; 52 } 53 if( $post_id = return_latest_id( $newest_child_cat_id ) ){ 54 if ( ( $post = get_post( $post_id ) ) ) { 55 $now_date = date( 'U' ); 56 $post_date = mysql2date( 'U', $post->post_modified ); // 投稿日なら $post->post_date 57 $diff_date = date( 'U', ( $now_date - $post_date )) / 86400; 58 if ( (int)$diff_date <= 30 ) 59 $classes[] = 'new'; 60 } 61 } 62 } 63 } 64 return $classes; 65 } 66} 67add_filter('nav_menu_css_class' , 'special_nav_class' , 10 , 3);
###試したこと
エラーメッセージで検索したところ、「new stdClassで初期化してあげると解消します。」という記事を見付けたのですが、
PHP
1$cats = new stdClass;
を追記してみたのですが、解消できませんでした。
恐れ入りますが、修正方法を教えていただけましたら幸いです。
以上、よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/22 14:33