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

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

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

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

PHP

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

Q&A

3回答

309閲覧

WordPressでオリジナルアバターを作成したい

maimaime

総合スコア17

WordPress

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

PHP

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

0グッド

1クリップ

投稿2018/12/27 05:14

編集2018/12/27 07:29

###実現したいこと
オリジナルアバターを出力したいです。
下記について良い解決方法がありましたら教えて頂ければ幸いです。

###試したコード
こちらのコードについて、後述するエラーの解決方法が知りたいです。
ちなみmy_get_ImgPassは画像のフスパスを取得する関数で、正常に作動します。

php

1function my_get_Avatar( $userId, $num=null ){ 2 global $wpdb; 3 // ユーザーIDから、画像のURLを取得(フルパスです) 4 $ImgPass = my_get_ImgPass('ImgPass' ,$userId); 5 // 画像URLがあれば 6 if ( ! empty($ImgPass) ){ 7 // 画像URLから、画像IDを取得 8 $ImgId = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $ImgPass )); 9 // ※画像IDから、指定サイズ版を取得 10 $ImgInfo = wp_get_attachment_image_src( $ImgId[0], 'img100' ); 11 // 出力 12 if( is_null($num) ){ 13 return '<img src="'.$ImgInfo[0].'" alt="">'; 14 }else{ 15 return '<img src="'.$ImgInfo[0].'" alt="">'; 16 } 17 }else{ 18 echo '画像なし'; 19 } 20} 21 22echo my_get_Avatar( 1, 100 );

エラー内容は次のものです。

php

1Notice: Undefined offset: 0 in 2/export/user/c/zjp_95167c/live_77a5b6/var/wordpress/wp-content/themes/functions.php 3on line 384

384行目はここです。

php

1 // ※画像IDから、指定サイズ版を取得 2 $ImgInfo = wp_get_attachment_image_src( $ImgId[0], 'img100' );

どう書けば解決できるか分かる方いませんか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/12/27 06:17

「エラーになる」とは具体的にどういう状態でしょうか。表示されたメッセージなどを質問文に追記していただけますか?
maimaime

2018/12/27 06:48

追記しました。すみませんでした。
guest

回答3

0

現情報で考えられるのは、登録されていない画像URL情報を関数[my_get_ImgPass]の戻り値で返しているのではないかと思われます。

まず、SQLは間違っているように見えません。

その上で、関数[wp_get_attachment_image_src] の呼び出し時点でエラーになるということは、関数[my_get_ImgPass]の戻り値である画像URLの情報がワードプレスで利用しているDBの指定テーブル[wp_posts]に無いと思いますが、その点はチェックされていらっしゃいますか?

メソッド$wpdb->get_col()が データが無い場合 null を返すので 変数[ $ImgId]にはnullが代入されてしまいます。その結果nullの[0]を参照してしまっているのでエラーになっているのではないかと思います。

関数[my_get_ImgPass]の戻り値として取得した画像URL情報をDumpなど行い、MySQLで直接当該画像URL情報があるのかSQL叩いてみて取得できるかを調査なされてはいかがでしょうか。

投稿2018/12/27 06:47

kanimaru

総合スコア1013

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

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

maimaime

2018/12/27 06:53 編集

どうもありがとうございます。 画像データが空ならば、そもそも関数[wp_get_attachment_image_src] の呼び出しも起こらず、エラーにもならないのではないでしょうか?と言いますのは、 質問のコードには if ( ! empty($ImgPass) ){} という条件を書いており、これは 「$ImgPassが空じゃない場合だけ」 という意図のつもりです。 なので、もしこの条件に合致しない(つまり、画像URLの情報がワードプレスで利用しているDBの指定テーブル[wp_posts]に無い)のでしたら、上の条件の中は走らず、関数[wp_get_attachment_image_src] の呼び出しも起こらず、エラーにもならないのではないでしょうか?
kanimaru

2018/12/27 07:10 編集

まず、$wpdb->get_col()に関して、空配列を返すような仕様でした。失礼いたしました。 さて、回答いたしますが、やはり関数[my_get_ImgPass]が返すURL情報がワードプレスで利用しているDBのテーブル上に存在しないものと思います。存在しない為、メソッド[ $wpdb->get_col]が空配列を返し、次の行で空配列の[0]を参照し、追記されたエラーが出ています。 ワードプレスの準備関数ではない独自に作られた関数[my_get_ImgPass]の仕様は存じ上げません。故に関数[my_get_ImgPass]が何の画像URL情報を返しているか存じません。本当に関数[my_get_ImgPass]は、WPに登録されているユーザidに紐づく画像URL情報を返し、かつ、その画像URL情報はワードプレスDBのwp_postsに存在するのでしょうか? ところで、指摘致しました $ImgPass に格納された画像URL情報がDB上にSQLを走らせて存在したことを確認してのご返答でしょうか。
maimaime

2018/12/27 07:30 編集

えっと、関数[my_get_ImgPass]が返すURL情報が存在しないのはその通りなんです。 ご指摘頂きました $ImgPass に格納された画像URL情報も存在しません。 で、どうして存在しないのに、 if ( ! empty($ImgPass) ){} という「存在したら」の条件が走ってしまうのでしょうか? 存在しないんだから、エラーは表示されず、'画像なし'がechoされるのではないのでしょうか??
kanimaru

2018/12/27 07:46 編集

追加情報をありがとうございます。 関数[my_get_ImgPass]がphpビルド関数emptyの仕様である以下URLのリンク先にある返り値 の項目の、いずれかに合致しない戻り値を返していると判断できます。関数[my_get_ImgPass]調査をなされるべきかと思います。 http://php.net/manual/ja/function.empty.php
guest

0

$ImgInfo = wp_get_attachment_image_src( $ImgId[0], 'img100' );
Notice: Undefined offset: 0 in

このエラーの内容は配列のサイズを超えた要素にアクセスているというエラーです。
$ImgId配列に0番目の要素が無いということで、空っぽの配列の可能性が高いです。

$ImgId = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $ImgPass ));

こちらのSQLで想定されるデータが取得できていないのではないでしょうか。
想定されるguidが存在するか、$ImgPassが正しいかご確認されてみてはいかがでしょうか?

投稿2018/12/27 07:08

tabuu

総合スコア2449

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

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

maimaime

2018/12/27 07:26 編集

ありがとうございます。 $ImgPassをvar_dumpすると、 string(0) "" となります。 つまり、 if ( ! empty($ImgPass) ){ の条件に合致しないと思うのですが、 なぜこの条件の中のコードが走って、エラーになってしまうのでしょうか?
tabuu

2018/12/27 23:42 編集

my_get_ImgPass関数の戻り値はどのようになっていますか? また、どうしても解決しないようであれば、以下のように条件を現実的な内容にするかですかね。 例えば$ImgPassの文字数が通常10文字以上になる場合 if ($ImgPass && strlen($ImgPass) >= 10) あと、$ImgIdのチェックもしておいたほうが安全だと思います。 if (is_array($ImgId) && count($ImgId) > 0) ※ImgPassのif文の条件間違っていたので修正しました。
guest

0

Ideone.com」でコードを確認したところ
4行目に使われている関数 my_get_ImgPass() が未定義というエラーが見つかりました。

関数が登場する手前で function my_get_ImgPass() {} で括るとエラーが出なくなります。

投稿2018/12/27 06:15

Sohaya

総合スコア254

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

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

maimaime

2018/12/27 06:39 編集

それはフルパスで画像URLを取得する関数で、別のとこで定義してます。正常に動きますので$ImgPassは問題ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問