您试图做的是一个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