Несколько циклов WordPress для пользовательских типов записей и таксономии без дубликатов

Я пытаюсь создать собственный шаблон для отображения нескольких циклов одного и того же пользовательского типа записи, но разных категорий.

Вот то, что я после:

Из пользовательского типа сообщения: "Портфолио"

В пользовательской категории 1 "Музыка":

  • 1 рекомендуемое сообщение сверху
  • Музыкальный заголовок
  • 3 подхитренных поста
  • 12 сообщений (только название)

В пользовательской категории 2 "Ведущие": - Ведущий рубрики - 3 сообщения

В пользовательской категории 3 "Новости": - Заголовок новости - 3 сообщения

Вот код, с которым я работаю:

    <?php if (have_posts()) : while (have_posts()) : the_post(); //WP loop ?>
         <?php the_content(); ?>
            <?php $args=array( //Loop 1
                'post_type' => 'dt_portfolio',
                'taxonomy' => 'dt_portfolio_category',
                'term' => 'music',
                'posts_per_page' => 16
                );
                $myloop = new WP_Query($args);
                if($myloop->have_posts()) : while($myloop->have_posts()) :
                $myloop->the_post();
                 ?>

                      <!--the content -->

              <?php endwhile; endif; ?>
              <?php wp_reset_query(); // end music loop ?>
            <h2>Presenters</h2>
            <?php $args=array( //Loop 2
                'post_type' => 'dt_portfolio', 
                'taxonomy' => 'dt_portfolio_category',
                'term' => 'presenters',
                'posts_per_page' => 3
                );
                $myloop = new WP_Query($args);
                if($myloop->have_posts()) : while($myloop->have_posts()) :
                $myloop->the_post();
                 ?>

                      <!--the content -->

              <?php endwhile; endif; ?>
              <?php wp_reset_query(); // end presenters loop ?>
            <h2>News</h2>
            <?php $args=array( //Loop 3
                'post_type' => 'dt_portfolio',
                'taxonomy' => 'dt_portfolio_category',
                'term' => 'news',
                'posts_per_page' => 3
                );
                $myloop = new WP_Query($args);
                if($myloop->have_posts()) : while($myloop->have_posts()) :
                $myloop->the_post();
                 ?>

                      <!--the content -->

              <?php endwhile; endif; ?>
              <?php wp_reset_query(); // end news loop ?>

       <?php endwhile; endif; // end WP loop?>

В целом 3 цикла работают отлично.

Часть, в которой мне нужна помощь, это 1-й цикл. Мне нужно взять все 16 сообщений из одной и той же пользовательской таксономии 'dt_portfolio_category' -> 'music'. Но разбейте их на 1 наиболее популярное сообщение (полная ширина), затем заголовок, затем 3 вспомогательных сообщения (3 столбца), затем 12 сообщений только с заголовком (3 столбца). Я пытался разбить его на 3 отдельных цикла, но содержимое дублируется... и я считаю, что должен быть более чистый способ сделать это.

Благодарю вас!

3 ответа

Решение

Параметры дизайна имеют незначительные изменения. Я пришел к решению, которое работает, чтобы показать:

1 полная новость

3 новости с выдержкой

1 музыкальный предмет полной ширины

16 музыкальных предметов с изображением и названием

3 сообщения из разной категории

3 сообщения из другой разной категории

Для содержания в каждом разделе я использую get_template_part.

Вот что работает:

Начните с одного цикла, чтобы показать 1-ую новостную ленту полной ширины

<?php
$args=array(
    'post_type' => 'dt_portfolio',
    'taxonomy' => 'dt_portfolio_category',
    'term' => 'news',
    'posts_per_page' => 1                
);

$fullnewsloop = new WP_Query($args);

if($fullnewsloop->have_posts()) : while($fullnewsloop->have_posts()) :
    $fullnewsloop->the_post();

    get_template_part( 'content-full-width', get_post_format() );
endwhile; endif; ?>

Используйте второй цикл, чтобы показать следующие 3 новости. Смещение - это ключ для пропуска первого новостного элемента, который уже был отображен в fullnewsloop,

