Недавно мы обсуждали, что такое Форматы постов в WordPress, для чего они нужны и почему вам нужно их использовать. Теперь пора научиться использовать форматы записей для управления основным циклом в вашей теме для того, чтобы правильно отображать каждый тип записи.
Смотрите также:
Включение форматов записей
Прежде чем использовать форматы записей в теме, вам нужно зарегистрировать их поддержку. Каждый тип записи, встроенный (это посты и страницы) или пользовательский, должен иметь отдельно зарегистрированную поддержку.
Для постов вы используете функцию add_theme_support() (это часть вашей темы), в файле functions.php это выглядит так:
add_action( 'after_setup_theme', 'slug_post_formats' ); function slug_post_formats() { add_theme_support( 'post-formats', array( 'aside', 'image', 'video', 'audio', 'quote', 'link', 'gallery', ) ); }
Для других типов записей, включая страницы и пользовательские типы записей, вам нужно использовать add_post_type_support(). Если вы хотите, чтобы страницы поддерживали те же форматы записей, что и посты, вам нужно просто использовать такой код:
add_post_type_support( 'page', 'post-formats' );
Вы можете использовать подобный код для добавления поддержки собственных типов записей или добавить 'post-formats' к аргументу 'supports' в register_post_type() при создании типа записей.
Разные форматы для разных типов записей
В предыдущей части код, который я показал, добавлял поддержку в другие типы записей тех же форматов, что были включены для постов. Ели вы хотите, чтобы ваш пользовательский тип записи поддерживал другие форматы записей, это тоже можно сделать, используя функцию add_post_type_support() — нужно просто передать в нее массив форматов записей.
Например, чтобы добавить поддержку галерей и изображений в страницы, при добавлении собственного типа записи под названием 'products' и всех форматов, вы сделаете следующее:
add_action( 'after_setup_theme', 'slug_post_formats' ); function slug_post_formats() { add_theme_support( 'post-formats', array( 'aside', 'image', 'video', 'audio', 'quote', 'link', 'gallery', ) ); add_post_type_support( 'pages', 'post-formats', array( 'gallery', 'image' ) ); add_post_type_support( 'products', 'post-formats', array( 'video' ) ); }
Использование форматов записи в цикле
Теперь, когда ваша тема поддерживает форматы записи, переходим к тому, как их использовать.
Представляем get_template_part()
Что делает форматы записей крутыми, так это то, что у нас есть один главный цикл с отдельной разметкой для каждого формата записи в отдельных файлах. Эта функциональность обеспечивается двумя функциями и первая, с которой вам стоит познакомиться, это get_template_part().
И хотя она использует require(), если вы углубитесь в исходный код, get_template_part() дает нам более гибкие способы включать файлы шаблонов в другие шаблоны, которых не дает require(). Я говорю гибкие, поскольку в отличие от require(), get_template_part() может работать с путями, которые не существуют.
Например, get_template_part( 'content', 'foo' ); попытается загрузить файл content-foo.php, но если он не существует, то затем функция попытается загрузить вместо него content.php. А вот require( 'content-foo.php' ); вернет ошибку, если content-foo.php не существует в не зависимости от того, существует content.php или нет.
Помните, что get_template_part() нацелена на это конкретное использование, поскольку она загружает файлы, относящиеся к корню текущей темы. В результате вам не нужно использовать get_template_directory_uri() или другие подобные функции для указания точного пути.
При этом вы можете использовать ее для загрузки файлов в подпапки основной папки темы, указывая путь, относительный к корню темы в первом аргументе. Например, чтобы загрузить content-main.php из подпапки 'parts' вы можете использовать get_template_part( 'parts/content', 'main' );
Представляем get_post_format()
Вторая функция, которая делает все это возможным, это get_post_format(), которая возвращает формат записи для текущей записи в цикле. Она имеет много способов использования, но основное ее предназначение — аргумент для get_template_part(). Это то, что позволяет нам включать части контента, относящиеся к конкретным типам записей, как мы увидим далее.
Благодаря этой гибкости get_post_format() мы можем использовать эту функцию в качестве одного из аргументов, даже если у нас нет контентной части темы для каждого из используемых форматов записей.
Включаем части шаблонов в цикл
Теперь, когда вы понимаете, какие две функции делают возможным соединение отдельных контентных частей для разных форматов записей, давайте соберем все вместе.
Посмотрите на основной цикл темы Twenty Fourteen:
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); get_template_part( 'content', get_post_format() ); endwhile; twentyfourteen_paging_nav(); else : get_template_part( 'content', 'none' ); endif; ?>
Как видите, это очень простой цикл. Настоящая разметка для записей содержится в отдельных контентных частях. Благодаря гибкой природе get_template_part(), если контентной части для конкретного формата записи не существует, WordPress вернется к content.php.
Это значит, что если у текущей записи формат 'video', WordPress сначала попытается загрузить content-video.php, а если такой файл не будет найден, он вернется к content.php.
Дочерние темы и контент
Как я говорил ранее, get_template_part() понимает дочерние темы. Это значит, что если используется дочерняя тема, WordPress сначала посмотрит на файл в папке этой дочерней темы, а затем заглянет в родительскую тему.
В результате хорошим вариантом будет использовать get_template_part( 'content', get_post_format() ); чтобы включить основной цикл в вашу страницу, даже если ваша тема не поддерживает форматы записей. Таким образом дочерняя тема сможет определить поддержку формата записи и добавить свои собственные контентные части в поддерживаемые форматы записей.
Вперед, форматировать записи!
Теперь, когда вы знаете, как добавить в вашу тему поддержку форматов записей и установить разные шаблонные части в зависимости от формата записи, пора начать думать о том, как внедрить это в свою тему. Обязательно обратите внимание на код готовых тем, например Twenty Fourteen, где уже внедрены форматы записей. Это даст вам вдохновение.
Комментарии к записи: 11
Кроме первого примера, вообще ничего непонятно. Тарабарщина.
Значит вам, скорее всего, не обязательно пользоваться форматами постов)
Подскажите пожалуйста, каким плагином создать такую же красивую форму подписки после статьи, как у вас?
Mailchimp
Как переименовать стандартные названия форматов, например изображение переименовать в фотографию?
Эти понятия должны храниться в файлах локализации WordPress
понятно. при обновлении wordpress новые названия вернуться к старым, или можно файл локализации вынести отдельно?
И еще, где можно более подробно почитать про то как изменить файл отвечающий за тип поста, а то что то у меня не происходит изменений при редактировании кода в том же content-image.php
Этот файл лучше сохранить локально где нибудь, чтобы потом заменить его при обновлении WordPress. По второму вопросу к сожалению ничего не можем подсказать.
«Разные форматы для разных типов записей» — выводит весь список форматов, которые добавляли через «add_theme_support», как решить?
Подскажите пожалуйста, можно ли сделать так, чтобы эти кастомные поля имели в конце префикс .html?
https://wordpress.stackexchange.com/questions/262005/add-the-html-extension-to-custom-post-types
тут на английском, но вроде доступно.