Индивидуальный шаблон подкатегорий определенных категорий в WordPress
WordPress позволяет гибко настраивать шаблоны для определенных страниц, постов, рубрик. Достаточно создать файлы category-{slug}.php или single-{slug}.php и задать индивидуальный шаблон. Но что делать, если у нам необходимо создать определенный шаблон для подкатегорий определенной категории? Скажем, у нас есть «Новости» и подкатегории «Акции», «Новинки» и т.д. и мы бы хотели, чтобы для этих подкатегорий задать определенный шаблон? В этом нам и помогут WordPress hooks.
Функция достаточно простая, после ее применения мы сможем делать шаблоны, создав файлы subcategory-{slug}.php и subcategory-{id}.php, где slug и id — алиас и id родительской категории. Мы добавляем функцию к хуку category_template, где мы можем повлиять на выбор шаблона перед выводом содержимого на страницу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | add_action('category_template', 'delfi_load_cat_parent_template'); function delfi_load_cat_parent_template($template) { $cat_ID = absint( get_query_var('cat') ); $category = get_category( $cat_ID ); if($category->category_parent > 0) { $templates = array(); if(!is_wp_error($category)) { $templates[] = "category-{$category->slug}.php"; } $templates[] = "category-$cat_ID.php"; $parentCategory = get_category($category->category_parent); if(!is_wp_error($parentCategory)) { $templates[] = "subcategory-{$parentCategory->slug}.php"; $templates[] = "subcategory-{$parentCategory->term_id}.php"; } $templates[] = "category.php"; $template = locate_template($templates); } return $template; } |
Данный код вставляем в файл functions.php для активного шаблона.
Суть функции в следующем — если у категории есть родительская категория ($category->category_parent > 0), то задействуем наш код. Получаем данные родительской категории, ее slug и id. Формируем список возможных файлов шаблонов, в том числе и стандартные category-{slug}.php, category-{id}.php, category.php и добавляем к ним еще два возможных варианта — subcategory-{slug}.php и subcategory-{id}.php.
locate_template функция делает грязную работу за нас — проверяет наличие файлов из списка, который передали и возвращает полный путь первого найденного.
Данный код работает только на 1 уровень подкатегорий. Можно модифицировать код, использовав функцию get_category_parents, но это породит дополнительные запросы к БД и обращениям к файловой системе и рекомендуется к использованию в случае действительной необходимости.