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

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

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

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

PHP

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

Q&A

解決済

1回答

1168閲覧

親子階層の情報を取得する関数が、記事のないアーカイブページでphpエラーになる

退会済みユーザー

退会済みユーザー

総合スコア0

WordPress

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

PHP

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

0グッド

0クリップ

投稿2020/03/28 09:14

編集2020/03/29 01:49

WordPress5.3のテンプレートarchive.phpでphpエラーが発生しています。
どのように修正すればよいか、ご教授いただければ幸いです。

発生しているエラー文

Notice: Trying to get property 'ancestors' of non-object in /xxx/xxx/wp-content/themes/xxx/functions.php on line 136

function.phpの該当部分

//固定ページの親子階層ごとに条件分岐 function page_is_ancestor_of($slug){ global $post; $page = get_page_by_path($slug); // 親か判別したい固定ページスラッグからページ情報を取得 $result = false; if(isset($page)){ foreach ((array)$post->ancestors as $ancestor) { if($ancestor == $page->ID){ $result = true; } } } return $result; }

↑のコード内の、下記の部分が 136行目です。

foreach ((array)$post->ancestors as $ancestor) {

archive.phpのエラーを吐いている部分

<?php if(is_page('about') || page_is_ancestor_of('about')): ?>    固定ページのaboutか、aboutの子階層で表示するコンテンツ <?php endif; ?>

エラーの発生条件

該当記事が1つもないカテゴリーの、アーカイブページを開く。
(カテゴリーに該当する記事を1つ作成すればエラーは消える)

エラーの原因?

表示する記事がないので、function.phpに書いたページ情報の取得が、うまく働いていないのだと思いますが…。
記事がない場合は何もしなくてよいのですが、phpをどのように書けばよいのでしょうか?

3/29追記:補足情報

「archive.phpのエラーを吐いている部分」について、補足です。
当初はarchive.phpでのみエラーが発生していたので、簡略化して書いてしまいました。エラーが発生しているのは、正確にはarchive.phpで読み込んでいるサイドバー用のsidebar.phpです。そして、このsidebar.phpは全ての固定ページと、投稿アーカイブページで共用しています。

なので、実現したいsidebar.phpの動きは以下になります。
・固定ページで読み込まれているときは親子階層により条件分岐をする
・投稿アーカイブページで読み込まれているときは親子階層の判別は不要

現状、固定ページは問題なく動いており、また投稿アーカイブページで読み込まれているときも、投稿記事が1つでもあればエラーは出ていません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

これでどうでしょう。

PHP

1 if(isset($page) && $post->ancestors){ 2 foreach ((array)$post->ancestors as $ancestor) { 3 if($ancestor == $page->ID){ $result = true; } 4 } 5 }

投稿2020/03/28 09:38

kei344

総合スコア69606

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

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

退会済みユーザー

退会済みユーザー

2020/03/29 01:57

コメントありがとうございます。 いただいたコードを適用してみたところ、エラー文は同じで、エラー箇所が1行前の if(isset($page) && $post->ancestors){ に変わりました。 そこで、こちらで以下のように書き換えてみたところ、archive.phpではエラーが出なくなりました。 if(isset($page) && ($post) && $post->ancestors){ ただし、今度は固定ページの子階層において、以下の条件分岐の箇所が一切表示されなくなってしまいました。表示されないだけで、エラーは出ていません。また、最上の親階層では問題がありません。 <?php if(is_page('about') || page_is_ancestor_of('about')): ?>    固定ページのaboutか、aboutの子階層で表示するコンテンツ <?php endif; ?> 問題の箇所がアーカイブページではなく、固定ページ(page.php)に移ってしまったので、補足情報として、エラー部分が正確にはsidebar.phpである旨を質問文に追記いたしました。 情報が足りず申し訳ありません。 //現在のfunction.php //固定ページの親子階層ごとに条件分岐 function page_is_ancestor_of($slug){ global $post; $page = get_page_by_path($slug); // 親か判別したい固定ページスラッグからページ情報を取得 $result = false; if(isset($page) && ($post) && $post->ancestors){ //投稿はよいが、固定ページはだめ foreach ((array)$post->ancestors as $ancestor) { if($ancestor == $page->ID){ $result = true; } } } }
kei344

2020/03/29 02:14

if(isset($page) && !empty($post->ancestors)) とか。
退会済みユーザー

退会済みユーザー

2020/03/30 01:33

ありがとうございます! 以下のコードで思い通りの挙動になりました。大変助かりました。 //固定ページの親子階層ごとに条件分岐 function page_is_ancestor_of($slug){ global $post; $page = get_page_by_path($slug); $result = false; if(isset($page) && !empty($post->ancestors)) { foreach ((array)$post->ancestors as $ancestor) { if($ancestor == $page->ID){ $result = true; } } } return $result; }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問