首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检索具有匹配子字段值的特定ACF中继器行

如何检索具有匹配子字段值的特定ACF中继器行
EN

Stack Overflow用户
提问于 2016-09-07 18:47:39
回答 3查看 7K关注 0票数 4

我已经做了几个小时的实验和研究,试图找到一种方法让它发挥作用,但我只是没有任何运气。

因此,我有几个不同的定制帖子类型,需要混合一点。让我尽可能清楚和经济地解释这一点。

有两个定制的帖子类型,消息和校园。(这是一个大型的多校区教堂网站)。每个邮件帖子将有一些基于校园的中继器行(通过分类法字段),每个校园帖子将试图获取最新的消息帖子,并从该行中提取特定的“校园”中继器行和相同的字段值。

在ACF中继器部分的讯息单站..。(我们选择一个校园帖子,然后手动输入扬声器名称和消息URL)

因此,目前,我在一个“校园”单一的帖子,试图查询和获取最新的消息,这是可行的。但是,然后我试图定位并只提取消息帖子中特定中继器行的值。邮件中的中继器字段是一个校园选择(基于Post对象字段的复选框(在“校园”post类型上)和2个不同的文本字段。

为了进一步说明..。邮件邮件有以下中继器数据:中继器第1行:校园选择-特洛伊(帖子),消息发言人-丹尼考克斯,消息URL - (url A)第2行:校园选择-伯明翰(帖子),消息发言人- Cliff Johnson,消息URL - (url B) .多个校园将有一个动态的中继器数量。

所以我想做的是在我的校园帖子--例如“特洛伊”--我想获取最新的消息帖子,进入中继器并找到带有“校园选择”值的行。我只想从该行返回消息发言人(丹尼考克斯)和消息URL (url )。我不需要其他行的任何东西。

我在当前的“最新消息”中有两个中继器行,下面是我当前的查询:

代码语言:javascript
运行
复制
<?php
  $args = array(
    'post_type' => 'messages',
    'posts_per_page' => 1
  );

  $latestMessageQuery = new WP_Query($args);
  if( $latestMessageQuery->have_posts() ) { ?>
    <?php while ($latestMessageQuery->have_posts()) : $latestMessageQuery->the_post(); ?>
      <?php if( have_rows('campus_message') ): ?>
        <?php while( have_rows('campus_message') ): the_row(); ?>
          <?php if( get_sub_field('campus_selector') == 'troy' ): ?>
            <?php the_sub_field('message_speaker'); ?>
          <?php else: ?>
            <?php the_sub_field('message_speaker'); ?>
          <?php endif; ?>
        <?php endwhile; ?>
      <?php endif; ?>
    <?php endwhile; ?>
  <?php }
  wp_reset_query();
?>

为了排除故障,我正在手动获取“特洛伊”值“校园选择器”,而不是根据我当前的“校园”位置动态获取该值.

查询将返回两个选项:"Cliff Johnson Danny Cox“(因为我有2行中继器)。

我怎样才能返回:“特洛伊,丹尼考克斯,url A”在我的查询?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-10 17:58:35

在这个问题上,我得到了ACF支持的一些帮助,下面他们发送给我的代码得到了我想要的。

代码语言:javascript
运行
复制
<?php
$args = array(
    'post_type' => 'messages',
    'posts_per_page' => 1
);
$current_campus_id = get_the_ID();

$latestMessageQuery = new WP_Query($args);
if( $latestMessageQuery->have_posts() ) {
    while ($latestMessageQuery->have_posts()) : $latestMessageQuery->the_post();
        if( have_rows('campus_message') ):
            while( have_rows('campus_message') ): the_row();
                if( get_sub_field('campus_selector') == $current_campus_id ):
                    the_sub_field('message_speaker');
                    the_sub_field('message_url');
                    break;
                endif;
            endwhile;
        endif;
    endwhile;
}
wp_reset_query();
?>
票数 2
EN

Stack Overflow用户

发布于 2018-02-01 21:24:24

我正在使用$wpdb全局提供更多的SQL直接解决方案。通常,我强烈反对“直接”使用SQL,但在这种情况下,ACF存储的WP和元数据的结构应该是稳定的,因为ACF流是将字段存储为“正常”的元/自定义字段。

我发布这篇文章,是因为它是一种非常简单和无冗余的方法,用于获取由子字段值找到的特定的ACF中继器行.

当您有许多ACF中继器行时,...useful。

我将给大家展示一个选项字段组中继器的例子,因为我认为这是最相关的。

让我们假设您有带有key/name your_option_name的选项字段和带有key/name subfield_name的子字段--注意在某些部分的\转义,这是因为SQL LIKE使用_作为

一个特殊的字符-意思是“任何单一字符”。

代码语言:javascript
运行
复制
  $query = 
 "SELECT option_name, option_value FROM {$GLOBALS['wpdb']->prefix}options"
." WHERE option_name LIKE ("
        ." SELECT"
        ." CONCAT( 'options\_your\_option\_name\_', CAST( REPLACE(option_name, 'options_your_option_name_', '' ) AS INTEGER ), '%' )"
        ." FROM {$GLOBALS['wpdb']->prefix}options"
        ." WHERE"
        ." (option_name LIKE 'options\_your\_option\_name\_%\_subfield\_name')"
        ." AND"
        ." (option_value = 'some subfield value')"
      ." LIMIT 0,1"
." )"
  ;

  $results = $GLOBALS['wpdb']->get_results( $query, ARRAY_A );

  if( !empty($results) ){
    foreach($results as $result){
      //do something with it :)
      echo $result['option_name'] . " => " . $result['option_value'];
      echo "<br>";
    }

  }

此解决方案的主要缺点是,如果您有一些格式化字段,则必须手动处理格式化,对于wysiwyg字段来说,它非常简单,只需使用the_content筛选器,如

echo apply_filters('the_content', $wysiwyg_stored_content);

SQL注意:它基本上是搜索prefix_main_key_NUMBER_subkey,然后从找到的键中删除prefix_main_key_,所以现在只剩下NUMBER_subkey,如果在MySQL/MariaDB中将字符串转换为整数,并且以整数开头,则可以这样得到整数.:)

票数 5
EN

Stack Overflow用户

发布于 2019-05-16 11:37:34

这将不会循环遍历所有行,而是只在子字段与搜索匹配时才读取该行。希望这能有所帮助

代码语言:javascript
运行
复制
 while (have_rows('repeater_name')) {
      the_row();
      if (get_sub_field('sub_field') != $unique_key) {
        // not our row
        continue;
      }
      // will get here if this is our row
    $sub_field1= get_sub_field('sub_field1');
    $sub_field2= get_sub_field('sub_field2');
    }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39377137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档