将数据保存到定制表中时触发的操作或筛选器

时间:2017-03-05 作者:Capiedge

我使用的是一个插件,我试图为订阅表单自动填充一个自定义字段(下拉列表),因为它应该列出一些动态数据(与网站内容相关)。

据我所知,该插件没有用于此目的的过滤器或操作。这迫使我以任何其他方式来处理这一问题。

该插件使用自定义表(而不是WP本机/内置表),因此我在想,当数据保存在这些自定义表中时,是否会触发任何操作或筛选器。

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

插件可能(或者:希望)使用了$wpdb 对象的实例wpdb-类,以添加自定义表。如果是(且仅当是),则其作者可能还使用$wpdb->insert() 将行添加到表中。

查看wpdb::insert(), 看看它source, 你会发现这个方法只是一个方便的包装wpdb::_insert_replace_helper(), 设置$type 参数到INSERT. 虽然此方法没有任何过滤器,但来源显示此函数实际使用

return $this->query( $this->prepare( $sql, $values ) );
wpdb::prepare() 不允许通过过滤器进行任何修改,让我们看看wpdb::query(). 您将在此处找到以下筛选器:

$query = apply_filters( \'query\', $query );
现在我们有了一个可以添加修改的入口点,让我们来讨论如何识别填充了数据的自定义表。查看放入语句中以供执行的SQL语句,您将注意到以下行:

$sql = "$type INTO `$table` ($fields) VALUES ($formats)";
The$table 变量来自函数定义,函数定义是$wpdb->insert() 呼叫通常任何sane开发人员都会使用"{$wpdb->prefix}custom_table_name" 在那里,为了避免在表前缀更改为wp_ 在…内wp-config.php.

最后:

<?
/* Plugin Name: Do something when a custom table gets data added or altered */
add_filter( \'query\', function( $query ) {
    // Return SQL unmodified. Not the table we are targeting.
    if ( false === strstr( $query, "{$wpdb->prefix}custom_table_name" ) ) {
        return $query;
    }

    // Return SQL unmodified. Not the actions we are targeting.
    # @TODO If you only want to act on either of them, modify the if-clause
    if ( 
        false === strstr( $query, "INSERT" ) 
        AND false === strstr( $query, "REPLACE" )
    ) {
        return $query;
    }

    # @TODO Do your custom task here and…
    # …modify according the query to your likings.

    return $query;
} );
请记住,该插件现在可以在每个查询上运行。您可能需要添加如下检查is_admin() 并将整个代码块包装在一个函数中,该函数附加到一个更专用的挂钩上,以减少它的执行次数。否则,您可能会显著降低站点速度。

相关推荐

他们有什么办法来扩展WPDB类并覆盖默认的查询函数吗

我试图通过扩展wpdb类并覆盖自定义查询函数来获取带有回溯的查询数据。如果我创建db的符号链接,代码运行良好。php,但如果我尝试在插件文件中执行它,则无法直接工作。代码为:<?php if ( ! defined( \'SAVEQUERIES\' ) ) { define( \'SAVEQUERIES\', true ); } class My_DB extends wpdb { function __construct( $db