如何修改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
相关产品推荐
相关产品推荐

