如何在服务页面展示Services分类所有文章及自定义文章分类名称与发布日期
解决WordPress自定义文章类型Services的两个展示需求
我正在开发首个WordPress主题,有两个核心需求:
- 在服务页面展示Service Categories分类下的所有文章;
- 在自定义文章类型services的单篇文章预览中,仅显示该文章选中的分类名称(不带链接)以及发布日期。
此前尝试使用get_terms()函数,但该函数会返回所有分类,无法满足单篇文章仅显示对应选中分类的需求。以下是已注册的services自定义文章类型及相关分类的代码,以及一段尝试实现分类文章展示的代码:
已注册的自定义文章类型与分类代码
function create_services_taxonomy() { // Services Categories register_taxonomy('service_category', 'services', array( 'labels' => array( 'name' => 'Service Categories', 'singular_name' => 'Service Category', 'search_items' => 'Search Service Categories', 'all_items' => 'All Service Categories', 'edit_item' => 'Edit Service Category', 'update_item' => 'Update Service Category', 'add_new_item' => 'Add New Service Category', 'new_item_name' => 'New Service Category Name', 'menu_name' => 'Service Categories', ), 'hierarchical' => true, // 类似默认分类结构 'show_admin_column' => true, 'show_in_rest' => true, // 支持Gutenberg编辑器 'rewrite' => array('slug' => 'service-category'), )); // Services Tags register_taxonomy('service_tag', 'services', array( 'labels' => array( 'name' => 'Service Tags', 'singular_name' => 'Service Tag', 'search_items' => 'Search Service Tags', 'all_items' => 'All Service Tags', 'edit_item' => 'Edit Service Tag', 'update_item' => 'Update Service Tag', 'add_new_item' => 'Add New Service Tag', 'new_item_name' => 'New Service Tag Name', 'menu_name' => 'Service Tags', ), 'hierarchical' => false, // 类似默认标签结构 'show_admin_column' => true, 'show_in_rest' => true, // 支持Gutenberg编辑器 'rewrite' => array('slug' => 'service-tag'), )); } add_action('init', 'create_services_taxonomy'); function create_services_post_type() { register_post_type('services', array( 'labels' => array( 'name' => 'Services', 'singular_name' => 'Service', 'add_new' => 'Add New', 'add_new_item' => 'Add New Service', 'edit_item' => 'Edit Service', 'new_item' => 'New Service', 'view_item' => 'View Service', 'search_items' => 'Search Services', 'not_found' => 'No services found', 'not_found_in_trash' => 'No services found in Trash', ), 'public' => true, 'has_archive' => true, 'supports' => array('title', 'editor', 'thumbnail', 'custom-fields'), // 可按需添加更多支持项 'show_in_rest' => true, // 支持Gutenberg编辑器 'rewrite' => array('slug' => 'services'), )); } add_action('init', 'create_services_post_type');
此前尝试的分类文章展示代码
<?php // 获取'services'分类法下的所有分类项 $terms = get_terms(array( 'taxonomy' => 'services', 'hide_empty' => false, // 设为true则仅显示包含文章的分类 )); if (!empty($terms) && !is_wp_error($terms)) { foreach ($terms as $term) { echo '<h2>' . esc_html($term->name) . '</h2>'; echo '<p>' . esc_html(term_description($term)) . '</p>'; // 查询当前分类下的文章 $term_posts = new WP_Query(array( 'post_type' => 'services', // 替换为你的自定义文章类型 'tax_query' => array( array( 'taxonomy' => 'services', 'field' => 'term_id', 'terms' => $term->term_id, ), ), )); if ($term_posts->have_posts()) { echo '<ul>'; while ($term_posts->have_posts()) { $term_posts->the_post(); echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>'; } echo '</ul>'; wp_reset_postdata(); } else { echo '该服务分类下暂无文章。'; } } } else { echo '未找到服务分类。'; } ?>
解决方案
一、修正服务页面的分类文章展示代码
此前代码的核心问题是taxonomy参数错误,你注册的分类法是service_category,而非services。以下是修正后的代码:
<?php // 获取Service Categories分类下的所有分类项(仅显示包含文章的分类) $terms = get_terms(array( 'taxonomy' => 'service_category', 'hide_empty' => true, )); if (!empty($terms) && !is_wp_error($terms)) { foreach ($terms as $term) { echo '<h2>' . esc_html($term->name) . '</h2>'; echo '<p>' . esc_html(term_description($term)) . '</p>'; // 查询当前分类下的所有services文章 $term_posts = new WP_Query(array( 'post_type' => 'services', 'tax_query' => array( array( 'taxonomy' => 'service_category', 'field' => 'term_id', 'terms' => $term->term_id, ), ), 'posts_per_page' => -1, // 显示该分类下所有文章 )); if ($term_posts->have_posts()) { echo '<ul>'; while ($term_posts->have_posts()) { $term_posts->the_post(); echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>'; } echo '</ul>'; wp_reset_postdata(); } else { echo '<p>该分类下暂无服务内容</p>'; } } } else { echo '<p>暂无服务分类</p>'; } ?>
二、在services单篇文章中显示选中分类与发布日期
使用get_the_terms()函数获取当前文章关联的分类,而非get_terms()。将以下代码放入你的single-services.php模板中合适位置:
<?php // 获取当前文章所属的Service Categories分类 $service_categories = get_the_terms(get_the_ID(), 'service_category'); // 显示分类名称(不带链接) if (!empty($service_categories) && !is_wp_error($service_categories)) { echo '<div class="service-category">'; echo '<span>分类:</span>'; $category_names = array(); foreach ($service_categories as $category) { $category_names[] = esc_html($category->name); } echo implode(', ', $category_names); echo '</div>'; } // 显示发布日期(可自定义格式) echo '<div class="service-date">'; echo '<span>发布日期:</span>' . get_the_date('Y年m月d日'); echo '</div>'; ?>
说明:
get_the_terms()仅返回当前文章关联的分类项,完美解决单篇文章显示对应分类的需求;get_the_date()的参数可按需调整日期格式,比如'F j, Y'对应英文格式“January 1, 2024”。
内容的提问来源于stack exchange,提问作者iCreative Code
相关产品推荐
相关产品推荐

