在 WordPress 中调试“register_activation_hook”
Posted
技术标签:
【中文标题】在 WordPress 中调试“register_activation_hook”【英文标题】:debugging "register_activation_hook" in WordPress 【发布时间】:2009-05-09 18:11:57 【问题描述】:在我在 Twitter 上询问人们什么是有用的之后,我正在尝试通过为自己设定一个目标来编写一个 WordPress 插件,即编写用户生成的词汇表插件(我不妨利用我的学习经验对不仅仅是我)。
无论如何,插件在安装时会设置一个数据库表,并向其中添加一些测试数据。然后,当显示内容时,foreach 循环会更改每个短语并将其替换为 Dhtml 浮动框。
但问题是,我无法弄清楚register_activation_hook
发生了什么;它可能被调用并且 SQL 失败或者它可能没有被调用(无论哪种方式,我激活插件后数据库中都没有额外的表)。
钩子看起来像这样:
register_activation_hook(__FILE__, "bot_install");
还有像这样的 bot_install 代码
function bot_install()
global $wpdb;
$table = $wpdb->prefix."sh_gloss";
$structure = "CREATE TABLE $table (
id INT(9) NOT NULL AUTO_INCREMENT,
phrase VARCHAR(80) NOT NULL,
desc VARCHAR(255) NOT NULL,
UNIQUE KEY id (id)
);";
$wpdb->query($structure);
// Populate table
$wpdb->query("INSERT INTO $table(phrase, desc)
VALUES('Scott Herbert', 'Rockstar Programmer')");
好的,首先请原谅自我数据库条目,它只是为了测试......
其次,有什么我应该看到但我错过的东西? 第三(也是最重要的)如何调试“bot_install”?我可以添加如下语句:
echo "in xxxx";
否则会弄乱标题(因为我猜所有这些代码都在主输出之前运行)。
【问题讨论】:
【参考方案1】:回答您的第三个(也是“最重要的”!)问题,太晚了。
要调试激活错误,请在 activated_plugin
挂钩上添加一个操作,将输出缓冲区(将包含您的错误)写入文件,然后检查该文件。
您可能还想turn on debugging in the config file,这样您就可以在您的文件中获得更多信息。
function save_output_buffer_to_file()
file_put_contents(
ABSPATH. 'wp-content/plugins/activation_output_buffer.html'
, ob_get_contents()
);
add_action('activated_plugin','save_output_buffer_to_file');
【讨论】:
【参考方案2】:我对 WordPress 一无所知,但是……由于代码中没有错误处理,你怎么知道 $wpdb
是一个有效的数据库连接句柄,代码怎么会检测到某些东西不起作用 -例如,CREATE TABLE 语句失败?代码显然盲目地(轻率地)假设没有任何事情可以或不会出错,但我的经验是事情可以而且确实会出错。
我仍然不是专家,但引用的 URL 说:
对数据库运行任何查询
查询功能允许您对 WordPress 数据库执行任何 SQL 查询。不过,对于 SELECT 查询,最好使用更具体的函数(见下文)。
<?php $wpdb->query('query'); ?>
查询
(字符串)您希望执行的 SQL 查询。
该函数返回一个与受影响/选择的行数相对应的整数。如果存在 mysql 错误,该函数将返回 FALSE。 (注意:由于 0 和 FALSE 都可以返回,因此请确保使用正确的比较运算符:相等 == 与相同性 ===)。
[...]
例子
从帖子 13 中删除“漱口”元键和值。
$wpdb->query(" DELETE FROM $wpdb->postmeta WHERE post_id = '13' AND meta_key = 'gargle'");
因此,大概,如果 CREATE TABLE 操作失败,您会从中得到一个 FALSE,您可以使用适当的运算符对其进行测试 - 我不确定它是哪一个。
进一步,关于错误的主题,页面说:
显示和隐藏 SQL 错误
您可以分别使用 show_errors 和 hide_errors 打开和关闭错误回显。
<?php $wpdb->show_errors(); ?>
<?php $wpdb->hide_errors(); ?>
您还可以使用 print_error 打印最近查询生成的错误(如果有)。
<?php $wpdb->print_error(); ?>
最后,对于开发初期的调试来说,只要能看到信息,响应是否乱码也无所谓。
【讨论】:
$wpdb 是一个全局 wordpress 变量,假设数据库存在,它指向它(据我所知,这是一个处理它的类)。我同意没有错误处理,这是我想要的!这个项目背后的想法是学习,所以我宁愿自己修复它,也不愿让别人告诉我出了什么问题。但是由于这个函数是在显示任何内容之前调用的,所以显示任何内容都会杀死 HTML 标头。那么我该如何测试呢? 没有空间引用原始评论中的链接,所以...重新 $wpdb 请参阅codex.wordpress.org/Function_Reference/wpdb_Class 并重新调试,请参阅 questron 中的最后三段。谢谢【参考方案3】:前段时间我不得不处理这个问题。 register_activation_hook 有点棘手,由于某种原因,运行查询对我不起作用,请使用 dbDelta 函数。
function bot_install()
global $wpdb;
$table = $wpdb->prefix."sh_gloss";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
$structure = "CREATE TABLE $table (
id INT(9) NOT NULL AUTO_INCREMENT,
phrase VARCHAR(80) NOT NULL,
desc VARCHAR(255) NOT NULL,
UNIQUE KEY id (id));";
dbDelta($structure);
// Populate table
$wpdb->query("INSERT INTO $table(phrase, desc)
VALUES('Scott Herbert', 'Rockstar Programmer')");
如果这不起作用,请告诉我。
【讨论】:
【参考方案4】:嗯,有一些叫做 PHP 错误日志的东西,所以,如果你想在 WordPress (PHP) 中调试一些东西,你可以调用
error_log(ob_get_contents(), 3, plugin_dir_path(__FILE__) . 'errors');
在这一行中,您将在插件目录中创建一个名为 error 的文件。
PHP error_log Manual
编辑:有时这种方法是更好的解决方案,因为 PHP 总是有权写下文件,这与 file_put_contents
中的相反
【讨论】:
以上是关于在 WordPress 中调试“register_activation_hook”的主要内容,如果未能解决你的问题,请参考以下文章
markdown WordPress调试工具(包括twig调试)
_Unwind_SjLj_Unregister 和 _Unwind_SjLj_Register 是啥?
UICollectionView 上的 register(_:forCellWithReuseIdentifier:) 有啥问题?