在 WordPress (wp-load.php) 之外使用 WordPress:“无法修改标头信息 - 标头已发送”

Posted

技术标签:

【中文标题】在 WordPress (wp-load.php) 之外使用 WordPress:“无法修改标头信息 - 标头已发送”【英文标题】:Using WordPress outside of WordPress (wp-load.php): "Cannot modify header information - headers already sent" 【发布时间】:2018-05-07 16:27:44 【问题描述】:

我正在尝试使用 php 单元来测试我编写的 API 类,该类与 WordPress 插件重力形式的插件一起使用。该类依赖于 WordPress 的几个函数,例如 wp_remote_request()。

为了访问这些 WordPress 依赖项,我试图在我的 PHP 单元测试类中使用 wp-load.php:

define( 'WP_USE_THEMES', false );
require '../../../wp-load.php';

但是,当我尝试这个时,我在运行 phpunit 时会在终端中得到以下输出:

无法修改标头信息 - 标头已发送(输出开始于 phar:///usr/local/Cellar/phpunit/6.4.2/libexec/phpunit-6.4.2.phar/phpunit/Util/Printer.php:112) ../wp-includes/functions.php:3760 ../wp-includes/load.php:422 ../wp-settings.php:110 ../wp-config.php:228 ../wp-load.php:37 ../wp-content/plugins/gravity-dpo/tests/TestCaseAddon.php:37

查看 wp-includes/functions.php 文件,我可以在函数 dead_db() 中的第 3760 行看到以下类,这就是导致错误的原因:

header( 'Content-Type: text/html; charset=utf-8' );

当然,要求 wp-load.php 应该是微不足道的,所以我可以使用 PHP 单元测试具有一些 WordPress 依赖项的类?对于我在这里做错了什么,我将不胜感激。我试图避免创建一个完全成熟的 WordPress 单元测试设置,因为我只想测试我的 API 类中的一两个函数。

【问题讨论】:

我对phpunit真的没有经验,但你为什么不直接模拟这些函数呢? 这是一个选项,但是按照我尝试的方式工作不应该很简单吗? 另外,我需要根据实际 GET 请求的结果进行测试,所以我不相信模拟这些方法比让 WordPress 依赖项工作更容易 【参考方案1】:

有时您可能想要测试某些功能,而无需实际创建插件/插件来执行此操作。使用以下代码创建一个 test.php 文件 sn-p 并将其放在 WordPress 根目录

<?php
// Load the WordPress Environment
// define( 'WP_DEBUG', true ); /* uncomment for debug mode */
require(./wp-load.php);
// require_once (./wp-admin/admin.php); /* uncomment for is_admin() */
?>
<pre>
<?php
/* test stuff here */
var_dump( is_admin() );
?>
</pre>

这是加载所有必需的 WordPress 功能以测试插件功能的快速方法,而无需实际创建插件。如您所见,wp-load.php 包含在文件的开头。如果您想测试管理端功能,还可以包含 wp-admin/admin.php

一旦您包含了所需的 WordPress 核心文件,您就需要测试任何原本存在于您的插件中的代码。完成测试后,不要忘记删除您的 test.php 文件。

【讨论】:

所以我不能在WordPress根目录之外使用这个方法(需要wp-load.php)? 请查看此make.wordpress.org/cli/handbook/plugin-unit-tests的官方wordpress链接 谢谢,我已经能够使用 wp-cli 和它的脚手架工具来完成这项工作。我试图要求 wp-load.php 是在吠叫错误的树。

以上是关于在 WordPress (wp-load.php) 之外使用 WordPress:“无法修改标头信息 - 标头已发送”的主要内容,如果未能解决你的问题,请参考以下文章

要求 wp-load.php 返回 3 个目录

从外部加载WordPress内容

在wordpress之外运行循环

从wordpress外部拉帖子(以正确的方式!)

Wordpress - do_settings_fields 未定义函数

PHP警告:require_once(/var/www/html/wp-config.php):无法打开流:第37行/var/www/html/wp-load.php中的权限被拒绝