讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

AniShort
AniShort

AI短剧协同制作平台

Laper
Laper

剧本策划到成片协作

立刻MV
立刻MV

低成本歌曲 MV、视频生成

获取自定义文章类型分类描述的教程

胖宇大大_2424

胖宇大大_2424

发布时间:2025-12-02 13:15:13

|

904人浏览过

|

来源于php中文网

原创

获取自定义文章类型分类描述的教程

本教程详细介绍了如何在wordpress中,当对自定义文章类型进行分类筛选时,显示对应分类(taxonomy)的描述信息。通过先遍历分类术语,然后针对每个术语执行文章查询,可以实现将分类名称和描述与相关文章内容一同一同展示,从而构建结构化且信息丰富的页面布局。

在WordPress开发中,我们经常需要创建自定义文章类型(Custom Post Types, CPT)并为其定义自定义分类法(Custom Taxonomies),例如为“作品集”(Portfolio)文章类型创建“作品分类”(Portfolio Category)。当用户浏览或筛选这些作品时,通常希望在展示作品列表的同时,也能看到当前所选分类的详细描述。本文将指导您如何实现这一功能,通过组织查询逻辑,确保分类描述能与其关联的文章内容一同呈现。

核心思路

实现这一功能的关键在于改变传统的文章查询方式。通常我们直接查询文章,然后获取其分类信息。但为了在文章列表之前或之上显示分类描述,我们需要反向操作:首先遍历所有目标分类术语(terms),然后针对每个术语,执行一次独立的文章查询,以获取属于该术语的所有文章。这样,在每次术语循环中,我们都可以先输出术语的名称和描述,再输出其下的文章。

逐步实现

以下是实现此功能的具体步骤和代码示例:

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

首先,我们需要使用 get_terms() 函数来获取特定自定义分类法下的所有术语。

CSS
CSS

CSS 官方网站入口。访问 W3C 的 CSS 页面,查看 CSS 标准、学习资料与工作组动态;CSS 是 Web 标准,无需下载安装。

下载
<?php
// 假设您的自定义分类法是 'portfolio_category'
$terms = get_terms('portfolio_category', array(
    'hide_empty' => false // 如果需要显示没有文章的分类,设置为 false
));

// 检查是否成功获取到术语且没有WordPress错误
if (!is_wp_error($terms) && !empty($terms)) :
    // 后续操作将在该循环内部进行
endif;
?>

2. 遍历每个分类术语

获取到术语列表后,我们需要遍历它们。在每次循环中,当前 $term 对象将包含该分类术语的所有信息,包括名称 ($term->name) 和描述 ($term->description)。

<?php
// ... (接上一步代码)
if (!is_wp_error($terms) && !empty($terms)) :
    foreach ($terms as $term) :
        // 每个 $term 都是一个 WP_Term 对象
        // 可以在这里输出分类的名称和描述
?>
        <div class="category-section">
            <h2 class="category-title"><?= esc_html($term->name); ?></h2>
            <?php if (!empty($term->description)) : ?>
                <p class="category-description"><?= esc_html($term->description); ?></p>
            <?php endif; ?>

            <div class="row category-posts">
                <?php
                // 接下来将在这里查询并显示该分类下的文章
                ?>
            </div>
        </div>
<?php
    endforeach;
endif;
?>

3. 为每个术语执行文章查询

在每次术语循环内部,我们将创建一个新的 WP_Query 实例,专门查询属于当前 $term 的文章。这需要使用 tax_query 参数。

<?php
// ... (接上一步代码)
    foreach ($terms as $term) :
        // ... (输出分类名称和描述)
