$wpdb->更新多行,就像普通SQL中的IN

时间:2014-08-01 作者:Ludvig Sjöbeck

我想知道是否可以使用$wpdb->update 更新多行的值,如IN 在“普通”SQL中。

我想完成这样的例子;

UPDATE [table]
SET [column_1] = [updated_value]
WHERE [column_2] IN ([comma_separated_ids])
我一直在四处寻找这将如何工作,但我还没有找到另一个问题,问这个问题或任何类型的答案/博客帖子解释是否可以做到这一点。

现在我使用的是一个查询,但如果使用一个简单的单行程序会更好。

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

正如你在source code 这个= 符号在中硬编码wpdb::update() 方法,因此,默认情况下not 可能使用IN 用于更新方法。

最简单的方法是使用wpdb::query() 使用sql查询时,只需确保正确地转义所有值

示例:

function wpdb_update_in( $table, $data, $where, $format = NULL, $where_format = NULL ) {

    global $wpdb;

    $table = esc_sql( $table );

    if( ! is_string( $table ) || ! isset( $wpdb->$table ) ) {
        return FALSE;
    }

    $i          = 0;
    $q          = "UPDATE " . $wpdb->$table . " SET ";
    $format     = array_values( (array) $format );
    $escaped    = array();

    foreach( (array) $data as $key => $value ) {
        $f         = isset( $format[$i] ) && in_array( $format[$i], array( \'%s\', \'%d\' ), TRUE ) ? $format[$i] : \'%s\';
        $escaped[] = esc_sql( $key ) . " = " . $wpdb->prepare( $f, $value );
        $i++;
    }

    $q         .= implode( $escaped, \', \' );
    $where      = (array) $where;
    $where_keys = array_keys( $where );
    $where_val  = (array) array_shift( $where );
    $q         .= " WHERE " . esc_sql( array_shift( $where_keys ) ) . \' IN (\';

    if( ! in_array( $where_format, array(\'%s\', \'%d\'), TRUE ) ) {
        $where_format = \'%s\';
    }

    $escaped = array();

    foreach( $where_val as $val ) {
        $escaped[] = $wpdb->prepare( $where_format, $val );
    }

    $q .= implode( $escaped, \', \' ) . \')\';

    return $wpdb->query( $q );
}
然后像这样使用:

wpdb_update_in(
  \'posts\', // table
  array( \'post_author\' => \'1\', \'post_status\' => \'draft\' ), // data
  array( \'post_author\' => array( \'2\', \'3\', \'4\', \'5\' ) ), // where
  array( \'%d\', \'%s\' ), // format
  \'%d\' // where format
);
执行的SQL将是

UPDATE wp_posts
SET post_author = 1, post_status = \'draft\'
WHERE post_author IN (2, 3, 4, 5)

结束

相关推荐

如何使用$wpdb更新记录?

我正在将非wp数据库迁移到Wordpress(这是我有生以来第一次,希望也是最后一次)。由于新旧网站都是多语言的,我的任务之一就是将文章与其翻译联系起来。我正在Wordpress上使用WPML插件来支持多语言。这个插件创建一个表,wp_icl_translations 结构如下:element_id | trid | language_code | source_language_code --------------------------------------