按浏览量从高到低排序WordPress文章的技术实现需求
Elementor自定义文章查询与排序实现方案
需求
需要在Elementor中展示两类文章,并按浏览量从高到低排序:
- 带有有效浏览量的文章:由wp-view-counter插件统计,对应文章元字段
entry_views值非空 - 标记为
trending的文章:属于filter分类法下slug为trending的术语,无论是否有浏览量 - 排序规则:浏览量高的在前,无浏览量的trending文章排在末尾
原代码问题
- WHERE条件逻辑重复混乱,可能筛选出不符合预期的文章
- 未处理排序逻辑,仅传递文章ID但未按浏览量排序
- JOIN表的方式不够严谨,容易产生重复数据
修正后的代码
function my_custom_elementor_query( $query ) { global $wpdb; // 构建SQL查询,获取符合条件的文章ID并按浏览量降序排序 $sql = " SELECT DISTINCT p.ID, COALESCE(CAST(pm.meta_value AS UNSIGNED), 0) AS view_count FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id AND pm.meta_key = 'entry_views' LEFT JOIN {$wpdb->term_relationships} tr ON p.ID = tr.object_id LEFT JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id = tt.term_taxonomy_id LEFT JOIN {$wpdb->terms} t ON tt.term_id = t.term_id WHERE p.post_type = 'post' AND p.post_status = 'publish' AND ( (pm.meta_value IS NOT NULL AND pm.meta_value != '') OR (t.slug = 'trending' AND tt.taxonomy = 'filter') ) ORDER BY view_count DESC, p.post_date DESC "; $post_ids = $wpdb->get_col( $sql ); if ( ! empty( $post_ids ) ) { $query->set( 'post__in', $post_ids ); $query->set( 'orderby', 'post__in' ); // 遵循SQL查询返回的ID排序顺序 } else { $query->set( 'post__in', array(0) ); // 无符合条件文章时返回空结果 } } add_action( 'elementor/query/custom_filter', 'my_custom_elementor_query' );
代码说明
- 浏览量处理:用
COALESCE(CAST(pm.meta_value AS UNSIGNED), 0)将entry_views转为数字类型,无浏览量的trending文章默认浏览量为0 - 条件筛选:明确区分两类文章的筛选逻辑,避免冗余和错误匹配
- 排序规则:先按浏览量降序排列,浏览量相同则按文章发布时间降序
- Elementor适配:通过
orderby = 'post__in'让Elementor的查询遵循我们SQL返回的ID顺序,确保排序生效 - 结果控制:增加
post_type和post_status限制,只获取已发布的文章(可根据实际内容类型调整)
内容的提问来源于stack exchange,提问作者danial
相关产品推荐
相关产品推荐

