在 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”的主要内容,如果未能解决你的问题,请参考以下文章

php 在WordPress上进行PHP调试的少数功能

markdown WordPress调试工具(包括twig调试)

WordPress调试

_Unwind_SjLj_Unregister 和 _Unwind_SjLj_Register 是啥?

UICollectionView 上的 register(_:forCellWithReuseIdentifier:) 有啥问题?

php Wordpress调试