?>
            <div class="row category-posts">
                <?php
                $args = [
                    'post_type'      => 'YOUR_CUSTOM_POST_TYPE', // 替换为您的自定义文章类型,例如 'portfolio'
                    'post_status'    => 'publish',
                    'posts_per_page' => -1, // 显示所有文章,或指定数量
                    'tax_query'      => [
                        [
                            'taxonomy' => 'portfolio_category', // 替换为您的自定义分类法
                            'field'    => 'term_id',
                            'terms'    => $term->term_id // 根据当前循环的术语ID进行筛选
                        ]
                    ]
                ];

                $query = new WP_Query($args);

                if ($query->have_posts()) :
                    while ($query->have_posts()) :
                        $query->the_post();
                        // 在这里输出每篇文章的内容
                ?>
                        <div class="col-lg-4 post-item">
                            <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
                            <?php the_post_thumbnail('thumbnail'); // 显示文章缩略图 ?>
                            <?php the_excerpt(); // 显示文章摘要 ?>
                        </div>
                <?php
                    endwhile;
                    wp_reset_postdata(); // 重置全局文章数据,非常重要!
                else :
                    // 如果该分类下没有文章
                    echo '<p class="no-posts-found">此分类下暂无文章。</p>';
                endif;
                ?>
            </div>
<?php
    endforeach;
// ... (结束 if 语句)
?>

完整代码示例

将以上片段整合,您将得到一个功能完整的代码块,用于在WordPress页面模板中显示按分类组织的自定义文章类型,并包含分类描述:

<?php
/**
 * 模板文件示例:显示按分类组织的自定义文章类型及其描述
 * 适用于 'portfolio' 自定义文章类型和 'portfolio_category' 自定义分类法
 */

// 获取 'portfolio_category' 分类法下的所有术语
$terms = get_terms('portfolio_category', array(
    'hide_empty' => false // 如果需要显示没有文章的分类,请设置为 false
));

// 检查是否成功获取到术语且没有WordPress错误
if (!is_wp_error($terms) && !empty($terms)) :
    foreach ($terms as $term) :
?>
        <div class="category-section mb-5">
            <div class="container">
                <div class="row">
                    <div class="col-12">
                        <h2 class="category-title text-center my-4"><?= esc_html($term->name); ?></h2>
                        <?php if (!empty($term->description)) : ?>
                            <p class="category-description text-center text-muted mb-4"><?= esc_html($term->description); ?></p>
                        <?php endif; ?>
                    </div>
                </div>

                <div class="row category-posts">
                    <?php
                    // 为当前分类术语构建 WP_Query 参数
                    $args = [
                        'post_type'      => 'portfolio', // 您的自定义文章类型
                        'post_status'    => 'publish',
                        'posts_per_page' => -1, // 显示所有文章
                        'tax_query'      => [
                            [
                                'taxonomy' => 'portfolio_category', // 您的自定义分类法
                                'field'    => 'term_id',
                                'terms'    => $term->term_id // 根据当前术语ID筛选
                            ]
                        ]
                    ];

                    $query = new WP_Query($args);

                    if ($query->have_posts()) :
                        while ($query->have_posts()) :
                            $query->the_post();
                            // 输出每篇文章的HTML结构
                    ?>
                            <div class="col-lg-4 col-md-6 mb-4">
                                <div class="card h-100">
                                    <?php if (has_post_thumbnail()) : ?>
                                        <a href="<?php the_permalink(); ?>">
                                            <?php the_post_thumbnail('medium', array('class' => 'card-img-top')); ?>
                                        </a>
                                    <?php endif; ?>
                                    <div class="card-body">
                                        <h4 class="card-title">
                                            <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                                        </h4>
                                        <p class="card-text"><?php the_excerpt(); ?></p>
                                    </div>
                                    <div class="card-footer">
                                        <a href="<?php the_permalink(); ?>" class="btn btn-primary">查看详情</a>
                                    </div>
                                </div>
                            </div>
                    <?php
                        endwhile;
                        wp_reset_postdata(); // 重置全局文章数据,避免影响后续查询
                    else :
                        // 如果当前分类下没有文章
                        echo '<div class="col-12"><p class="text-center text-muted">此分类下暂无相关作品。</p></div>';
                    endif;
                    ?>
                </div> <!-- .row.category-posts -->
            </div> <!-- .container -->
        </div> <!-- .category-section -->
