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

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

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

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

PHP

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

Q&A

解決済

2回答

1132閲覧

WordPressでホームの条件分岐をするとき、ホームなのにelseに該当する

moomoom

総合スコア19

WordPress

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

PHP

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

0グッド

0クリップ

投稿2019/09/03 03:15

編集2019/09/03 04:41

###前提・知りたいこと
下記をheader.phpに書き、ホームを開きます。

すると「ホームだよ」が出力され「ホーム以外」は出力されません。
にも関わらず、「// ここでエラー」の部分でエラーが出力されます。

つまりホームだと判定しているのにも関わらず、elseのコードを読んでいるのです。

このエラーをなくす方法を知りたいです!

###該当のソースコード

<?php $url = explode( '/', rtrim($_SERVER['REQUEST_URI'], '/') ); if( is_home() || is_front_page() ){ echo 'ホ―ムだよ'; $user_id = get_current_user_id(); } else{ echo 'ホーム以外'; $user_id = get_user_by( 'slug', $url[2] )->ID; // ここでエラー }

###エラー
しかもこのエラー、3回出ます。なんなのでしょうか?

PHP Notice: Trying to get property 'ID' of non-object in /home/●●●●●●/example.com/public_html/wp-content/themes/world/header.php on line 70

###試したこと
よくわからんけど条件分岐が効かないなら、他の条件としてissetを追加してみました。それが下記ですが、やはり同じエラーです。

<?php $url = explode( '/', rtrim($_SERVER['REQUEST_URI'], '/') ); if( is_home() || is_front_page() ){ echo 'ホ―ムだよ'; $user_id = get_current_user_id(); } else{ echo 'ホーム以外'; if( isset($url[2]) ){ // 追加 $user_id = get_user_by( 'slug', $url[2] )->ID; // やはり同じエラー } }

そしてvar_dumpで見てみました。コメントアウトの通りの結果です。

var_dump($url); // array(1) { [0]=>string(0) ""} var_dump($user_id); // int(1)

このように配列の数は1つなのに、『isset($url[2])』の指定、つまり『配列の2つ目がある場合』の指定さえ無視して、エラーの行を読んでしまいます。

###試したこと2
特にquery_posts()は使ってないのですが、一応下記リセットを書いてみましたがダメでした。

<?php wp_reset_query(); /* 以下は同じ */

###試したこと3
さらに条件分岐に「REQUEST_URI」を加えてみましたが、これもダメでした。

if( is_home() || is_front_page() || $_SERVER["REQUEST_URI"] === "/" ){

かなり意味不明なのですが、エラーを消したいです。

どなたかアドバイスいただけませんでしょうか。

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

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

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

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

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

beginner_t

2019/09/03 04:04

質問ですが、ホームにはどのテンプレートをあててるのでしょうか?
moomoom

2019/09/03 04:12

オリジナルテーマのindex.phpです。ちなみにその中身は下記6行だけです。 <?php get_header(); get_template_part( 'main' ); get_template_part( 'side' ); get_footer(); ?>
beginner_t

2019/09/03 05:36 編集

$user_id = get_user_by( 'slug', $url[2] )->ID; // ここでエラー これですけどslugを指定しているということはuser_nicenameを取りたいってことでいいんですかね??
moomoom

2019/09/03 06:33 編集

仰るとおりです。(←左記は間違いで、欲しいのはIDです。2019/09/03 15:32のコメントの通りです。失礼致しました。)
beginner_t

2019/09/03 06:00

$url[2]は何がはいってるのでしょうか?
moomoom

2019/09/03 06:22

ホーム以外であれば下記の「name」がはいります。 example.com/user/name/blog
guest

回答2

0

ベストアンサー

やろうとしてることはadd_rewrite_ruleを使ってやるべきことだし判定が雑です

これじゃフロントページ以外のどのページにアクセスしても
ほとんどエラーが出ることになるんじゃないでしょうか

もうちょっと判定を丁寧にした方がいいかと思います

php

1if( isset($url[2]) ){ 2 ... 34if( isset($url[2]) && $url[1]==='user'){ 5 $user_data=get_user_by( 'slug', $url[2] ); 6 if(!empty($user_data)){... 7

あるいは

php

1 2if(preg_match('/user/([^/]+)(/.+)?/',$_SERVER["REQUEST_URI"],$matches)){ 3 $user_data=get_user_by( 'slug', $matches[1] ); 4 if(!empty($user_data)){... 5

みたいな感じに

WPは一つのリクエストで複数のリクエストが発生することはままあることで
存在しない画像・JS・CSSの読み込みのコードがあれば
それだけでWPのクエリ処理が走ることになりますし
時に特定のURLに404が返ることを確かめるみたいなこともします

想定しないURLでリクエストされることはままあることです

リクエストに対する挙動をカスタマイズするときはコンフリクトしないように
確実に規定のリクエストだけを拾うようにしましょう

投稿2019/09/03 11:05

KazuhiroHatano

総合スコア7804

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

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

moomoom

2019/09/03 11:38

>add_rewrite_ruleを使ってやるべき 実際はfunctions.phpにある関数で使っている条件分岐なのですがそれがうまく動作せず、いったんテストのためにheader.phpに書いて様子を見ている、という感じになりますので…ここはお見逃しください。 >判定が雑 >確実に規定のリクエストだけを拾うように なるほど、今まであまり気にしていませんでした。よくよく気を付けたいと思います。ありがとうございます。 >存在しない画像・JS・CSSの読み込みのコードがあればそれだけでWPのクエリ処理が走る まさに。テスト中なのでたくさんあります。なるほどそのような処理があるんですね。勉強になります。
moomoom

2019/09/03 11:46

ところで、多少コードをシンプルにし、改めて他の問題なのではと思っています。 下記ですが、test1() も test2() もいずれも 「ホ―ムだよhome」と出力されるのに、test1() だけエラーになります。 つまり else の中で $page をセットしてあげないとエラーになるのです。elseの中の「ホーム以外」は出力されていないのに、です。 このような場合、何か要因考えられますでしょうか?(別質問たてるべきですか?) ▼ホームでエラーになる function test1(){ if ( $_SERVER["REQUEST_URI"] === "/" ){ echo 'ホ―ムだよ'; $page = 'home'; }else{ echo 'ホ―ム以外'; } echo $page; } test1(); ▼ホームでエラーなし function test2(){ if ( $_SERVER["REQUEST_URI"] === "/" ){ echo 'ホ―ムだよ'; $page = 'home'; }else{ echo 'ホ―ム以外'; $page = 'not home'; } echo $page; } test2();
KazuhiroHatano

2019/09/03 12:44

else判定の処理の中でerror_log($_SERVER['REQUEST_URI']);とかしてみて、どういうリクエストの時にその処理が走ってるのか確かめてみれば原因が見えるのではないでしょうか
moomoom

2019/09/04 01:47

ありがとうございます。error_logを知りませんでした。 やってみますとエラーメッセージが下記のように6つに増えました。 【↓test1() の従来のエラーはこの3つ】 ---------------------------------------------- PHP Notice: Undefined variable: page in /home/●●●●●●/example.com/public_html/wp-content/themes/world/header.php on line 108 PHP Notice: Undefined variable: page in /home/●●●●●●/example.com/public_html/wp-content/themes/world/header.php on line 108 PHP Notice: Undefined variable: page in /home/●●●●●●/example.com/public_html/wp-content/themes/world/header.php on line 108 ---------------------------------------------- 【↓test1() のelseにerror_logを書いた場合はこの6つ】 ---------------------------------------------- PHP Notice: Undefined variable: page in /home/●●●●●●/example.com/public_html/wp-content/themes/world/header.php on line 108 /wp-content/imges/back.jpg%20alt= PHP Notice: Undefined variable: page in /home/●●●●●●/example.com/public_html/wp-content/themes/world/header.php on line 108 PHP Notice: Undefined variable: page in /home/●●●●●●/example.com/public_html/wp-content/themes/world/header.php on line 108 /wp-content/themes/world/js/jquery.typist.min.js.map /wp-content/themes/world/js/jdenticon-2.1.1.min.js.map ---------------------------------------------- この増えたものがおっしゃっていた「>存在しない画像・JS・CSSの読み込み」によって発生するエラーでしょうか?つまりこれらを存在させればOKだよと。 しかし、いずれも実際に存在するファイルなのに、なぜか勝手にファイル名の末尾に「%20alt=」や「.map」が追加されることで「存在しない画像・JS」と捉えられてしまっている様子です。 なぜ勝手に末尾につくのか、まで、ひょっとしてわかりますでしょうか。この末尾の追加さえなくせれば…!!(JSの方は、wp_enqueue_scriptsを確認して、「.map」なんて書いていないこと確認済みです。)
KazuhiroHatano

2019/09/04 02:11

ファイルを存在させるより、ifの判定を厳密にする方がいいです 回答で述べたようにこのままではほとんどのページで同様のエラーが出ることになります jsの読み込みはjsによって行われることもあります WPでリクエストに対する挙動をカスタマイズするときは 他の想定されうるリクエストに干渉しないように十分に注意して処理すべきです これはadd_rewrite_ruleを使う場合でも同様です
KazuhiroHatano

2019/09/04 02:15

しかし、%20alt=が後ろにつくのは画像のファイル名に問題があるのではないかと思われるのと 多分.mapはjsのファイルがそれをリクエストしているのではないかと思われるので ちゃんとjsファイルと一緒に置いといてあげた方がいいかと思います .mapファイルはライブラリのフォルダに.jsファイルと一緒に入っていたのではないかと思います
moomoom

2019/09/04 03:22

ありがとうございます。なんでもよくご存じですねーー! JSも画像も仰るとおりで、見事にエラー解消いたしました。ベストアンサーとさせて頂きます。ご協力に深く感謝申し上げます。 最後に残った疑問なのですが、今までのエラーは要は、存在しないファイルを読もうとしたら起こったということになりますよね。その経緯が謎です。 「ファイルが存在しない→謎の経緯→test1()でエラー」という、この謎の経緯の部分までは、わからないですよね。 質問のコードは質問用に書いたものなのでいったん忘れてください。 とりあえず、『ホームで実行する test1() と test2() について、なぜ存在しないファイルがあるときに tets1() でエラーが起こるのか』という部分に絞って知りたいと思っています。
KazuhiroHatano

2019/09/04 03:59

WPは.htaccessをみれば明白ですが「リクエストされたURLのファイルが存在しないならばWPでルーティング処理をする」というようになっています つまり、ファイルが存在しないURLへのリクエストがあればWPはそれに応じたページを表示しようとするということです テーマにget_header()などをしない404.phpを用意するなどしておけば 無効なURLにおいて通常のリクエスト時に行う処理をしないようにすることもできるでしょう しかし、URLリライトを用いて判定を厳にするのがまず前提と思います URLによる処理の分岐の判定がガバガバだと色々な問題を起こします
moomoom

2019/09/04 04:08

なるほど、変な画像のページを表示しとうとしてelseに抜けたからエラーということでしたか。納得いきました。404のテクニックも貴重なお話ありがとうございます。 リライト実装と判定の厳密に努めます! 長々と何度も返信におつきあい頂きまして、最後まで本当にどうもありがとうございました。
guest

0

まずエラーに関してですが、
ニックネームを取りたいということであれば

php

1$user_id = get_user_by( 'id', $url[2] )->user_nicename;

のようにidやemailなどでuserを指定しuser_nicenameを出力させるものではないでしょうか?
一応こちらの環境でも$url[2]の部分を実在するidに指定しuser_nicenameが出力されることを確認しています。

提示いただいているものの場合ニックネームを指定し、IDを出力していると思います。
関数リファレンス

投稿2019/09/03 06:28

beginner_t

総合スコア716

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

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

moomoom

2019/09/03 06:32

すみません。取りたいのはIDです。 以下の文を「user_nicenameからIDを取りたいってことでいいんですかね??」と空目しました。 「user_nicenameを取りたいってことでいいんですかね??」
beginner_t

2019/09/03 06:35

なるほど、IDであっているんですね。ではURLのnameはその記事を書いている人で変わるという認識でよいでしょうか?
moomoom

2019/09/03 07:15 編集

>なるほど、IDであっているんですね はい。すみませんでした。ヾ(_ _。) >ではURLのnameはその記事を書いている人で変わる その解釈で問題ないです。
beginner_t

2019/09/03 08:06

$urlをdumpしたら、[2]にnameが入っているんですよね? こちらの環境では同じURLの構成ではないですが、IDは取れていて、エラーもでてなければ、ifも正常に読めているんですけどね。。
moomoom

2019/09/03 08:11 編集

はい、私もデフォルトの環境ならそうなることは確認しています。質問のエラーを再現させる要因がわからず何か手掛かりがつかめればと思い質問したので、また何かあればよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問