Заставьте * ALL * Wordpress Категории использовать шаблон родительской категории - PullRequest
13 голосов
/ 25 июня 2010

Я хочу изменить поведение иерархии шаблонов по умолчанию и заставить все страницы уровня подкатегории, у которых нет собственного файла шаблона категории, ссылаться на файл родительского шаблона категории.В моем другом посте Ричард М. дал превосходный ответ , который решил проблему для отдельной подкатегории.Кто-нибудь знает, как это абстрагировать?

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');

Заранее спасибо.

Ответы [ 3 ]

21 голосов
/ 25 июня 2010
/**
 * 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's find it's 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's override $template and get outta here
                $template = $_template;
                break;
            }
        }
    }

    return $template;
}

add_filter( 'category_template', 'so_3119961_load_cat_parent_template' );

Это циклически изменяет родительскую иерархию, пока не будет найден непосредственный шаблон.

3 голосов
/ 16 июля 2011

Мне было интересно, как сделать то же самое для иерархических таксономий.Кажется, что ответ TheDeadMedic сработает и в этом случае с несколькими изменениями:

2 голосов
/ 16 июля 2010

Переменная TEMPLATEPATH может не работать для дочерних тем - выглядит в папке родительской темы.Вместо этого используйте STYLESHEETPATH.например,

$template = STYLESHEETPATH . "/category-{$cat->slug}.php";
...