重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

お忙しい中恐れ入ります。
WordPressにてPHP8.2にて使用しているのですが、どうしても上記Warning・・・・。が消せません。

何かの未定義なのでしょうけれど、一つ直すと違う行が同じWarning・・・・。と表示されてしまいます。


コードは以下になります。


---------------------------------------------------------------------------------------------------------

//内部リンクをはてなカード風にするショートコード
function nlink_scode($atts) {
extract(shortcode_atts(array(
'url'=>"",
'title'=>"",
'excerpt'=>""
),$atts));

$id = url_to_postid($url);//URLから投稿IDを取得
$post = get_post($id);//IDから投稿情報の取得
$date = mysql2date('Y-m-d H:i', $post->post_date);//投稿日の取得

$img_width ="200";//画像サイズの幅指定
$img_height = "200";//画像サイズの高さ指定
$no_image = get_template_directory_uri().'/images/no-img.png';//アイキャッチ画像がない場合の画像を指定

//抜粋を取得
if(empty($excerpt)){
if($post->post_excerpt){
$excerpt = get_the_custom_excerpt($post->post_excerpt , 90);

}else{
$excerpt = get_the_custom_excerpt($post->post_content , 90);
}
}





//タイトルを取得
if(empty($title)){
$title = esc_html(get_the_title($id));
}


//アイキャッチ画像を取得
if(has_post_thumbnail($id)) {
$img = wp_get_attachment_image_src(get_post_thumbnail_id($id),array($img_width,$img_height));
$img_tag = "<img src='" . $img[0] . "' alt='{$title}' width=" . $img[1] . " height=" . $img[2] . " />";
} else { $img_tag ='<img src="'.$no_image.'" alt="" width="'.$img_width.'" height="'.$img_height.'" />';
}

$nlink .='<div>
<a href="'. $url .'" class="tmt-blog-card">
<div class="tmt-blog-card-box">
<div class="tmt-blog-card-thumbnail loading=”lazy”">'. $img_tag .'</div>
<div class="tmt-blog-card-content">
<div class="tmt-blog-card-title">'. $title .' </div>
<div class="tmt-blog-card-excerpt">'. $excerpt .'</div>
</div>
</div>
<div class="clear"></div>
</a></div>';

return $nlink;
}

add_shortcode("nlink", "nlink_scode");
---------------------------------------------------------------------------------------------------------

上記の89行目は、以下の部分になるのですが、

<div class="tmt-blog-card-excerpt">'. $excerpt .'</div>◯◯◯
                            ↑
上記の◯◯の部分にはsvgを記載しています。質問の長さが入り切らなかったので省略しました。

svgの有無に関わらず、
上記コードにて未定義のものがあるのでしょうか?

svgがいけないのでしょうか?
それともやはり何か未定義のものがあるのでしょうか?


お忙しい中大変恐れ入りますが、
何卒ご教授お願い申し上げます。


お願い申し上げます。

なお、
PHP8のエラー回避の以下コードを使用して一応はError表示を非表示にはしているのですが、
将来的なことも考えて、
上記コードのどこがいけないのかご教授いただけましたら幸いです。

よろしくお願い申し上げます。

A 回答 (4件)

$nlink ='<div(以下略)


としない理由は何ですか?



PHPでは変数宣言しなくても null が入っているものとして使えます。
ですが、これでは 未定義変数を意図して使っているのか、別の定義済み変数の間違いなのかが判断できません。
例)
$a0 = 5; # $a0が定義される。

$b = $a1 + 5 ;
# $a1が意図的に未定義の変数を使ったものなのか、
# 定義済みの変数($a0とか)の間違いなのか、判断でない

$c += 5 ; #複合代入演算子 += : $c = $c + 5 と同等。
# $c + 5 の$c が意図的に未定義のまま使ったものなのか、
# 別の定義済みの変数の間違いなのか
# ただの代入 $c = 5 ;の意図で書いたのか 判断でない


最近になって、未定義の変数を使おうとすると Warning:Undefined variable という警告が出るようになりました。


修正方法は、何を意図していたか、によって違います。
(1)意図的に未定義変数を使っている
 → それより前に 変数 = 初期値 ;等として「定義済み」にしておく
(2)変数名の間違い
 → 正しいものに直す
(3)(複合代入演算子で)ただの代入の意味で使っている
 →「ただの代入」にする
(4) 想定では定義済みのはずなのに、そうなっていない
→ プログラムを見なおす。
(if文等による分岐で未定義のままになるようなものが無いか、等)


あなたのプログラムでは、 (3)があてはまりそうです。
ですが、(4)の可能性(これより前の$nlinkに設定して、その末尾に<div〜を追加することを想定している)もありえます。
    • good
    • 1
この回答へのお礼

度重なるご回答誠にありがとうございます。
勉強不足で、(3)と(4)の両方なのだと思います。

以下に修正したコードです。

function nlink_scode($atts) {
$atts = shortcode_atts([
'url' => '',
'title' => '',
'excerpt' => ''
], $atts, 'nlink');

<省略>

$html = '
<div>
<a href="' . $url . '" class="tmt-blog-card ' . $click_class . '" data-post-id="' . esc_attr($post_id) . '" target="_blank" rel="noopener">
<div class="tmt-blog-card-box">
<div class="tmt-blog-card-thumbnail">' . $img_tag . '</div>
<div class="tmt-blog-card-content">
<div class="tmt-blog-card-title">' . esc_html($title) . '</div>
<div class="tmt-blog-card-excerpt">' . esc_html($excerpt) . '</div>
</div>
</div>
</div>
<div class="clear"></div>
</a>
</div>';
return $html;
}
add_shortcode('nlink', 'nlink_scode');


