查询没有自定义元字段的帖子

时间:2011-09-03 作者:Nick Budden

我正在尝试构建一个自定义查询,该查询将返回所有DON\'T 具有关联的post meta。我不太确定怎么做。。。这是我正在使用的内容,作为参考,“分数”是我添加到posts表中的一个自定义列。

    $querystr = "
        SELECT $wpdb->posts.ID 
        FROM $wpdb->posts, $wpdb->postmeta
        WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id 
        AND $wpdb->posts.post_type = \'post\'
        AND $wpdb->posts.post_date < NOW()
        AND $wpdb->postmeta.meta_key != \'_social_\'
        ORDER BY $wpdb->posts.score DESC
        LIMIT 1
     ";

    $result = $wpdb->get_row($querystr, ARRAY_A);
    add_post_meta($result["ID"], "_social_", date("Y-m-d-H-i"), true);
上述示例不起作用。这样做的背景是,我正在运行一个cron,每半小时自动将一篇帖子发布到我的社交网络中,然后我想添加帖子元_social_ 因此,在我的下一个cron上,我不会再将其添加到我的社交网络中。我希望,这个查询将始终为我提供尚未添加到我的社交网络中的得分最高的帖子。

谁能告诉我如何查询排除_social_ 自定义post meta?

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

您必须执行联接或子查询:

$querystr = "
SELECT $wpdb->posts.ID 
FROM $wpdb->posts
WHERE $wpdb->posts.post_type = \'post\'
AND $wpdb->posts.post_date < NOW()
AND $wpdb->posts.ID NOT IN
( SELECT DISTINCT post_id FROM $wpdb->postmeta WHERE meta_key = \'_social_\' )
ORDER BY $wpdb->posts.score DESC
LIMIT 1;
";

SO网友:s_ha_dum

Milo的另一个SQL语句是:

$querystr = "
  SELECT {$wpdb->posts}.ID 
  FROM {$wpdb->posts}
  LEFT JOIN {$wpdb->postmeta} ON (
    {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id
    AND {$wpdb->postmeta}.meta_key = \'_social_\'
  )
  WHERE {$wpdb->posts}.post_type = \'post\'
  AND {$wpdb->posts}.post_date < NOW()
  AND {$wpdb->postmeta}.post_id IS NULL
  /* ORDER BY {$wpdb->posts}.score DESC 
  LIMIT 1 */
";

$result = $wpdb->get_col($querystr);
var_dump($result);
我评论了最后两行,因为:

您似乎已经入侵了$wpdb->posts 要包含新列的表--score-- 我无法测试这一点(但作为一名ORDER BY争论不重要。)我很好奇为什么你觉得有必要把桌子弄坏return all posts...“使用LIMIT 1 参数,则查询不可能返回“所有”帖子。该参数将强制它只返回一个,无论有多少个符合条件我另外更改了$wpdb 方法到get_col 因为这会让你ID没有进一步的麻烦。

结束