在 WordPress 中调试“register_activation_hook”

     2023-05-09     30

关键词:

【中文标题】在 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代码

if($_SERVER['REMOTE_ADDR']=='your.ip.address.here')define('WP_DEBUG',true);elsedefine('WP_DEBUG',false); 查看详情

php在wordpress上进行php调试的少数功能(代码片段)

查看详情

如何在 wordpress api 中显示原始 json 字符串

】如何在wordpressapi中显示原始json字符串【英文标题】:HowcanIshowtherawjsonstringinwordpressapi【发布时间】:2021-07-2905:30:30【问题描述】:在我的自定义wordpressapi端点上出现此错误:SyntaxError:JSON.parse:unexpectedcharacteratline1column1oftheJSONdata... 查看详情

函数补充之类型提示

...数的知识点:类型提示Typehinting(最低Python版本为3.5)defregister(name:"必须传入名字傻叉",age:1111111,hobbbies:"必须传入爱好元组")->"返回的是整型":#可以在函数形参的后面跟:加提示信息print(name)print(age)print(hobbbies)return111#register(1,... 查看详情

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

】UICollectionView上的register(_:forCellWithReuseIdentifier:)有啥问题?【英文标题】:What\'swrongwithregister(_:forCellWithReuseIdentifier:)onUICollectionView?UICollectionView上的register(_:forCellWithReuseIdentifier:)有什么问题?【发布时间】:2017-0 查看详情

常量注册(代码片段)

... 函数来定义一个常量。在内核中,我们将会使用 REGISTER_*_CONSTANT() 的家族函数来注册常量。对于自定义的大多数常量来说,你可能希望在程序初始化的时候便定义这些常量:PHP_MINIT_FUNCTION(sample4)REGISTER_STRING 查看详情

在 Gatsby 和 GraphQL 中的 wordpress 中过滤 ACF Post Object-field

】在Gatsby和GraphQL中的wordpress中过滤ACFPostObject-field【英文标题】:FilteringonanACFPostObject-fieldinwordpressinGatsbyandGraphQL【发布时间】:2021-10-2722:59:51【问题描述】:这是QueryingwordpresswithmetaqueriesfromGatsby的后续问题经过一些调试,我收集... 查看详情

_Unwind_SjLj_Unregister 和 _Unwind_SjLj_Register 是啥?

】_Unwind_SjLj_Unregister和_Unwind_SjLj_Register是啥?【英文标题】:Whatare_Unwind_SjLj_Unregisterand_Unwind_SjLj_Register?_Unwind_SjLj_Unregister和_Unwind_SjLj_Register是什么?【发布时间】:2011-06-2905:10:09【问题描述】:什么是_Unwind_SjLj_Unregister和_ 查看详情

Wordpress 错误:尝试更改永久链接,但显示错误

】Wordpress错误:尝试更改永久链接,但显示错误【英文标题】:WordpressError:Triedchangingpermalink,butshowingerror【发布时间】:2021-11-0907:12:09【问题描述】:使用ubuntu操作系统我尝试更改页面的永久链接,但页面未在选项卡中打开。帮... 查看详情

markdown配置wordpress调试错误日志(代码片段)

查看详情

php启用wordpress错误日志调试输出到文件(代码片段)

查看详情

如何在 Wordpress 插件中使用 ReactJS

】如何在Wordpress插件中使用ReactJS【英文标题】:HowToUseReactJSinWordpressPlugin【发布时间】:2016-02-1610:08:44【问题描述】:我在Wordpress插件中使用ReactJs时遇到问题。我正在使用ReactJs开发一个Wordpress插件。谷歌搜索仅在Wordpress主题中... 查看详情

如何在 Wordpress 中显示 SQL 数据?

】如何在Wordpress中显示SQL数据?【英文标题】:HowtodisplaySQLdatainWordpress?【发布时间】:2016-11-1304:34:57【问题描述】:Wordpress有ORM吗?如何从MySQL等SQL服务器访问数据并将其显示在Wordpress中?【问题讨论】:将此作为参考。BrianSwan... 查看详情

如何在 Wordpress 中使用 RecordJs

】如何在Wordpress中使用RecordJs【英文标题】:HowcanIuseRecordJsinWordpress【发布时间】:2015-04-2004:31:18【问题描述】:我需要用录音机在wordpress中创建一个页面,录制完这段音频后,我需要通过邮件发送给我。知道我可以使用recorderjsj... 查看详情

在 wordpress 中归档文件

】在wordpress中归档文件【英文标题】:Archivefileinwordpress【发布时间】:2019-12-1709:09:48【问题描述】:谁能告诉wordpress中archive.php文件的确切用途。我用谷歌搜索并得到了一个解决方案,即https://codex.wordpress.org/Category_Templates中的... 查看详情

在 Wordpress 中居中特色图片 [关闭]

】在Wordpress中居中特色图片[关闭]【英文标题】:CenteringfeaturedimageinWordpress[closed]【发布时间】:2019-10-1514:24:04【问题描述】:我想在我的网站上将Wordpress特色图片居中:https://link.do/ibXD8我在主题属性中找不到合适的选项。【问... 查看详情

php[wordpress-常规]显示其他服务器信息。用于调试网站。(代码片段)

查看详情

php[debugenqueuescripts]快速调试,列出所有入队脚本。#wordpress#enqueue(代码片段)

查看详情