- ベストアンサー
WordPressでドロップシッピングサイトの商品一覧ページに自動在庫取得を実装する方法
- WordPressでドロップシッピングサイトを作成中ですが、商品一覧ページに自動で在庫を取得して表示したいです。
- 現在、カスタムテンプレートを使用して商品IDを取得し、在庫状況を出力する方法を試しています。
- しかし、1つ目の在庫状況は取得できるのですが、2つ目以降がエラーになってしまいます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
あと、1, 2の他にwp_get_attachment_image_srcなどと同じようなところに定義しておくという方法も思いつきましたが、まぁ、これまで紹介した方法でもちゃんと動くと思います。 > 1.include_onceを使った場合に<?php include_once 'loop_zaiko.php'; ?> > という形にしました。別ファイルには、<?php function~以下を > コピーして同じディレクトリに入れておきましたが、1個目の在庫状況は > 取得できるものの、2つ目以降が取得できない状況です。 できないはずないと思うんですが、 "<?php function~以下をコピーして同じディレクトリに入れておきました" というのから嫌な予感がしますね。 Fatal error: Cannot redeclare get_content() の解消が1、2の目的です。 functionを外に追い出すことを薦めたつもりですが、functionの後に続く"もしもAPIから商品情報XML取得&パース"のところから下も別ファイルにしちゃってないですか?それをinclude_onceしたらどうなるか考えてみましょう。 http://php.net/manual/ja/function.include-once.php include_onceというのは、そのファイルを一度だけ読み込むという機能なので、もしinclude_onceにプログラムが書いてあったらそれは一度しか実行されません。functionの場合は一度しか読まれなくてもget_content($url);と書けば呼び出せますが、それ以外のところは二度実行されません。そして、function get_content($url) {...}は二度実行するとエラーになりますので、先の回答ではこの部分をinclude_onceで別ファイルに追い出すことをおすすめしました。 つまり、 このファイルはこんなふうに書き換わります。 <!--ここから--> <?php include_once 'loop_zaiko.php'; /* * もしもAPIから商品情報XML取得&パース */ (以下略) そして、loop_zaiko.phpはこうなります。 <?php function get_content($url){ $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_HEADER, 0); ob_start(); curl_exec ($ch); curl_close ($ch); $string = ob_get_contents(); ob_end_clean(); return $string; } ?> > 2.の方法につきましては、具体的な記述方法が分かりませんで、 > 何度か似たような形に変えたりしてみたのですができませんでした。 > すみません、本当にお手間をおかけしてしまい申し訳ございませんが、 > どのように書けば良いかご教授いただくことはできませんでしょうか? その「似たような形」を具体的に書いてもらったほうが一発で適切な答えを出せそうですが、これでうまくいきませんか? <!--ここから--> <?php if (!function_exists(get_content) { function get_content($url) { ... } } /* * もしもAPIから商品情報XML取得&パース */ (以下略) 2の解決方法もやっていることは1と大差ないです。1だと既にファイルが実行されていたら実行しないというinclude_onceを使ってget_contentが2回定義されることを避け、2だとfunction_existsで関数が定義されているかを調べて、定義されていない場合にのみ定義することでget_contentが2回定義されることを避けているわけで。 この回答の最初に書いたwp_get_attachment_image_srcと同じ所で定義するというのだと、2回以上実行するような箇所で関数を定義することを避けるというちょっと絡め手な戦法ですね。 まあ、紹介した関数のマニュアルをちゃんと読んで、使い方についてもそれで検索してみたりしてもう少し理解を深めてみてはいかがでしょうか。
その他の回答 (1)
- hanabutako
- ベストアンサー率54% (492/895)
Fatal error: Cannot redeclare get_content() というのが見えませんか? このコードは商品を表示するたびに呼び出されているんだと予想するんですが、そのたびにget_content()関数の定義を繰り返しているんでしょうね。よく見てみるとこの部分の前は関数定義をするようなところはないのでこれまでそういうエラーが出ることはなかったのでしょう。 対処方法は次の2つのどちらかでしょう。 1. include_onceを使う 2. function_existsを使う 1はget_contentを別ファイルに分けて、include_onceでそれを読むようにすると1度しか読まないので複数回読んで複数回定義するというエラーが防げます。 http://php.net/manual/ja/function.include-once.php 2は関数定義の前においておくことで複数回定義することを防ぎます。 http://php.net/manual/ja/function.function-exists.php
お礼
hanabutako様 先日はありがとうございました。 こちらのご回答につきまして、御礼し忘れており、大変失礼いたしました。 先日ご教示いただきましたおかげさまでやりたいことができました。ただ、できてはいるようなのですがエラーが出てしまう場合があり、改めて「ワードプレス、PHPについてご教示下さい。」というタイトルで投稿させて頂いております。 もしまた見かけることがございましたら何卒ご教示賜りたく思います。ご多忙のようでしたらお構いなく下さい。 hanabutako様のおかげで一歩一歩前に進めることができましたので、本当にありがたかったです。 御礼遅れまして、大変失礼いたしました。 ありがとうございました。
補足
hanabutako様 ご回答本当にありがとうございます。ご教授いただきましたやり方のうち、1.include_onceを使った場合に<?php include_once 'loop_zaiko.php'; ?>という形にしました。別ファイルには、<?php function~以下をコピーして同じディレクトリに入れておきましたが、1個目の在庫状況は取得できるものの、2つ目以降が取得できない状況です。 2.の方法につきましては、具体的な記述方法が分かりませんで、何度か似たような形に変えたりしてみたのですができませんでした。すみません、本当にお手間をおかけしてしまい申し訳ございませんが、どのように書けば良いかご教授いただくことはできませんでしょうか? 今までプログラムもやったことなく、はじめてワードプレスを使っており、ほぼ全くの初心者といっていいほどなもので。。。本当に申し訳ございません。何とか助けて頂けませんでしょうか。 何卒宜しくお願い申し上げます。
お礼
hanabutako様 たびたびのご回答ならびに的確なご指示をありがとうございました。おかげさまでできました。本当にありがとうございます。 ご指摘の通り、まさにfunctionの後に続く"もしもAPIから商品情報XML取得&パース"のところから下も別ファイルにしちゃっていました。 ご教授頂きましたとおり、 <?php if (!function_exists(get_content) { function get_content($url) { ... } } の部分につきましては、 <?php if function_exists get_content($url) { ... } というようなとんちんかんなことをしていました。 今回、外部ファイルを作ったほうが分かりやすいソースになりましたので、そちらで運用させて頂きたいと思います。 上記ようにできたおかげで画像ファイルもAPIから取得することができ、作業がとても楽になりました。 本当に本当に助かりました。どうお礼を言ってよいやら、本当にありがとうござました。