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

Breadcrumb NavXT 7.1.0处理GET请求生成多余子段问题咨询

问题

我在网站上使用Breadcrumb NavXT 7.1.0插件,在“新闻”板块实现了AJAX筛选:访问类似mysite.com/news/?country=turkey的链接时,页面仅显示土耳其相关新闻,面包屑路径为首页 | 新闻。

相关代码:

/* frontend */
$(document).ready(function() {

    let slug = window.location.href.split('=').pop();

    $.ajax({
      cashe: false,
      method: 'post',
      url: '<?php echo get_template_directory_uri(); ?>/news-ajax-sort.php',
      data: slug,
      success: function(data) {
        $('.all-news-wrap').append(data);
      }
    }); 
})
/* backend */
$keys = array_keys($_POST);
$newsslug = $keys[0];

if(isset($newsslug)) {
    $news_args = array(
        'post_type' => 'news',
        'posts_per_page' => 100,
        'tax_query' => array(
            array(
                'taxonomy' => 'country_news',
                'field'    => 'slug',
                'terms'    => $newsslug
            )
        )
    );
}
else {
    $news_args = array(
        'post_type' => 'news',
        'posts_per_page' => 100
    );
}
//here is the standard wordpress loop

之后我创建了实现逻辑完全相同的“活动”板块,仅将AJAX筛选条件改为按年份筛选,Breadcrumb NavXT设置也一致。但访问类似mysite.com/events/?years=2023的链接时,面包屑路径变为首页 | 活动 | 2023,多出了不必要的子段。我曾尝试将参数值改为events2023,但面包屑仍显示首页 | 活动 | events2023,问题未解决。

请问为何实现完全相同的两个板块,插件处理方式不同?插件如何根据GET请求生成子段,该如何干预?


解答

一、两个板块处理不同的原因

Breadcrumb NavXT会自动扫描URL中的GET参数,匹配WordPress内置查询变量或已注册的自定义分类法:

  • 新闻板块用的country参数,不属于插件识别的内置/关联变量,所以不会额外生成面包屑子项;
  • 活动板块的years参数和WordPress内置的year日期归档查询变量高度相似,插件误判这是一个归档类参数,自动把参数值作为子项添加到面包屑里——哪怕改参数值,只要参数名是years,插件的识别逻辑依然会触发。

二、插件处理GET请求生成子段的逻辑

Breadcrumb NavXT核心依赖WordPress的查询对象($wp_query)解析页面上下文,处理GET参数时会按以下顺序判断:

  1. 检查参数是否匹配WordPress内置查询变量(比如year、category、tag等);
  2. 检查参数是否匹配已注册的自定义分类法的查询变量;
  3. 只要匹配成功,就会自动生成对应面包屑子项,将参数值作为子项文本。

三、干预解决的两种方法

方法1:修改GET参数名

把活动板块的参数名从years改成插件不会识别的名称(比如event_year),彻底避开插件的自动识别逻辑:

  • 前端AJAX的参数获取逻辑要对应调整;
  • 后端$_POST的参数读取代码也要同步修改。

方法2:用插件钩子过滤面包屑

如果不想改参数名,可通过Breadcrumb NavXT提供的bcn_breadcrumb_trail钩子,手动移除多余的面包屑子项:

add_filter('bcn_breadcrumb_trail', 'remove_unwanted_event_breadcrumb', 10, 1);
function remove_unwanted_event_breadcrumb($trail) {
    // 判断当前是否在活动归档页,且存在years参数
    if(is_post_type_archive('events') && isset($_GET['years'])) {
        // 移除最后一个面包屑子项(即多余的年份段)
        array_pop($trail->breadcrumbs);
    }
    return $trail;
}

将这段代码添加到主题的functions.php文件即可生效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:05:14