0

0

WordPress:如何通过自定义分类法过滤自定义文章类型

聖光之護

聖光之護

发布时间:2025-11-24 11:35:00

|

949人浏览过

|

来源于php中文网

原创

WordPress:如何通过自定义分类法过滤自定义文章类型

本教程将详细介绍在wordpress中如何正确地通过自定义分类法过滤自定义文章类型。我们将从注册自定义分类法开始,接着展示如何生成分类选项,并重点讲解使用`wp_query`配合`tax_query`参数实现精确过滤的核心方法,同时纠正常见错误,确保您能高效、准确地管理和展示特定分类下的自定义文章。

在WordPress中,自定义文章类型(Custom Post Types, CPT)和自定义分类法(Custom Taxonomies)是构建复杂网站内容结构的关键工具。然而,许多开发者在尝试根据自定义分类法过滤自定义文章类型时,会遇到使用传统方法(如针对标准分类的cat参数)无效的问题。本文将深入探讨如何使用WP_Query配合tax_query参数,实现精准且高效的自定义文章类型过滤。

1. 注册自定义分类法

首先,确保您的自定义文章类型(例如 pdf)和自定义分类法(例如 pdf_cat)已正确注册。以下是在 functions.php 文件中注册自定义分类法的示例代码:

function register_pdf_taxonomy() {
    $labels = array(
        'name'              => _x( 'PDF Categories', 'taxonomy general name', 'your-text-domain' ),
        'singular_name'     => _x( 'PDF Category', 'taxonomy singular name', 'your-text-domain' ),
        'search_items'      => __( 'Search PDF Categories', 'your-text-domain' ),
        'all_items'         => __( 'All PDF Categories', 'your-text-domain' ),
        'parent_item'       => __( 'Parent PDF Category', 'your-text-domain' ),
        'parent_item_colon' => __( 'Parent PDF Category:', 'your-text-domain' ),
        'edit_item'         => __( 'Edit PDF Category', 'your-text-domain' ),
        'update_item'       => __( 'Update PDF Category', 'your-text-domain' ),
        'add_new_item'      => __( 'Add New PDF Category', 'your-text-domain' ),
        'new_item_name'     => __( 'New PDF Category Name', 'your-text-domain' ),
        'menu_name'         => __( 'PDF Categories', 'your-text-domain' ),
    );

    $args = array(
        'hierarchical'      => true, // 设置为 true 则为层级分类(如分类目录),false 则为非层级(如标签)
        'labels'            => $labels,
        'show_ui'           => true,
        'show_admin_column' => true,
        'query_var'         => true,
        'rewrite'           => array( 'slug' => 'pdf_category' ), // 自定义分类法的基础URL
    );

    // 将 'pdf_cat' 分类法注册到 'pdf' 自定义文章类型
    register_taxonomy( 'pdf_cat', array( 'pdf' ), $args );
}
add_action( 'init', 'register_pdf_taxonomy' );

注意:此示例假设您已经注册了一个名为 pdf 的自定义文章类型。如果尚未注册,您也需要在 functions.php 中使用 register_post_type() 函数进行注册。

2. 显示自定义分类法选项

前端页面上,您可能需要显示一个下拉菜单或一组链接,供用户选择特定的分类法进行过滤。以下代码展示了如何获取并输出 pdf_cat 分类法的所有项:

 'pdf_cat', // 指定要获取的自定义分类法
    'hide_empty' => false,     // 显示没有文章的分类法项
    'orderby'    => 'name',    // 按名称排序
    'order'      => 'ASC',
);
$categories = get_terms( $args );

if ( ! empty( $categories ) && ! is_wp_error( $categories ) ) {
    echo '';
}
?>

重要提示:

  • 对于自定义分类法,应使用 get_terms() 函数来获取分类法项,而不是 get_categories()。
  • 生成分类法项的链接时,请务必使用 get_term_link($category),而不是 get_category_link()。get_category_link() 专用于WordPress的默认文章分类。

3. 实现自定义文章类型过滤的核心:使用 WP_Query 和 tax_query

要根据自定义分类法过滤自定义文章类型,核心在于使用 WP_Query 类及其强大的 tax_query 参数。

3.1 为什么传统方法无效?

在WordPress中,get_the_category() 和 cat 查询参数主要用于查询或获取默认文章分类。当您尝试使用它们来处理自定义文章类型及其自定义分类法时,它们将无法识别,导致过滤失败或返回错误的结果。例如,以下代码片段是常见的错误尝试:

// 错误的过滤尝试,不适用于自定义分类法
$cat = get_the_category(); // 获取当前文章的默认分类
$catid = get_cat_ID( $cat[0]->name ); // 再次尝试获取默认分类ID

$args = array(
    'post_type' => 'pdf',
    'cat'       => $catid, // 'cat' 参数只适用于默认分类
);
$query = new WP_Query( $args );

这种方法会将 pdf 类型的文章与默认分类进行关联,而不是 pdf_cat 分类法,因此无法实现预期效果。

网奇企业网站管理系统CWMS2.0 英文版
网奇企业网站管理系统CWMS2.0 英文版

