サポート » マルチサイト » 外部ファイルにwp_load.phpを読み込んだ際のエラーについて

  • 解決済 saki-saki

    (@saki-saki)


    いつもお世話になっております。

    今回、マルチサイト化されたWordPressで
    自作のajax機能を使う為に外部ファイルに「wp_load.php」を読み込む文を記述しました。

    マルチサイト化した場合の「wp_load.php」の呼び出し方が

    $_SERVER = array(
      'HTTP_HOST' => 'ホスト名',
      'REQUEST_URI' => '/[子サイトのディレクトリ]/'
    );
    require('../wp-load.php');

    ということまではわかり、無事にajaxの機能を使うこと自体はできたのですが、
    以下のエラーが発生してしまいました。
    Notice: Undefined index: REQUEST_METHOD in /home/web/ホスト名/public/wp-includes/pluggable.php on line 638
    pluggable.phpの638行目には以下のように書かれています。

    // Allow a grace period for POST and AJAX requests
    	if ( defined('DOING_AJAX') || 'POST' == $_SERVER['REQUEST_METHOD'] ) {
    		$expired += HOUR_IN_SECONDS;
    }

    エラー自体はwp-config.phpのデバック機能をfalseにすれば表示されないので
    最悪これで隠すことも可能ですし、問題なくajaxの機能は使えてるのですが、できるだけ解決したく、ご質問させていただきました。

    以下が現在の仕様です。

    WordPressのバージョンは4.1.18です。
    wp-config.phpはpublicフォルダと同階層に設置し、
    publicフォルダにWPフォルダは作らずそのままWPの中身を入れています。
    ajaxフォルダにindex.phpを設置し、そこでwp_load.phpを読み込む記述をしております。

    
    ----------------------------------------
    wp-config.php
    public
      |
      |-ajaxフォルダ
      |  |-index.php
      |
      |-wp-includesフォルダ
      |-wp-adminフォルダ
      |-cssフォルダ
      |-jsフォルダ
      |-imageフォルダ
      |-index.php
      |-wp-load.php
      |-wp-blog-header.php
      |-以下略
    -----------------------------------------
    

    ajaxフォルダのindex.phpに

    $_SERVER = array(
      'HTTP_HOST' => 'ホスト名',
      'REQUEST_URI' => '/[子サイトのディレクトリ]/'
    );
    require('../wp-load.php');

    だけを記述しても上記のエラーが出ましたので、ajaxを使う以前の問題だと思っていました。
    このエラーの解決方法がわかる方がいましたら、ご教授をよろしくお願いします。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • こんにちは

    pluggable.phpの638行目では、
    $_SERVER['REQUEST_METHOD']

    を参照していますが、ajaxフォルダのindex.phpにある

    $_SERVER = array(
      'HTTP_HOST' => 'ホスト名',
      'REQUEST_URI' => '/[子サイトのディレクトリ]/'
    );

    $_SERVERを上書きして$_SERVER['REQUEST_METHOD']はクリアされてしまっています。

    この記述がなぜ必要なのかよく分からないですが、その値を変更したいのであれば、

    $_SERVER['HTTP_HOST'] = 'ホスト名';
    $_SERVER['REQUEST_URI'] = '/[子サイトのディレクトリ]/';

    とすれば良いと思います。

    ただ、この値を上書きすると他の箇所に何か影響がありそうにも思います。

    本題とは関係ないところで申し訳ないのですが、「$_」から記述されている変数はユーザーがデータを差し込むべきではありません。
    これは入口出口の「出口」のような役割でサーバーなどの機材を経由したデータを意味するものです。
    出口から入っても売り場にもどれるではないか、むしろパンや総菜、冷蔵冷凍商品に近いので便利ではないかという感覚が物理ではあるかと思います。
    しかし理論値としては「どこからきて、どこを経由したデータなのか」というのは仮想通貨のハッシュデータでもないかぎり判別がつかないのです。
    「どこかでデータがおかしくなった」という事象について対処する場合、入口側からと出口側からの検証だけでも経路が単純に2倍になります。
    実質個人でそんなに大きなプログラムを作成することはないと思いますが、もしプロジェクト単位で行えば文字通り「全部ひっくり返す」ということもあります。
    「そんな大げさな」と言われるかもしれませんが、最初に「出口から入らない、受け取り口にデータを返し入れない」というわずかの手間でそのすべてが回避できるなら
    ぜひとも、受け取りは自前の変数にいれて、流れが一方向になるように組んでいってもらいたいと思います。

    munyagu様
    ご連絡が遅れて失礼致しました。
    先程、提案していただいた用に書きましたら、エラーもなく無事にajax通信で記事を読み込めることができました。

    $_SERVER = array(
      'HTTP_HOST' => 'ホスト名',
      'REQUEST_URI' => '/[子サイトのディレクトリ]/'
    );
    

    では、REQUEST_METHODを指定していなくてもクリアしてしまうのですね。勉強になります。
    >>ただ、この値を上書きすると他の箇所に何か影響がありそうにも思います。
    ajaxボタンを押したら記事を取得するだけでしたので、特に問題はないかと思っております。
    ありがとうございました。

    msio様
    $_についてご教授いただき、大変勉強になりました。
    本当なら、WordPress標準にあるajax機能を使いたいのですが、自分の勉強不足のため、思ったようにうごいくれず、外部ファイルから呼び出す結果になってしまいました。
    今後は教えていただいたことを頭に入れて組み込みたいと思います。
    ありがとうございました。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • このトピックに返信するにはログインが必要です。