一応、このコードにてErrorは表示されなくなりました。
以前とは、異なる記載になっていますが合っていますでしょうか?

お礼日時:2025/05/04 10:36

もう一度言います


「提示された部分だけ見ると、 .= を使う必要は無いように思えます。」


「$nlink .='<div>〜

$nlink = $nlink . '<div>〜
と同等の意味になります。」
日本語で言えば「現在の $nlinkの末尾に '<div>〜 を結合して、改めて $nlink に代入する」です。
これより前に $nlink が存在しないのですから、「末尾に結合」する意味があるのですか?
結合する意味が無いなら、素直に「代入」すればいいのでは?


また「将来の変更等でこれより前に$nlinkに何か入っている状態で、その末尾に追加する」という意図で .= を残しておきたいなら、「これより前に$nlinkに何か入っている状態」にする必要があります。

> $nlink = NULL;
> を追加し、

NULLであることに意図が無いのなら「間違い」です。
自動変換で NULLは空文字になりますが、特に意図が無いなら最初から空文字にするべきです。
NULLと空文字の区別がつかないなら、いろいろと不具合の原因になるので、PHPの勉強をがんばりましょう。
    • good
    • 1
この回答へのお礼

ご回答誠にありがとうございます。

おっしゃるように
> .= を使う必要は無いように思えます。

.= を削除したところ以下のようにErrorになってしまいサイト自体が表示されなくなってしまいます。


Parse error: syntax error, unexpected variable "$nlink" in◯◯← .= を削除した行。


>.= を残しておきたいなら、「これより前に$nlinkに何か入っている状態」にする必要があります。


ということは、
if(empty($excerpt)){
$excerpt = esc_html(ltl_get_the_excerpt($id));
}

のように、
nlinkの前に記載すればよいのでしょうか?



if{empty($nlink)){
$nlink = ◯◯◯◯;
}

のように記載すればよいのでしょうか?


未熟で大変申し訳けありませんが、
具体的に、
どのようにnlinkの定義を記載すればよいのかご教授いただけませんでしょうか≦(._.)≧ ペコ。


issetなども調べてみましたが・・・。

何度も、
恐れ入りますが何卒よろしくお願い申し上げます。

これでダメなら諦めます。

お礼日時:2025/05/01 20:25

だとすると話が違ってきます。


前の回答の後半は一旦忘れてください。


> 変数としましては$nlinkと記載されています。
>
> $excerptの問題ではなく、
> $nlinkの問題なのでしょか?

そうなります。
その視点で見ると$nlinkが最初に出てくるのは
$nlink .='<div>〜
です。
$nlink .='<div>〜

$nlink = $nlink . '<div>〜
と同等の意味になります。
=で代入する前に $nlink の内容を参照しようとするので、これより前に定義できてなければ未定義となります。
提示された部分だけ見ると、 .= を使う必要は無いように思えます。
どうしても .= を使うなら、これより前に $nlinkに値を代入しておく飛鳥があります。
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。
=を省いたところエラーでサイト自体が表示されなくなってしまいました。

なので、
$nlink .='<div>〜
の前に
$nlink = NULL;
を追加し、

$nlink = NULL;
$nlink .='<div>〜

というようにしてみたところ
無事エラー表示されなくなりました。


これであっているのでしょうか?

お礼日時:2025/05/01 05:29

SVGは関係ありません。



Warning:Undefined variable の後に「 $~ 」と変数名が書いてないですか?
「一つ直すと違う行が同じWarning・・・・」というのも「一言一句同じメッセージ」なのか、「同じ変数で行番号が違う」なのか、 「同じ『Undefined variable 』という警告なだけで行番号や変数は違う」なのかで対処が違います。


//抜粋を取得
if(empty($excerpt)){
 if($post->post_excerpt){
  $excerpt = get_the_custom_excerpt($post->post_excerpt , 90);
 }else{
  $excerpt = get_the_custom_excerpt($post->post_content , 90);
 }
}
・実際には $excerptは extractで「定義」されていますが、構文的には「$excerpt=''」等と「定義」しているのは empty($excerpt)がtrueのときだけです。
empty($excerpt)がfalseなら、emptyの仕様としては$excerptは定義されているはずですが、PHPにはそんなemptyの仕様がわからず「empty($excerpt)がfalseなら$excerptは定義されない」と判定しているのかもしれません。
    • good
    • 2
この回答へのお礼

お忙しい中、ご解答誠にありがとうございます。

変数としましては$nlinkと記載されています。


$excerptの問題ではなく、
$nlinkの問題なのでしょか?

また、
(1)上記$nlinkが問題だった場合と、

(2)以下のような場合にはどのようにコードを記載すればよいのでしょうか?


>・実際には $excerptは extractで「定義」されていますが、構文的には「$excerpt=''」等と「定義」しているのは empty($excerpt)がtrueのときだけです。
empty($excerpt)がfalseなら、emptyの仕様としては$excerptは定義されているはずですが、PHPにはそんなemptyの仕様がわからず「empty($excerpt)がfalseなら$excerptは定義されない」と判定しているのかもしれません。


このような場合のfalseの場合の定義はどのように記載すればよいのでしょうか?

お忙しい中恐縮ですが、何卒ご教授お願い申し上げます。

お礼日時:2025/04/30 15:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

今、見られている記事はコレ!


このQ&Aを見た人がよく見るQ&A