<?php
    endforeach;
else :
    // 如果没有找到任何分类术语
    echo '<p class="text-center text-muted">未找到任何作品分类。</p>';
endif;
?>

注意事项与最佳实践

  1. 替换占位符: 务必将代码中的 YOUR_CUSTOM_POST_TYPE 和 portfolio_category 替换为您实际使用的自定义文章类型和自定义分类法名称。
  2. wp_reset_postdata(): 在每次 WP_Query 循环结束后,调用 wp_reset_postdata() 至关重要。它会重置全局的 $post 数据,确保后续的WordPress循环(例如主查询或页面上的其他查询)不会受到当前自定义查询的影响。
  3. 错误处理: 使用 !is_wp_error($terms) 检查 get_terms() 是否返回了错误,增强代码的健壮性。
  4. hide_empty 参数: get_terms() 函数的 hide_empty 参数决定是否显示没有关联文章的分类。根据您的需求设置为 true (默认) 或 false。
  5. 性能考虑: posts_per_page => -1 会获取所有匹配的文章。如果某个分类下的文章数量非常大,这可能会影响页面加载性能。对于大量文章的分类,您可能需要考虑分页或限制显示数量。
  6. HTML 结构: 示例代码提供了基本的 HTML 结构,您可以根据自己的前端设计和 CSS 框架(如 Bootstrap)进行调整和美化。
  7. 可访问性: 确保您的 HTML 结构和内容符合可访问性标准。

总结

通过上述方法,您可以有效地在WordPress中展示按自定义分类法组织的自定义文章类型,并为每个分类提供详细的描述。这种结构化的内容展示方式不仅提升了用户体验,也使得页面内容更具信息量和可读性,特别适用于作品集、产品目录或知识库等场景。理解并应用这种“先分类后文章”的查询逻辑,是WordPress高级开发中一项非常实用的技能。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
bootstrap框架介绍
bootstrap框架介绍

本专题整合了bootstrap框架相关介绍,阅读专题下面的文章了解更多详细内容。

785

2026.03.18

bootstrap安装教程
bootstrap安装教程

本专题整合了bootstrap安装相关教程,阅读专题下面的文章了解更多详细操作教程。

199

2026.03.18

wordpress seo
wordpress seo

WordPress网站SEO优化方法有:1、选择一个SEO友好的主题,具有清晰的代码结构,快速的加载速度和响应式设计;2、使用SEO插件,优化你的标题标签,元描述,关键字,XML站点地图等;3、优化你的内容,内容是SEO优化的核心;4、优化你的网站速度;5、创建友好的URL;6、使用内部链接;7、优化图像;8、使用社交媒体;9、定期更新你的网站;10、监控和分析你的网站等等。

6775

2023.09.18

wordpress下载后怎么安装
wordpress下载后怎么安装

安装前准备:确保服务器满足要求、获取安装文件、创建数据库。上传 wordpress 文件。创建数据库和用户。运行安装程序:选择语言、输入数据库信息、网站标题和管理员信息。安装 wordpress。安装后配置:设置永久链接、安装主题、安装插件、创建内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

6839

2024.04.15

WordPress插件教程
WordPress插件教程

本专题整理热门WordPress插件资源,涵盖SEO优化、缓存加速、安全防护、表单管理、电商扩展等插件推荐与使用教程。

338

2026.06.16

WordPress建站教程大全
WordPress建站教程大全

本专题汇总WordPress教程相关内容,包括WordPress安装教程、建站教程、使用技巧、网站管理经验和实战案例,帮助用户快速掌握WordPress建站与运营方法。

900

2026.06.16

WordPress开发教程
WordPress开发教程

本专题提供WordPress开发技术资料,包括主题开发、插件开发、自定义功能开发、API调用及性能优化等内容。

1038

2026.06.16

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

0

2026.11.12

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn