0

0

在WordPress中为自定义文章类型显示分类法描述的教程

花韻仙語

花韻仙語

发布时间:2025-11-27 12:16:13

|

702人浏览过

|

来源于php中文网

原创

在WordPress中为自定义文章类型显示分类法描述的教程

本教程详细阐述了如何在wordpress中,当按自定义分类法(如作品集类别)过滤或展示自定义文章类型时,同时显示该分类法的描述。核心方法是首先遍历所有分类法术语,然后针对每个术语执行一个独立的wp_query来获取相关文章,从而在显示文章列表的同时,展示对应分类的详细描述信息。

在WordPress开发中,我们经常会创建自定义文章类型(Custom Post Types, CPT)并为其关联自定义分类法(Custom Taxonomies)。一个常见的需求是,当用户浏览或过滤特定分类下的文章时,不仅要显示该分类下的文章列表,还需要同时展示该分类法的描述信息,以提供更丰富的上下文。本文将详细介绍如何通过遍历分类法术语并结合WP_Query来实现这一功能。

核心策略:术语驱动的文章查询

要实现为每个分类显示其描述以及该分类下的文章,最直接且有效的方法是采用“术语驱动的查询”策略。这意味着我们将不再仅仅查询文章,而是首先获取所有目标分类法中的术语(term),然后针对每一个术语,执行一个独立的WordPress查询(WP_Query)来获取与其关联的自定义文章。这种方法确保了在显示文章之前,我们已经拥有了当前术语的所有详细信息,包括其描述。

实现步骤

以下是实现此功能的具体步骤:

1. 获取所有目标分类法术语

首先,我们需要使用 get_terms() 函数来获取特定自定义分类法下的所有术语。这个函数返回一个包含所有术语对象的数组,每个对象都包含了术语的名称、描述、slug等信息。

天工大模型
天工大模型

中国首个对标ChatGPT的双千亿级大语言模型

下载
<?php
// 假设你的自定义分类法是 'portfolio_category'
$taxonomy_slug = 'portfolio_category';
$terms = get_terms($taxonomy_slug, array(
    'hide_empty' => true // 只获取有文章关联的术语
));

// 检查是否成功获取到术语且没有WordPress错误
if (!is_wp_error($terms) && !empty($terms)) :
    // 后续步骤将在循环内部进行
else :
    echo '<p>未找到任何分类术语或发生错误。</p>';
endif;
?>

2. 遍历术语并执行文章查询

获取到术语列表后,我们需要遍历这些术语。在每次循环中,我们将:

  • 显示当前术语的名称和描述。
  • 构建一个 WP_Query 参数数组,其中包含 tax_query 参数,用于根据当前术语的ID来过滤文章。
  • 执行 WP_Query 来获取与当前术语关联的自定义文章。
  • 遍历查询结果,显示每篇文章的标题或其他所需信息。
  • 在每次内部文章循环结束后,调用 wp_reset_postdata() 重置全局文章数据,以避免对后续查询产生影响。
<?php
// ... (接上一步的代码)

if (!is_wp_error($terms) && !empty($terms)) :
    foreach ($terms as $term) :
        // 为每个术语创建一个容器,例如一个行或一个区块
        ?>
        <div class="category-section">
            <div class="category-header">
                <h2><?php echo esc_html($term->name); ?></h2>
                <?php if (!empty($term->description)) : ?>
                    <p class="category-description"><?php echo esc_html($term->description); ?></p>
                <?php endif; ?>
            </div>

            <div class="posts-grid row">
                <?php
                // 构建WP_Query参数,查询当前术语下的自定义文章
                $args = [
                    'post_type'      => 'your_custom_post_type', // 替换为你的自定义文章类型 slug
                    'post_status'    => 'publish',
                    'posts_per_page' => -1, // 显示所有文章
                    'tax_query'      => [
                        [
                            'taxonomy' => $taxonomy_slug,
                            'field'    => 'term_id',
                            'terms'    => $term->term_id,
                        ],
                    ],
                ];

                $query = new WP_Query($args);

                if ($query->have_posts()) :
                    while ($query->have_posts()) : $query->the_post();
                        // 显示每篇文章的标题、链接等信息
                        ?>
                        <div class="col-lg-4 col-md-6 mb-4">
                            <div class="post-item">
                                <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
                                <!-- 可以添加文章缩略图、摘要等 -->
                                <?php if (has_post_thumbnail()) : ?>
                                    <a href="<?php the_permalink(); ?>">
                                        <?php the_post_thumbnail('thumbnail', array('class' => 'img-fluid')); ?>
                                    </a>
                                <?php endif; ?>
                                <p><?php the_excerpt(); ?></p>
                            </div>
                        </div>
                    <?php
                    endwhile;
                    wp_reset_postdata(); // 重置文章数据
                else :
                    echo '<div class="col-12"><p>此分类下暂无文章。</p></div>';
                endif;
                ?>
            </div><!-- .posts-grid -->
        </div><!-- .category-section -->
        <?php
    endforeach;
endif;
?>

完整示例代码

将以上步骤整合,一个完整的实现代码示例如下。请根据你的实际情况替换 your_custom_post_type 和 portfolio_category。

<?php
/**
 * 在WordPress中按自定义分类法分组显示文章,并展示分类法描述。
 */

// 定义你的自定义文章类型和自定义分类法
$custom_post_type = 'your_custom_post_type'; // 例如: 'portfolio'
$taxonomy_slug = 'portfolio_category';       // 例如: 'portfolio_category'

