我已经进行了数小时的实验和研究,试图找到一种方法让它发挥作用,但我没有运气。
所以我有几个不同的自定义帖子类型需要混合一点。让我试着尽可能清楚和经济地解释它。
有2种自定义帖子类型,消息&校园。 (这是一个大型的多校区教会网站)。每个消息帖子都会有一些基于校园的转发器行(通过分类字段),每个校园帖子都会尝试获取最新的消息帖子,然后拉出特定的校园"转发器行,以及该行的相同字段值。
消息单一帖子的ACF转发器部分...(我们正在选择其中一个校园帖子,然后手动输入演讲者姓名和消息URL)
所以此刻,我在校园内#34;单个帖子,试图查询并获取最新消息帖子,这是有效的。但后来我尝试定位并仅提取消息帖子中特定转发器行INSIDE的值。消息中的转发器字段是校园选择(基于帖子对象字段的选择框(在"校园"后期类型)和2个不同的文本字段。
为了进一步说明...... Message post有以下转发器数据: 中继器第1行:校园选择 - 特洛伊(后),消息发言人 - 丹尼考克斯,消息URL - (网址A) 转发器第2行:校园选择 - 伯明翰(帖子),消息发言人 - Cliff Johnson,消息URL - (网址B) ......并且将为多个校园提供动态数量的中继器。
所以我试图做的事情如下......在我的校园内 - "特洛伊"例如 - 我想抓住最新的消息帖子,进入转发器并找到"校园选择"值。我想从该行返回消息发送者(Danny Cox)和消息URL(URL A)。我不需要其他行的任何东西。
我当前的#34;最新消息"我有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();
?>
对于疑难解答,我手动尝试抓住&#34;特洛伊&#34;价值&#34;校园选择器&#34;而不是基于我目前的校园和#34;动态获得该值。位置......
该查询正在返回:&#34; Cliff Johnson Danny Cox&#34; (因为我有2个中继器行)。
我怎样才能返回:&#34;特洛伊,丹尼考克斯,网址A&#34;在我的查询中?
答案 0 :(得分:4)
我使用$wpdb
全局提供更多SQL直接解决方案。
通常,我强烈建议不要“直接”使用SQL,但在这种情况下,WP met的结构和ACF的元存储将来应该是稳定的,因为ACF流将字段存储为“普通”元/自定义字段。
我发布这个是因为它是一种非常简单且无冗余的方式,可以获得如何通过子字段值找到特定的ACF转发器行。
...当你有很多ACF中继器行时很有用。
我将在选项字段组中向您展示转发器的示例,因为我认为它是最相关的。
假设您有包含键/名称DirectoryIndex maintenance.php
的选项字段和包含键/名称your_option_name
的子字段 - 请注意subfield_name
在某些部分转义,这是因为SQL \
正在使用LIKE
一个特殊字符 - 意思是“任何一个字符”
_
此解决方案的主要缺点是,如果您有一些格式化字段,则必须手动处理格式化,对于所见即所得字段,它非常简单,只需使用the_content
过滤器,如
{{1 }}
SQL注意:它基本上搜索prefix_main_key_NUMBER_subkey,然后从找到的密钥中删除prefix_main_key_,因此只剩下NUMBER_subkey =&gt;现在,如果您在MySQL / MariaDB中将CAST字符串串行化为INTEGER并使用INTEGER进行STARTS,那么您将以这种方式获得INTEGER ... :)
答案 1 :(得分: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();
?>
答案 2 :(得分: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');
}