在 WordPress 中使用 ACF 转发器显示特定的博客文章

Posted

技术标签:

【中文标题】在 WordPress 中使用 ACF 转发器显示特定的博客文章【英文标题】:Display specific blog posts using ACF repeater in WordPress 【发布时间】:2021-07-02 02:21:32 【问题描述】:

我正在尝试在我的 WordPress 网站上创建使用 ACF 归档的简单重复器。我试图让管理员在文章底部显示“其他有趣的”博客文章。

到目前为止,我已经使用 Wp_Query 创建了一个循环:

<?php
if( have_rows('featured') ): while( have_rows('featured') ) : the_row();    
?>  
    
<div class="container-fluid blog-container medium-container">
<div class="row">
<div class="col-12 blog-one">

<?php
// Get ACF sub field
$get_ids = get_sub_field('article_id');
// Make them display with comma
$show_ids = implode(', ', $get_ids);

   // Featured blog list query
   $blog = new WP_Query( array(
   'posts_per_page' => 5,
   'order' => 'DESC',

   // Display post with specific ID using ACF repeater field inside array
   'post__in' => array($show_ids)
));

...
...
...

<?php endwhile; endif; ?>   

所以目标是在后端显示管理员包含的数字(帖子 ID) - 将它们放在“post__in”内的数组中。但是我的代码不起作用。任何想法如何解决这个问题?

【问题讨论】:

你不需要 implode id $get_ids 包含一个数组。 子字段“article_id”的字段类型和返回格式是什么 是数字。我应该将其更改为简单的文本字段吗? 通过将 ID 内爆到逗号分隔的字符串中,您实际上将 array('1,2,3') 传递给您的查询,这当然与 array(1,2,3) 完全不同 ACF 有一个帖子字段类型。您可以将其配置为接受并返回多个帖子,从而避免编写此类循环。 【参考方案1】:

高级自定义字段具有帖子对象字段类型。您可以将其配置为接受多个帖子,然后它将作为帖子对象数组 (WP_Post) 为您返回。这避免了循环遍历转发器字段来构建查询参数的任何需要。

推荐解决方案

首先,将转发器字段替换为帖子对象字段。设置帖子类型为post,允许null为true,multiple为true。

然后您可以调整您的代码以显示这些帖子。

例子:

<?php if ( $featured_posts = get_field( 'featured' ) ) : ?>
    <div class="container-fluid blog-container medium-container">
        <div class="row">
            <div class="col-12 blog-one">
                <?php foreach ( $featured_posts as $post ) 
                    setup_postdata( $post );

                    // Do whatever you need to do to display the post here...
                 ?>
                . . .
<?php endif; 

文档:https://www.advancedcustomfields.com/resources/post-object/

修复现有代码

如果您更愿意修复已有的代码,则需要重新考虑循环。

每次遍历转发器字段时,您都会进入并获取为帖子输入的 ID(子字段)。您需要先收集所有这些,然后使用它来构建您的查询。

例子:

$posts_ids = [];

if ( have_rows( 'featured' ) ) : while( have_rows( 'featured' ) ) : the_row();
    $post_ids[] = get_sub_field( 'article_id' );
endwhile; endif;

// Let's drop any blank elements and force them all to integers.
$filtered_ids = array_map( 'intval', array_filter( $post_ids ) );

$blog_query = new WP_Query( [
    'post__in' => $filtered_ids,
] );

您可以添加更多检查、清理等。无论哪种方式,让 ACF 为您执行此操作并选择推荐的解决方案仍然要好得多。

【讨论】:

以上是关于在 WordPress 中使用 ACF 转发器显示特定的博客文章的主要内容,如果未能解决你的问题,请参考以下文章

ACF 中继器字段仅显示一行

以编程方式更新转发器字段中特定组字段的值 - 高级自定义字段 (ACF) - Wordpress

将 wordpress 元数据导入并转换为 ACF 转发器字段

ACF 中继器 - 应用不同的行最后一个中继器

从 ACF 转发器字段中获取 meta_key

Wordpress ACF:如何通过自定义代码(PHP)将行添加到附加到用户的转发器字段