当前位置: 首页 > 知识库问答 >
问题:

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

牟子真
2023-03-14

我已经做了几个小时的实验和研究,试图找到一种方法来实现这一点,但我只是没有任何运气。

因此,我有几种不同的自定义帖子类型需要混合一下。让我试着尽可能清晰和经济地解释它。

有2种自定义帖子类型,消息

因此,目前,我在一个“校园”的单一帖子中,试图查询和获取最新的消息帖子,这是有效的。但是,然后我尝试只针对消息post中特定中继器行的值并将其拉入。消息中的转发器字段是一个校园选择(基于“校园”帖子类型上的帖子对象字段的选择框)和两个不同的文本字段。

为了进一步说明...消息帖子有以下重复者数据:重复者行1:校园选择-特洛伊(帖子),消息说话者-丹尼·考克斯,消息URL - (url A)重复者行2:校园选择-伯明翰(帖子),消息说话者-克里夫·约翰逊,消息URL - (url B)...多个校园将会有动态数量的中继器。

所以我想做的是…在我的校园帖子里-比如“特洛伊”-我想获取最新的消息帖子,进入中继器,找到带有“校园选择”值的行。我只想从该行返回消息说话者(Danny Cox)和消息URL(URL A)。我不需要其他行的任何东西。

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

<?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();
?>

对于故障排除,我正在手动尝试获取“troy”值“校园选择器”,而不是根据我当前的“校园”位置动态获取该值...

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

我如何才能在我的查询中只返回:“Troy, Danny Cox, url A”?

共有3个答案

甄飞飙
2023-03-14

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

 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');
    }
许法
2023-03-14

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

<?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();
?>
胡飞鹏
2023-03-14

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

我发布这个是因为这是一种非常简单且无冗余的方式,可以获取由子字段值找到的特定ACF中继器行。
...当您有很多 ACF 中继器行时很有用。

我将向您展示选项字段组中的repeater示例,因为我认为这是最相关的。

假设您有带有key/nameyour_option_name的选项字段和带有key/namesubfield_name的子字段-注意某些部分的\转义,这是因为SQL喜欢使用_作为
一个特殊字符-意思是“任何单个字符”

  $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过滤器,如
echoapply_filters('the_content',$wysiwyg_stored_content);

SQL注意:它基本上是搜索prefix_main_key_NUMBER_subkey然后从找到的键中删除prefix_main_key_,所以只剩下NUMBER_subkey=

 类似资料:
  • 问题内容: 考虑一个非常简单的模型,其中我们有位置,每个位置可以有零个或多个事件。位置将具有名称,描述和地理位置数据(经度/纬度)之类的属性。事件应附加到一个位置(其父级),并应具有名称和描述。 我想要做的是查询子文档(事件),以对其名称和描述进行全文搜索。我想找回匹配的事件,还可以获取其父位置的名称。我还想通过位置坐标缩小结果集。我不想获取与查询不匹配的任何事件。在Elastic Search中

  • 我有一个按钮,当您单击它时,它会触发对一个函数的ajax调用,该函数应根据数据属性删除acf repeater字段中的一行。 这是函数,但有问题的行不会删除:

  • 我正在尝试将转发器字段添加到灵活的内容行中,但由于某种原因,没有输出任何内容。我已经检查了字段,它们似乎是正确的,所以有人可以指出我哪里出错了吗?谢谢

  • 我有一个由10个名为Arr的唯一对象id组成的数组,我在一个名为xyz的集合中有10000个文档。 如何在只有一个请求的集合xyz中的数组Arr中使用对象ID查找文档? 有$all和$in运算符,但用于使用数组查询字段。 或者我是否需要发出等于Arr长度的请求并使用findOne获取单个文档? 编辑:我期待这样的事情: db.getCollection("xyz"). search({"_id":

  • 我有一个带有ACF中继器字段的分类。我正在尝试在自定义REST APIendpoint的回调中添加行,但没有运气。该字段的方案是: 我使用以下命令向字段中添加一行-但运气不佳: 知道我做错了什么吗?添加行是否只适用于Post而不适用于Term....?我怀疑那是真的...

  • 问题内容: 在我的阻止代码中,我试图以编程方式检索具有特定值属性的产品列表。 或者,如果不可能的话,将如何检索所有产品然后过滤它们以仅列出具有特定属性的产品? 如何使用标准布尔过滤器执行搜索或匹配产品的子集? 问题答案: 几乎所有的Magento模型都有一个对应的Collection对象,该对象可用于获取模型的多个实例。 要实例化产品集合,请执行以下操作 产品是Magento EAV样式的模型,因