Combining custom post type and post category

How can I query all the posts from either the custom post type (‘videos’) or with a post category (‘video’) in a loop?

I’ve managed to create a query that combines the posts from a custom post type and the normal posts using the code below, but am struggling with achieving the same with a custom post type and a post category.

Read More
<?php $args = array_merge( $wp_query->query, array( 'post_type' => array( 'post', 'videos', ) ) ); query_posts( $args ); ?>     
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

Any help would be appreciated!

This is what my slides look like:

if($query->have_posts()){
while ( $query->have_posts() ) {
    $query->the_post();
    $carousel_slide = '<li>
               <a href="<?php the_permalink(); ?>">
               <div class="tile-image"><?php the_post_thumbnail('tile-small-thumb'); ?></div>
               <div class="tile-up-arrow"></div>
               <div class="videoslider">Video</div>
               <div class="tile-post-title">
                   <h5><?php the_titlesmall('', '...', true, 55); ?></h5>
               </div>
               <div class="hover-display" ></div>
               </a>
           </li>';
    $found_posts[] = $post->ID;
    $slides[] = $carousel_slide;
}
wp_reset_postdata();

}

First off, I get a Parse error: syntax error, unexpected T_STRING on <?php the_post_thumbnail('tile-small-thumb'); ?> and a Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING on <h5><?php the_titlesmall('', '...', true, 55); ?></h5>. Removing these loads the page fine, but doesn’t render the links as links, but instead as <?php the_permalink(); ?>.

If I’m just doing everything wrong here please let me know and I’ll go ahead and close this question.

Thanks again for you time.

Related posts

Leave a Reply

2 comments

  1. Must have both

    The following arguments array searches for the post-type-slug videos and category-slug video. It doesn’t use pagination by setting posts_per_page to -1 and only returns published posts.

    $args = array(
        'post_type' => 'videos', 
        'category_name' => 'video', 
        'posts_per_page' => -1,
        'post_status' => 'publish'
      );
    

    Either this or that

    If you are trying to show posts with EITHER the post-type OR the category slug, use two queries, because they are NOT combinable by any means of the arguments array.

    $args = array(
        'post_type' => 'videos', 
        'posts_per_page' => -1,
        'post_status' => 'publish'
      );
    
    $args = array(
        'category_name' => 'video',
        'posts_per_page' => -1,
        'post_status' => 'publish'
      );
    

    However, I am noticing that you are using query_posts(). If you are trying to alter the main loop, please don’t. Use the pre_get_posts hook instead. If you are querying this for a secondary loop, use WP_Query instead.

    With WP_Query

    function create_slide() {
         return '<li>
               <a href="'. esc_attr( esc_url( get_the_permalink() ) ) .'">
               <div class="tile-image">' . get_the_post_thumbnail('tile-small-thumb') . '</div>
               <div class="tile-up-arrow"></div>
               <div class="videoslider">Video</div>
               <div class="tile-post-title">
                   <h5>' . get_the_title() . '</h5>
               </div>
               <div class="hover-display"></div>
               </a>
           </li>';
    }
    
    $slides = array();
    $displayed = array();
    $args = array(
        'post_type' => 'videos', 
        'posts_per_page' => -1,
        'post_status' => 'publish'
    );
    $query = new WP_Query( $args );
    while ( $query->have_posts() ) : $query->the_post();
        $displayed[] = get_the_ID();
        $slides[] = create_slide();
    endwhile;
    
    $args = array(
        'category_name' => 'video',
        'posts_per_page' => -1,
        'post_status' => 'publish',
        'post__not_in' =>  $displayed,
    );
    
    $query = new WP_Query( $args );
    while ( $query->have_posts() ) : $query->the_post();
        $displayed[] = get_the_ID();
        $slides[] = create_slide();
    endwhile;
    
    wp_reset_postdata();
    
    echo implode('', $slides);
    
  2. To do an OR rather than an AND, you would need custom logic, and it would be a hassle, but an unnecessary one!

    Instead of trying to get the posts AND the category, you should do 2 individual queries to grab what you want, so grab all the video posts, put them in an array, then grab all the posts in the video category, add those to the same array, then print out what you’ve got.

    Kind of like putting oranges in your shopping cart, then putting bannanas in, rather than looking endlessly for a box that has both oranges and bannanas together

    $slides = array();
    $found_posts = array();
    // get the video posts
    $query = new WP_Query(
        array(
            'post_type' => 'videos',
            'posts_per_page' => -1
        )
    );
    if($query->have_posts()){
        while ( $query->have_posts() ) {
            $query->the_post();
            $carousel_slide = 'put your slide content here, so probably an <li> element or something?';
            $found_posts[] = $post->ID;
            $slides[] = $carousel_slide;
        }
        wp_reset_postdata();
    }
    
    // get the video category
    $query = new WP_Query(
        array(
            'category_name' => 'video',
            'posts_per_page' => -1
            'post__not_in' =>  $found_posts
        )
    );
    if($query->have_posts()){
        while ( $query->have_posts() ) {
            $query->the_post();
            $carousel_slide = 'put your slide content here, so probably an <li> element or something?';
            $slides[] = $carousel_slide;
        }
    
        wp_reset_postdata();
    }
    
    // we should now have all our slides in the $slides array so lets print them out
    
    echo implode('',$slides);
    

    You will need to modify this line which appears twice:

    $carousel_slide = 'put your slide content here, so probably an <li> element or something?';
    

    So that it contains the slide html for the post, so I imagine it will likely be an li element, some calls to grab the featured image, etc but that’s beyond the scope of this question ( which is regarding queries, not how to setup JCarousel slides and featured images ).