如何使用foreach循环替代print_r输出WordPress分类列表?
解决WordPress分类排序后列表展示问题
问题原因
你直接执行echo $items无法正常工作,是因为get_sorted_categories返回的是WP_Term对象数组,PHP不能直接输出对象,必须访问对象的具体属性(比如分类名称、链接等)。
正确的列表展示代码
下面是两种常见的展示方式,根据需求选择:
1. 带归档链接的分类列表
$list = get_sorted_categories('date'); if (!empty($list)) { echo '<ul class="sorted-categories">'; foreach ($list as $category) { // 获取分类归档链接,转义输出防止安全问题 $category_link = esc_url(get_category_link($category->term_id)); $category_name = esc_html($category->name); echo "<li><a href=\"{$category_link}\">{$category_name}</a></li>"; } echo '</ul>'; }
2. 纯文本分类列表
如果不需要链接,只展示分类名称:
$list = get_sorted_categories('date'); if (!empty($list)) { echo '<ul class="sorted-categories">'; foreach ($list as $category) { echo '<li>' . esc_html($category->name) . '</li>'; } echo '</ul>'; }
原函数优化建议
原函数存在潜在问题:如果传入的$order_by参数不在允许的列表中(比如传入title),会导致SQL语法错误。可以添加参数校验逻辑:
function get_sorted_categories( $order_by = 'id' ){ global $wpdb; $category = get_categories(); $order = [ 'id' => 'post.ID', 'date' => 'post.post_date', 'modified' => 'post.post_modified', ]; // 校验排序参数,无效参数默认使用id排序 if (!array_key_exists($order_by, $order)) { $order_by = 'id'; } $order_by = $order[ $order_by ]; $q = $wpdb->get_results("SELECT tax.term_id FROM `{$wpdb->prefix}term_taxonomy` tax INNER JOIN `{$wpdb->prefix}term_relationships` rel ON rel.term_taxonomy_id = tax.term_id INNER JOIN `{$wpdb->prefix}posts` post ON rel.object_id = post.ID WHERE tax.taxonomy = 'category' AND post.post_type = 'post' AND post.post_status = 'publish' ORDER BY {$order_by} DESC"); $sort = array_flip( array_unique( wp_list_pluck( $q, 'term_id' ) ) ); usort( $category, function( $a, $b ) use ( $sort ) { if( isset( $sort[ $a->term_id ], $sort[ $b->term_id ] ) && $sort[ $a->term_id ] != $sort[ $b->term_id ] ) $res = ($sort[ $a->term_id ] > $sort[ $b->term_id ]) ? 1 : -1; else if( !isset( $sort[ $a->term_id ] ) && isset( $sort[ $b->term_id ] ) ) $res = 1; else if( isset( $sort[ $a->term_id ] ) && !isset( $sort[ $b->term_id ] ) ) $res = -1; else $res = 0; return $res; } ); return $category; }
优化说明:
- 增加参数校验,避免无效参数导致的SQL错误
- 移除了usort回调中未使用的
$category变量,减少不必要的资源占用
内容的提问来源于stack exchange,提问作者Guruh
相关产品推荐
相关产品推荐

