Отображение записей по тегу на странице

6 июл. 2012 г., 04:34:56
Просмотры: 29.2K
Голосов: 3

Я пытаюсь создать расширенную страницу WordPress, которая показывает обычный контент, плюс второй раздел на той же странице, отображающий последние записи с определенным тегом X. Например, создается страница о "кошках" с картинками, контентом и т.д. После этого я хочу отобразить последние X записей с тегом "кошки". Возможно ли это сделать без использования плагинов и без создания пользовательского шаблона страницы для каждой страницы?

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

Спасибо!

4
Комментарии

Вообще-то я уже задавал подобный вопрос раньше. Посмотрите вот это: http://wordpress.stackexchange.com/q/50857/10691

its_me its_me
6 июл. 2012 г. 10:07:30

@AahanKrish Но можно ли заставить это работать с произвольными полями для вызова тегов?

Bill Bill
7 июл. 2012 г. 00:21:09

Возможно, это и получится, но я не знаю как. :) Может, стоит немного подождать

its_me its_me
7 июл. 2012 г. 04:40:06

Вы хотите получать последние записи из того же текущего списка по тегам? То есть при просмотре записей с тегом 'cats' отображать последние записи с тегом/полем 'cats' (тегированное или поле)?

Вы можете получить текущий запрос и использовать get_posts().[http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters]

Diana Diana
19 июл. 2012 г. 00:09:44
Все ответы на вопрос 3
0

Это должно сработать. Код будет проверять записи, помеченные тегом с названием текущей страницы. Нет необходимости использовать 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; // Если есть 'теги страницы' ?>
11 нояб. 2012 г. 15:13:05
2

Выполните 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 и использую этот подход - он действительно работает!

6 сент. 2012 г. 12:03:37
Комментарии

Можете привести пример в коде?

Brian Fegter Brian Fegter
6 сент. 2012 г. 13:18:43

Да, подождите две минуты, я пишу

JeanDavidDaviet JeanDavidDaviet
6 сент. 2012 г. 14:12:04
0

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

Но, возможно, вы захотите обернуть свой код в Виджет, что сделает его добавление в существующие шаблоны немного проще.

28 нояб. 2015 г. 22:09:42