You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress:如何将ACF Repeater值与页面按字母排序并关联父页面

解决ACF Repeater字段与页面标题的整体字母排序问题

我来帮你搞定这个排序需求!你现在的输出是按页面顺序逐个输出国家和大陆,但要实现所有内容(国家+大陆)的整体字母排序,核心思路是先把所有需要显示的条目统一收集到一个数组里,排序后再输出,这样就能保证所有内容按字母顺序排列,同时国家也能正确链接到对应的大陆页面。

具体实现步骤和代码

  1. 初始化数组收集所有条目:先创建一个空数组,用来存储所有大陆和国家的名称与链接。
  2. 遍历页面收集数据:在WP_Query循环中,先把当前大陆页面的信息加入数组,再遍历Repeater字段把每个国家的信息(关联当前大陆的链接)也加入数组。
  3. 对数组按字母排序:使用usort函数对数组按名称进行不区分大小写的排序。
  4. 输出排序后的列表:循环数组,安全输出每个条目。

完整代码如下:

<?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:14:08