WordPress:如何将ACF Repeater值与页面按字母排序并关联父页面
解决ACF Repeater字段与页面标题的整体字母排序问题
我来帮你搞定这个排序需求!你现在的输出是按页面顺序逐个输出国家和大陆,但要实现所有内容(国家+大陆)的整体字母排序,核心思路是先把所有需要显示的条目统一收集到一个数组里,排序后再输出,这样就能保证所有内容按字母顺序排列,同时国家也能正确链接到对应的大陆页面。
具体实现步骤和代码
- 初始化数组收集所有条目:先创建一个空数组,用来存储所有大陆和国家的名称与链接。
- 遍历页面收集数据:在WP_Query循环中,先把当前大陆页面的信息加入数组,再遍历Repeater字段把每个国家的信息(关联当前大陆的链接)也加入数组。
- 对数组按字母排序:使用
usort函数对数组按名称进行不区分大小写的排序。 - 输出排序后的列表:循环数组,安全输出每个条目。
完整代码如下:
<?php $args = array( 'post_type' => 'page', 'post_parent' => 0, 'meta_query' => array( array( 'key' => '_wp_page_template', 'value' => 'page-landing.php' ) ) ); $the_query = new WP_Query( $args ); // 初始化数组存储所有要显示的条目 $all_items = array(); if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); // 添加当前大陆页面到数组 $all_items[] = array( 'name' => get_the_title(), 'url' => get_permalink() ); // 遍历Repeater字段,添加所有国家到数组(链接指向当前大陆页面) if( have_rows('countries') ): while ( have_rows('countries') ) : the_row(); $country_name = get_sub_field('country'); if ( !empty($country_name) ) { // 跳过空的国家字段 $all_items[] = array( 'name' => $country_name, 'url' => get_permalink() ); } endwhile; endif; endwhile; wp_reset_postdata(); // 重置查询,避免影响后续全局变量 endif; // 对数组按名称进行不区分大小写的字母排序 usort($all_items, function($a, $b) { return strcmp(strtolower($a['name']), strtolower($b['name'])); }); // 输出排序后的列表 if ( !empty($all_items) ) { echo '<ul>'; foreach ( $all_items as $item ) { // 使用WordPress安全函数处理输出,避免XSS风险 $safe_url = esc_url($item['url']); $safe_name = esc_html($item['name']); echo "<li><a href=\"{$safe_url}\" title=\"{$safe_name}\">{$safe_name}</a></li>"; } echo '</ul>'; } ?>
关键细节说明
- 排序逻辑:
strcmp(strtolower($a['name']), strtolower($b['name']))确保排序不区分大小写,比如“Belgium”和“africa”会被正确排序为“Africa”、“Belgium”。 - 安全输出:使用
esc_url、esc_html等函数处理链接和文本,这是WordPress开发的最佳实践,能有效防止XSS攻击。 - 重置查询:
wp_reset_postdata()用来重置全局$post变量,避免后续代码出现意外问题。
这样修改后,你的输出就会是按字母顺序排列的所有国家和大陆,每个国家的链接也会正确指向对应的大陆页面啦!
内容的提问来源于stack exchange,提问作者Falch0n
相关产品推荐
相关产品推荐

