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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:20:34