I have a modified theme that displays CPT posts. I am creating a slider that will cycle through all the sticky posts and display them at the top of the page. 到目前为止还行。
The problem. 当我在一个特定类别中的帖子少于5个时。滑块代码不能正确显示帖子(帖子大小缩小,重复,各种奇怪的东西)。现在,在你建议我尝试另一个滑块之前,请注意这一个是硬编码到主题中的。我可以对其进行注释,为另一个滑块插入新代码,但这只是需要维护的另一个插件/主题元素。我想看看我的逻辑是否可以修正。
What I need. 我正在寻找一个if/else语句,它允许我传递两个不同的循环,一个可以传递一种类型的参数,另一个可以传递第二组参数(如果某个特定类别的帖子少于5篇,则从所有其他类别中提取)。
这是我使用的代码-ALMOST SUCCESSFULLY (有关更多信息,请参阅下面的代码)。
<div class="slider">
<ul>
<?php
$term = get_term_by(\'slug\', get_query_var(\'term\'), get_query_var(\'taxonomy\'));
$sticky = get_option(\'sticky_posts\');
$args_cat_only = array (
\'my_cat\' => $term->slug,
\'posts_per_page\' => -1,
\'post__in\' => $sticky,
\'post_type\' => MYCPT_POST_TYPE,
\'post_status\' => \'publish\',
\'orderby\' => \'rand\',
);
$cat_only_query = new WP_Query( $args_cat_only );
if ( $cat_only_query->have_posts() ) {
while ( $cat_only_query->have_posts() ) {
$cat_only_query->the_post(); ?>
<li>
// items from category only
</li>
<?php } wp_reset_postdata();
if( count($cat_only_query->posts) <= 4 ) {
$args_all_cats = array ( //Args to pull from all categories
\'orderby\' => \'rand\',
\'posts_per_page\' => -1,
//\'my_cat\' => $term->slug,
\'post__in\' => $sticky,
\'post_type\' => MYCPT_POST_TYPE,
\'post_status\' => \'publish\'
);
$cat_query_all = new WP_Query( $args_all_cats );
if( $cat_query_all->have_posts() ) {
while( $cat_query_all->have_posts() ) {
$cat_query_all->the_post(); ?>
<li>
// items from ALL categories
</li>
<?php } wp_reset_postdata();
}
}
}
?>
</ul>
此代码用于查询特定于我们所在类别的所有CPT帖子,并返回粘性帖子,除非少于5篇(4篇或更少)。在这种情况下,它会从所有类别中获取帖子。问题是因为have_posts() 仅当有帖子时返回true,当循环中没有帖子时,我的逻辑被破坏。
我可以添加另一个elseif/else语句,并运行一个没有帖子的场景,但我宁愿不这样做(除非这是唯一的方法)。我能否以某种方式修改我的第二个查询,以便在进行计数检查时,它会显示“if there are less than 5, OR there are zero, do foo“?
最合适的回答,由SO网友:socki03 整理而成
首先,我会创建一个数组,将您的帖子放入其中,创建某种计数系统。将列表项输出转储到该数组中,对其进行计数,然后使用剩余的计数调用第二个查询。
<?php
$term = get_term_by(\'slug\', get_query_var(\'term\'), get_query_var(\'taxonomy\'));
$sticky = get_option(\'sticky_posts\');
// Moved the base arguments into one array
$base_args = array(
\'posts_per_page\' => 5, // Changed to 5, because that\'s the amount you need
\'post_type\' => MYCPT_POST_TYPE,
\'orderby\' => \'rand\'
\'post__in\' => $sticky,
);
// Merge your base arguments and cat only arguments
$args_cat_only = array_merge( $base_args, array (
\'my_cat\' => $term->slug,
) );
$cat_only_query = new WP_Query( $args_cat_only );
if ( $cat_only_query->have_posts() ) {
while ( $cat_only_query->have_posts() ) { $cat_only_query->the_post();
// Start an Output Buffer
ob_start();
?>
<li>
// items from category only
</li>
<?php
// Dump output into list item array
$list_items[] = ob_get_clean();
}
wp_reset_postdata();
}
if ( count( $list_items ) < 5 ) {
// Find out how many posts you need
$post_need = 5 - count( $list_items );
// Change base args posts_per_page to only call the amount of posts you need
$base_args[\'posts_per_page\'] = $post_need;
// Run the new query based on base arguments
$fill_in_query = new WP_Query( $base_args );
if ( $fill_in_query->have_posts() ) {
while ( $fill_in_query->have_posts() ) { $fill_in_query->the_post();
// Start an Output Buffer
ob_start();
?>
<li>
// items from category only
</li>
<?php
// Dump output into list item array
$list_items[] = ob_get_clean();
}
wp_reset_postdata();
}
}
?>
<div class="slider">
<ul>
<?php echo implode( \'\', $list_items ); // Print your list items ?>
</ul>
</div>
现在唯一的问题是,第二个查询中的随机抽取从技术上讲可能会从第一个查询中抽取一个随机抽取。
我没有测试任何代码,如果您有任何问题,请告诉我。