为什么wpdb->更新会删除其他元数据?

时间:2021-07-13 作者:Artem

我在termmeta表中的现有数据:

meta\\U id术语id关键字meta\\U值/tr>27918546税务状况

$found_id = $wpdb->get_var("SELECT term_id FROM `{$wpdb->prefix}termmeta` WHERE meta_value=\'{$group[\'1C_id\']}\'");

if(!empty($found_id)) $wpdb->update($wpdb->prefix.\'termmeta\', array(\'meta_key\' => \'1C_id\', \'meta_value\' => $group[\'1C_id\']), array(\'term_id\'=>$found_id));
这会删除tax\\u position meta,并复制1C\\u id meta行,但无法找出原因。我的其他代码都没有处理这个元字段。

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

替换所有变量后,UPDATE命令看起来是这样的-在本例中,表前缀是wp_ (默认值),$group[\'1C_id\']9095b4cf-969d-11e9-a601-5cf3706390c8, 和$found_id (术语ID)为123.

UPDATE `wp_termmeta`
SET `meta_key` = \'1C_id\', `meta_value` = \'9095b4cf-969d-11e9-a601-5cf3706390c8\'
WHERE `term_id` = 123
这意味着,all 现有元数据,其中术语ID为123无论元键是什么,都将更改:

首先,元键设置为1C_id, 所以tax_position meta已重命名为1C_id.

其次,元值设置为9095b4cf-969d-11e9-a601-5cf3706390c8, 成为tax_position\'s新值。

这就解释了这一点:“这将删除tax\\u position meta并复制1C\\u id meta行;。

一、 e.Thetax_position meta没有被删除,只是它的键和值被更改了,并且它们被设置为与现有的相同1C_id 元。

因此$wpdb->update() 没有实际删除或添加任何元数据。是您的查询没有正确执行。

那么也许你想做这样的事?

注意,我使用$wpdb->prepare() 为安全执行准备查询,您也应该这样做

// Select meta IDs by meta value.
$meta_ids = $wpdb->get_col( $wpdb->prepare( "
    SELECT meta_id FROM $wpdb->termmeta
    WHERE meta_value = %s
", $group[\'1C_id\'] ) );

// Then update all the above meta by the meta ID.
if ( ! empty( $meta_ids ) ) {
    $wpdb->query( $wpdb->prepare( "
        UPDATE $wpdb->termmeta
        SET meta_key = \'1C_id\', meta_value = %s
        WHERE meta_id IN (" . implode( \',\', $meta_ids ) . ")
    ", $group[\'1C_id\'] ) );

    /* Or you can use update_metadata_by_mid():
    foreach ( $meta_ids as $meta_id ) {
        update_metadata_by_mid( \'term\', $meta_id, $group[\'1C_id\'], \'1C_id\' );
    }
    */
}
但是,为什么要用相同的值更新元值($group[\'1C_id\']) 选择元时使用?那是打字错误吗?(可能您只是想更新元密钥……?)

相关推荐

Set MySQL variables in WPDB

我有一个SQL查询,它可以很好地作为原始SQL查询工作,但是当我将其放入WPDB时,它会抛出一个错误:global $wpdb; $sql = "SET @product_group = (SELECT product_group FROM insert_temporary LIMIT 1); SELECT * FROM insert_temporary WHERE product_group in (SELECT product_group