根据meta_value查询postmeta,返回post_id数组

时间:2018-05-05 作者:Slam

我正在尝试从Posteta检索post\\u id数组,其中meta\\u值与某个值匹配。

在MySQL中,查询如下:

SELECT post_id FROM azEw_postmeta 
WHERE meta_key=\'to4_related_authors\' 
AND meta_value LIKE \'%"203561"%\';
在WP\\u查询或get\\u posts()函数中,我知道参数如下所示:

array(
  \'key\' => \'to4_related_authors\', 
  \'value\' => \'"\' . get_the_ID() . \'"\', 
  \'compare\' => \'LIKE\'
)
我可以找到很多返回帖子的示例,但我想要的只是一个ID数组。是否有一个WordPress函数可以从Posteta返回ID,或者是否需要作为$wpdb->get\\u results()查询来执行此操作?

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

您试图做的是一个post-meta查询,但根本问题是您正在使用post-meta对帖子进行分组,这就是构建分类法的目的。分类表针对这类查询进行了优化和设计,而post meta则不是。

此外,您的查询似乎在元值内搜索,这表明您没有将post元分解为单独的键和值,而是存储了一个结构化数据对象,现在正尝试在序列化的PHP字符串内进行查询

因此,请使用分类法。

根据您的问题,您试图将一篇文章与另一篇文章相关联,即与当前文章有某种关联的作者。

因此,请使用非层次分类法,其中术语的首字母是作者帖子ID,名称是作者帖子标题。

这样,如果我们命名我们的分类法to4_related_authors:

$authors = wp_get_object_terms( $post_id, \'to4_related_authors\' );
foreach ( $authors as $author ) {
    echo $author->slug;
}
作为奖励,您可以获得一个模板存档和一个URL/to4_related_authors/-post-id/ 这显示了与该作者相关的所有帖子。更改注册参数可以让您选择更漂亮的名称。

此外,如果您只需要ID,请使用一个数组和一个循环,您不需要对所有内容进行特殊的API调用:

$list = [];
$authors = wp_get_object_terms( $post_id, \'to4_related_authors\' );
foreach ( $authors as $author ) {
    $list[] = $author->slug; // add it to the list
}
echo implode( \', \', $list ); // output a comma separated list
或者更好,wp_list_pluck:

$authors = wp_get_object_terms( $post_id, \'to4_related_authors\' );
$list = wp_list_pluck( \'slug\' );
echo implode( \', \', $list );
但请记住,在服务器上查询帖子元非常费时费力,尤其是当你浏览了几篇帖子之后。你说“大约有100000篇文章和14000位作者。”,这意味着这些查询根本无法扩展,如果它们需要几秒钟才能执行,尤其是在负载情况下,我也不会感到惊讶。在这种情况下,分类查询可能会快1000倍。

请记住,分类法适用于您需要分组筛选或搜索的任何内容。它们不必应用于帖子,只需ID,可以是用户ID、注释ID或任何其他唯一的数字整数。同样,它们的slug不必是描述性的,您可以将它们用作键和标识符。WP在内部将菜单项分组到nav菜单中,它们不必是类别和标记的克隆。

分类法可以在任何时候找到任何有X的东西,或者所有有Y的东西,或者有Z的东西,或者知道A,相信B,或者更喜欢C

结束