0

I'm using the following author archive code:

<?php
/**
* The template for displaying Author Archive pages.
*
* @package Cryout Creations
* @subpackage Parabola
* @since Parabola 1.0
*/

get_header(); ?>

    <section id="container" class="<?php echo parabola_get_layout_class(); ?>">
        <div id="content" role="main">
        <?php cryout_before_content_hook(); ?>

        <?php if ( have_posts() ) : ?>

            <?php
                /* Queue the first post, that way we know
                 * what author we're dealing with (if that is the case).
                 *
                 * We reset this later so we can run the loop
                 * properly with a call to rewind_posts().
                 */
                the_post();
            ?>

            <header class="page-header">
                <h1 class="page-title author"><?php printf( __( 'Author Archives: %s', 'parabola' ), '<span class="vcard"><a class="url fn n" href="' . esc_url( get_author_posts_url( get_the_author_meta( "ID" ) ) ) . '" title="' . esc_attr( get_the_author() ) . '" rel="me">' . get_the_author() . '</a></span>' ); ?></h1>
            </header>

            <?php
                /* Since we called the_post() above, we need to
                 * rewind the loop back to the beginning that way
                 * we can run the loop properly, in full.
                 */
                rewind_posts();

            // If a user has filled out their description, show a bio on their entries.
            if ( get_the_author_meta( 'description' ) ) : ?>
            <div id="author-info">
                <div id="author-avatar">
                    <?php echo get_avatar( get_the_author_meta( 'user_email' ), apply_filters( 'parabola_author_bio_avatar_size', 60 ) ); ?>
                </div><!-- #author-avatar -->
                <div id="author-description">
                    <h2><?php printf( __( 'About %s', 'parabola' ), get_the_author() ); ?></h2>
                    <?php the_author_meta( 'description' ); ?>
                </div><!-- #author-description  -->
            </div><!-- #entry-author-info -->
            <?php endif; ?>

            <?php /* Start the Loop */ ?>
            <?php while ( have_posts() ) : the_post(); ?>

                <?php
                    /* Include the Post-Format-specific template for the content.
                     * If you want to overload this in a child theme then include a file
                     * called content-___.php (where ___ is the Post Format name) and that will be used instead.
                     */
                    get_template_part( 'content/content', get_post_format() );
                ?>

            <?php endwhile; ?>

            <?php if($parabola_pagination=="Enable") parabola_pagination(); else parabola_content_nav( 'nav-below' ); ?>

        <?php else : ?>

            <article id="post-0" class="post no-results not-found">
                <header class="entry-header">
                    <h1 class="entry-title"><?php _e( 'Nothing Found', 'parabola' ); ?></h1>
                </header><!-- .entry-header -->

                <div class="entry-content">
                    <p><?php _e( 'Apologies, but no results were found for the requested archive. Perhaps searching will help find a related post.', 'parabola' ); ?></p>
                    <?php get_search_form(); ?>
                </div><!-- .entry-content -->
            </article><!-- #post-0 -->

        <?php endif; ?>

        <?php cryout_after_content_hook(); ?>
        </div><!-- #content -->
    <?php parabola_get_sidebar(); ?>
    </section><!-- #primary -->


<?php get_footer(); ?>

I need to exclude a category from the author page. However I can't get this to work.

If added

query_posts (query_posts( 'cat=-x' ); where x is category to skip), 

instead of looping through posts I always see one single/same post which is not of selected category.

Any suggestions, why this might not work?

2

1 Answer 1

1

Never use query_posts, use pre_get_posts to modify any main query.

function wpd_exclude_author_category( $query ) {
    if ( $query->is_author() && $query->is_main_query() ) {
        $query->set( 'category__not_in', array( 42 ) );
    }
}
add_action( 'pre_get_posts', 'wpd_exclude_author_category' );
4
  • could you explain why?
    – Saulius S
    Jun 25, 2014 at 7:48
  • @SauliusS The main query is run before the template is loaded (it's how WordPress knows what template to load), when you use query_posts you run a new query which overwrites that one, so for every page view you are running an extra query, which wastes cpu and memory. pre_get_posts modifies query parameters before the main query is run. for more info, read the codex entry for query_posts.
    – Milo
    Jun 25, 2014 at 8:04
  • @PieterGoosen unluckily the pre_get_posts is only partially good. Most of the single posts have paging previous/next, and pre_get_posts is not working in such case.
    – Saulius S
    Jul 13, 2014 at 0:36
  • @Milo, I think the comment above is directed at you :-) Jul 13, 2014 at 10:32

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.