17

我正在尝试对插件进行逆向工程: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.phpwp-config.php...)
插件已经运行的事实是否意味着wp-load.php已加载?
此外,这完全浪费了资源,因为它包含了很多文件,其中可能还包含其他文件,并且它就像一个无限循环的所需文件,每个文件都在另一个文件中,被加载两次..(如果其他插件使用这个,甚至更多也是一种方法)

那么它究竟是做什么的呢?

附言; 我通过谷歌找到的只是如何正确地包含它(因为路径是可以改变的)——但这不是我的问题/问题。

4

6 回答 6

38

我的问题是......这个wp-load.php文件中到底有什么代码需要它?

所有核心 WordPress 功能。这包括主题文件、活动插件的所有文件等。但是以这种方式加载 WordPress 不会解析请求的 URL 并且不会运行 WordPress 查询(通过初始化 WP 对象,也不会 WP_Query 对象)。

通过查看它,我所了解的只是它加载了关键的核心 wordpress 文件,以使网站正确运行(functions.php,wp-settings.phpwp-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=samplehttp://example.com/wp-admin/admin-ajax.php)。

查看第一个 URL 如何引用my-plugin插件目录中的特定文件,第二个 URL 如何转到添加了特定查询参数的站点主页,或者第三个示例,其中引用的文件admin-ajax.php位于wp-admin目录中 - 这是一个特殊的文件,这使得插件可以轻松地发出 AJAX 请求(此文件还加载 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 解析和数据库查询/ies)。

如果还有什么你不太明白的地方——在这里发表评论,我会尝试进一步解释。

于 2012-12-23T21:28:18.557 回答
5

wp-load.php负责引导 WordPress 环境,使插件能够使用原生 WordPress 核心功能。

现在至于

插件运行的事实不是已经加载了 wp-load.php 吗?

一点也不!

如果您直接访问一个插件文件,这并不意味着您拥有整个 WordPress 环境,并且您无法使用本机核心功能,除非您包含wp-load.php.

于 2012-12-23T20:41:55.150 回答
4

根据我的阅读,当需要使用数据库时,它们通常在插件中包含 wp-load,但这是一个糟糕的选择,因为它会引发很多问题。您可以在这里看到一些相关文章:http: //ottodestruct.com/blog/2010/dont-include-wp-load-please/(如果此链接被删除,请参见该页面

于 2012-12-22T15:48:12.763 回答
4

如果文件位于 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'));
}
于 2014-08-06T20:56:47.330 回答
1

可能是双重检查。

require_once() 表示如果已经加载,则不再加载。

于 2012-12-23T06:03:17.630 回答
1

wp-load.php是从外部脚本加载 WP 的一种方法,允许使用 WP 功能以及其他功能。

但是,正如您所说,这不是必需的,因为它是一个插件。但是,您没有解释在哪里找到问题中的代码,因为wp-load.php位于与样式表目录不同的目录中的前端页面或脚本确实需要,例如,即使它们是插件的一部分.

管理区域中的插件页面不必重新加载 WP,因为它已经加载,但前端页面必须加载它。

简而言之,有几个原因可以包括wp-load.php访问 WP 函数和变量。

于 2012-12-23T18:27:08.307 回答