WordPress wp-load.php
Posted
技术标签:
【中文标题】WordPress wp-load.php【英文标题】:Wordpress wp-load.php 【发布时间】:2012-12-01 09:15:51 【问题描述】:我正在尝试对插件进行逆向工程: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
已加载吗?
此外,这完全浪费了资源,因为它包含了很多文件,其中可能还包含其他文件,并且它就像一个无限循环的所需文件,每个文件都在另一个文件中,被加载两次..(如果其他插件使用这个,甚至更多也是一种方法)
那么它到底是做什么的呢?
附:我通过谷歌找到的只是如何正确地包含它(因为路径是可以改变的)——但这不是我的问题/问题。
【问题讨论】:
【参考方案1】:我的问题是...
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
插件目录中的特定文件,第二个 URL 如何转到添加了特定查询参数的站点主页,或者第三个示例,其中引用的文件是 @987654330 @ 在wp-admin
目录中 - 这是一个特殊文件,它使插件可以轻松地发出 AJAX 请求(此文件还加载 WordPress 核心并触发一些动作挂钩)。
在第一次引用的情况下,如果插件想要使用一些 WordPress 功能(用于引用数据库、操作帖子等),它需要通过包含 wp-load.php
来加载 WordPress 核心文件。
此外,这完全浪费了资源,因为它包含的文件太多,可能还包含其他文件,而且它就像一个无限循环的所需文件,每个文件都在另一个文件中,被加载两次..(如果其他文件甚至更多插件也使用这种方法)
注意require_once(...
中的_once
部分 - 这告诉 PHP 仅 包含尚未包含的文件。因此不会发生冲突,PHP 也不会占用太多内存。虽然 - 如果您处于 WordPress 已经启动的环境中,则不应调用 require
函数。
所以,基本上插件作者希望对您在其中找到此代码的插件文件提出一些请求。由于作者想在此文件中使用 WordPress 功能,因此他调用 wp-load.php
文件以加载核心功能。
我认为,这样做是为了减少服务器上的负载,尽管在 plugins_loaded
动作钩子上运行了几个钩子,并将自定义 $_GET
参数添加到主 url,结果应该还是很接近的。
我个人更喜欢第二个选项,但就像我说的,包括wp-load.php
将阻止 WordPress 运行一些复杂的东西(URL 解析和数据库查询/ies)。
如果还有什么你不太明白的地方 - 在此处发表评论,我会尝试进一步解释。
【讨论】:
很好,详细的答案!非常感谢你! :)【参考方案2】:wp-load.php
负责引导 WordPress 环境,使插件能够使用原生 WordPress Core 功能。
现在来说
插件运行不就意味着 wp-load.php 已经加载了吗?
一点也不!
如果您直接访问插件文件,并不意味着您拥有整个 WordPress 环境,并且您无法使用原生核心功能,除非您包含 wp-load.php
。
【讨论】:
【参考方案3】:根据我的阅读,当需要使用数据库时,它们通常在插件中包含 wp-load,但这是一个糟糕的选择,因为它会引发很多问题。 你可以在这里看到一些相关的文章: http://ottodestruct.com/blog/2010/dont-include-wp-load-please/(如果此链接被删除,See that page here)
【讨论】:
【参考方案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'));
【讨论】:
这不是试图从 wp-content 文件夹中获取它吗?为什么会在里面?它通常至少在根目录中。【参考方案5】:wp-load.php
是从外部脚本加载 WP 的一种方式,允许使用 WP 功能以及其他功能。
但是,正如您所说,这不是必需的,因为它是一个插件。但是,您没有解释在哪里找到问题中的代码,因为对于位于与样式表目录不同的目录中的前端页面或脚本确实需要 wp-load.php
,例如,即使它们是一部分一个插件。
管理区域的插件页面不需要重新加载 WP,因为它已经加载,但前端页面必须加载它。
简而言之,包含 wp-load.php
以访问 WP 函数和变量有几个原因。
【讨论】:
【参考方案6】:可能是双重检查。
require_once() 表示如果已经加载,则不再加载。
【讨论】:
以上是关于WordPress wp-load.php的主要内容,如果未能解决你的问题,请参考以下文章