在WordPress中调试“register_activation_hook”

时间:2009-05-09 18:11:58

标签: php sql wordpress

我正在尝试学习编写一个WordPress插件,我自己设定了编写用户生成的词汇表插件的目标,之后我向Twitter上的人询问了什么是有用的(我也可以利用我的学习经验对我有用)不仅仅是我。)

无论如何,在安装时,插件会设置一个数据库表,并向其中添加一些测试数据。然后,当显示内容时,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";

或者会弄乱标题(因为我猜所有这些代码都是在主输出之前运行的。)

4 个答案:

答案 0 :(得分:2)

要回答你的第三个问题(和#34;最重要的"!)问题。

要调试激活错误,请在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');

答案 1 :(得分:0)

我对WordPress一无所知,但是......因为代码中没有错误处理,你怎么知道$wpdb是一个有效的数据库连接句柄,代码如何检测到某些东西不是工作 - 例如,CREATE TABLE语句失败?代码显然是盲目地(轻率地)假设没有任何可能或将会出错,但我的经验是,事情可以而且确实会出错。


我仍然不是专家,但引用的URL说:

  

对数据库运行任何查询

     

查询功能允许您在WordPress数据库上执行任何SQL查询。但是,对于SELECT查询,最好使用更具体的函数(见下文)。

<?php $wpdb->query('query'); ?> 
  

查询

     

(string)您要执行的SQL查询。

     

该函数返回与受影响/选择的行数对应的整数。如果存在MySQL错误,则该函数将返回FALSE。 (注意:由于可以返回0和FALSE,因此请确保使用正确的比较运算符:equality == vs。sameity ===)。

     

[...]

     

实施例

     

从帖子13中删除'gargle'元键和值。

   $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(); ?> 

最后,为了在初始开发时进行调试,只要你能看到信息,如果响应是乱码就没那么重要。

答案 2 :(得分:0)

我不得不暂时处理这件事。 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')");

}

如果这不起作用,请告诉我。

答案 3 :(得分:0)

好吧,这里有一些PHP错误日志记录,因此,如果您想在WordPress(PHP)中调试某些内容,可以调用

error_log(ob_get_contents(), 3, plugin_dir_path(__FILE__) . 'errors');

在这一行中,您将在插件目录中创建一个名为error的文件。

PHP error_log Manual

编辑:有时这种方法是更好的解决方案,因为PHP总是有权记下文件,这与file_put_contents

相反