どの場所からwp-load.phpを含めるには?


11

プラグイン内のjQuery.ajax()スクリプトを介してスタンドアロンのphpスクリプト(myAjax.php)を呼び出すプラグインがあります。

次のコードをmyAjax.phpファイルに配置する必要があります。

require_once('../../../wp-load.php');

if (!is_user_logged_in()){
    die("You Must Be Logged In to Access This");
}
if( ! current_user_can('edit_files')) {
    die("Sorry you are not authorized to access this file");
}

ただし、実際の相対パスが私の例と異なる場合に備えて、wp-load.phpへのパスを指定するより完全な方法が欲しいです。



Miloの発言に加えて、この件に関する2つの素晴らしい投稿があります。garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress最後のバージョンottopress.com/2010/dont-include-wp-load-please最後のバージョン)学習のためにも、最初のスライドショーandrewnacin.com/2011/04/16/wordcamp-seattle最後のバージョン
Wyck

回答:


5

__DIR__定数を使用できます。ファイルはプラグインまたはテーマフォルダー内にあるため、常にwp-contentフォルダー内に配置されます。ファイルのパスを取得し、そこwp-contentからすべてをトリムすることができます。

$path = preg_replace('/wp-content.*$/','',__DIR__);

wpがwp-contentフォルダー内にないことを確認する必要がある場合(誰が知っているか?何か起こります)-否定先読みを使用します。

$path = preg_replace('/wp-content(?!.*wp-content).*/','',__DIR__);

(開発している独自のプラグインが他のwp-contentフォルダー内にないことを確認する方が簡単なので)

Aaand ..あなたwp-loadはそこにいます:

include($path.'wp-load.php');

だが!

前述のように、AJAXにはWP-sのネイティブajaxテクニックを使用できます。

もちろん、WPのネイティブAJAX手法では不十分な場合もあります。


3
wp-content存在しない場合や、WPとは完全に異なるディレクトリにある場合があります。
fuxia

これがおそらく最良の方法です。変なwpコンテンツの場所がある場合は(たぶん)、正規表現を調整します。
pguardiario 2016年

0

私はこれが古い質問であることを知っていますが、同じことを達成しようとしている一部のユーザーに役立つかもしれないと思う自分の答えを追加したいと思いました。

はい、常にネイティブWP Ajax APIを使用する方が優れています(そして簡単です)が、WPインスタンス全体をロードするため、非常に遅くなる可能性があります。

私の解決策は非常に単純rootで、WordPressインストールのを取得するために機能するはずです。カスタムAJAX呼び出しをwp_register_script()行うスクリプトでは、まずスクリプトを登録してください(まだエンキューしないでください)。次に、を使用wp_localize_script()して解析しますABSPATH(これは内部wp-load.phpで定義され、ルートパスを保持する定数です)。これをスクリプト内で取得して、AJAX呼び出しとともに解析できます。最後に、もちろん、スクリプトを実際にでエンキューしてくださいwp_enqueue_script()

例:

以下のPHPスニペットはscript.jsファイルをエンキューし、rootを呼び出してディレクトリを取得できるようにしますpluginslug_scriptname_i18n.wp_root。基本的にwp_localize_script()はを使用して翻訳を行いますが、これはサーバー側で取得したスクリプトにデータを解析するのにも役立ちます。

        $handle = 'pluginslug-scriptname'; // Set script handle
        $name = str_replace( '-', '_', $handle ) . '_i18n'; // Will convert handle to pluginslug_scriptname_i18n
        wp_register_script( $handle, plugin_dir_url( __FILE__ ) . 'script.js', array(), '1.0.0', false );  
        wp_localize_script(
            $handle,
            $name,
            array( 
                'ajax_url' => plugin_dir_url( __FILE__ ) . 'ajax-handler.php', // @THIS WILL HOLD YOUR AJAX URL :) To retrieve this inside your script.js simply call: pluginslug_scriptname_i18n.ajax_url
                'wp_root' => ABSPATH // @THIS WILL HOLD THE ROOT PATH :) To retrieve this inside your script.js simply call: pluginslug_scriptname_i18n.wp_root
            )
        );
        wp_enqueue_script( $handle );

あなたscript.jsはこのように見えるかもしれません:

    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 ){
            if (this.status == 200) {
                // Success:
            }
            // Complete:
        }
    };
    xhttp.onerror = function () {
      console.log(this);
      console.log("** An error occurred during the transaction");
    };
    xhttp.open("POST", pluginslug_scriptname_i18n.ajax_url, true);
    xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
    var params = JSON.stringify({
        first_name: 'Johny',
        wp_root: pluginslug_scriptname_i18n.wp_root
    });
    xhttp.send(params);

今あなたの中であなたはajax-handler.phpそれを取得してwp_content_dirあなたのwp-load.phpようにロードすることができます:

// Set proper content type
header('Content-Type: text/html');
// Disable caching
header('Cache-Control: no-cache');
header('Pragma: no-cache');
// Get's the payload
$request_body = json_decode( file_get_contents('php://input'), true );  

// Set this to true to just load the basics!
// Only set this to true if you know what you are doing
// Lookup SHORTINIT inside wp-settings.php for more details
define( 'SHORTINIT', false ); 

// Include wp-load.php
require_once( $request_body['wp_root'] . 'wp-load.php' );
die();

wp_rootクライアント側で変更できることに注意してください。

補足として:

一部の人が気付かないかもしれないもう1つのトリックは、含める前に(ブール)wp-load.phpと呼ばれる定数を定義できることSHORTINITです。これはWordPressに基本をロードするように指示します(多くのWPコア機能を失うことを意味します)が、通常のWPインスタンスに必要なすべてのファイルが含まれていないため、ロード時間が短縮されます。SHORTINIT内部に定義されているwp-settings.php(ただのためのファイルや外観を開くSHORTINIT。あなたはボンネットの下に何が起こっているかのより良い理解を持つことになります。この気の利いたトリックは、私がやったことを私のテストでは75%(さらにロード時間をスピードアップします少し前ですが、これはWPバージョンに依存します。またwp-load.php、WPバージョンの新しいリリースでは頻繁に変更が行われるため、SHORTINITスクリプトは、WordPressの将来のバージョンでも、WordPressの下位バージョンでも常に機能することを確認してください。あなたは、WordPressのコーデックスの多くに依存している複雑なことを行う場合は要するに、その後に確認してくださいしない設定SHORTINIT


-1

以下のコードを使用してwp-load.phpを使用し、任意の場所からwp-loadを含めることができます

require_once( trailingslashit( ABSPATH ) .'wp-load.php' );

2
しかし、ABSPATHを設定し、trailinglashitを定義している場合は、おそらくすでにwp-loadが含まれています。
Rupの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.