it-swarm.com.ru

WordPress wp-load.php

Я пытаюсь перепроектировать плагин: http://wordpress.org/extend/plugins/wordpress-social-login/

В части этого есть эта строка:
(Мне трудно понять первый, остальные просто там для справки, если у них есть что-то сделать.)

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

define( 'WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL', plugins_url() . '/' . basename( dirname( __FILE__ ) ) ); 
define( 'WORDPRESS_SOCIAL_LOGIN_HYBRIDAUTH_ENDPOINT_URL', WORDPRESS_SOCIAL_LOGIN_PLUGIN_URL . '/hybridauth/' ); 

Мой вопрос ... что именно находится в этом файле wp-load.php, что требуется для кода? Глядя на это, я понимаю только то, что он загружает ключевые файлы WordPress для правильной работы сайта (functions.php, wp-settings.php, wp-config.php и т.д.)
Разве тот факт, что плагин работает уже, не означает, что wp-load.php загружен?
Кроме того, это полная трата ресурсов, поскольку включает в себя так много файлов, которые могут включать и другие файлы, и это как бесконечный цикл необходимых файлов, каждый в другом, которые загружаются дважды ... (или даже больше, если другие плагины тоже используют этот метод)

Так что именно это делает?

P.S; Все, что я нашел в Google, - это КАК правильно его включить (поскольку пути могут изменяться), но это не моя проблема/вопрос.

11
Asaf

Мой вопрос ... что именно находится в этом файле wp-load.php, что требуется для кода?

Все основные функции WordPress. Это включает в себя файлы темы, все файлы активных плагинов и т.д., НОзагрузка WordPress таким способом не анализирует запрошенный URL и не запускает запрос WordPress (путем инициализации WP, ни объекты WP_Query).

Глядя на это, я понимаю только то, что он загружает ключевые файлы WordPress для правильной работы сайта (functions.php, wp-settings.php, wp-config.php и т.д.)

Да, вы правильно поняли. 

Разве тот факт, что плагин работает уже, не означает, что wp-load.php загружен?

Если код плагина был вызван WordPress (например, для отображения страницы администратора, или он был включен изначально загруженным файлом плагина) - тогда да, это означает, что wp-load.php уже загружен.

Однако иногда плагины направляют запросы к отдельным файлам (например, http://example.com/wp-content/plugins/my-plugin/sample.php), а не к какой-либо странице на платформе WordPress (например, http://example.com/?my_plugin_action=sample или http://example.com/wp-admin/admin-ajax.php). 

Посмотрите, как первый URL-адрес ссылается на определенный файл в каталоге плагинов my-plugin, а второй - на домашнюю страницу сайта с добавленным конкретным аргументом запроса, или в третьем примере, где указанным файлом является admin-ajax.php в каталоге wp-admin - это это специальный файл, который позволяет плагинам сделать запрос AJAX (этот файл также загружает ядро ​​WordPress и запускает некоторые хуки действий).

В случае первой ссылки, если плагин хочет использовать некоторые функциональные возможности WordPress (для обращения к базе данных, манипулирования публикациями и т.д.), Ему необходимо загрузить файлы ядра WordPress, включая wp-load.php.

Кроме того, это полная трата ресурсов, поскольку включает в себя так много файлов, которые могут включать и другие файлы, и это как бесконечный цикл необходимых файлов, каждый в другом, которые загружаются дважды ... (или даже больше, если другие плагины используют это тоже такой метод)

Обратите внимание на часть _once в require_once(... - это говорит PHP, чтобы включить файл только , если он еще не был включен. Поэтому никаких конфликтов не возникнет, и PHP не будет использовать слишком много памяти. Хотя - если вы находитесь в контексте, где WordPress уже запущен, вам не следует вызывать функцию require


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

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

Лично я предпочитаю второй вариант, но, как я уже сказал, в том числе wp-load.php будет запрещать WordPress запускать некоторые сложные вещи (разбор URL-адресов и запросы к базам данных).

Если есть еще что-то, что вы не совсем понимаете по этому поводу - оставьте комментарий здесь, и я постараюсь объяснить дальше.

27
Nikola Ivanov Nikolov

Из того, что я прочитал, они обычно включают wp-load в плагины, когда требуется использование базы данных, но это плохой выбор, так как он вызывает много проблем . Вы можете увидеть некоторые соответствующие статьи здесь: http://ottodestruct.com/blog/2010/dont-include-wp-load-please/ (если эта ссылка когда-либо будет удалена, см. эту страницу здесь )

4
tix3

wp-load.php отвечает за загрузку среды WordPress, которая позволяет плагину использовать встроенную функцию WordPress Core.

Теперь что касается 

Разве тот факт, что плагин работает уже, не означает, что wp-load.php загружен?

Не за что! 

Если вы обращаетесь к файлу плагина напрямую, это не значит, что у вас есть вся среда WordPress, и вы не можете использовать встроенные функции ядра, если не включите wp-load.php.

3
Bainternet

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

Но, как вы говорите, это не должно быть необходимо, так как это плагин. Тем не менее, вы не объясняете, где вы нашли код в своем вопросе, потому что wp-load.php действительно необходим для интерфейсных страниц или сценариев, расположенных в каталоге, отличном от каталога таблиц стилей, например, даже когда они являются частью плагин.

Страницы плагинов в области администратора не должны перезагружаться WP, потому что он уже загружен, но интерфейсные страницы должны его загружать. 

Короче говоря, есть несколько причин для включения wp-load.php для доступа к функциям и переменным WP. 

1
Felipe Alameda A

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

if(!defined(ABSPATH)){
    $pagePath = explode('/wp-content/', dirname(__FILE__));
    include_once(str_replace('wp-content/' , '', $pagePath[0] . '/wp-load.php'));
}
1
user3916019

Вероятно, двойная проверка.

require_once () означает, что если он уже был загружен, он не будет загружаться снова.

1
Prathik Rajendran M