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

如何修改WordPress作者分类法排序为按姓氏而非名字?

问题描述

我创建了一个作者分类法(Authors taxonomy),每个作者的名称字段中包含名字与姓氏。当前分类页面的作者列表按字母顺序展示,但排序依据为名字,我希望将其改为按姓氏排序。以下是当前的实现代码:

<?php
          $taxonomy = 'autorzy'; // <== Here define your custom taxonomy
            $sorted   = array(); // Initializing

            // Get all terms alphabetically sorted
            $terms = get_terms( array(
                'taxonomy'   => $taxonomy,
                'hide_empty' => false,
                'orderby'    => 'name'
            ) );

            // Loop through the array of WP_Term Objects
            foreach( $terms as $term ) {
                $term_name    = $term->name;
                $image = get_field('obrazek_wyrozniajacy', $term);
                $term_link    = get_term_link( $term, $taxonomy );
                $first_letter = strtoupper($term_name[0]);
                
                // Group terms by their first starting letter
                if( ! empty($term_link) ) {
                    $sorted[$first_letter][] = '<li><a href="'.$term_link.'">' .'<img src="'.$image['url'].'" />'.$term_name.'</a></li>';
                } else {
                    $sorted[$first_letter][] = '<li>'.$term_name.'</li>';
                }
            }

            // Loop through grouped terms by letter to display them by letter
            foreach( $sorted as $letter => $values ) {
                echo '<div class="tax-by-letter" id="tax-letter-'.$letter.'">
                <h3 class="tax-letter-'.$letter.'">'.$letter.'</h3>
                <ul class="nav">' . implode('', $values) . '</ul>
                </div>';
            }
?>
解决方案

要实现按姓氏排序,需对代码做两处关键修改:

  • 替换默认排序,添加自定义姓氏排序逻辑
    原代码依赖orderby => 'name'按完整名称排序,我们需要先获取所有作者分类,再手动按姓氏排序。将获取$terms的代码替换为:

    // 获取所有作者分类,取消默认排序
    $terms = get_terms( array(
        'taxonomy'   => $taxonomy,
        'hide_empty' => false,
        'orderby'    => 'none' // 后续手动处理排序
    ) );
    
    // 按姓氏对作者分类排序
    usort($terms, function($a, $b) {
        // 拆分名称,取最后一段作为姓氏
        $a_last_name = trim(end(explode(' ', $a->name)));
        $b_last_name = trim(end(explode(' ', $b->name)));
        return strcasecmp($a_last_name, $b_last_name); // 不区分大小写的字符串比较
    });
    
  • 更新分组首字母为姓氏的首字母
    原代码取的是完整名称的首字母,需要改为提取姓氏的首字母:

    // 获取姓氏并提取首字母
    $name_parts = explode(' ', $term_name);
    $last_name = trim(end($name_parts));
    $first_letter = strtoupper($last_name[0]);
    

修改后的完整代码

<?php
$taxonomy = 'autorzy'; // <== Here define your custom taxonomy
$sorted   = array(); // Initializing

// 获取所有作者分类,取消默认排序
$terms = get_terms( array(
    'taxonomy'   => $taxonomy,
    'hide_empty' => false,
    'orderby'    => 'none'
) );

// 按姓氏对作者分类排序
usort($terms, function($a, $b) {
    $a_last_name = trim(end(explode(' ', $a->name)));
    $b_last_name = trim(end(explode(' ', $b->name)));
    return strcasecmp($a_last_name, $b_last_name);
});

// 遍历分类项
foreach( $terms as $term ) {
    $term_name    = $term->name;
    $image = get_field('obrazek_wyrozniajacy', $term);
    $term_link    = get_term_link( $term, $taxonomy );
    
    // 提取姓氏首字母用于分组
    $name_parts = explode(' ', $term_name);
    $last_name = trim(end($name_parts));
    $first_letter = strtoupper($last_name[0]);
    
    // 按首字母分组
    if( ! empty($term_link) ) {
        $sorted[$first_letter][] = '<li><a href="'.$term_link.'">' .'<img src="'.$image['url'].'" />'.$term_name.'</a></li>';
    } else {
        $sorted[$first_letter][] = '<li>'.$term_name.'</li>';
    }
}

// 渲染分组后的作者列表
foreach( $sorted as $letter => $values ) {
    echo '<div class="tax-by-letter" id="tax-letter-'.$letter.'">
    <h3 class="tax-letter-'.$letter.'">'.$letter.'</h3>
    <ul class="nav">' . implode('', $values) . '</ul>
    </div>';
}
?>

注意事项

如果作者名称包含中间名、连字符复姓等特殊格式,需要调整explode的分隔符或拆分规则,适配实际的命名格式。

内容的提问来源于stack exchange,提问作者Patryk Banach

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:43:10