获取(并显示)与 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 博客 2 博客 3

博客 1products 字段设置为“Premium”。 博客 2 也将此字段设置为“Premium”。

博客 3products 字段设置为“通用”。

我制作了一个自定义模块,用于展示“相关产品”(具有匹配 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 1product 数据)。我通过将 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 关系字段匹配的其他帖子的主要内容,如果未能解决你的问题,请参考以下文章

计算 ACF 中的关系帖子数

按关系字段 (ACF) 的 Elementor 帖子的自定义查询过滤器

ACF 关系字段的 WordPress 查询

如何在页面模板中将ACF关系帖子显示为循环

带有 ACF 嵌套字段的 WP MetaQuery

Wordpress ACF 显示关系问题