为子类别使用不同的模板
Use different template for children categories
我在 WordPress 中有一个父类别页面,在其下方显示一个 post 和四个子类别。四个子分类页面将共享相同的 HTML 和逻辑,但与父分类不同。父类别使用 category.php 和 category.twig 来处理其 HTML 和内容的显示。请参阅下面的代码。我怎样才能告诉 WordPress 和 Timber 对父类别(slug:故事)的子项使用 category-child.php 和 category-child.twig(示例名称)。我知道我可以为每个子 slug 或 ID 使用 category-slug.php 或 category-id.php,但这需要将相同的代码添加到四个(或更多)不同的 PHP 和 Twig 文件, 这并不理想。
category.php
/**
* @package WordPress
* @subpackage gerryfeehan
* @since 1.0.0
*/
$templates = array( 'category.twig', 'index.twig' );
$context = Timber::context();
$args = array(
'cat' => '7,5,3,4,6',
'numberposts' => 1,
'orderby' => 'date',
'order' => 'DESC',
);
$context['stories'] = Timber::get_posts($args);
$context['categories'] = Timber::get_terms('category');
$categories = get_categories(
array(
'hide_empty' => '0',
'parent' => 7,
'orderby' => 'id',
'order' => 'ASC'
)
);
// $context['categories'] = $categories;
// Updated code with suggestions from Tomek
$category = get_queried_object(); // will give you current WP_Term
if( $category->parent == 0 ) {
// parent category
$templates = array( 'category.twig' );
$context['categories'] = $categories;
} else {
// child category
$templates = array( 'category-map.twig' );
$context['categories'] = $categories;
}
// Timber::render( array( 'category.twig', 'index.twig' ), $context );
Timber::render( $templates, $context );
category.twig
{% extends "base.twig" %}
{% block content %}
<section class="stories">
<h2>Stories</h2>
{% for story in stories %}
<article class="story" id="story-{{ story.ID }}">
{% if story.thumbnail.src %}
<figure>
<img src="{{ story.thumbnail.src }}" class="" alt="{{ story.thumbnail.alt }}" />
{% if story.thumbnail.caption %}
<figcaption>{{ story.thumbnail.caption }}</figcaption>
{% endif %}
</figure>
{% endif %}
<h3 class="story__heading">
<a href="{{ story.link }}">
{{ story.title }}
</a>
</h3>
<div class="story__meta">
<time class="">{{ story.date }}</time>
</div>
<div class="story__content">
{{ story.preview.read_more(false) }}
</div>
</article>
{% endfor %}
</section>
{% if function(cat_is_ancestor_of(7, 5)) %}yolo{% endif %}
{% for category in categories %}
<div class="category">
<figure>
<figcaption>
{{ category.name }}
</figcaption>
{{ category.description }}
</figure>
</div>
{% endfor %}
{% endblock %}
可以将以下代码添加到 archive.php 文件中,但我不确定如何扩展它以满足我的需要。
else if ( is_category() ) {
$term = new Timber\Term( get_queried_object_id() );
$context['term'] = $term;
$context['title'] = single_cat_title( '', false );
array_unshift( $templates, 'archive-' . $term->slug . '.twig' );
}
完整的父子类别结构
家长:故事
儿童:在美国、加拿大、美国和世界露营。
有什么想法吗?
作为解决方案,您可以为子类别创建模板文件并通过 functions.php
包含该模板
循序渐进
创建模板文件,例如 template-sub-category.php
将代码添加到您的 functions.php
add_filter( 'template_include', 'your_prefix_set_template', 10, 1 );
function your_prefix_set_template( $template_path ) {
if ( ! is_category() ) {
return $template_path;
}
$parent_category = get_term_by( 'slug', 'stories', 'category' ); // parent category
if ( empty( $parent_category ) ) {
return $template_path;
}
$term = get_queried_object();
if ( $term->parent !== $parent_category->term_id ) { // check if is the parent category
return $template_path;
}
return locate_template( 'template-sub-category.php' );
}
在 category.php 中保留逻辑。添加类似这样的内容(sudo 代码):
$类别=get_queried_object(); // 会给你当前的 WP_Term
if($category->parent == 0) {
// parent category
$templates = array( 'parent-category.twig' );
$context['dataForParentCategory'] = array( ... );
} 否则 {
// child category
$templates = array( 'child-category.twig' );
$context['dataForChildCategory'] = array( ... );
}
Timber::render( $templates, $context );
我在 WordPress 中有一个父类别页面,在其下方显示一个 post 和四个子类别。四个子分类页面将共享相同的 HTML 和逻辑,但与父分类不同。父类别使用 category.php 和 category.twig 来处理其 HTML 和内容的显示。请参阅下面的代码。我怎样才能告诉 WordPress 和 Timber 对父类别(slug:故事)的子项使用 category-child.php 和 category-child.twig(示例名称)。我知道我可以为每个子 slug 或 ID 使用 category-slug.php 或 category-id.php,但这需要将相同的代码添加到四个(或更多)不同的 PHP 和 Twig 文件, 这并不理想。
category.php
/**
* @package WordPress
* @subpackage gerryfeehan
* @since 1.0.0
*/
$templates = array( 'category.twig', 'index.twig' );
$context = Timber::context();
$args = array(
'cat' => '7,5,3,4,6',
'numberposts' => 1,
'orderby' => 'date',
'order' => 'DESC',
);
$context['stories'] = Timber::get_posts($args);
$context['categories'] = Timber::get_terms('category');
$categories = get_categories(
array(
'hide_empty' => '0',
'parent' => 7,
'orderby' => 'id',
'order' => 'ASC'
)
);
// $context['categories'] = $categories;
// Updated code with suggestions from Tomek
$category = get_queried_object(); // will give you current WP_Term
if( $category->parent == 0 ) {
// parent category
$templates = array( 'category.twig' );
$context['categories'] = $categories;
} else {
// child category
$templates = array( 'category-map.twig' );
$context['categories'] = $categories;
}
// Timber::render( array( 'category.twig', 'index.twig' ), $context );
Timber::render( $templates, $context );
category.twig
{% extends "base.twig" %}
{% block content %}
<section class="stories">
<h2>Stories</h2>
{% for story in stories %}
<article class="story" id="story-{{ story.ID }}">
{% if story.thumbnail.src %}
<figure>
<img src="{{ story.thumbnail.src }}" class="" alt="{{ story.thumbnail.alt }}" />
{% if story.thumbnail.caption %}
<figcaption>{{ story.thumbnail.caption }}</figcaption>
{% endif %}
</figure>
{% endif %}
<h3 class="story__heading">
<a href="{{ story.link }}">
{{ story.title }}
</a>
</h3>
<div class="story__meta">
<time class="">{{ story.date }}</time>
</div>
<div class="story__content">
{{ story.preview.read_more(false) }}
</div>
</article>
{% endfor %}
</section>
{% if function(cat_is_ancestor_of(7, 5)) %}yolo{% endif %}
{% for category in categories %}
<div class="category">
<figure>
<figcaption>
{{ category.name }}
</figcaption>
{{ category.description }}
</figure>
</div>
{% endfor %}
{% endblock %}
可以将以下代码添加到 archive.php 文件中,但我不确定如何扩展它以满足我的需要。
else if ( is_category() ) {
$term = new Timber\Term( get_queried_object_id() );
$context['term'] = $term;
$context['title'] = single_cat_title( '', false );
array_unshift( $templates, 'archive-' . $term->slug . '.twig' );
}
完整的父子类别结构
家长:故事 儿童:在美国、加拿大、美国和世界露营。
有什么想法吗?
作为解决方案,您可以为子类别创建模板文件并通过 functions.php
包含该模板循序渐进
创建模板文件,例如 template-sub-category.php
将代码添加到您的 functions.php
add_filter( 'template_include', 'your_prefix_set_template', 10, 1 );
function your_prefix_set_template( $template_path ) {
if ( ! is_category() ) {
return $template_path;
}
$parent_category = get_term_by( 'slug', 'stories', 'category' ); // parent category
if ( empty( $parent_category ) ) {
return $template_path;
}
$term = get_queried_object();
if ( $term->parent !== $parent_category->term_id ) { // check if is the parent category
return $template_path;
}
return locate_template( 'template-sub-category.php' );
}
在 category.php 中保留逻辑。添加类似这样的内容(sudo 代码):
$类别=get_queried_object(); // 会给你当前的 WP_Term
if($category->parent == 0) {
// parent category
$templates = array( 'parent-category.twig' );
$context['dataForParentCategory'] = array( ... );
} 否则 {
// child category
$templates = array( 'child-category.twig' );
$context['dataForChildCategory'] = array( ... );
}
Timber::render( $templates, $context );