检查当前术语是否为另一个术语的子项

时间:2018-03-23 作者:KreigD

我正在尝试制作一个归档模板,该模板将只应用于特定术语的子类别。我的结构如下所示:

展会活动(主要分类法)展会子类别1Show subcat 1Show subcat 2 (和任何其他子类别)以获得相同的存档模板。这是我的一次尝试,但肯定行不通。这是我的functions.php.

    add_filter( \'template_include\', \'kd_event_subcategory_archive\' );

    function kd_event_subcategory_archive( $template ) {
        $term = get_queried_object()->term_id;
        if ( $term->parent == \'tradeshow\' ) {
            $event_subcat = locate_template( \'taxonomy-tradeshow-subcategory.php\' );

            return $event_subcat;
        }

        return $template;
    }
我似乎不知道如何正确地检查一个术语是否是我的孩子tradeshow 学期

2 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

有两个问题阻碍了您的检查:

    $term = get_queried_object()->term_id;
    if ( $term->parent == \'tradeshow\' ) {
从以下内容开始:

    $term = get_queried_object()->term_id;
在这里$term 包含术语的ID,而不是术语对象。假设这是第5个术语,结果是:

    $term = 5;
    if ( $term->parent == \'tradeshow\' ) {
这行不通。$term 是数字,不是对象,所以你不能->parent 在上面。

修复方法是直接使用查询的对象:

    $term = get_queried_object();
这就引出了下一个问题:

    if ( $term->parent == \'tradeshow\' ) {
父项不是字符串,而是术语ID。0 如果没有父项,则为父项的ID,如查找时所示WP_Term:

/**
 * ID of a term\'s parent term.
 *
 * @since 4.4.0
 * @var int
 */
public $parent = 0;
因此,您需要提前获取tradeshow术语以找到其ID。通常,对于这些场景,开发人员不会硬编码slug,而是提供一个列出术语的设置,并将ID存储为一个选项,以避免此类查找,并增加灵活性

但在这种情况下,您可以使用get_term_by 功能,例如。

$tradeshow = get_term_by(\'slug\', \'tradeshow\', \'events\')
然后使用:

$tradeshow->term_id === $term->parent
问题和建议这些都是我想提及的不相关的附加项目

使用调试var_dump, 调试器或其他工具,以查看$term 会暴露出这些问题。

此外,PHP错误日志将充满警告和通知,这些警告和通知指向试图执行等效于5->parent 这对PHP来说毫无意义。注意错误日志。我建议使用查询监视器插件作为捕获意外警告的简单方法

查询的对象并不总是一个术语

此代码将在每次页面加载时运行:

add_filter( \'template_include\', \'kd_event_subcategory_archive\' );

function kd_event_subcategory_archive( $template ) {
    $term = get_queried_object()->term_id;
    if ( $term->parent == \'tradeshow\' ) {
但是,如果用户访问日期档案或作者档案怎么办?现在代码仍在运行,产生错误。因此,此过滤器需要测试以检查用户是否在分类法存档中,以及分类法是否匹配。

它甚至可能是一篇单篇文章,如果贸易展术语的术语ID为5,并且您位于ID为5的文章或页面上,那么您将在分类法存档中看到一篇文章。

但我怀疑使用单独的分类法会更容易。

https://codex.wordpress.org/Function_Reference/get_queried_object

  • 如果您在一篇文章上,它将返回post对象如果您在一个页面上,它将返回page对象如果您在存档页面上,它将返回post类型对象如果您在类别存档中,它将返回category对象如果您在作者存档中,它将返回author对象等

SO网友:Jake

所有这些答案都是如此强大和冗长。我刚刚在两行代码中使用了这一点:

$term = get_queried_object();
$is_parent = $term->parent == 0 ? true : false;
本质上,这只是检查父项是否为0,如果是,则它是父项。否则,它将是一个孩子。

超级简单。

结束