能否在WP Query中使用模板部件?如何统一管理音乐标签CPT?
问题背景与需求
我正在开发自定义WordPress主题,包含多个自定义文章类型(CPT):
- CPT#1:艺人(Artists)
- CPT#2:名为“Triple Cash”的音乐厂牌(CPT标识:
triple) - CPT#3:名为“Bloom”的音乐厂牌(CPT标识:
bloom) - CPT#4:名为“Genuine”的音乐厂牌(CPT标识:
genuine) - CPT#5:名为“Revma”的音乐厂牌(CPT标识:
revma)
目前在艺人归档页面,我用以下代码关联艺人与音乐厂牌,展示该艺人参与的所有专辑:
$relatedAlbums = new WP_Query(array( 'posts_per_page' => -1, 'post_type' => array('triple','bloom', 'genuine', 'revma'), 'meta_key' => 'release_date', 'orderby' => 'meta_value_num', 'order' => 'DESC', 'meta_query' => array( array( 'key' => 'related_artists', 'compare' => 'LIKE', 'value' => '"' . get_the_ID() . '"' ) ) ));
考虑到未来可能新增更多音乐厂牌,我希望统一管理所有音乐厂牌CPT的标识,避免每次新增都要修改WP_Query里的post_type数组。
我尝试用模板部件解决,代码如下:
$relatedAlbums = new WP_Query(array( 'posts_per_page' => -1, get_template_part('template-parts/labels'), 'meta_key' => 'release_date', 'orderby' => 'meta_value_num', 'order' => 'DESC', 'meta_query' => array( array( 'key' => 'related_artists', 'compare' => 'LIKE', 'value' => '"' . get_the_ID() . '"' ) ) ));
其中labels.php的内容为:
'post_type' => array('triple', 'bloom')
但这个方法没生效,想请教:
labels.php需要补充什么代码才能生效?- 还有其他更合适的方式定义这类CPT的全局管理变量吗?
解决方案
一、修复模板部件的问题
get_template_part是用来输出HTML/模板内容的函数,无法直接返回数组键值对,所以你的写法不生效。要让模板部件方案可用,需要修改如下:
- 修改
template-parts/labels.php,让它返回CPT数组:
<?php // 返回音乐厂牌CPT标识数组 return array('triple', 'bloom', 'genuine', 'revma'); ?>
- 主代码中用
include代替get_template_part,接收返回值后传入查询:
$label_cpts = include get_theme_file_path('template-parts/labels.php'); $relatedAlbums = new WP_Query(array( 'posts_per_page' => -1, 'post_type' => $label_cpts, 'meta_key' => 'release_date', 'orderby' => 'meta_value_num', 'order' => 'DESC', 'meta_query' => array( array( 'key' => 'related_artists', 'compare' => 'LIKE', 'value' => '"' . get_the_ID() . '"' ) ) ));
二、更推荐的全局管理方式
模板部件方案虽可行,但以下几种方式更符合WordPress开发规范,维护性更强:
方式1:定义主题常量
在主题的functions.php中添加常量定义:
// 全局定义音乐厂牌CPT数组 define('MUSIC_LABEL_CPTS', array('triple', 'bloom', 'genuine', 'revma'));
之后在任意需要的地方直接调用:
$relatedAlbums = new WP_Query(array( 'posts_per_page' => -1, 'post_type' => MUSIC_LABEL_CPTS, // 其余参数保持不变 ));
方式2:自定义全局函数
在functions.php中封装获取CPT数组的函数:
// 返回音乐厂牌CPT标识数组的函数 function get_music_label_cpts() { return array('triple', 'bloom', 'genuine', 'revma'); }
调用时直接传入函数返回值:
$relatedAlbums = new WP_Query(array( 'posts_per_page' => -1, 'post_type' => get_music_label_cpts(), // 其余参数保持不变 ));
方式3:自动获取所有音乐厂牌CPT(最灵活)
如果你的音乐厂牌CPT注册时有统一规则(比如名称前缀、自定义参数),可以通过代码自动过滤获取,新增厂牌后无需手动修改代码:
// 自动筛选所有音乐厂牌类型的CPT function get_music_label_cpts() { // 获取所有自定义公开CPT $all_custom_cpts = get_post_types(array( 'public' => true, '_builtin' => false ), 'names'); // 根据注册规则过滤厂牌CPT,示例:检查菜单名称是否包含"厂牌" $label_cpts = array_filter($all_custom_cpts, function($cpt) { $cpt_object = get_post_type_object($cpt); return isset($cpt_object->labels->menu_name) && str_contains($cpt_object->labels->menu_name, '厂牌'); }); return array_values($label_cpts); }
这种方式会自动识别所有符合规则的厂牌CPT,完全无需手动维护数组。
内容的提问来源于stack exchange,提问作者Charalambos
相关产品推荐
相关产品推荐

