You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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')

但这个方法没生效,想请教:

  1. labels.php需要补充什么代码才能生效?
  2. 还有其他更合适的方式定义这类CPT的全局管理变量吗?

解决方案

一、修复模板部件的问题

get_template_part是用来输出HTML/模板内容的函数,无法直接返回数组键值对,所以你的写法不生效。要让模板部件方案可用,需要修改如下:

  1. 修改template-parts/labels.php,让它返回CPT数组:
<?php
// 返回音乐厂牌CPT标识数组
return array('triple', 'bloom', 'genuine', 'revma');
?>
  1. 主代码中用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:01:14