使用$wpdb查询包含当前post_id的元值的帖子

时间:2013-08-04 作者:Matt Edwards

我试图使用$wpdb从数据库中检索帖子列表,其中wp\\u postmeta表中的meta\\u值包含以反逗号表示的当前post\\u ID。例如,“10”

倒过来的逗号是确保10与100等不匹配。

当我粘贴元值的精确值时,我可以让它工作,即:a:1:{I:0;s:2:“10”},然而,它也在返回所有的修订,而不仅仅是最新的帖子。

以下是我当前使用的代码:

   $id = get_the_ID();
   $rows = $wpdb->get_results($wpdb->prepare( 
                  "
                  SELECT * 
                  FROM wp_postmeta
                  WHERE meta_key LIKE %s
                      AND meta_value = %s
                  ",
                  \'roles_%_production\',
                  \'%"\' . $id . \'"%\'
              ));

        // loop through the results
        if( $rows ) {
        ......
        }
任何想法都将不胜感激。

谢谢

3 个回复
SO网友:gmazzap

在您发布的代码中,您并没有像您所说的那样检索“帖子列表”,而是检索元表中的行列表。如果您真的想检索帖子列表,请依赖WP_Query 使用meta_query 参数。

类似于:

$id = \'10\'; // unserialized value

$args = array(
  \'post_type\' => \'post\',
  \'post_status\' => \'publish\',
  \'posts_per_page\' => -1,
  \'meta_query\' => array(
    array(
      \'key\' => \'roles_%_production\',
      \'value\' => $id,
      \'compare\' => \'LIKE\'
    )
  )
);
$query = new WP_Query( $args );
$rows = $query->get_posts();
如果您想使用$wpdb(我不知道为什么),正确的查询如下:

<?php
$id = \'10\'; // unserialized value

global $wpdb;
$rows = $wpdb->get_col( $wpdb->prepare(
  "SELECT DISTINCT $wpdb->posts.ID FROM $wpdb->posts, $wpdb->postmeta
  WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id AND
  $wpdb->posts.post_status = \'publish\' AND
  $wpdb->posts.post_type = \'post\' AND
  $wpdb->postmeta.meta_key = %s AND
  meta_value = %s",
  \'roles_%_production\',
  $id
) );
?>
$rows 将包含帖子ID数组。我这样做是为了让$wpdb的使用更有意义。如果要检索所有字段,请使用SELECT * 而不是SELECT DISTINCT $wpdb->posts.ID, 使用$wpdb->get_results 而不是$wpdb->get_col 并添加行GROUP BY $wpdb->posts.ID 到查询。

SO网友:kaiser

两个注意事项:

搜索元数据的规则很简单:序列化元数据(如转换为a:1:{i:0;s:2:"10";}) is not meant to be searchable. 您必须将数据集转换为单个值,以便执行适当的操作meta_query 搜索。

唯一有效的搜索方法是查询所有数据,然后对其进行反序列化,如果符合条件则进行渲染,或者跳过它。有enough discussions and Q/As on SO that cover that topic.

准备好的报表like_escape(), 必须这样使用:

"%".like_escape( $string )."%"
需要预处理和附加% chars很简单:如果LIKE 应发生在两端或仅发生一个(开始、结束、两侧)。

SO网友:Shaun Cockerill

倒过来的逗号是确保10与100等不匹配。

当我粘贴元值的精确值时,我可以让它工作,即:a:1:{I:0;s:2:10}

这是因为在WHERE查询中= 其中值包含%. 使用LIKE 相反,将修复此特定问题。改变meta_value = %smeta_value LIKE %s, 并且您的查询的工作方式应该与使用完整序列化字符串的工作方式相同。

它还将返回所有修订,而不仅仅是最新的帖子。

在查询结果时,请确保指定了正确的帖子类型和状态。如果要包括所有非修订的帖子,则需要确保加入posts表(在WHERE 声明)。

LEFT JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->postmeta.post_id
并在您的WHERE 语句(通过AND).

$wpdb->posts.post_type NOT IN (\'revision\')

结束

相关推荐

如何在WordPress中加载JQuery Easure脚本?

好的,首先,我知道如何手动操作我可以下载easing,将其放在我的插件文件夹中,然后使用wp_enqueue_script. 但是,我希望长期加载脚本,确保使用wordpress使用的easing脚本的相同版本。所以我要寻找的是一种在wordpress中使用wp_enqueue_script, 如下所示。我已经看过了function reference 对于wp_enqueue_script, 但我似乎找不到合适的文件/句柄来排队。是否有人知道如何加载WordPress本机缓解脚本?//I know th