我设置了几个类别,并希望根据is_page()
显示特定类别。
在page.php
内,我创建了一个if..else
语句,用于检查页面名称并打印出特定类别。我现在的问题是,不是只打印the_title
,而是打印整个帖子。
我在哪里错了?
<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'content', 'page' ); ?>
<?php if ( is_page( 'Greywater Recycling' ) ) { ?>
<div class="col">
<?php query_posts( 'category_name=Greywater Recycling&posts_per_page=5'); if (have_posts()) : while (have_posts()) : the_post(); ?>
<h2><?php the_title(); ?></h2>
<?php endwhile; endif; ?>
</div>
<?php } else if ( is_page( 'Stormwater Management' ) ) { ?>
<div class="col">
<?php query_posts( 'category_name=Stormwater Management&posts_per_page=5'); if (have_posts()) : while (have_posts()) : the_post(); ?>
<h2><?php the_title(); ?></h2>
<?php endwhile; endif; ?>
</div>
<?php } else if ( is_page( 'Rainwater Harvesting' ) ) { ?>
<div class="col">
<?php query_posts( 'category_name=Rainwater Harvesting&posts_per_page=5'); if (have_posts()) : while (have_posts()) : the_post(); ?>
<h2><?php the_title(); ?></h2>
<?php endwhile; endif; ?>
</div>
<?php } ?>
<?php endwhile; // end of the loop. ?>
答案 0 :(得分:1)
您的代码存在许多问题。例如,循环中的 is_page
does not work。
其次,不要混淆query_posts
:When should you use WP_Query vs query_posts() vs get_posts()?。真的,忘掉它用于二次循环。
您的代码可以简化为以下内容。在functions.php
中,我们删除一个函数以通过其名称获取类别ID。另一个使用ID进行二次循环。然后,在page.php
中对这些函数进行简单调用。
page.php
请注意,您不需要在每一行打开PHP标记,这使代码难以阅读。
仅用于在PHP和HTML之间交换
<?php
get_template_part( 'content', 'page' );
// This page title
$the_title = get_the_title();
// Search for category with the same name of the page
$category = brsfl_get_category_id( $the_title );
// Category found, go to the secondary loop
if( $category ) {
brsfl_check_print_categories( $category );
}
functions.php
始终在功能名称前加上一些独特的内容,以避免可能导致网站崩溃的冲突。
/**
* Get the category ID based on its name
*/
function brsfl_get_category_id( $cat_name )
{
$term = get_term_by( 'name', $cat_name, 'category' );
// term found, return its ID
if( $term ) {
return $term->term_id;
}
// not found
return false;
}
/**
* Print a loop based on a category ID
*/
function brsfl_check_print_categories( $cat_id )
{
$args = array(
'post_type' => 'post',
'cat' => $cat_id,
'posts_per_page' => 5
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() )
{
while ( $the_query->have_posts() ) :
$the_query->the_post();
echo '<h2>' . get_the_title() . '</h2>';
endwhile;
}
else
{
echo 'No posts found...';
}
}
虽然我已在建议的范围内回答,但我认为有更好的解决方案,例如:
a shortcode,只需调整功能即可。
使用Advanced Custom Fields显示一个元框,您可以在其中选择一个非常特定的类别(不依赖于页面和类别名称)并仅使用WP_Query
函数将其打印出来在模板中。
答案 1 :(得分:0)
我认为通过slug名称获取类别更好。 我已经尝试过你的解决方案,它工作正常,但在我的类别中有一个名称带有特殊的html字符,如撇号或引号,但它没有。
这是从您的解决方案编辑的代码片段:
你的functions.php中的
function brsfl_get_category_id($cat_name){
$term = get_term_by( 'slug', $cat_name, 'category' );
if( $term ) {
return $term->term_id;
}
return false;
}
你的page.php中的
$the_slug = get_post(get_the_ID())->post_name;
$category = brsfl_get_category_id( $the_slug );
if( $category ) {
brsfl_check_print_categories( $category );
}