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

经典编辑器链接弹窗重复添加自定义CPT链接问题

解决经典编辑器链接搜索中自定义CPT条目重复追加的问题

问题核心:当自定义CPT(自定义文章类型)集成到经典编辑器链接搜索后,滚动触发Ajax加载时,自定义条目会被重复追加到结果列表,而默认文章/页面无此问题。原因是wp_link_query过滤器每次Ajax请求都会执行,当前代码直接追加条目而未做去重处理,而默认内容由WordPress内部查询自动处理了分页与去重。

解决方法:添加ID去重逻辑

在向$results数组追加自定义CPT条目之前,先检查该条目ID是否已存在于现有结果中,仅添加未存在的条目:

add_filter('wp_link_query', array($this, 'wp_link_query'), 10, 2);

public function wp_link_query($results, $query) {
    // 提取现有结果中的所有ID,用于去重判断
    $existing_ids = array_column($results, 'ID');

    // 自定义CPT查询,匹配搜索关键词与默认分页规则
    $custom_posts = get_posts(array(
        'post_type' => 'your_cpt_slug', // 替换为你的自定义文章类型slug
        's' => $query['s'],
        'posts_per_page' => isset($query['posts_per_page']) ? $query['posts_per_page'] : 20,
        'post_status' => 'publish',
        'paged' => isset($query['paged']) ? $query['paged'] : 1
    ));

    foreach ($custom_posts as $post) {
        $post_id = $post->ID;
        // 仅ID未存在时才追加条目
        if (!in_array($post_id, $existing_ids)) {
            $results[] = array(
                'ID' => $post_id,
                'title' => esc_html($post->post_title),
                'permalink' => get_permalink($post),
                'info' => __('自定义文章类型', 'your-text-domain') // 自定义显示的条目描述
            );
            // 更新现有ID数组,避免同一次请求内重复添加
            $existing_ids[] = $post_id;
        }
    }

    return $results;
}

关键说明

  1. 去重逻辑:通过array_column提取现有结果的ID数组,用in_array判断是否已存在,确保每个ID只被添加一次。
  2. 同步查询参数:自定义CPT查询使用$query中的s(搜索关键词)、posts_per_page、paged参数,与WordPress默认链接搜索的分页、搜索逻辑保持一致,避免加载重复的分页内容。
  3. 避免同请求重复:每次添加条目后更新$existing_ids,防止同一次请求内因循环逻辑重复添加相同条目。

内容的提问来源于stack exchange,提问作者root66

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:05:20