我已经做了几个小时的实验和研究,试图找到一种方法让它发挥作用,但我只是没有任何运气。
因此,我有几个不同的定制帖子类型,需要混合一点。让我尽可能清楚和经济地解释这一点。
有两个定制的帖子类型,消息和校园。(这是一个大型的多校区教堂网站)。每个邮件帖子将有一些基于校园的中继器行(通过分类法字段),每个校园帖子将试图获取最新的消息帖子,并从该行中提取特定的“校园”中继器行和相同的字段值。
在ACF中继器部分的讯息单站..。(我们选择一个校园帖子,然后手动输入扬声器名称和消息URL)
因此,目前,我在一个“校园”单一的帖子,试图查询和获取最新的消息,这是可行的。但是,然后我试图定位并只提取消息帖子中特定中继器行的值。邮件中的中继器字段是一个校园选择(基于Post对象字段的复选框(在“校园”post类型上)和2个不同的文本字段。
为了进一步说明..。邮件邮件有以下中继器数据:中继器第1行:校园选择-特洛伊(帖子),消息发言人-丹尼考克斯,消息URL - (url A)第2行:校园选择-伯明翰(帖子),消息发言人- Cliff Johnson,消息URL - (url B) .多个校园将有一个动态的中继器数量。
所以我想做的是在我的校园帖子--例如“特洛伊”--我想获取最新的消息帖子,进入中继器并找到带有“校园选择”值的行。我只想从该行返回消息发言人(丹尼考克斯)和消息URL (url )。我不需要其他行的任何东西。
我在当前的“最新消息”中有两个中继器行,下面是我当前的查询:
<?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”在我的查询?
发布于 2016-09-10 17:58:35
在这个问题上,我得到了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();
?>
发布于 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
使用_
作为
一个特殊的字符-意思是“任何单一字符”。
$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中将字符串转换为整数,并且以整数开头,则可以这样得到整数.:)
发布于 2019-05-16 11:37:34
这将不会循环遍历所有行,而是只在子字段与搜索匹配时才读取该行。希望这能有所帮助
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');
}
https://stackoverflow.com/questions/39377137
复制相似问题