Alter secondary loop to exclude posts from current page category

This one is even more simple. Refer to the WP_Query() category parameters. I think you will want to use 'category__not_in'.

foreach ( $random_posts_cat_array as $random_post_cat ) {
    if ( $post_cat_slug == $random_post_cat ) {
        // No posts from this category!
        $random_posts_query_args['category__not_in'] = $post_cat_id;
    }
}

Edit

So for example if a post is currently on display and its category is artists, I’d like to exclude all artists posts from being displayed but display all the other categories (stated in the code below).

Okay, so this is actually a bit different, and I think you’d want to use 'category__in' instead of 'category__not_in':

// Array to hold categories to include
$cats_to_include = array();

// Loop through category slugs, and
// add their IDs to this array
foreach ( $random_posts_cats_array as $random_post_cat ) {
    $random_post_cat_obj = get_category_by_slug( $random_post_cat );
    $cats_to_include[] = $random_post_cat_obj->term_id;
}

// unset current cat
// call this after you define $post_cat_id
if ( in_array( $post_cat_id, $cats_to_include ) ) {
    unset( $cats_to_include[$post_cat_id] );
}

// Now build custom query args
$random_posts_query_args['category__in'] = $cats_to_include;

Edit 2

Complete code (cleaned up a bit, for legibility):

<?php
// First, let's eliminate some DRY,
// by making an array of our categories
$random_posts_cat_array = array( 'artists', 'projects', 'people', 'development', 'offsite' );

// Globalize $post,
// since we're outside the primary loop
global $post;
$post_cats = get_the_category( $post->ID );
// First array object
$post_cat = $post_cats[0];
// Current post category ID
$post_cat_id = $post_cat->term_id;
// Current post category slug
$post_cat_slug = $post_cat->slug;

// Now, let's find out if we're displaying
// the category index for one of our categories
if ( in_array( $post_cat_slug, $random_posts_cat_array ) ) {

   // Set up custom loop args
    $random_posts_query_args = array(
        'posts_per_page' => 3,
        'orderby'       => 'rand',
        'post__not_in'  => array( $post->ID )
    );

    // Array to hold categories to include
    $cats_to_include = array();

    // Loop through category slugs, and
    // add their IDs to this array
    foreach ( $random_posts_cats_array as $random_post_cat ) {
        $random_post_cat_obj = get_category_by_slug( $random_post_cat );
        $cats_to_include[] = $random_post_cat_obj->term_id;
    }

    // unset current cat
    // call this after you define $post_cat_id
    if ( in_array( $post_cat_id, $cats_to_include ) ) {
        unset( $cats_to_include[$post_cat_id] );
    }

    // Now build custom query args
    $random_posts_query_args['category__in'] = $cats_to_include;

    // Run random posts query
    $random_posts_query = new WP_Query( $random_posts_query_args );

    // Setup random posts query loop
    if ( $random_posts_query->have_posts() ) : while ( $random_posts_query->have_posts() ) : $random_posts_query->the_post();

        foreach( get_the_category() as $cat ) {
            echo '<div class="module ' . $cat->slug . '" data-category="' . $cat->slug . '" >';
            ?>

            <a href="https://wordpress.stackexchange.com/questions/53865/<?php the_permalink()?>" title="<?php the_title(); ?>">
                <div class="active">
                    <div class="hover"></div>
                    <?php the_post_thumbnail(); ?>
                </div>

                <?php
                $sub_title=get_post_meta($post->ID,'subtitle',true);
                if($sub_title != '') {
                    echo '<h1>'. get_the_title() .'<span> / '. $sub_title .'</span></h1>';
                } else {
                    echo '<h1>'. get_the_title() .'</h1>';
                }

                // Call in the contents of a custom field called Excerpt,
                // and if custom field in admin panel is empty don't 
                // display <p> tags otherwise wrap contents in <p> tags
                $excerpt=get_post_meta($post->ID,'Excerpt',true);
                if($excerpt != '') {
                    echo '<p>'. $excerpt .'</p>';
                } else {
                    echo ' ';
                }
                ?>
                <p class="date"><?php the_time('YdmHi') ?></p>
            </a>
        </div>

        <?php 
    endwhile; endif;

    // Be kind; rewind
    wp_reset_postdata();

} 
?>

Edit 3

Okay, here’s why the Cat ID isn’t getting removed from the category__in array:

if ( in_array( $post_cat_id, $cats_to_include ) ) {
    unset( $cats_to_include[$post_cat_id] );
}

But here’s the array structure:

["category__in"]=> array(5) { 
    [0]=> int(1) 
    [1]=> int(6) 
    [2]=> int(3) 
    [3]=> int(5) 
    [4]=> int(7) 
}

See the problem? We’re looking at the key instead of at the value. So, try this instead:

foreach ( $cats_to_include as $cat_key => $cat_value ) {
    if ( $cat_value == $post_cat_id ) {
        unset( $cats_to_include[$cat_key] );
    }
}

Try that, and report back the var_dump() again, so we can see if $cats_to_include now gets updated properly.

Leave a Comment