如何使用WordPress posts_join过滤器关联posts与history表并排序
实现方法
要实现关联history表并按其ID排序,需要同时使用posts_join和posts_orderby两个钩子,且要确保只在目标查询中生效,避免干扰全局查询。
1. 关联history表的posts_join钩子
通过该钩子将wp_history表(若你的表前缀非默认,请替换为实际前缀)与wp_posts表关联,关联条件为文章ID匹配history表的activity_id。
function custom_join_history_table($join, $query) { // 仅在指定查询中生效,这里以post__in存在且非后台查询为例 if (!is_admin() && $query->is_main_query() && !empty($query->get('post__in'))) { global $wpdb; $join .= " INNER JOIN {$wpdb->prefix}history ON {$wpdb->prefix}posts.ID = {$wpdb->prefix}history.activity_id "; } return $join; } add_filter('posts_join', 'custom_join_history_table', 10, 2);
2. 设置按history表ID排序的posts_orderby钩子
修改查询的排序规则,指定按history表的ID字段排序(可根据需求改为DESC)。
function custom_orderby_history_id($orderby, $query) { if (!is_admin() && $query->is_main_query() && !empty($query->get('post__in'))) { global $wpdb; $orderby = "{$wpdb->prefix}history.ID ASC"; } return $orderby; } add_filter('posts_orderby', 'custom_orderby_history_id', 10, 2);
3. 执行查询的示例代码
原有查询逻辑可保持不变,传入post__in数组即可:
// 示例文章ID数组 $clicked_activities_array = [101, 202, 303]; $args = [ 'post__in' => $clicked_activities_array, 'post_type' => 'post', // 替换为你的实际文章类型 'posts_per_page' => -1, ]; $query = new WP_Query($args); // 循环输出文章标题 if ($query->have_posts()) { while ($query->have_posts()) { $query->the_post(); echo get_the_title() . '<br>'; } wp_reset_postdata(); }
注意事项
- 确认
history表的activity_id字段确实存储对应文章ID,数据关联无误。 - 若为自定义查询而非主查询,可在
$args中添加自定义参数(如'custom_history_sort' => true),然后在钩子中通过$query->get('custom_history_sort')判断,避免影响其他查询。 - 若
history表未使用WordPress默认前缀,需手动替换{$wpdb->prefix}history为实际表名。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

