我正在尝试学习编写一个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";
或者会弄乱标题(因为我猜所有这些代码都是在主输出之前运行的。)
答案 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总是有权记下文件,这与file_put_contents