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

标签 wordpress custom-post-type advanced-custom-fields

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

所以我有几个不同的自定义帖子类型需要混合一下。让我试着尽可能清楚和经济地解释它。

有 2 种自定义帖子类型,消息和校园。 (这是一个大型的多校区教会网站)。每个消息帖子都会有一些基于校园的转发器行(通过分类字段),每个校园帖子将尝试获取最新的消息帖子,并拉出特定的“校园”转发器行,以及该行中相同的字段值.

消息单个帖子的 ACF 中继器部分...(我们选择 Campus 帖子之一,然后手动输入演讲者姓名和消息 URL)
enter image description here

所以目前,我在一个“校园”单帖子中,试图查询并获取最新的消息帖子,这是有效的。但是后来我试图定位并仅提取消息帖子内部特定中继器行的值。消息中的转发器字段是一个 Campus Select(基于 Post Object 字段(在“campus”post-type 上)的选择框)和 2 个不同的文本字段。

为了进一步说明......消息帖子具有以下转发器数据:
中继器第 1 行:Campus Select - Troy(post),消息扬声器 - Danny Cox,消息 URL -(url A)
中继器第 2 行:Campus Select - Birmingham (post), Message Speaker - Cliff Johnson, Message 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”?

最佳答案

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

我发布此信息是因为它是一种非常简单且无冗余的方法,用于了解如何获取由子字段值找到的特定 ACF 中继器行。
...当您有很多 ACF 中继器行时很有用。

我将在选项字段组中向您展示一个关于中继器的示例,因为我认为它是最相关的。

假设您有键/名称为 your_option_name 的选项字段和键/名称为 subfield_name 的子字段 - 请注意 \ 在某些部分转义,这是因为 SQL LIKE 使用 _ 作为
特殊字符 - 意思是“任何单个字符”

  $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>";
    }

  }

这个解决方案的主要缺点是,如果你有一些格式化的字段,你必须手动处理格式,对于所见即所得的字段,它非常简单,只需使用 the_content 过滤器,如 echo apply_filters('the_content', $wysiwyg_stored_content);

SQL 注意:它基本上搜索 prefix_main_key_NUMBER_subkey 然后它从找到的键中删除 prefix_main_key_,所以只剩下 NUMBER_subkey => 现在如果你在 MySQL/MariaDB 中将字符串转换为 INTEGER 并且它以整数开始,你将通过这种方式获得整数。 .. :)

关于wordpress - 如何检索具有匹配子字段值的特定 ACF 中继器行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39377137/

相关文章:

php - 在wordpress的cherry框架中自动更改css

php - 如何在 WordPress 中显示所有可用的自定义帖子类别?

php - 标题中显示的高级自定义字段简码

php - wordpress menu-walker 中的 ACF 对象

advanced-custom-fields - 通过Repeater Field查询ACF Field不为空

javascript - Bootstrap - 响应式搜索按钮

angularjs - 如何使用 Angular js 获取 Wordpress 帖子

php - WordPress:使用 meta_query 排除帖子 - 并非每个帖子都有 meta_field

WordPress - 自定义帖子存档页面上的特色图像

sql - 自定义帖子类型每年/每月存档