// 获取指定分类法下的所有术语
$terms = get_terms($taxonomy_slug, array(
    'hide_empty' => true, // 只显示包含文章的术语
    'orderby'    => 'name',
    'order'      => 'ASC',
));

// 检查是否成功获取到术语且没有WordPress错误
if (!is_wp_error($terms) && !empty($terms)) :
    ?>
    <div class="custom-taxonomy-listing">
        <?php
        foreach ($terms as $term) :
            // 为每个分类术语创建一个独立的展示区块
            ?>
            <section class="category-group mb-5">
                <header class="category-group-header mb-4">
                    <h2 class="category-name display-4"><?php echo esc_html($term->name); ?></h2>
                    <?php if (!empty($term->description)) : ?>
                        <p class="category-description lead"><?php echo esc_html($term->description); ?></p>
                    <?php endif; ?>
                </header>

                <div class="row posts-in-category">
                    <?php
                    // 构建WP_Query参数,查询当前术语下的自定义文章
                    $args = [
                        'post_type'      => $custom_post_type,
                        'post_status'    => 'publish',
                        'posts_per_page' => -1, // 显示所有文章
                        'tax_query'      => [
                            [
                                'taxonomy' => $taxonomy_slug,
                                'field'    => 'term_id',
                                'terms'    => $term->term_id,
                            ],
                        ],
                        'orderby'        => 'date', // 按日期排序
                        'order'          => 'DESC', // 降序
                    ];

                    $query = new WP_Query($args);

                    if ($query->have_posts()) :
                        while ($query->have_posts()) : $query->the_post();
                            ?>
                            <div class="col-lg-4 col-md-6 mb-4">
                                <article id="post-<?php the_ID(); ?>" <?php post_class('post-card'); ?>>
                                    <?php if (has_post_thumbnail()) : ?>
                                        <div class="post-thumbnail">
                                            <a href="<?php the_permalink(); ?>">
                                                <?php the_post_thumbnail('medium', array('class' => 'img-fluid rounded')); ?>
                                            </a>
                                        </div>
                                    <?php endif; ?>
                                    <div class="post-content p-3">
                                        <h3 class="post-title h5 mt-2"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
                                        <div class="post-excerpt">
                                            <?php the_excerpt(); ?>
                                        </div>
                                        <a href="<?php the_permalink(); ?>" class="read-more btn btn-sm btn-primary mt-2">阅读更多</a>
                                    </div>
                                </article>
                            </div>
                        <?php
                        endwhile;
                        wp_reset_postdata(); // 重置文章数据,非常重要
                    else :
                        // 如果当前分类下没有文章
                        ?>
                        <div class="col-12">
                            <p class="text-muted">此分类“<?php echo esc_html($term->name); ?>”下暂无相关文章。</p>
                        </div>
                    <?php
                    endif;
                    ?>
                </div><!-- .row.posts-in-category -->
            </section><!-- .category-group -->
        <?php
        endforeach;
        ?>
    </div><!-- .custom-taxonomy-listing -->
<?php
else :
    // 如果没有获取到任何分类术语
    ?>
    <p class="alert alert-warning">抱歉,未找到任何自定义分类术语或发生错误。</p>
<?php
endif;
?>

注意事项与最佳实践

  1. 替换占位符: 务必将代码中的 your_custom_post_type 替换为你实际的自定义文章类型 slug,将 portfolio_category 替换为你实际的自定义分类法 slug。
  2. 性能考量: 每次遍历术语都会执行一个新的 WP_Query。对于拥有大量术语和文章的网站,这可能会导致多次数据库查询。在大多数情况下,这种性能开销是可接受的。如果遇到性能瓶颈,可以考虑使用缓存插件或更高级的查询优化技术(例如,一次性获取所有文章,然后在PHP中按分类法进行分组,但这会增加代码复杂性)。
  3. wp_reset_postdata() 的重要性: 在每次 WP_Query 的文章循环结束后,调用 wp_reset_postdata() 至关重要。它会将全局 $post 对象和相关数据恢复到主查询(main query)的状态,防止对页面其他部分的WordPress函数(如 the_title()、the_permalink() 等)产生意外影响。
  4. 错误处理和空状态: 代码中包含了 is_wp_error() 和 !empty($terms) 的检查,以优雅地处理没有术语或获取术语失败的情况。同时,也处理了特定分类下没有文章的空状态。
  5. 样式和布局: 示例代码中的 HTML 结构仅为演示目的,你可以根据自己的主题和设计需求进行调整,例如使用 Bootstrap 或其他 CSS 框架来美化输出。
  6. hide_empty 参数: 在 get_terms() 中使用 hide_empty =youjiankuohaophpcn true 可以确保只显示那些至少关联了一篇文章的分类术语,避免显示空分类。

总结

通过上述方法,我们可以有效地在WordPress中为自定义文章类型实现按分类法分组显示,并同时展示每个分类法的描述信息。这种结构化的展示方式不仅提升了内容的可读性,也为访问者提供了更全面的信息,是构建专业WordPress网站的常用技巧。遵循本文的指导和最佳实践,你将能够轻松地将此功能集成到你的项目中。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

385

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2111

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

357

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.10.09

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

420

2023.10.16

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

478

2023.10.16

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

231

2023.10.19

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

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

精品课程

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

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 42.4万人学习

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

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