如何让WordPress插件检查数据库更改,然后执行一些操作?

时间:2018-08-14 作者:slider2013

例如,我如何检查数据库中是否写入了新的注释,然后让我的插件注册有更改?我将使用这些信息在我的插件之后在数据库中做一些事情。

感谢您的帮助。找不到有关此问题的任何信息。

2 个回复
最合适的回答,由SO网友:Fayaz 整理而成

通过检查date 列:

要仅检查新评论、新帖子等,您可以创建cron作业(&H);然后检查comment_date, post_date 等,以确定这些表中是否出现任何新的内容。保存cron作业中最后检查的时间戳,以便date 大于上次检查的时间戳的是新插入。

使用WordPress API过滤器/操作挂钩:

WordPress在更改数据库之前/之后触发一些过滤器/操作挂钩。

通常会触发动作挂钩after 数据库操作已完成。这些挂钩通常具有名称前缀/后缀,如added/update/updated/deleted/save/insert 不幸的是,WordPress挂钩的命名不一致,否则会容易得多。

例如,comment API在数据库更改后激发以下操作挂钩:

  • wp_insert_comment: 在将注释插入数据库后激发
  • deleted_comment: 从数据库中删除注释后激发
  • trashed_comment: 将注释移动到垃圾箱后激发
  • untrashed_comment: 将注释移出垃圾箱后激发
  • spammed_comment: 在注释标记为垃圾邮件后激发
  • unspammed_comment: 在注释(以前标记为垃圾邮件)未标记为垃圾邮件后激发
  • edit_comment: 更新/编辑注释后激发
  • comment_closed: 在帖子标记为不允许评论后激发
带有动作挂钩的示例代码:

add_action( \'wp_insert_comment\', \'wpse_comment_inserted\' );
function wpse_comment_inserted( $comment_id, $comment_object, 99, 2 ) {
    // comment with id $comment_id is inserted into the database,
    // do something with it here
}
还有很多其他的filter hooksaction hooks 在数据库更改之前/之后运行的。根据需要使用它们。

使用这些挂钩的好处是,因为它们是WordPress核心的一部分,所以您不必担心内部更改。然而,缺点是,可能有一些插件/主题不使用这些核心API,而是运行其自定义构造的查询。因此,您将无法从这些数据库中捕获DB更改。

通过使用query 过滤器挂钩:

还可以跟踪通过WordPress进行的插入/更新/删除查询$wpdb API。任何使用WordPress数据库API的数据库查询都使用$wpdb (例如wpdb 类)。所有查询(包括插入、更新和删除)都会触发query filter hook. 因此,使用这个钩子,您可以在执行之前过滤所有查询。

但是,如果任何主题/插件在WordPress之外进行自定义DB查询,则无法正常工作$wpdb API,或者在加载插件之前运行任何核心查询,或者任何外部应用程序通过自定义SQL查询进行更改。

通过扩展wpdb 类:

此外,还可以创建db.php file, in the wp-content 目录(或在中创建软链接wp-content 并扩展wpdb 从那里开始上课。通过这种方式,您可以增强wpdb 从那里初始化并跟踪插入/更新/删除查询。

通过使用数据库触发器:

然而,要通过任何SQL查询跟踪任何数据库更改,唯一可靠和完整的方法是创建triggers 插件激活后,通过触发器跟踪数据库更改。不过,要从插件执行此操作,您用于WordPress的数据库凭据必须具有创建/删除触发器权限。

Caution: 触发器太多可能会减慢DB查询的速度。此外,确保在插件停用时清除触发器。

SO网友:Rick Hellewell

如果您希望在评论者保存(发布)评语时发生一些事情,那么您需要使用preprocess\\u评语过滤器(请参阅Plugin API/Filter Reference/preprocess comment ).

function preprocess_comment_handler( $commentdata ) {
    //some code
    return $commentdata;
}
add_filter( \'preprocess_comment\' , \'preprocess_comment_handler\' );
只要为保存注释时希望发生的任何事情添加代码即可。将此代码块放入functions.php (在子主题中,因此主题更新不会覆盖您的代码)。

结束