搜索和显示 ACF 中继器子字段

Posted

技术标签:

【中文标题】搜索和显示 ACF 中继器子字段【英文标题】:Search and Display ACF Repeater Sub Fields 【发布时间】:2018-02-10 19:44:01 【问题描述】:

我有一个名为 Players 的自定义帖子类型,它生成 8 个不同的播放器,每个播放器每个播放器有 3 个视频。这些视频中的每一个都有一个标题。假设“玩家 A - 跑步” “玩家 A - 游泳”

如何通过关键字进行搜索,这样每当我输入播放器 A 时,它只会显示播放器 A 的视频。现在,无论何时输入播放器 A,它都会显示搜索结果中的所有视频

<?php
$s=($_GET["s"]); // Insert the searched keyword into a variable
// check if the repeater field has rows of data
if( have_rows('videos') ):
// loop through the rows of data
while ( have_rows('videos') ) : the_row(); 
    $video_1_title= get_sub_field('video_1_title');
    $video_2_title= get_sub_field('video_2_title');
    $video_3_title= get_sub_field('video_3_title');
    $video_1= get_sub_field('video_1');
    $video_2= get_sub_field('video_2');
    $video_3= get_sub_field('video_3');
    ?>

 <?php 
 endwhile;
 endif;
 ?>

 <?php if ( have_posts() ) :
 while ( have_rows('videos') ) : the_row(); ?>

 <div id="post-<?php the_ID(); ?>" class="videoPosts">

 <?php
  if(stripos($video_1_title, $_GET["s"])!== false) ||       
 (stripos($video_2_title, $_GET["s"])!== false) ||
 (stripos($video_3_title, $_GET["s"])!== false)) :

 ?>

<div id="one"><?php echo $video_1?></div>
<div id="two"><?php echo $video_2?></div>
<div id="three"><?php echo $video_3?></div>


<?php endif; ?>
</div>

<?php 
endwhile;
endif;
?>

【问题讨论】:

欢迎来到 Stack Overflow。你能确认这是在哪个页面上吗?例如,它是档案、单曲等吗?我只是想弄清楚你的$post 是什么 这是一个 search.php 页面。我正在构建一个具有特定设计的自定义 search.php 页面,该页面将在单独的部分中显示所有视频、图像和描述。我只是无法显示包含该特定值的单个帖子。例如,当您键入“John”时,它应该在单独的部分中显示有关 john 的所有图像、视频和描述。现在它显示所有视频,但将“约翰的”视频放在搜索结果页面的顶部。 它们只是普通帖子,即您没有使用自定义帖子类型?我很确定我知道这个问题,但我只是想在提出解决方案之前获取所有信息! 我正在使用 ACF Pro,并且我创建了一个名为“Players”的帖子类型,其中包含一个名为 videos 的转发器字段,其中包含 3 个名为 video_1_title、video_2_title、video_3_title 的子字段。 是的,但是这些字段是添加到常规 Wordpress 帖子、页面还是自定义帖子类型中? 【参考方案1】:

主要问题是 Wordpress 默认不搜索自定义字段,这就是为什么您必须为视频标题编写自己的搜索代码。

在 WP 的搜索中包含自定义字段实际上很复杂,您通常会使用像 Relevanssi 这样的插件,但是您想按标题搜索视频,那么我们可以做到!

您的循环和逻辑存在问题,但更大的问题是 Wordpress 搜索只返回关键字存在于标准 WP 字段(例如帖子标题或内容)而不是 ACF 字段中的结果。

继续你的做法(即替换你的 search.php 中的搜索):

1.将您在 search.php 中的代码替换为以下代码:

这使用 WP_Query 执行一个全新的查询,该查询仅搜索您的视频标题的视频标题。

$s=($_GET["s"]);

// this will search all `player` posts for the search keyword in a custom field called video_%_title
// you don't need to specify video_1_title, video_2_title etc separately
$args = array(
    'numberposts'   => -1,
    'post_type'     => 'player',
    'meta_query'    => array(
        array(
            'key'       => 'video_%_title',
            'compare'   => 'LIKE',
            'value'     => $s,
        ),
    )
);
$the_query = new WP_Query( $args );

// loop through the results
if( $the_query->have_posts() ): 
    while ( $the_query->have_posts() ) : $the_query->the_post(); 

       // loop through all results to get the videos:
        while ( have_rows('videos') ) : the_row(); ?>

            <div id="post-<?php get_the_ID(); ?>" class="videoPosts">

                <div id="one"><?php echo get_sub_field('video_1'); ?></div>
                <div id="two"><?php echo get_sub_field('video_2'); ></div>
                <div id="three"><?php echo get_sub_field('video_3'); ></div>

            </div>

        <?php 
        endwhile; // end video loop

    endwhile;  // end posts loop
endif; 

wp_reset_query();    // Restore global post data stomped by the_post(). 
?>

注意:

这会显示找到的任何帖子中的所有视频,因为这是您自己的代码所做的。如果您只想显示带有搜索关键字的那些,您可以这样做:

$video_1_title= get_sub_field('video_1_title');
$video_2_title= get_sub_field('video_2_title');
$video_3_title= get_sub_field('video_3_title');

<?php
 if(stripos($video_1_title, $_GET["s"])!== false))   ?>
     <div id="one"><?php echo get_sub_field('video_1'); ?></div>
<?php 

if(stripos($video_2_title, $_GET["s"])!== false))   ?>
     <div id="two"><?php echo get_sub_field('video_2'); ?></div>
<?php 

if(stripos($video_3_title, $_GET["s"])!== false))   ?>
     <div id="three"><?php echo get_sub_field('video_3'); ?></div>
<?php 

?>

2。将此添加到您的functions.php

(虽然如果你将它包含在你的 search.php 页面中它会起作用) 这告诉 Wordpress 在所有名为 video_%_title 的字段中搜索,其中 % 是任意数字

function player_video_posts_where( $where ) 
    $where = str_replace("meta_key = 'video_%", "meta_key LIKE 'video_%", $where);
    return $where;

add_filter('posts_where', 'player_video_posts_where');

【讨论】:

wp_query 选项不起作用,但第二个代码对我来说是视频部分的诀窍。非常感谢。

以上是关于搜索和显示 ACF 中继器子字段的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress ACF 中继器子字段

ACF 中继器子字段 Shuffle(wordpress 高级自定义字段)

表中的 ACF 中继器字段 - 在 PHP 模板中

ACF 中继器字段仅显示一行

ACF 中继器字段和 Clearfix / 显示时的样式

ACF 中继器字段返回包含中继器计数的字符串