Сделать * ALL * Категории Wordpress используют шаблон родительской категории
Я хочу изменить поведение иерархии шаблонов по умолчанию и заставить все страницы уровня подкатегорий, у которых нет собственного файла шаблона категории, ссылаться на файл шаблона родительской категории. В моем другом сообщении Ричард М. дал отличный ответ, который решил проблему для отдельной подкатегории. Кто-нибудь знает, как отвлечь его?
function myTemplateSelect()
{
if (is_category()) {
if (is_category(get_cat_id('projects')) || cat_is_ancestor_of(get_cat_id('projects'), get_query_var('cat'))) {
load_template(TEMPLATEPATH . '/category-projects.php');
exit;
}
}
}
add_action('template_redirect', 'myTemplateSelect');
Спасибо заранее.
Ответы
Ответ 1
/**
* Iterate up current category hierarchy until a template is found.
*
* @link http://stackoverflow.com/a/3120150/247223
*/
function so_3119961_load_cat_parent_template( $template ) {
if ( basename( $template ) === 'category.php' ) { // No custom template for this specific term, let find it parent
$term = get_queried_object();
while ( $term->parent ) {
$term = get_category( $term->parent );
if ( ! $term || is_wp_error( $term ) )
break; // No valid parent
if ( $_template = locate_template( "category-{$term->slug}.php" ) ) {
// Found ya! Let override $template and get outta here
$template = $_template;
break;
}
}
}
return $template;
}
add_filter( 'category_template', 'so_3119961_load_cat_parent_template' );
Это завершает родительскую иерархию до тех пор, пока не будет найден немедленный шаблон.
Ответ 2
Мне было интересно, как сделать то же самое для иерархических таксономий. Ответ на DeadMedic, похоже, работает в этом случае с несколькими настройками:
function load_tax_parent_template() {
global $wp_query;
if (!$wp_query->is_tax)
return true; // saves a bit of nesting
// get current category object
$tax = $wp_query->get_queried_object();
// trace back the parent hierarchy and locate a template
while ($tax && !is_wp_error($tax)) {
$template = STYLESHEETPATH . "/taxonomy-{$tax->slug}.php";
if (file_exists($template)) {
load_template($template);
exit;
}
$tax = $tax->parent ? get_term($tax->parent, $tax->taxonomy) : false;
}
}
add_action('template_redirect', 'load_tax_parent_template');
Ответ 3
Переменная TEMPLATEPATH может не работать для дочерних тем - выглядит в родительской папке темы.
Вместо этого используйте STYLESHEETPATH. например.
$template = STYLESHEETPATH . "/category-{$cat->slug}.php";