Добавление контента на архивные страницы и страницы таксономий для пользовательских типов записей

7 февр. 2014 г., 05:19:57
Просмотры: 13.5K
Голосов: 9

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

0
Все ответы на вопрос 2
2
13

Первый вариант решения — использовать 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 );
}

Теперь ваши клиенты могут войти в бэкенд и отредактировать страницу "Описание продуктов", и всё, что написано в её содержимом, будет отображаться на странице архива.

То же самое, конечно, можно сделать и для архива таксономии.

7 февр. 2014 г. 12:48:51
Комментарии

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

Solomon Closson Solomon Closson
11 нояб. 2017 г. 02:00:02

Оба предложенных вами метода — это Неряшливый способ решения этой проблемы. К сожалению, чистого способа сделать это нет. Wordpress должен предоставить чистый способ, ИМХО!

Solomon Closson Solomon Closson
11 нояб. 2017 г. 02:01:37
1

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

7 февр. 2014 г. 08:22:04
Комментарии

Можете привести пример базового кода, который бы вы использовали для этого?

Brad Dalton Brad Dalton
7 февр. 2014 г. 11:11:11