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

16 августа 2016 1 501 11

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

Универсальный шаблон для WordPress — Monstroid2

Я вчера рассказывал каким образом в 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} — короткое имя рубрики.

И всё.

Всё самое новое и интересное я публикую в своём Телеграм-канале. Подписывайтесь!

Иван Данилин
Автор: Иван Данилин

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

Комментарии
  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 новых версий. Если обновление критическое, особенно если связано с безопасностью — лучше обновиться. После мажорных релизов Вордпресс, устаревшие темы/плагины часто начинают лагать. Исправления приходят в их новых версиях.

Добавить комментарий

Услуги фрилансеров по фиксированной цене — 500 р.
Подробнее