Вопрос или проблема
Я использую дочернюю тему на основе ‘Twenty Seventeen’ и создал собственный тип записи (‘review’).
Я хочу создать две страницы: одну, которая перечисляет ‘reviews’, и другую, которая перечисляет смесь ‘posts’ и ‘reviews’ (в порядке недавности).
Для первой страницы я сделал копию index.php
из Twenty Seventeen и назвал ее page-reviews.php
, добавив такой код в начало:
$args = array(
'post_type' => 'review',
'orderby' => 'date',
'order' => 'DESC',
'posts_per_page' => 10,
);
$the_query = new WP_Query( $args );
Далее заменил have_posts()
и the_post()
на $the_query->have_posts()
и $the_query->the_post()
соответственно.
Если я выбираю использовать этот шаблон для страницы, он работает, и ‘reviews’ перечислены, но весь макет перепутан. В <body>
много классов, которые нарушают макет.
Например, стандартная главная страница блога с использованием index.php
имеет эти классы в <body>
и выглядит нормально:
blog logged-in admin-bar hfeed has-header-image has-sidebar colors-light customize-support
В то время как моя пользовательская страница имеет такие классы:
page-template page-template-page-postslist page-template-page-postslist-php page page-id-15071 logged-in admin-bar has-header-image page-two-column colors-light customize-support
Как я могу сделать пользовательский шаблон, который больше похож на index.php
с точки зрения классов, которые он добавляет?
Вы можете использовать фильтр классов тела, чтобы отрегулировать классы, добавляемые в тег body
.
add_filter('body_class','review_pages_classes');
function review_pages_classes($classes) {
$classes[] = 'blog';
return $classes;
}
Какие классы вам нужно добавить или удалить, вероятно, является вопросом проб и ошибок или более детального изучения таблицы стилей.
В этом случае я создам шорткод, который вы можете разместить на любой странице. Вставьте следующий код в файл functions.php
add_shortcode('review-list', 'show_review_list');
function show_review_list($attr){
$args = array(
'post_type' => 'review',
'orderby' => 'date',
'order' => 'DESC',
'posts_per_page' => 10,
);
$the_query = new WP_Query( $args );
ob_start();
//...
//Поместите код из index.php здесь, чтобы получить правильную структуру HTML
//так же, как вы сделали это раньше
//
return ob_get_clean();
}
Для использования вставьте [review-list] в любое место на странице/посте.
Ответ или решение
Создание настраиваемых шаблонов списка постов в дочерней теме Twenty Seventeen может быть сложной задачей, особенно если вы хотите добиться определенного визуального стиля и функциональности. Рассмотрим каждый аспект этого вопроса, чтобы разработать решение, которое будет соответствовать вашим специфическим требованиям.
Теория
Создание кастомных шаблонов в дочерней теме WordPress — это отличная возможность расширить функциональность сайта и адаптировать его под свои нужды. Однако, важным аспектом является понимание того, как работает система шаблонов WordPress и, в частности, как реализованы наследование и стилизация в Twenty Seventeen. Ваша задача состоит в том, чтобы создать страницу, которая будет отображать записи кастомного типа ‘review’, а также комбинированный список, содержащий как стандартные записи блога, так и записи типа ‘review’. При этом вы хотите добиться определенного вида и функциональности, не нарушая стандартный внешний вид сайта.
В вашем примере вы создали файл page-reviews.php
как копию index.php
и изменили код для запроса записей нужного типа. Это стандартный подход, когда речь идет о кастомизации вывода определенного типа контента. Однако проблема, с которой вы столкнулись, связана с CSS-классами, которые добавляются в body
и определяют стилизацию страницы.
Пример
Рассмотрим, как вы можете использовать фильтр body_class для изменения классов, добавляемых в тег body
. Этот фильтр позволяет манипулировать классами, которые WordPress автоматически добавляет в зависимости от типа шаблона, который используется. Используя функцию add_filter
, вы можете добавить или удалить нужные классы для вашей кастомной страницы.
add_filter('body_class', 'review_pages_classes');
function review_pages_classes($classes) {
if (is_page('reviews')) {
$classes[] = 'blog';
}
return $classes;
}
Данный код добавляет класс ‘blog’ на страницу с названием ‘reviews’. Это позволяет сделать стили этой страницы ближе к стилям, используемым для страниц блога, что частично решает вашу проблему со стилями.
Применение
-
Создание новой страницы-шаблона: копирование
index.php
для создания нового шаблона (page-reviews.php
) — правильный шаг. Убедитесь, что в начале файла находится заголовок шаблона, например:<?php /* Template Name: Reviews Page */
-
Коррекция классов и стилизации: настройка классов
body
. Выше был приведен пример, как добавлять класс ‘blog’ через фильтрbody_class
, что может помочь вашей странице унаследовать стили от страниц блога. -
Создание шорткода: включение функциональности через шорткод позволяет гибко размещать списки в любой странице или записи. Когда вы создаете шорткод, он предоставляет возможность динамически включать контент.
Поместите следующий код в
functions.php
:add_shortcode('review-list', 'show_review_list'); function show_review_list($attr) { $args = array( 'post_type' => 'review', 'orderby' => 'date', 'order' => 'DESC', 'posts_per_page' => 10, ); $the_query = new WP_Query($args); ob_start(); if ($the_query->have_posts()) { while ($the_query->have_posts()) { $the_query->the_post(); // Здесь вы вставляете HTML из index.php // Например: // echo '<div>' . get_the_title() . '</div>'; } } else { echo 'No reviews found'; } wp_reset_postdata(); return ob_get_clean(); }
Теперь, используя шорткод
[review-list]
, вы можете добавлять список обзоров в любой части вашего сайта. -
Тестирование и исправление: тестируйте шаблоны и шорткоды на разных страницах. Возможно, вам потребуется настроить CSS, чтобы ваши обзоры выглядели на странице именно так, как вы хотите.
Заключение
Создание кастомных шаблонов в WordPress — это не только возможность для кастомизации контента, но и задача, требующая внимательного отношения к деталям, включая стилизацию и функциональность. Используя фильтры WordPress, такие как body_class
, и расширяясь через шорткоды, вы можете получить значительное преимущество в управлении своим контентом. В итоге, адаптируя ваш сайт под специфичные нужды, вы можете существенно улучшить пользовательский опыт и внешний вид сайта.