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

