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

如何在WordPress插件的foreach循环中按post_title而非ID排序?

解决WordPress插件中按post_title排序的问题

嘿,我来帮你搞定这个排序问题!你当前的代码确实是按文章ID排序的——因为get_posts()默认的排序规则就是按post_id升序排列,而且你写的sort(events);不仅少了变量符号$,还因为sort()函数对对象数组的默认排序逻辑根本不会识别post_title,所以这行代码完全起不到你想要的作用。

下面给你两种实用的解决方案,优先推荐第一种:

方法1:直接在get_posts中指定排序参数(最高效)

这是最优方案,因为直接让数据库返回已经排好序的结果,性能更好。只需要在get_posts的参数数组里添加orderby和order两个字段即可:

// 移除无效的sort(events); 这行代码
$events = get_posts(array(
    'post_type' => $this->main->get_main_post_type(),
    'post_status' => 'publish',
    'posts_per_page' => -1,
    'orderby' => 'title', // 按标题排序
    'order' => 'ASC' // 升序排列,换成DESC就是降序
));

echo '<select>';
foreach($events as $event) {
    echo '<option class="'.$event->post_title.'" value="'.$event->ID.'" '.($mec_event_id == $event->ID ? 'selected="selected"' : '').'>'.$event->post_title.' -test3</option>';
}
echo '</select>';

方法2:获取数组后用usort自定义排序(适合无法修改get_posts参数的场景)

如果因为某些限制你不能修改get_posts的参数,那可以在获取到$events数组后,用usort()函数自定义排序规则,根据post_title来比较:

$events = get_posts(array(
    'post_type' => $this->main->get_main_post_type(),
    'post_status' => 'publish',
    'posts_per_page' => -1
));

// 按post_title升序排序
usort($events, function($a, $b) {
    return strcmp($a->post_title, $b->post_title);
});

// 如果需要降序,就交换a和b的位置:return strcmp($b->post_title, $a->post_title);

echo '<select>';
foreach($events as $event) {
    echo '<option class="'.$event->post_title.'" value="'.$event->ID.'" '.($mec_event_id == $event->ID ? 'selected="selected"' : '').'>'.$event->post_title.' -test3</option>';
}
echo '</select>';

要注意的是,strcmp()函数是区分大小写的,如果需要不区分大小写的排序,可以把标题转成小写后再比较:

return strcmp(strtolower($a->post_title), strtolower($b->post_title));

内容的提问来源于stack exchange,提问作者Mike Kuhl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:12:48