Отображение записей по тегу на странице
Я пытаюсь создать расширенную страницу WordPress, которая показывает обычный контент, плюс второй раздел на той же странице, отображающий последние записи с определенным тегом X. Например, создается страница о "кошках" с картинками, контентом и т.д. После этого я хочу отобразить последние X записей с тегом "кошки". Возможно ли это сделать без использования плагинов и без создания пользовательского шаблона страницы для каждой страницы?
Возможно, это выполнимо с помощью произвольных полей и множественных циклов. Например, получить X количество записей из произвольного поля со значением "кошки". Я уже некоторое время борюсь с этой задачей и не могу найти решение, которое не требует создания шаблона для каждой отдельной страницы.
Спасибо!
Это должно сработать. Код будет проверять записи, помеченные тегом с названием текущей страницы. Нет необходимости использовать if (have_posts()):
в шаблоне страницы: если шаблон вызывается, значит запись существует :)
<div class="page-loop">
<?php
while (have_posts()) : the_post();
$page_title = strtolower(get_the_title());
the_title('<h1>','</h1>');
?>
<p><?php the_content(); ?><p>
<?php endwhile;?>
</div>
<!-- Получаем последнюю запись, помеченную тегом с названием страницы -->
<div class="related-posts">
<?php
$args = array(
'tag' => $page_title,
'posts_per_page' => 1,
);
$query = new WP_Query($args);
if ($query->have_posts()) :
while ($query->have_posts()) : $query->the_post();
the_title('<h1>','</h1>');
?>
<p><?php the_content(); ?><p>
<?php endwhile; else: ?>
<p>Извините, нет записей с этим тегом!</p>
<?php endif; wp_reset_query(); ?>
</div>
Если вы предпочитаете использовать произвольные поля для добавления 'тега' к странице (вместо использования заголовка), вы можете добавить метабокс к странице следующим образом. Добавьте этот код в файл functions.php (примечание: это добавит метабокс ко всем страницам)
/** Регистрируем метабокс */
function my_theme_add_meta_boxes() {
global $post;
add_meta_box(
'my-theme-meta',
'Выберите тег',
'my_theme_print_page_meta',
'page',
'normal',
'high'
);
}
add_action('add_meta_boxes', 'my_theme_add_meta_boxes');
/** Добавляем дополнительные метаданные к странице */
function my_theme_print_page_meta() {
global $post;
$page_tags = get_post_meta($post->ID, '_page-tags', true);
?>
<label for="page-tags">Добавьте 'тег'</label>
<input type="text" class="page-tags" name="page-tags" value="<?php echo esc_attr($page_tags); ?>" />
<?php
}
/** Сохраняем метаданные записи */
function my_theme_save_custom_meta() {
global $post;
// Предотвращаем очистку метаданных при автосохранении
if( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
return $post->ID;
}
if (isset($_POST['page-tags'])) {
$clean = sanitize_text_field($_POST['page-tags']);
update_post_meta($post->ID, '_page-tags', $clean);
}
}
add_action('save_post', 'my_theme_save_custom_meta');
Тогда ваш код в файле page.php может выглядеть так:
<div class="page-loop">
<?php
while (have_posts()) : the_post();
$page_tags = get_post_meta($post->ID, '_page-tags', true);
the_title('<h1>','</h1>');
?>
<p><?php the_content(); ?><p>
<?php endwhile;?>
</div>
<?php if ($page_tags): ?>
<!-- Получаем последнюю запись, помеченную тегом из метаданных страницы -->
<div class="related-posts">
<?php
$args = array(
'tag' => $page_tags,
'posts_per_page' => 1,
);
$query = new WP_Query($args);
if ($query->have_posts()) :
while ($query->have_posts()) : $query->the_post();
the_title('<h1>','</h1>');
?>
<p><?php the_content(); ?><p>
<?php endwhile; else: ?>
<p>Извините, нет записей с этим тегом!</p>
<?php endif; wp_reset_query(); ?>
</div>
<?php endif; // Если есть 'теги страницы' ?>

Выполните WP_Query во второй части вашей страницы:
<!-- Первая часть вашей страницы !-->
<div class="firstcontent">
<?php if ( have_posts() ) : while ( have_posts() ) : the_post();?>
<p><?php the_title(); ?><p>
<p><?php the_content(); ?><p>
<?php endwhile; endif;?>
</div>
<!-- А теперь вызываем WP_Query() !-->
<div class="secondcontent">
<!-- получаем основной запрос !-->
<?php $wp_query = new WP_Query(array(
'post_type' => 'post'
));?>
<!-- и используем его как выше !-->
<?php if ( have_posts() ) : while ( have_posts() ) : the_post();?>
<p><?php the_title(); ?><p>
<p><?php the_content(); ?><p>
<?php endwhile; endif;?>
</div>
Сейчас я работаю с темой в WordPress и использую этот подход - он действительно работает!

Выше уже есть ответы о том, как использовать циклы, поэтому я не буду добавлять больше про wp get recent posts или Параметры таксономии.
Но, возможно, вы захотите обернуть свой код в Виджет, что сделает его добавление в существующие шаблоны немного проще.
