WordPress中如何实现WP_Query结果按父页面标题字母排序
WordPress 按父页面标题排序查询结果
WP_Query原生不支持直接通过查询参数按关联父页面的字段排序,无需改写SQL联表逻辑,拿到结果集后做PHP二次排序即可,兼容性更强。
实现逻辑
- 移除原WP_Query参数中针对子页面本身的
orderby、order配置,这部分配置无法实现父级字段排序 - 遍历查询得到的所有符合模板条件的页面对象,为每个项挂载对应的父页面标题属性
- 用PHP原生数组排序函数,按父页面标题字段做字母排序
- 遍历排序后的结果集输出前端内容,避免循环过程中修改全局
$post变量导致的上下文异常
修正后完整代码
// 拉取所有匹配指定模板的已发布页面,移除无效的默认排序参数 $opnamePages = new WP_Query(array( 'post_type' => 'page', 'posts_per_page' => -1, 'post_status' => 'publish', 'meta_key' => '_wp_page_template', 'meta_value' => 'templates/dienst-sub-opname-page.php', 'no_found_rows' => true // 关闭分页计数,提升全量查询性能 )); if($opnamePages->have_posts()){ $pageList = $opnamePages->posts; // 为每个页面项补充父页面标题字段 foreach($pageList as $page){ $parentId = wp_get_post_parent_id($page->ID); // 无父页面的项默认赋值空字符串,可按需调整排序优先级 $page->parent_title = $parentId ? get_the_title($parentId) : ''; } // 按父页面标题做字母排序:SORT_ASC为升序,需要降序替换strcmp两个参数顺序即可 usort($pageList, function($a, $b){ return strcmp($a->parent_title, $b->parent_title); // 降序排序使用下方返回值替换上行 // return strcmp($b->parent_title, $a->parent_title); }); // 遍历排序后的结果输出结构 echo "<div class='subNavigationDropdown'>"; echo "<div class='dropdown'>"; foreach($pageList as $page){ $pageLink = get_permalink($page->ID); $pageTitle = $page->post_title; $parentTitle = $page->parent_title; echo "<a href='{$pageLink}' title='Ga naar {$pageTitle}'>{$parentTitle}</a>"; } echo "</div>"; echo "</div>"; wp_reset_postdata(); }
可选调整说明
- 如果需要把无父页面的项排到列表最后,可以在排序回调中单独判断
parent_title为空的情况,返回更大的排序权重值 - 如果需要做不区分大小写的字母排序,可以把排序函数里的
strcmp替换为strcasecmp
内容的提问来源于stack exchange,提问作者Thessa Verbruggen
相关产品推荐
相关产品推荐