<?php
$args=array(
    'post_type' => 'dt_portfolio',
    'taxonomy' => 'dt_portfolio_category',
    'term' => 'news',
    'posts_per_page' => 3,
    'offset' => 1 // this skips the first post from the news category.
);

$shortnewsloop = new WP_Query($args);

if($shortnewsloop->have_posts()) : while($shortnewsloop->have_posts()) :
    $shortnewsloop->the_post();                

    get_template_part( 'content-title-excerpt', get_post_format() );
endwhile; endif; ?>

В следующем разделе циклы повторяются с использованием различных терминов таксономии.

<?php
$args=array ( 
    'post_type' => 'dt_portfolio',
    'taxonomy' => 'dt_portfolio_category',
    'term' => 'music',
    'posts_per_page' => 1
);

$fullmusicloop = new WP_Query($args);

if($fullmusicloop->have_posts()) : while($fullmusicloop->have_posts()) :
    $fullmusicloop->the_post();

    get_template_part( 'content-full-width', get_post_format() );
endwhile; endif; ?>

<?php
$args=array(
    'post_type' => 'dt_portfolio',
    'taxonomy' => 'dt_portfolio_category',
    'term' => 'music',
    'posts_per_page' => 16,
    'offset' => 1 // this skips the post already displayed in the fullmusicloop.
);

$shortmusicloop = new WP_Query($args);

if($shortmusicloop->have_posts()) : while($shortmusicloop->have_posts()) :
    $shortmusicloop->the_post();

    get_template_part( 'content-title-image', get_post_format() );
endwhile; endif; ?>

Последний раздел - еще две петли из терминов таксономии.

<?php
$args=array(
    'post_type' => 'dt_portfolio',
    'taxonomy' => 'dt_portfolio_category',
    'term' => 'speakerss',
    'posts_per_page' => 3,
);

$speakersloop = new WP_Query($args);

if($speakersloop->have_posts()) : while($speakersloop->have_posts()) :
    $speakersloop->the_post();                

    get_template_part( 'content-title-image', get_post_format() ); 
endwhile; endif; ?>

<?php
$args=array(
    'post_type' => 'dt_portfolio',
    'taxonomy' => 'dt_portfolio_category',
    'term' => 'artists',
    'posts_per_page' => 3,
);

$artistsloop = new WP_Query($args);

if($artistsloop->have_posts()) : while($artistsloop->have_posts()) :
    $artistsloop->the_post();

    get_template_part( 'content-title-image', get_post_format() );
endwhile; endif; ?>

Чувак потренируйся с этим:

$args=array( //Loop 3
            'post_type' => 'dt_portfolio',
            'tax_query' => array(
                   array('taxonomy'=>'dt_portfolio_category',
                             'term'=> 'news',
                             'field'=>'slug')
            ),
            'posts_per_page' => 3
            );

Остальное с вашим кодом... без изменений. Надеюсь, это сработает

<?php
$args=array(
    'post_type' => 'dt_portfolio',
    'taxonomy' => 'dt_portfolio_category',
    'term' => 'music',
    'posts_per_page' => 16
);

$music = new WP_Query($args);

$counter = 1;

if($music->have_posts()) : while($music->have_posts()) :
    $music->the_post();

    if ($counter = 1){
        # code...
        # I'd use some helper functions here
        print_main_music();
    } elseif ($counter > 1 && $counter < 5) {
        # code...
        # I'd use some helper functions here
        print_featured_music();
    } else {
        # code...
        # I'd use some helper functions here
        print_other_music();
    }

    $counter++;

endwhile; endif;
?>

Вспомогательные функции должны быть в вашем functions.php подать и они должны echo- просто ваш HTML с тегами шаблона (the_content(), the_title() и т.д...); Я думаю, что вы не просите весь HTML+CSS макет, верно?

Очевидно, что вы можете смешивать HTML с PHP... это не очень хорошо, но для целей тестирования это просто нормально.

Другие вопросы по тегам