CWMS 2.0功能介绍:一、 员工考勤系统,国内首创CWMS2.0的企业员工在线考勤系统。二、 自定义URL Rewrite重写,友好的搜索引擎 URL优化。三、 代码与模板分离技术,支持超过5种类型的模板类型。包括:文章、图文、产品、单页、留言板。四、 购物车功能,CWMS2.0集成国内主流支付接口。如:淘宝、易趣、快钱等。完全可媲美专业网上商城系统。五、 多语言自动切换 中英文的说明。六、

下载

3.2 正确方法:WP_Query 与 tax_query

WP_Query 类的 tax_query 参数专门用于处理自定义分类法查询。它允许您指定一个或多个分类法、字段和术语(terms)来精确过滤文章。

首先,您需要获取要过滤的自定义分类法项的ID。这通常取决于您的页面结构:

  • 如果当前页面是自定义分类法归档页 (例如 /pdf_category/my-category/),您可以使用 get_queried_object_id() 来获取当前分类法项的ID。
  • 如果通过表单或URL参数进行过滤 (例如 /my-filter-page/?pdf_cat_id=123),您可以通过 $_GET 或 $_REQUEST 获取ID,并进行安全验证。

以下是使用 tax_query 进行过滤的示例代码:

term_id : 0;

$paged = get_query_var( 'paged', 1 ); // 获取分页参数

$pdf_args = array(
    'post_type'   => 'pdf',         // 指定自定义文章类型
    'paged'       => $paged,        // 处理分页
    'post_status' => 'publish',     // 只查询已发布的文章
    'tax_query'   => array(         // 这是核心:自定义分类法查询数组
        array(
            'taxonomy' => 'pdf_cat',      // 指定自定义分类法的名称
            'field'    => 'term_id',      // 指定查询字段,可以是 'term_id', 'slug', 'name'
            'terms'    => $catid,         // 指定要查询的分类法项ID
            'operator' => 'IN',           // 操作符:'IN' (包含), 'NOT IN' (不包含), 'AND' (同时属于多个), 'EXISTS', 'NOT EXISTS'
        ),
    ),
);

// 如果没有指定分类ID,则不进行分类法过滤
if ( empty( $catid ) ) {
    unset( $pdf_args['tax_query'] );
}

$pdf_query = new WP_Query( $pdf_args );

// 循环显示过滤后的文章
if ( $pdf_query->have_posts() ) :
    while ( $pdf_query->have_posts() ) : $pdf_query->the_post();
        ?>
        

$pdf_query->max_num_pages, 'current' => $paged, ) ); wp_reset_postdata(); // 重置全局文章数据 else : echo '

没有找到相关PDF文章。

'; endif; ?>

tax_query 参数详解:

  • taxonomy:必填,您自定义分类法的名称(例如 'pdf_cat')。
  • field:必填,指定您在 terms 中提供的值是分类法项的哪个字段。常见选项有:
    • 'term_id':通过分类法项ID进行查询。
    • 'slug':通过分类法项的别名(slug)进行查询。
    • 'name':通过分类法项的名称进行查询。
  • terms:必填,一个或多个分类法项的值(根据 field 的设置)。可以是一个ID、slug或名称,也可以是一个数组。
  • operator:可选,指定如何处理 terms 数组。
    • 'IN' (默认):文章必须属于 terms 数组中的任何一个分类法项。
    • 'NOT IN':文章不能属于 terms 数组中的任何一个分类法项。
    • 'AND':文章必须同时属于 terms 数组中的所有分类法项。
    • 'EXISTS':文章必须至少有一个属于指定 taxonomy 的分类法项。
    • 'NOT EXISTS':文章不能有任何属于指定 taxonomy 的分类法项。

您还可以通过在 tax_query 数组中添加多个子数组来构建更复杂的查询,例如同时过滤多个分类法,或在一个分类法中包含某些项同时排除另一些项。

4. 注意事项与最佳实践

  • 避免使用 query_posts():query_posts() 会修改主查询,可能导致不必要的性能问题和副作用。始终推荐使用 WP_Query 创建自定义查询。
  • 安全获取 $catid:当从URL参数获取分类法ID时,务必使用 intval() 或 sanitize_text_field() 等函数进行安全验证和净化,以防止SQL注入等安全风险。
  • 分页处理:在自定义查询中,务必传递 paged 参数以确保分页功能正常工作。
  • 重置文章数据:在自定义 WP_Query 循环结束后,调用 wp_reset_postdata() 是一个好习惯,它可以将全局 $post 对象恢复到主查询的状态,避免影响后续的模板标签。
  • 优化性能:对于大型网站,考虑使用缓存插件或对象缓存来优化查询性能。

总结

通过本教程,您应该已经掌握了在WordPress中如何正确地通过自定义分类法过滤自定义文章类型。核心在于理解 WP_Query 的 tax_query 参数,并正确配置 taxonomy、field 和 terms。遵循这些最佳实践,您将能够构建出功能强大、高效且易于维护的WordPress网站。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2541

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1608

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1500

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1416

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1446

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.7万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 7万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号