1
votes

I have manipulated a wordpress "blog" template to show category specific posts by using the page title as reference. That way I can create a 'News' page and it auto populates the page with all the 'News' Category posts.

This code works perfectly as written on single word Titles, however it doesn't call any posts on multi word titles. ie: 'In The News'. The page doesn't break, it just says "Sorry, no posts matched your criteria".

Any thoughts?

<?php
/**
 * Template Name: Category Posts Ultimate Template
 *
 * This template is the default page template. It is used to display content when someone is viewing a
 * singular view of a page ('page' post_type) unless another page template overrules this one.
 * @link http://codex.wordpress.org/Pages
 *
 * @package WooFramework
 * @subpackage Template
 */
    get_header();
    global $woo_options;
    /**
     * The Variables
     *
     * Setup default variables, overriding them if the "Theme Options" have been saved.
     */

        $settings = array(
                        'thumb_w' => 505, 
                        'thumb_h' => 284, 
                        'thumb_align' => 'alignleft',
                        'post_content' => 'excerpt'
                        );

        $settings = woo_get_dynamic_values( $settings );
    ?>
    <!-- #content Starts -->
    <div id="content" class="page col-full">

        <?php woo_main_before(); ?>

        <section id="main" class="col-left"> 

            <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
            <h1><?php the_title(); ?></h1>
                <?php the_content(); ?>
            <?php endwhile; else: endif; ?>

        <?php woo_loop_before(); ?> 

        <!-- Does the blog need pagination? -->
        <?php
            if ( get_query_var( 'paged') ) { $paged = get_query_var( 'paged' ); } elseif ( get_query_var( 'page') ) { $paged = get_query_var( 'page' ); } else { $paged = 1; }

            $query_args = array(
                                'post_type' => 'post', 
                                'paged' => $paged
                            );

            remove_filter( 'pre_get_posts', 'woo_exclude_categories_homepage' );

            // The Query

            query_posts('category_name='.get_the_title().'&post_status=publish,future&paged=' . get_query_var('paged'));

            if (have_posts()) { 
                $count = 0;
                while (have_posts()) { the_post(); $count++;
        ?>      

                    <!-- Post Starts -->
                    <article <?php post_class(); ?>>

                        <header>
                            <h1><a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></h1>
                        </header>

                        <?php woo_post_meta(); ?>

                        <section class="entry fix">
                            <?php if ( isset( $settings['post_content'] ) && $settings['post_content'] != 'content' ) { woo_image( 'width=' . $settings['thumb_w'] . '&height=' . $settings['thumb_h'] . '&class=thumbnail ' . $settings['thumb_align'] ); } ?>
                            <?php global $more; $more = 0; ?>                                           
                            <?php if ( isset( $settings['post_content'] ) && $settings['post_content'] == 'content' ) { the_content(__( 'Read More...', 'woothemes' ) ); } else { the_excerpt(); } ?>
                        </section>

                        <footer class="post-more">      
                            <?php if ( isset( $settings['post_content'] ) && $settings['post_content'] == 'excerpt' ) { ?>
                            <span class="read-more"><a href="<?php the_permalink(); ?>" title="<?php esc_attr_e( 'Continue Reading &rarr;', 'woothemes' ); ?>" class="button"><?php _e( 'Continue Reading', 'woothemes' ); ?></a></span>
                            <?php } ?>
                        </footer>   

                    </article><!-- /.post -->

                <?php
                        } // End WHILE Loop

                    } else {
                ?>
                    <article <?php post_class(); ?>>
                        <p><?php _e( 'Sorry, no posts matched your criteria.', 'woothemes' ); ?></p>
                    </article><!-- /.post -->
                <?php } // End IF Statement ?> 


        <?php woo_loop_after(); ?>
        <?php woo_pagenav(); ?>
        <?php wp_reset_postdata(); ?>      
        <?php wp_reset_query(); ?>            


        </section><!-- /#main -->

        <?php woo_main_after(); ?>

        <?php get_sidebar(); ?>

    </div><!-- /#content -->

<?php get_footer(); ?>
1

1 Answers

2
votes

It's not working because you can't have a space in your query. Instead of getting posts by category name, it would be better to use something like the category slug. This would not have any spaces in it and for something like 'In The News' it would probably be 'in-the-news'.

This will definitely depend on how your category slugs are named in comparison to the titles, but it's something that I have used with success in the past. So before executing your query we need to take the title and convert it to a new 'slug' that matches a category:

// Replace any spaces in the title with dashes
$title_slug = strtolower(str_replace( " ", "-" , the_title_attribute('echo=0') ) );
// Get the category object by using our new title slug
$id_obj = get_category_by_slug($title_slug);
// Get the category id so that we can use that in the query
$cat_id = $id_obj->term_id;

Then you would just change your query_posts to use the category id instead of the name:

query_posts( 'cat='.$cat_id.'&post_status=publish,future&paged='.get_query_var('paged') );

Again, this may or may not require a little tweaking of your title names and/or category slugs, but should work for you!