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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:40:54