Добавление контента на архивные страницы и страницы таксономий для пользовательских типов записей
У меня есть пользовательский тип записи "Товары" и таксономия "Применение". На странице архива "Товары" я хочу разместить пользовательский контент, который клиент сможет редактировать через WYSIWYG. То же самое относится и к странице таксономии. Я думал создать фиктивные Страницы и просто выводить контент по ID в шаблонах archive-products.php и taxonomy-usage.php, но мне интересно, есть ли более правильный способ реализации этой задачи.

Первый вариант решения — использовать Settings API и создать два поля: "Описание продуктов" и "Описание использования". После этого отображение этих полей в вашем шаблоне будет простым, например:
$options = get_option('my_theme_options');
echo $options['prod_description'];
// echo $options['usage_description'];
Однако Settings API — не самая сильная часть ядра WordPress, и, возможно, создание страницы настроек только для этих полей не стоит усилий.
Другой подход — использовать страницу (с пользовательским шаблоном страницы) в качестве архива.
Создайте страницу и назовите ее "Архив продуктов".
Вставьте в нее что-то вроде этого:
<?php
/*
Template Name: Products Archive
*/
get_header();
if ( have_posts() ) the_post();
the_content(); // это выведет содержимое страницы
$p_query = new WP_Query('post_type=products');
if ( $p_query->have_posts() ) { while( $p_query->have_posts() ) {
$p_query->the_post();
// здесь потребуется файл 'entry-product.php', куда можно поместить всю разметку продукта
get_template_part('entry', 'product');
} }
wp_reset_postdata();
get_footer();
После этого в бэкенде создайте страницу и назначьте ей только что созданный шаблон. Напишите что угодно в содержимом страницы, и при её открытии вы увидите как содержимое страницы, так и продукты.
То же самое можно сделать для страницы таксономии. Просто измените шаблон страницы и запрос в нем.
Если по какой-то причине вам нужно использовать archive-products.php
в качестве архива продуктов, альтернативный вариант — создать пользовательский шаблон, но использовать его только для получения содержимого страницы.
Создайте PHP-файл в вашей теме и назовите его 'page-prod-description.php'. В этот файл поместите только:
<?php
/*
Template Name: Products Description
*/
wp_safe_redirect( home_url() );
exit();
Этот файл создает пользовательский шаблон страницы. Этот шаблон можно привязать к страницам, но они не могут быть открыты напрямую, так как при попытке вы будете перенаправлены на главную страницу.
Теперь войдите в бэкенд и создайте страницу с названием "Описание продуктов", назначив ей только что созданный шаблон. Если вы попытаетесь открыть страницу http://example.com/product-description
, вас перенаправит на главную.
В вашем шаблоне архива продуктов, archive-products.php
, вы можете использовать содержимое, добавленное на этой странице, следующим образом:
$desc = get_pages('meta_key=_wp_page_template&meta_value=page-prod-description.php');
if ( ! empty($desc) ) {
$page = array_shift($desc);
echo apply_filters('the_content', $page->post_content );
}
Теперь ваши клиенты могут войти в бэкенд и отредактировать страницу "Описание продуктов", и всё, что написано в её содержимом, будет отображаться на странице архива.
То же самое, конечно, можно сделать и для архива таксономии.

Но это повлияет на объект main_query
$wp_query
и приведёт к тому, что он не будет выводить правильный post_type
для запроса, происходящего на страницах архивов. Это сделает ваши вызовы фильтров, таких как pre_get_posts
, для страницы архива бесполезными. Это основная проблема. Wordpress должен предоставить средства для УПРАВЛЕНИЯ контентом архивов типов записей и архивов таксономий.

Вы можете создать обычные страницы, а затем применить к ним пользовательские шаблоны, которые содержат соответствующий пользовательский цикл для вывода CPT (пользовательских типов записей). Или же можно создать страницу настроек (или добавить опцию в Настройщик темы), где клиент сможет добавлять контент через WYSIWYG-редактор, а затем выводить этот контент в соответствующем шаблоне архива.
