質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

メニュー

メニューは、UIにおける仕組みであり、ユーザに機能の表示と実行する手段を与えます。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

756閲覧

WordPressで新着情報がある場合にメニューの表示を変更したい

hollyhock

総合スコア1

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

メニュー

メニューは、UIにおける仕組みであり、ユーザに機能の表示と実行する手段を与えます。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

1グッド

2クリップ

投稿2020/11/21 09:01

編集2020/11/27 09:40

前提

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;

を追記してみたのですが、解消できませんでした。

恐れ入りますが、修正方法を教えていただけましたら幸いです。
以上、よろしくお願いいたします。

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

PHP

1$classes[] = 'new';}

この波括弧で見通しが悪くなっていると思います。
インデントを揃えると問題点が見つかりやすいです。

それと

PHP

1$cat_id = get_category( $item->object_id );

get_category()はカテゴリーのオブジェクトを持ってくるので、
その次のIDの判定が失敗しています。

PHP

1$item->object_id

ここにstring型のカテゴリIDがセットされているので get_category() まではしなくて良いのかなと思います。

投稿2020/11/22 05:34

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hollyhock

2020/11/22 14:33

大変わかりやすいご回答ありがとうございます。 コメントが遅くなり申し訳ございません。 kazwedaさまのご回答の通りに修正したところ、テスト表示がうまくいきました! (カテゴリーIDが7のメニュー項目にのみ、「new」表示がされました) あとはdate関連データでの条件分岐を付けてまいります。現状、date関連データでの条件分岐は、独自関数を別途記述することで実現していますが、「メニュー項目のカテゴリーが子カテゴリーを持つ場合」の表示が意図した通りになりません。もう少し自分で試行錯誤してみようと思います。
guest

0

エラーメッセージの回避方法

for文の前に

PHP

1if (!(int)$count === 0)

を記述することで、エラーメッセージが出なくなりました。

投稿2020/12/05 05:58

hollyhock

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問