使用MySQL将一个自定义字段值替换为另一个自定义字段值

时间:2018-01-04 作者:Philip

我有两个自定义字段,都有数值:

tnid\\u 01

tnid\\U 01旧

所有帖子都存在自定义字段“tnid\\u 01”。

自定义字段“tnid\\u 01old”仅适用于某些帖子。

我正在尝试将“tnid\\u 01”的值替换为“tnid\\u 01old”,但前提是“tnid\\u 01old”存在。

这就是我目前所知道的,但我得到了一个mysql错误:

Update wp_postmeta (post_id, meta_key, meta_value)(
SELECT post_id, \'tnid_01\', meta_value
FROM wp_postmeta
WHERE meta_key=\'tnid_01old\'
);
thx公司

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

我不确定单独使用MySQL是否可以做到这一点,因为您需要保存值并重用它们。这是一个PHP版本。

<?php
global $wpdb;
// select all the old postmeta
$oldData = $wpdb->get_results("SELECT * FROM wp_postmeta WHERE meta_key = \'tnid_01old\'");
// make sure we have results
if($oldData) {
    // loop through each result
    foreach($oldData as $meta) {
        // save post ID and meta value
        $meta_post_id = $meta->post_id;
        $metavalue = $meta->meta_value;
        // update \'tnid_01\' value
        $wpdb->update(
            // table name
            \'wp_postmeta\',
            // value to set
            array(
                \'meta_value\' => "$metavalue"
            ),
            // condition to meet: match same post ID but new meta key
            array(
                \'post_id\' => $meta_post_id,
                \'meta_key\' => \'tnid_01\'
            )
        )
    }
}
?>
如果你在一个低流量的网站上,你可以暂时将其粘贴到一个主题模板文件中,并加载使用该模板的任何页面,然后确保删除该代码,这样它就不会再次访问数据库。或者更合适的方法是在wp admin中运行它。

SO网友:Gary D

查询不起作用的主要原因是您忽略了SET 陈述

我不确定您是在寻找一次性解决方案,还是可以重用的编程解决方案,但看看这是否能给您带来所需的结果:

UPDATE wp_postmeta SET \'tnid_01\' = \'tnid_01old\' WHERE \'tnid_01old\' IS NOT NULL

结束

相关推荐

如何让$wpdb显示MySQL警告?

在某些情况下,当给出错误的查询时,将尝试运行该查询,并给出警告(而不是错误)。在MySQL提示符中,要查看这些警告,可以运行SHOW WARNINGS;.例如:mysql> SELECT * FROM wp_posts WHERE id = \"hello\"; Empty set, 1 warning (0.00 sec) mysql> SHOW WARNINGS; +---------+------+----------------------------