我正在尝试对插件进行反向工程: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-ing发现的所有内容都是如何正确地包含它(因为路径可以改变) - 但这不是我的问题/问题。
答案 0 :(得分:28)
我的问题是......代码需要这个
wp-load.php
文件究竟是什么?
所有核心WordPress功能。这包括主题文件,活动插件的所有文件等。但以这种方式加载WordPress不解析请求的URL并且不运行WordPress查询(通过初始化WP对象,也不是WP_Query对象)。
通过查看它,我理解的是它加载了关键的核心wordpress文件,以使网站正常运行(
functions.php
,wp-settings.php
,wp-config.php
等...)< / p>
是的,你已经理解正确了。
插件运行的事实是否已经意味着加载了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
插件目录中的特定文件,第二个URL指向添加了特定查询参数的站点主页,或者第三个示例,其中引用的文件是admin-ajax.php
目录中的wp-admin
- 这是一个特殊文件,这使得插件可以轻松发出AJAX请求(此文件还会加载WordPress核心并触发一些操作挂钩)。
在第一次引用的情况下,如果插件想要使用一些WordPress功能(用于引用数据库,操作帖子等),则需要通过包含wp-load.php
来加载WordPress核心文件。
此外,它完全浪费资源,因为它包含许多文件,其中可能包含其他文件,它就像无限循环的所需文件,每个文件都在另一个文件中,这些文件正在被加载两次..(或者甚至更多,如果其他文件插件也使用这种方法)
请注意_once
中的require_once(...
部分 - 这告诉PHP如果尚未包含文件。因此,不会发生冲突,PHP不会使用太多内存。虽然 - 如果您处于已启动WordPress的环境中,则不应调用require
函数。
因此,基本上插件作者希望对您在其中找到此代码的插件文件进行一些请求。由于作者想在此文件中使用WordPress功能,因此他调用wp-load.php
文件以加载核心功能。
我认为这样做是为了减少服务器上的负载,尽管有几个钩子在plugins_loaded
动作挂钩上运行,并且自定义$_GET
参数添加到主网址,结果应该非常接近。
我个人更喜欢第二个选项,但就像我说的那样,包括wp-load.php
将阻止WordPress运行一些复杂的东西(URL解析和数据库查询)。
如果还有什么东西,你对此不太了解 - 在这里发表评论,我会尝试进一步解释。
答案 1 :(得分:4)
根据我的阅读,当需要数据库使用时,它们通常在插件中包含wp-load,但这是一个糟糕的选择,因为它会引发很多问题。 你可以在这里看到一些相关的文章: http://ottodestruct.com/blog/2010/dont-include-wp-load-please/(如果此链接被删除,See that page here)
答案 2 :(得分:3)
wp-load.php
负责引导WordPress环境,使该插件能够使用本机WordPress核心功能。
现在至于
插件运行的事实是否已经意味着加载了wp-load.php?
完全没有!
如果您直接访问插件文件,并不意味着您拥有整个WordPress环境,除非包含wp-load.php
,否则您无法使用本机核心功能。
答案 3 :(得分:2)
如果文件位于wp-content目录中的任何位置(无论级别),这将包括wp-load.php(如果尚未加载)。
if(!defined(ABSPATH)){
$pagePath = explode('/wp-content/', dirname(__FILE__));
include_once(str_replace('wp-content/' , '', $pagePath[0] . '/wp-load.php'));
}
答案 4 :(得分:1)
可能需要仔细检查。
require_once()表示如果已加载,则不会再次加载。
答案 5 :(得分:1)
wp-load.php
是从外部脚本加载WP的一种方法,允许在其他功能中使用WP功能。
但是,正如你所说,这不应该是必要的,因为它是一个插件。不过,您无法解释在哪里找到问题中的代码,因为前端页面或位于与样式表目录不同的目录中的脚本确实需要wp-load.php
,例如,甚至当他们是插件的一部分时。
管理区域中的插件页面不必重新加载WP,因为它已经加载,但前端页面必须加载它。
简而言之,有几个原因可以包含wp-load.php
来访问WP函数和变量。