Wordpress wpdb查询问题 - 如何过滤出修订版?

时间:2011-11-24 14:07:32

标签: wordpress wpdb

有人可以告诉我如何修改下面的代码,以便过滤掉修订版吗?我尝试使用修订删除插件,但它们只适用于帖子或页面的修订...而不是自定义帖子类型。

<?php

global $wpdb;
global $post;

$review_id = $post->ID;

if (get_post_type($review_id) == "features") {
   $assoc_id = get_post_meta($review_id, "associated_hosts_value", true);
  $review_id = intval($assoc_id);
}

$assoc = $wpdb->get_col("SELECT DISTINCT post_id from wp_postmeta WHERE (meta_key='associated_hosts_value') AND ((meta_value LIKE ',{$review_id},%') OR (meta_value LIKE '%,{$review_id},%') OR (meta_value = '{$review_id}') OR (meta_value LIKE '%,{$review_id}'));");

1 个答案:

答案 0 :(得分:1)

修订版存储在post_type列下的wp_posts中,因此您需要在wp_posts上进行内部联接并查询post_type NOT IN ('revision')

"SELECT DISTINCT post_id from {$wpdb->postmeta} INNER JOIN {$wpdb->posts} ON ID = post_id WHERE post_type NOT IN ('revision') ..."

顺便说一下,将原始SQL查询插入到get_col中是一种不好的做法,因为它使您容易受到SQL注入的攻击。使用$wpdb->prepare(),如下所示:

http://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks

请注意,您需要转义LIKE语句中使用的%,方法是将其更改为%%以在prepare()内工作。

此外,您不应该将WP表名硬编码到查询语句中。 wpdb类存储用于构造查询的表名,即$wpdb->posts$wpdb->postmeta。使用这些可确保您的插件始终查询正确的WP表。在多站点安装中尝试使用您的代码,以找出重要的原因。