Несколько циклов 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... это не очень хорошо, но для целей тестирования это просто нормально.