Как подключить wp-load.php из любого местоположения?

18 авг. 2011 г., 18:48:56
Просмотры: 87K
Голосов: 14

У меня есть плагин, который вызывает отдельный PHP-скрипт (myAjax.php) через скрипт jQuery.ajax() внутри плагина.

Мне нужно поместить следующий код в файл myAjax.php:

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

if (!is_user_logged_in()){
    die("Для доступа необходимо авторизоваться");
}
if( ! current_user_can('edit_files')) {
    die("Извините, у вас нет прав для доступа к этому файлу");
}

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

3
Комментарии

Не делайте так. Используйте AJAX правильным WordPress-способом.

Milo Milo
18 авг. 2011 г. 19:00:01

Дополняя сказанное Мило, вот 2 отличные статьи на эту тему. http://www.garyc40.com/2010/03/5-tips-for-using-ajax-in-wordpress/ (последняя версия ) http://ottopress.com/2010/dont-include-wp-load-please/ (последняя версия ) Также для обучения рекомендую первую презентацию http://andrewnacin.com/2011/04/16/wordcamp-seattle/ (последняя версия )

Wyck Wyck
18 авг. 2011 г. 19:17:14

Вам следует использовать конечную точку REST API вместо отдельного файла - это даст красивый URL и избавит от необходимости загружать/инициализировать WP. Отдельные PHP-файлы, как в вашем случае, представляют угрозу безопасности и создают множество проблем

Tom J Nowell Tom J Nowell
3 окт. 2022 г. 14:49:30
Все ответы на вопрос 5
2
11

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

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

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

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

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

И... ваш wp-load.php будет здесь:

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

Лучшие практики

Как упоминалось ранее, для AJAX следует использовать технику admin-ajax от WordPress или новый REST API.

3 июн. 2015 г. 20:59:40
Комментарии

wp-content может отсутствовать или находиться в совершенно другом каталоге, отличном от WP.

fuxia fuxia
3 июн. 2015 г. 21:45:52

Это, вероятно, лучший способ. Если у вас нестандартное расположение wp-content (что маловероятно), просто скорректируйте ваше регулярное выражение.

pguardiario pguardiario
27 нояб. 2016 г. 04:37:16
0

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

Да, всегда лучше (и проще) использовать нативный WP Ajax API, но он может стать очень медленным, потому что загружает весь экземпляр WordPress.

Мое решение: довольно простое и должно работать для получения корня (root) установки WordPress. В любом скрипте, где вы делаете пользовательский AJAX-вызов, убедитесь, что сначала регистрируете скрипт с помощью wp_register_script() (но пока не подключаете его). Затем используйте wp_localize_script() и передайте константу ABSPATH (эта константа определена внутри wp-load.php и содержит корневой путь). Теперь вы можете получить её внутри вашего скрипта и передать вместе с AJAX-запросом. И наконец, конечно, убедитесь, что подключаете скрипт с помощью wp_enqueue_script().

Пример:

Следующий PHP-код подключит ваш файл script.js и позволит получить корневую директорию, вызвав pluginslug_scriptname_i18n.wp_root. По сути, wp_localize_script() используется для переводов, но это также удобно для передачи данных в ваш скрипт, которые вы получили на стороне сервера.

        $handle = 'pluginslug-scriptname'; // Устанавливаем handle скрипта
        $name = str_replace( '-', '_', $handle ) . '_i18n'; // Преобразует handle в 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', // @ЭТО БУДЕТ СОДЕРЖАТЬ URL ДЛЯ AJAX :) Чтобы получить его внутри script.js, просто вызовите: pluginslug_scriptname_i18n.ajax_url
                'wp_root' => ABSPATH // @ЭТО БУДЕТ СОДЕРЖАТЬ КОРНЕВОЙ ПУТЬ :) Чтобы получить его внутри script.js, просто вызовите: 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) {
                // Успех:
            }
            // Завершено:
        }
    };
    xhttp.onerror = function () {
      console.log(this);
      console.log("** Произошла ошибка во время выполнения запроса");
    };
    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 следующим образом:

// Устанавливаем правильный Content-Type
header('Content-Type: text/html');
// Отключаем кэширование
header('Cache-Control: no-cache');
header('Pragma: no-cache');
// Получаем данные запроса
$request_body = json_decode( file_get_contents('php://input'), true );  

// Установите в true, чтобы загрузить только базовые компоненты!
// Устанавливайте в true, только если точно знаете, что делаете
// Смотрите SHORTINIT в wp-settings.php для подробностей
define( 'SHORTINIT', false ); 

// Подключаем wp-load.php
require_once( $request_body['wp_root'] . 'wp-load.php' );
die();

Помните, что wp_root может быть изменён на стороне клиента.

Дополнительно:

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

10 июл. 2019 г. 19:39:07
0

Я предлагаю этот метод как "защищённый" способ найти путь до файла wp-load.php, при условии, что он находится в директории выше той, где выполняется ваш скрипт.

echo get_wp_abspath('wp-load.php') . PHP_EOL;

function get_wp_abspath($filename)
{
  $_DIR = __DIR__; // расположение этого скрипта

  $_FILE = $_DIR . '/' . $filename; // полный путь/файл

  while(!file_exists($_FILE)) // если не найден
  {
    $_DIR = dirname($_DIR); // на уровень выше (т.е. ../)

    $_FILE = $_DIR . '/' . $filename; // новый полный путь/файл

    if($_DIR == '/') return FALSE; // если достигли корня, возвращаем FALSE
  }

  return $_FILE; // если файл найден, возвращаем полный путь/файл
}
27 дек. 2022 г. 11:56:11
0

Разве

include $_SERVER['DOCUMENT_ROOT'] . '/wp-load.php';

не сработает в большинстве ситуаций?

WPINC и ABSPATH на этом этапе не определены (если они определены, значит wp-load.php, вероятно, уже был подключен, как кто-то отметил.

12 июн. 2024 г. 15:47:21
1
-1

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

require_once( trailingslashit( ABSPATH ) .'wp-load.php' );
10 янв. 2020 г. 11:31:09
Комментарии

Но если у вас установлена ABSPATH и определена функция trailingslashit, то, скорее всего, вы уже подключили wp-load.

Rup Rup
10 янв. 2020 г. 11:43:08