Меняем шаблон для всех записей рубрики в WordPress

16 августа 2016 4 259 12

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

Новые лендинги

Я вчера рассказывал каким образом в WordPress можно сделать разную длину анонсов записи в зависимости от присвоенной записи рубрики. Заодно напомнил, что в WordPress имеется прекрасный внутренний механизм шаблонов. Благодаря которому быстро и легко создаются индивидуальные шаблоны для любых типов данных и таксономий. В том числе и для архивов рубрик, о которых и шла речь.

Один внимательный читатель совершенно верно заметил, что в WordPress нельзя сделать шаблон для всех записей рубрики. Имеется в виду single.php. Да, действительно, привычным способом это сделать не получится.

В single.php можно задать индивидуальный шаблон лишь для конкретных записей. Например, сверстав его заранее, назначать каждый раз при публикации. Что применимо далеко не во всех случаях. С недавних пор, а именно начиная с WordPress версии 4.4, появился встроенный механизм шаблонов записей такого вида: single-{post-type}-{slug}.php. Где {post-type} — тип данных, а {slug} — короткое имя записи. То есть для стандартных записей, нужно указывать тип данных post, для кастомных (CPT) соответствующие им имена. Ну, а {slug}, напомню, это короткое имя записи, которое указывается в URL записи.

Так как же в WordPress создать шаблон для записей конкретной категории?

На самом деле всё очень просто. Для этого можно воспользоваться небольшим хуком, который традиционно размещаем в файле functions.php активной темы или в функциональном плагине сайта.

add_filter('single_template', create_function(
	'$the_template',
	'foreach( (array) get_the_category() as $cat ) {
		if ( file_exists(TEMPLATEPATH . "/single-{$cat->slug}.php") )
			return TEMPLATEPATH . "/single-{$cat->slug}.php"; }
		return $the_template;' )
);

В результате, мы сможем создавать шаблон для записей рубрик следующим образом: single-{cat-slug}.php. Где {cat-slug} — короткое имя рубрики.

И всё.

Подпишитесь на мой телеграм и первыми получайте новые материалы, в том числе которых нет на сайте.

INNERSTAT
Лучшее за неделю

Подпишитесь на рассылку и получайте новые материалы на электронную почту

Иван Данилин

Практикующий веб-разработчик, специализируюсь на платформе Вордпресс.

Комментарии
  1. Здравствуйте, Иван. Эта тема очень горячая для меня! Я не до конца поняла…
    Объясню по порядку.

    В моей теме » Photoline Lite» можно выбирать шаблон к страницам, а к рубрикам и записям — нет, только базовый 🙁
    Шаблонов к страницам аж 4! Мне нужно изменить шаблон в записях (рубрике).

    Если я размещу хук в файле functions.php активной темы , то как мне изменить шаблон к записей или рубрике? Чисто технически не поняла…

    single-{cat-slug}.php, где {cat-slug} — короткое имя рубрики. — Это всё где я должна проделывать?

    И если в теме уже есть несколько шаблонов, может можно имя нужного мне шаблона куда-то вставить?) Заранее спасибо и простите за возможно смешные вопросы чайника)
    • Наталья, добрый день!
      Для записей — берете имеющийся в теме single.php, копируете, переименовываете его в single-{cat-slug}.php и вносите все изменения, которые должны быть в записях рубрики {cat-slug}.
      Для рубрик — берете category.php, копируете, переименовываете его в category-{cat-slug}.php — это будет шаблон рубрики {cat-slug}. Если category.php в теме нет, попробуйте использовать archive.php, index.php, taxonomy.php

      Полная иерархия шаблонов Вордпресс есть в Кодексе
    • Здравствуйте! А как быть, если в теме нет файлов single и category? Например , тема mission news…
    • Добрый день! В Mission News используется своя маршрутизация шаблонов, поэтому стандартный способ работать не будет.
      Вам нужно создать шаблон и добавить еще одно условие в функцию.

      Допустим, рубрика называется ‘test’.

      Возьмите content.php, скопируйте и переименуйте его в content-test.php
      А в functions.php найдите функцию ct_mission_news_get_content_template() и перед последним else добавьте условие

      elseif ( in_category(‘test’) ) {
      get_template_part( ‘content-test’, get_post_type() );
      }

      Вся функция будет выглядеть так

      if ( ! function_exists( ‘ct_mission_news_get_content_template’ ) ) {
      function ct_mission_news_get_content_template() {
      global $wp_query;
      $layout = get_theme_mod( ‘layout’ );

      // output ad widget area after first post
      if ( is_main_query() && $wp_query->current_post == 1 ) {
      get_sidebar( ‘after-first-post’ );
      }

      if ( is_home() || is_archive() || is_search() ) {
      if ( !empty( $layout ) && $layout != ‘simple’ && $wp_query->current_post != 0 ) {
      get_template_part( ‘content-archive-‘ . esc_attr( $layout ), get_post_type() );
      } else {
      get_template_part( ‘content-archive’, get_post_type() );
      }
      } elseif ( in_category(‘test’) ) {
      get_template_part( ‘content-test’, get_post_type() );
      } else {
      get_template_part( ‘content’, get_post_type() );
      }
      }
      }

      content-test.php — это будет шаблон записей рубрики ‘test’.
  2. Спасибо большое, а как можно изменить шаблон самой рубрики? content-test — это шаблон записей в конкретной рубрике, а какой файл нужно добавить для изменения страницы категории/рубрики сайт.ру/category/test/ ?
    • Принцип тот же, только проверяем не in_category(), а is_category()
      Скопируйте и переименуйте content-archive.php в content-archive-test.php, а в функцию (functions.php) добавьте такое условие

      elseif ( is_category(‘test’) ) {
      get_template_part( ‘content-archive-test’, get_post_type() );
      }

      Где-нибудь здесь, наверное

      if ( is_home() || is_archive() || is_search() ) {
      if ( !empty( $layout ) && $layout != ‘simple’ && $wp_query->current_post != 0 ) {
      get_template_part( ‘content-archive-‘ . esc_attr( $layout ), get_post_type() );
      } elseif ( is_category(‘test’) ) {
      get_template_part( ‘content-archive-test’, get_post_type() );
      }
      else {
      get_template_part( ‘content-archive’, get_post_type() );
      }
      } elseif ( in_category(‘test’) ) {
      get_template_part( ‘content-test’, get_post_type() );
      } else {
      get_template_part( ‘content’, get_post_type() );
      }
    • спасибо огромное, а вот эти обновления тем которые приходят, если обновить тему, то все отредактированные файлы и внесенные изменения слетят?
    • ну и последний вопрос, если можно,так ли уж нужны эти обновления тем, чтобы их устанавливать? просто уже достаточно много всего переделал под себя в шаблоне…много ли пользы от этих обновлений?
    • Это риторический вопрос, изучайте changelog новых версий. Если обновление критическое, особенно если связано с безопасностью — лучше обновиться. После мажорных релизов Вордпресс, устаревшие темы/плагины часто начинают лагать. Исправления приходят в их новых версиях.
Добавить комментарий

Премиум-темы для Вордпресс с русскоговорящей поддержкой
Подробнее