WordPress分类排序报错:sort()参数应为数组而非WP_Term的解决方法
修正WordPress职位分类下拉框的排序错误
我在WordPress中设有名为“Job Title”的分类,希望遍历文章并在下拉选择框中按字母顺序显示职位名称,编写的代码如下:
<select name="jobTitle" id="jobTitleFilter"> <option value="" selected="selected">Job Title</option> <?php foreach ( get_terms( 'job_title', array() ) as $job_title ) : ?> <?php sort( $job_title ); ?> <option value="<?php echo esc_html( $job_title->term_id); ?>"><?php echo esc_html( $job_title->name ); ?></option> <?php endforeach; ?> </select>
该代码在PHP 7环境下虽能运行但存在错误,在PHP 8.0.30中触发致命错误:
Fatal error: Uncaught Error: sort(): Argument #1 ($array) must be of type array, WP_Term given in template-partner-job-postings.php on line 26
在PHP 7的Query Monitor中显示错误:
sort() expects parameter 1 to be array, object given
错误原因
你在循环内部对单个WP_Term对象调用了sort()函数,但sort()的作用是排序数组,不能传入对象。PHP 7对此仅抛出警告,而PHP 8的类型检查更严格,直接触发致命错误。
修正方案
方法一:利用get_terms()内置排序参数(推荐)
直接通过get_terms()的参数指定排序规则,无需手动排序,代码更简洁高效:
<select name="jobTitle" id="jobTitleFilter"> <option value="" selected="selected">Job Title</option> <?php // 配置参数,按分类名称字母升序排序 $job_terms = get_terms( array( 'taxonomy' => 'job_title', 'orderby' => 'name', 'order' => 'ASC', 'hide_empty' => false, // 可根据需求设置是否隐藏无关联文章的分类,默认值为true ) ); foreach ( $job_terms as $job_title ) : ?> <option value="<?php echo esc_html( $job_title->term_id); ?>"><?php echo esc_html( $job_title->name ); ?></option> <?php endforeach; ?> </select>
方法二:手动自定义排序(适用于复杂排序场景)
如果需要更灵活的排序逻辑,可以先获取所有分类项,再用usort()自定义排序规则:
<select name="jobTitle" id="jobTitleFilter"> <option value="" selected="selected">Job Title</option> <?php $job_terms = get_terms( 'job_title', array() ); // 按分类名称字母升序排序 usort( $job_terms, function( $term_a, $term_b ) { return strcmp( $term_a->name, $term_b->name ); } ); foreach ( $job_terms as $job_title ) : ?> <option value="<?php echo esc_html( $job_title->term_id); ?>"><?php echo esc_html( $job_title->name ); ?></option> <?php endforeach; ?> </select>
内容的提问来源于stack exchange,提问作者jfc
相关产品推荐
相关产品推荐

