WordPress 子、孙、曾孙类别必须使用父类别模板

WordPress child, grandchild, great grandchild categories must use parent category template

我创建了一个名为 category-south-africa.php 的模板。我希望所有子、孙、曾孙类别自动使用此模板。例如,所有这些类别都必须使用 category-south-africa.php 模板:

/category/south-africa/
/category/south-africa/stellenbosch/
/category/south-africa/stellenbosch/wine-farm/
/category/south-africa/stellenbosch/wine-farm/wine-varietal/

有人可能有 php 功能解决方案吗?

get_ancestors() 即 returns 包含任何给定类别的父项的数组。

使用类似 get_ancestors( child_category_id, 'category' );

检查值是否在数组中。如果是,则定义模板名称。

您可以为此创建自己的模板。您可以检查 category_template 过滤器并执行类似的操作。

add_filter('category_template', 'add_top_term_template');
function add_top_term_template($template) {
    $term = get_queried_object();
    $parent = $term->parent;

    if($parent === 0) {
        return $template;
    }
    $topLevel = null;
    while($parent !== 0) {
        $topLevel = get_term($parent);
        $parent = $topLevel->parent;
    }

    $templates = ["term-top-level-{$topLevel->slug}.php"];
    
    return locate_template($templates);
}

您可以在此处找到有关过滤器的更多信息:https://codex.wordpress.org/Plugin_API/Filter_Reference/category_template

您可以使用此功能检查当前类别是否为子类别,并将模板设置为与父类别相同的模板。将其放入主题的 functions.php。

function childcategory_template( $template ) {
    $cat = get_queried_object();
    if( 0 < $cat->category_parent )
        $template = locate_template( 'category-south-africa.php');
    return $template;
    }
    add_filter( 'category_template', 'childcategory_template' );

评论后编辑:您还可以检查名称(slug)并设置 $template 变量以考虑父项的名称(slug)。

function childcategory_template( $template ) {
    $cat = get_queried_object();
    if( 0 < $cat->category_parent )
        $parent_id = $cat->category_parent;
        if ( get_category( $parent_id )->slug == "south-africa" ) {
            $template = locate_template( 'category-south-africa.php');
        } else if ( get_category( $parent_id )->slug == "north-africa" ) {
            $template = locate_template( 'category-north-africa.php');
        }
    return $template;
    }
    add_filter( 'category_template', 'childcategory_template' );