如何删除两个(相关的)wp_postmeta行?

时间:2017-05-24 作者:Mike

我在wp\\U Posteta中有这样的条目(为简洁起见,缩写为:

post_id | meta_key | meta_value

整数| U缩略图| id |整数

整数| rafi |整数

现在可以轻松地选择和删除包含\\u thumb的所有行。

与包含rafi的行相同。

我需要做的是删除具有公共post\\u id以及\\u thumb和rafi的行。

原因是我只想从设置了rafi键的帖子中删除特色图片。

我可以删除匹配的\\u缩略图\\u id行,因此:

全球wpdb美元;

$wpdb->查询(“

DELETE FROM $wpdb->postmeta

WHERE meta_key = \'_thumbnail_id\'
“);

但我不知道如何正确选择匹配行来设置删除。

谢谢你的建议!

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

经过5个小时的搜索,我终于编写了SQL查询,即-

DELETE FROM {$wpdb->postmeta} 
WHERE  post_id IN (SELECT post_id 
                   FROM   (SELECT post_id 
                           FROM   {$wpdb->postmeta} 
                           WHERE  meta_key LIKE \'_thumbnail_id\' 
                                  AND post_id IN(SELECT post_id 
                                                 WHERE  meta_key LIKE \'rafi\')) 
                          AS s) 
我在上面看到了你的答案SQL 对这类问题进行查询是最好的做法,也是更好的做法。

希望这有帮助。

SO网友:Mike

这是我想到的。我通过启用“随机自动特征图像”插件进行了测试,该插件添加了缺失的缩略图并添加了元键rafi。

然后我禁用插件,并将以下代码添加到函数中。php。

检查数据库会显示预期的结果。

下一步是将此代码合并到插件的撤消/清理功能中。

$sql = "SELECT * from wp_postmeta";

$result = $wpdb->get_results($sql);

foreach( $result as  $results ) {

  $mid = $results->meta_id;
  $pid = (string)$results->post_id;


  if ($results->meta_key == \'rafi_RandFeat\'){
    foreach( $result as  $results1 ) {
            if($results1->meta_key == \'_thumbnail_id\' && $results1->post_id == $pid){
                $wpdb->query( "
                DELETE FROM $wpdb->postmeta
                WHERE meta_id = $mid;
                ");

                $wpdb->query( "
                DELETE FROM $wpdb->postmeta
                WHERE meta_id = $results1->meta_id;
                ");

        };
    };
  };
};

结束

相关推荐

将WordPress和自动MySQL备份到不同的主机

我正在进行以下设置。本地网络中的开发计算机和具有真实internet域的生产服务器。在我的开发人员计算机上为我的主题开发PHP/CSS文件是通过git, 我可以轻松地将它们部署到生产系统中。到目前为止,一切正常。但在我的开发系统上,我还希望始终从实际系统中获得一个合理的新数据库转储。现在,快速而肮脏的方法就是编写一个cronjob来执行mysqldump 在生产服务器和mysql < dumpfile 在开发人员计算机上。但由于Wordpress将主机名保存在其数据库中,这将导致开发系统无法工作,因