如何从任何位置包含wp-load.php?

时间:2011-08-18 作者:N2Mystic

我有一个插件,它通过jQuery调用独立的php脚本(myAjax.php)。插件中的ajax()脚本。

我需要将以下代码放入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加载的路径。以防实际的相对路径与我的示例不同。

3 个回复
SO网友:Ilia Andrienko

您可以使用__DIR__ 常数因为文件位于插件或主题文件夹中,而插件或主题文件夹始终位于wp-content 文件夹您只需获取文件的路径并从wp-content 从中:

$path = preg_replace(\'/wp-content.*$/\',\'\',__DIR__);
如果您需要确保wp不在某个wp内容文件夹中(谁知道呢?会发生什么情况),请使用负面前瞻:

$path = preg_replace(\'/wp-content(?!.*wp-content).*/\',\'\',__DIR__);
(因为更容易确定您正在开发的插件不位于其他wp内容文件夹中)

aa和。。你的wp-load 是否有:

include($path.\'wp-load.php\');
但是正如前面提到的,对于AJAX,您可以使用WP-s native ajax technique.

当然,在某些情况下,WP的原生AJAX技术还不够。

SO网友:Rens Tillmann

我知道这是一个老问题,但我想添加我自己的答案,我认为这可能会帮助一些用户实现同样的目标。

是的,使用本机WP-Ajax-API总是更好(也更容易),但它可能会变得非常慢,因为它会加载整个WP实例。

My solution: 非常简单,应该可以检索root wordpress安装的。在执行自定义AJAX调用的任何脚本中,只需确保首先将脚本注册到wp_register_script() (暂时不要排队)。然后使用wp_localize_script() 并分析ABSPATH (这是一个在wp-load.php 并将保留根路径)。现在,您可以在脚本中检索此内容,并将其与AJAX调用一起解析。最后,当然要确保实际将脚本排队wp_enqueue_script().

Example:

下面的PHP代码片段将把您的script.js 文件,并允许您检索root 通过调用dirpluginslug_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();

Please keep in mind that the wp_root can be altered client side.

As a side note:

另一个你们中的一些人可能没有意识到的技巧是wp-load.php 您可以定义一个名为SHORTINIT (布尔)。这将告诉WordPress只需加载基本功能(意味着您将丢失许多WP核心功能),但它将加快加载时间,因为它不会包含常规WP实例所需的所有文件。这个SHORTINIT 在内部定义wp-settings.php (只需打开文件并查找SHORTINIT. 你将更好地了解引擎盖下发生的事情。这个巧妙的技巧将进一步加快加载速度(在我的测试中,加载速度比前一段时间提高了75%)。但这将取决于WP版本。还要记住wp-load.php WP版本的新版本会频繁更改,因此如果您使用SHORTINIT 请确保您的脚本即使在未来版本的WordPress中也能正常工作,并且在较低版本的WordPress中也能正常工作。简而言之,如果你做的事情很复杂,需要依赖大量的WordPress codex,那么请确保NOT 设置SHORTINITtrue.

SO网友:Nilesh Raut

您可以使用以下代码来使用wp load。php包含来自任何位置的wp加载

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

结束

相关推荐