How to display post category inside page.php if else statement?

I have set up a few categories and want to display specific ones based on is_page().

Inside page.php, I’ve created an if..else statement that checks the page name and prints out the specific category. My problem at the moment is that instead of just the_title being printed out the whole post is being printed.

Read More

Where am I going wrong with this?

<?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. ?>

Related posts

Leave a Reply

2 comments

  1. Many problems with your code. For one, is_page does not work inside the loop.

    Second, don’t mess with query_posts: When should you use WP_Query vs query_posts() vs get_posts()?. Really, forget about it for secondary loops.

    Your code can be simplified to the following. In functions.php, we drop one function to get the Category ID by its Name. And another to do a secondary loop using the ID. And then, in page.php a simple call to those functions.

    Documentation: Class_Reference/WP_Query.

    page.php

    Notice that you don’t need to open PHP tags at each line, that makes the code dreadly difficult to read.
    Use it only to swap between PHP and 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

    Always prefix your function names with something distinctive to avoid conflicts that may take the site down.

    /**
     * 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...';
        } 
    }
    

    Although I’ve answered within the proposed scope, I think there are better solutions to this, like:

    • a shortcode, just adapt the functions.

    • using Advanced Custom Fields to show a meta box where you can select a very specific category (don’t relying in page and category names) and use only the WP_Query function to print it out in the template.

  2. i think it’s better to get the category by the slug name.
    i’ve tried your solution, it works fine but in the case of one of my category has a name with special html characters like apostrophes or quotes it doesn’t.

    here is the piece of code edited from your solution :

    in your 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;
        }
    

    in your 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 );
        }