Как создать tag.php
Как создать шаблон tag.php, который будет работать для всех записей, содержащих метки?
Я создал несколько меток = Еда, Напитки и Фрукты
запись 1 имеет метки Еда и Напитки
запись 2 имеет метки Еда и Фрукты
Как создать отдельную страницу для этих записей с метками?
Мой код выглядит так, но он ничего не показывает.
function get_tags_post($tag_name){
$original_query = $wp_query;
$wp_query = null;
$brand_name = $tag_name;
$args = array(
'posts_per_page' => 5, // Количество записей на странице
'tag' => $brand_name // Название метки
);
$wp_query = new WP_Query( $args );
if ( have_posts() ) : while (have_posts()) : the_post();
echo '<li>';
single_tag_title();
echo '</li>';
endwhile; endif;
$wp_query = null;
$wp_query = $original_query;
wp_reset_postdata();
}
Пожалуйста, если кто-то знает, какая часть кода неправильная, подскажите.
К сожалению, весь ваш код неправильный. То, что вы делаете, аналогично использованию query_posts
, чего следует избегать. Кроме того, никогда не заменяйте основной запрос на архивных страницах или на главной странице пользовательским запросом.
Чтобы создать страницу тега, просто сделайте копию вашего index.php и переименуйте её в tag.php. Вот пример файла tag.php из стандартной темы twentyfourteen, чтобы дать вам представление:
<?php
/**
* Шаблон для отображения страниц тегов
*
* Используется для отображения архивных страниц записей по тегу.
*
* @link http://codex.wordpress.org/Template_Hierarchy
*
* @package WordPress
* @subpackage Twenty_Fourteen
* @since Twenty Fourteen 1.0
*/
get_header(); ?>
<section id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<?php if ( have_posts() ) : ?>
<header class="archive-header">
<h1 class="archive-title"><?php printf( __( 'Архивы по тегу: %s', 'pietergoosen' ), single_tag_title( '', false ) ); ?></h1>
<?php
// Показываем необязательное описание термина.
$term_description = term_description();
if ( ! empty( $term_description ) ) :
printf( '<div class="taxonomy-description">%s</div>', $term_description );
endif;
?>
</header><!-- .archive-header -->
<?php
$counter = 1; //Начинаем счетчик для разметки колонок записей
// Начинаем цикл.
while ( have_posts() ) : the_post();
?>
<div class="entry-column<?php echo ( $counter%2 ? ' left' : ' right' ); ?>">
<?php get_template_part( 'content', get_post_format() ); ?>
</div>
<?php
$counter++; //Обновляем счетчик
endwhile;
pietergoosen_pagination();
else :
// Если нет записей, подключаем шаблон "Записей не найдено".
get_template_part( 'content', 'none' );
endif;
?>
</div><!-- #content -->
</section><!-- #primary -->
<?php
get_sidebar( 'content' );
get_footer();
Также ознакомьтесь со следующими ссылками:
ДОПОЛНЕНИЕ
Хотел бы отметить, что ваш код должен быть правильно отформатирован. В текущем виде его сложно читать и отлаживать.
Прочитайте coding-standards/php/#indentation для получения дополнительной информации.

Если вы хотите использовать свой собственный wp_query (что, кстати, абсолютно нормально и может применяться, если вы понимаете, что делаете, и используете меры безопасности — например, старайтесь не злоупотреблять $_GET, а если используете, применяйте strip_tags() или (int), если нужно передать только число).
Вы можете выполнить запрос для архива с тегами в index.php (если хотите иметь только один универсальный шаблон для стандартных записей WordPress) или создать файл tags.php в корневой папке шаблона (там, где находятся index.php и другие файлы шаблонов). Этот файл будет идентичен index.php, но срабатывать при переходе на страницы вида: www.webage.com/tag/название-тега
Сначала используйте get_queried_object(); для получения текущего объекта. Рекомендуется сохранить его в переменную для удобства:
$qObject = get_queried_object();
Если работаете в index.php, хорошей практикой будет создать переменную для определения, является ли текущая страница архивом тегов, чтобы использовать это позже:
$isArchiveTag = (($qObject->taxonomy == 'post_tag')?true:false);
Не обязательно создавать эту переменную, если работаете в tag.php.
Теперь, если вы используете wp_query, запрос должен выглядеть так:
$postArgs = array(
'post_type' => 'post',
'showposts' => -1,
'post_status' => 'publish',
'parent' => 0,
'hide_empty' => true,
'orderby' => 'date',
'order' => 'DESC',
'tag' => (($isArchiveTag)?$qObject->slug:'')
);
$query = new WP_Query($postArgs);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$currentPost = get_post(); // если нужно сохранить данные записи в переменную
// ваш код здесь
}
}
wp_reset_postdata();
Для получения названия активного тега можно использовать:
single_tag_title( '', false );
или
$qObject->name;
Чтобы получить все теги в виде объекта WordPress и сохранить их в переменную, используйте:
$tags = get_terms('post_tag');
Удачи! :)
