Как включить wp-load.php из любого места?

12

У меня есть плагин, который вызывает автономный скрипт php (myAjax.php) через скрипт jQuery.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-load.php в случае, если фактический относительный путь отличается от моего примера.

N2Mystic
источник
Чтобы добавить к тому, что сказал Майло, здесь есть 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

Ответы:

6

Вы можете использовать __DIR__константу. Поскольку файл находится либо внутри плагина, либо в папке темы, которые всегда находятся внутри wp-contentпапки. Вы можете просто получить путь к файлу и обрезать все, начиная wp-contentс него:

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

Если вам нужно убедиться, что wp не находится в какой-либо папке wp-content (кто знает? Что-то случится) - используйте отрицательный взгляд:

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

(поскольку легче убедиться, что ваш собственный плагин, который вы разрабатываете, не находится внутри какой-либо другой папки wp-content)

Ааа .. твой wp-loadтам есть

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

Но!

Как уже упоминалось, для AJAX вы можете использовать нативную технику WP-s ajax .

Конечно, бывают случаи, когда родной техники AJAX в WP недостаточно.

Илья Андриенко
источник
3
wp-contentможет отсутствовать или находиться в совершенно другом каталоге, чем WP.
fuxia
Это, наверное, лучший способ. Если у вас странное расположение wp-контента (маловероятно), просто измените свое регулярное выражение.
pguardiario
0

Я знаю, что это старый вопрос, но хотел добавить свой собственный ответ, который, я думаю, мог бы помочь некоторым пользователям, пытающимся достичь того же самого.

Да, всегда лучше (и проще) использовать собственный API Ajax WP, но он может стать очень медленным, поскольку загружает весь экземпляр 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клиент может быть изменен.

Как примечание стороны:

Еще одна хитрость, о которой некоторые из вас могут не знать, это то, что перед включением wp-load.phpвы можете определить константу с именем SHORTINIT(булево). Это скажет WordPress просто загрузить основы (то есть вы потеряете много функций ядра WP), но это ускорит время загрузки, поскольку не будет включать все необходимые файлы для обычного экземпляра WP. Он SHORTINITопределен внутри wp-settings.php(просто откройте файл и поищите SHORTINIT. У вас будет лучшее понимание того, что происходит под капотом. Этот изящный прием ускорит время загрузки еще больше (до 75% в моих тестах, которые я делал). Некоторое время назад.) Но это будет зависеть от версии WP. Также имейте в виду, что wp-load.phpизменения часто происходят с новыми выпусками версий WP, поэтому, если вы используетеSHORTINITбудьте уверены, что ваш скрипт всегда будет работать даже в будущих версиях WordPress, а также с более низкой версией WordPress. Короче говоря, если вы делаете сложные вещи, основанные на большом количестве кодекса WordPress, убедитесь, что НЕ установлено SHORTINITзначение true .

Ренс Тиллманн
источник
-1

Вы можете использовать приведенный ниже код, чтобы использовать wp-load.php для включения wp-load из любого места

require_once( trailingslashit( ABSPATH ) .'wp-load.php' );
Нилеш Раут
источник
2
Но если у вас есть набор ABSPATH и определен trailingslashit, то вы, вероятно, уже включили wp-load.
Руп