WordPress 教程:从搜索结果中排除特定分类的专业方法

WordPress 教程:从搜索结果中排除特定分类的专业方法

本教程详细指导如何在 wordPress 网站的搜索结果中排除特定分类的文章。文章将介绍使用 pre_get_posts 钩子结合 tax_query 参数的专业方法,避免手动排除文章ID或不奏效的旧有方法,确保搜索结果的精准性和相关性,提升用户体验。

理解需求:为何排除特定分类?

在运营 wordpress 网站时,有时我们不希望某些特定分类下的文章出现在站内搜索结果中。例如,可能有一些内部管理、归档性质的分类,或是一些仅用于特定页面展示而非搜索发现的内容。通过排除这些分类,可以有效提升搜索结果的相关性和用户体验,避免用户在搜索时看到不必要或不相关的内容。

常见误区与低效方案

在尝试实现这一功能时,开发者可能会遇到一些常见的误区或采用低效的解决方案:

  1. 使用 $query-youjiankuohaophpcnset( ‘cat’,’-ID’ ): 这种方法在某些旧版 WordPress 或特定配置下可能有效,但并非总是可靠。它的主要问题在于,当 pre_get_posts 钩子执行时,’cat’ 参数可能已经被其他查询条件覆盖或处理,导致排除操作不生效。

  2. 手动排除文章 ID: 另一种临时解决方案是获取需要排除分类下的所有文章 ID,然后使用 post__not_in 参数手动将其排除。

    add_action('pre_get_posts','exclude_posts_from_search'); function exclude_posts_from_search( $query ){     if( $query->is_main_query() && is_search() ){         // 示例:手动排除文章ID         $post_ids = Array(52384, 52366, 52058, 52392, 52374);         $query->set('post__not_in', $post_ids);     } }

    这种方法虽然能实现效果,但效率极低且难以维护。每当分类下新增或删除文章时,都需要手动更新 post_ids 数组,这在内容频繁更新的网站中是不可持续的。

专业解决方案:使用 pre_get_posts 和 tax_query

WordPress 提供了一个强大且灵活的钩子 pre_get_posts,它允许我们在主查询执行之前修改查询参数。结合 tax_query 参数,我们可以精确地控制分类(或其他自定义分类法)的包含或排除。

tax_query 是一个用于构建复杂分类法查询的数组,它允许我们指定分类法名称、字段(如 ID、slug)、术语(term)以及操作符(如 IN、NOT IN)。

以下是实现从搜索结果中排除特定分类的专业代码:

/**  * 从WordPress搜索结果中排除特定分类  *  * @param WP_Query $query 当前的WP_Query对象  */ function exclude_categories_from_search($query) {     // 确保只在搜索页面且非后台管理时修改查询     // $query->is_search 检查当前是否为搜索查询     // !is_admin() 确保代码只在前端执行     if ( !$query->is_search || is_admin() ) {         return $query;     }      // 定义要排除的分类ID数组     // 请将这里的示例ID替换为您实际需要排除的分类ID     $term_ids_to_exclude = array( 19, 18, 214, 226, 20 );       // 构建 tax_query 数组     $taxquery = array(         array(             'taxonomy' => 'category', // 指定要查询的分类法,默认为 'category'             'field'    => 'id',      // 指定查询字段,这里是分类ID             'terms'    => $term_ids_to_exclude, // 要排除的分类ID数组             'operator' => 'NOT IN'   // 操作符:'NOT IN' 表示排除这些ID         )     );      // 将构建好的 tax_query 设置到当前查询对象中     $query->set( 'tax_query', $taxquery );      // 返回修改后的查询对象     return $query; } add_action( 'pre_get_posts', 'exclude_categories_from_search' );

代码详解:

  1. function exclude_categories_from_search($query): 定义一个函数,接收当前的 WP_Query 对象作为参数。
  2. if ( !$query->is_search || is_admin() ): 这是一个关键的条件判断。它确保我们的代码只在以下两种情况下执行:
    • 当前查询是一个搜索查询 ($query->is_search 为真)。
    • 当前请求不是在 WordPress 后台 (!is_admin() 为真)。 这样可以避免不必要的查询修改,确保代码只在需要时生效。
  3. $term_ids_to_exclude = array( 19, 18, 214, 226, 20 );: 定义一个数组,其中包含您希望从搜索结果中排除的所有分类的 ID。请务必将这些示例 ID 替换为您网站中实际的分类 ID。
  4. $taxquery = array(…): 构建 tax_query 数组。
    • ‘taxonomy’ => ‘category’:指定我们要操作的分类法是 WordPress 内置的 category。如果您要排除自定义分类法(例如 product_cat),请在此处更改其名称。
    • ‘field’ => ‘id’:表示我们将根据分类的 ID 进行查询。您也可以使用 ‘slug’ 根据分类的别名进行查询。
    • ‘terms’ => $term_ids_to_exclude:传入要排除的分类 ID 数组。
    • ‘operator’ => ‘NOT IN’:这是核心部分,它告诉 WordPress 排除所有属于 $term_ids_to_exclude 数组中 ID 的分类。
  5. $query->set( ‘tax_query’, $taxquery );: 将构建好的 tax_query 应用到当前的 WP_Query 对象中。
  6. add_action( ‘pre_get_posts’, ‘exclude_categories_from_search’ );: 将我们的函数挂载到 pre_get_posts 钩子上,确保在 WordPress 生成查询之前执行我们的修改。

如何获取分类ID

要找到您网站中分类的 ID,您可以:

  1. 登录 WordPress 后台。
  2. 导航到 文章 > 分类
  3. 将鼠标悬停在您想要排除的分类名称上,浏览器左下角会显示链接,其中包含 tag_ID= 后面的数字,这就是分类的 ID。
  4. 或者,点击进入该分类的编辑页面,浏览器地址栏中的 URL 会显示 tag_ID= 后面的数字。

注意事项

  • 代码放置位置:这段代码应放置在您当前活动主题的 functions.php 文件中。更推荐的做法是将其放入一个自定义插件中,以确保在主题切换时功能不会丢失。
  • 多分类法排除:如果需要排除多个分类法中的术语,可以在 $taxquery 数组中添加更多的子数组。
  • 性能考量:对于小型到中型网站,此方法对性能影响微乎其微。对于超大型网站,如果需要排除的分类数量非常庞大,可能需要进行性能测试。
  • 测试:在将代码部署到生产环境之前,务必在开发或测试环境中进行充分测试,确保功能按预期工作且没有引入新的问题。
  • 与其他插件的兼容性:某些SEO插件或自定义搜索插件可能会修改 pre_get_posts 钩子。如果出现冲突,可能需要调整代码的优先级(通过 add_action 的第三个参数)。

总结

通过利用 pre_get_posts 钩子和 tax_query 参数,我们可以以一种高效、灵活且易于维护的方式,精确控制 WordPress 搜索结果中分类的显示。这种方法避免了手动排除文章 ID 的繁琐,也解决了旧版 $query->set(‘cat’, ‘-ID’) 可能存在的兼容性问题,是实现这一功能的最佳实践。正确实施后,将显著提升网站搜索功能的专业性和用户体验。

以上就是WordPress 教程:从搜索结果中排除特定分类的专业方法的详细内容,更多请关注php中文网其它相关文章!

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享