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

问题描述 投票:1回答:3

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

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

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

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

所以目前,我在一个“校园”单一帖子里面,试图查询并获得最新的消息帖子,这是有效的。但后来我试图定位并仅仅输入消息帖子中特定转发器行INSIDE的值。消息中的转发器字段是校园选择(基于帖子对象字段的选择框(在“校园”后的类型)和2个不同的文本字段。

为了进一步说明......消息帖子有以下转发器数据:转发器第1行:校园选择 - 特洛伊(帖子),消息扬声器 - 丹尼考克斯,消息URL - (网址A)转发器第2行:校园选择 - 伯明翰(帖子) ),消息发言人 - Cliff Johnson,消息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();
?>

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

该查询返回两个:“Cliff Johnson Danny Cox”(因为我有2个转发器行)。

我如何才能返回:“特洛伊,丹尼考克斯,网址A”在我的查询中?

wordpress custom-post-type advanced-custom-fields
3个回答
4
投票

我正在使用$wpdb global提供更多SQL-direct解决方案。通常,我强烈建议不要“直接”使用SQL,但在这种情况下,WP met的结构和ACF的元存储将来应该是稳定的,因为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中将CAST字符串串行化为INTEGER并且它使用INTEGER进行STARTS,那么你将以这种方式得到INTEGER。 .. :)


0
投票

我在这个问题上得到了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();
?>

0
投票

这不会遍历所有行,但只有在您的子字段与搜索匹配时才会读取该行。希望这可以帮助

 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');
    }
© www.soinside.com 2019 - 2024. All rights reserved.