获取(并显示)与 ACF 关系字段匹配的其他帖子
Posted
技术标签:
【中文标题】获取(并显示)与 ACF 关系字段匹配的其他帖子【英文标题】:Get (and display) other posts that match ACF relationship field 【发布时间】:2020-06-17 21:39:40 【问题描述】:我有一个名为 products
的 ACF relationship
字段。此字段存在于名为 resources
的自定义帖子类型中。
在resources
,我有三个博客,标题为:
博客 1 将 products
字段设置为“Premium”。 博客 2 也将此字段设置为“Premium”。
博客 3 将 products
字段设置为“通用”。
我制作了一个自定义模块,用于展示“相关产品”(具有匹配 products
的博客)。例如,如果我在 Blog 1 上,我希望在此自定义模块中看到 Blog 2 的标题,因为 products
字段匹配(它们'都设置为“Premium”)。
如果我在 博客 3 上,我希望什么也看不到,因为不存在具有 products
值的其他帖子。
目前,在我的自定义模块(称为“相关产品”供参考)中,我有以下代码:
$posts = get_field('products');
if( $posts ):
foreach( $posts as $post):
the_title();
endforeach;
endif;
现在,我在 Blog 1 上,在“相关产品”模块中,我看到:Premium
打印了一次。
这显然是在提取数据,但我认为这仅适用于当前帖子(它显示 blog 1 的 product
数据)。我通过将 Blog 3 上的 products
更改为“Premium”对此进行了测试,结果在页面上仍然相同,只是在帖子上打印了一次“Premium”。
我想要达到的目标:
获取其他相同product
类型的帖子。
从这些其他帖子中提取数据(我想获取这些帖子标题并显示它们)。
【问题讨论】:
【参考方案1】:get_field('products')
将从当前帖子中获取 products
字段,因此您得到的是预期的输出。
如果您想在products
字段中显示所有其他具有相同值的帖子,您需要获取所有帖子并比较它们的products
字段;
$thisPostsProductsField = get_field('products');
$allPosts = get_posts([
'post_type' => 'resources',
'numberposts' => -1,
'post__not_in' => [get_the_ID()] # NOTE: Ignore the post we're on
]);
$relatedPosts = [];
foreach ($allPosts as $aPost)
$aPostsProductField = get_field('products', $aField->ID); # NOTE: The second argument to get_field() specifies from where to fetch the field, it defaults to the current post ID
if ($aPostsProductField === $thisPostsProductsField)
$relatedPosts[] = $aPost;
# $relatedPosts should now contain other posts of type "resources" that have the same "products" field
foreach ($relatedPosts as $post)
setup_postdata($post);
the_title();
the_content();
the_post_thumbnail();
wp_reset_postdata();
我在这里假设您已将products
关系字段限制为一个 帖子?否则,您还需要循环字段值,并且您还需要确定帖子是否有 one 原始帖子的产品或是否需要 all em> 原始帖子的产品。
编辑:您可以使用 meta_query 代替,以避免必须获取每个帖子并比较它们的字段;
$relatedPosts = get_posts([
'post_type' => 'resources',
'meta_query' => [
[
'key' => 'products',
'value' => $thisPostsProductsField->ID,
'compare' => '='
]
]
]);
但这取决于 ACF 如何存储products
字段。
【讨论】:
测试了 1000 个帖子。花了 1 毫秒。【参考方案2】:您所描述的内容听起来很简单。 但是您写的那行似乎不正确:
$posts = get_field('products');
确实,get_field()
函数返回单个值,而不是帖子的集合。
下面是一个 sn-p,它检索所有将 products
字段设置为与当前帖子相同的值的帖子:
$value = get_field('products');
$posts = get_posts(array(
'numberposts' => -1,
'post_type' => 'post',
'meta_key' => 'products',
'meta_value' => $value
));
希望这会有所帮助...
【讨论】:
以上是关于获取(并显示)与 ACF 关系字段匹配的其他帖子的主要内容,如果未能解决你的问题,请参考以下文章