0

I have a few different CPTs setup; 'jobs', 'events', 'products'. They are being displayed on various pages of the site, in sidebar or footer areas.

Using the following code, my CPT gets output, but all $args are ignored except 'post_type'. Posts are output as if 'posts_per_page' => -1.

If I leave 'post_type' empty, then blog posts are loaded and all of the args work as expected.

I have the same problem no matter which CPT I use for 'post_type'. Example of 'jobs' below:

<?php
$args = array(         
    'post_type' => 'jobs', 
    'posts_per_page' => 3,
    'post_status' => 'publish',
    'order' => 'DESC',
    'orderby' => 'menu_order'
);
$wp_query = new WP_Query($args);
while ( $wp_query->have_posts() ) : $wp_query->the_post();
?>
    
// POST CONTENT
    
<?php endwhile; wp_reset_query(); ?>

CTP's are setup as follows:

add_action( 'init', 'm_jobs_init' );

function m_jobs_init() {
$labels = array(
    'name'               => __( 'Jobs' ),
    'singular_name'      => __( 'Job' ),
    'menu_name'          => __( 'Jobs' ),
    'name_admin_bar'     => __( 'Jobs' ),
    'add_new'            => __( 'Add Job' ),
    'add_new_item'       => __( 'Add New Job' ),
    'new_item'           => __( 'New Job' ),
    'edit_item'          => __( 'Edit Job' ),
    'view_item'          => __( 'View Job' ),
    'all_items'          => __( 'All Jobs' ),
    'search_items'       => __( 'Search Jobs' ),
    'parent_item_colon'  => __( 'Parent Job' ),
    'not_found'          => __( 'No Jobs Found' ),
    'not_found_in_trash' => __( 'No Jobs Found in Trash' ),
);

$args = array(
    'labels'             => $labels,
    'public'             => true,
    'publicly_queryable' => true,
    'show_ui'            => true,
    'show_in_menu'       => true,
    'show_in_nav_menus'  => true,
    'query_var'          => true,
    'rewrite'            => array( 'slug' => 'jobs' ),
    'capability_type'    => 'post',
    'has_archive'        => true,
    'hierarchical'       => true,
    'menu_position'      => null,
    'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'page-attributes','post-formats' )
);

register_post_type( 'jobs', $args );
}

Additional notes as below:

I have one pre_get_posts filter that changes the output on the archive page. I tried removing that but nothing changed with this query.

I've also been through and checked any other wp_query loops are closing with wp_reset_postdata(); but to no avail.

I've also run var_dump($wp_query); which I can see doesn't look right, but not sure where errors are coming from. A truncated version reads:

object(WP_Query)[8153]
  public 'query' => 
    array (size=5)
      'post_type' => string 'jobs' (length=4)
      'posts_per_page' => int 3
      'post_status' => string 'publish' (length=7)
      'order' => string 'DESC' (length=4)
      'paged' => int 1
  public 'query_vars' => 
    array (size=65)
      'post_type' => string 'jobs' (length=4)
      'posts_per_page' => int -1
      'post_status' => string 'publish' (length=7)
      'order' => string 'ASC' (length=3)
      'paged' => int 1

Where does this second block of data come from? This has 'posts_per_page' => int -1 and 'order' => string 'ASC' which looks like it might be the cause of the issue.

2
  • 1
    Your code looks fine to me. Have you tried disabling plugins? It's possible there a filter, such as pre_get_posts, interfering with your query.
    – vancoder
    Sep 14, 2021 at 17:51
  • @vancoder I have one pre_get_posts filter that changes the output on the archive page. I tried removing that but nothing changed with this query. I've also been through and checked any other wp_query loops are closing with wp_reset_postdata(); but to no avail. I've also run var_dump($wp_query); which I can see doesn't look right, but not sure where errors are coming from. I'll try to edit my post above with further details. Sep 14, 2021 at 21:27

1 Answer 1

0

I found the problem, thanks to @vancoder for the tip!

I have pre_get_posts attached to a function for alphabetizing product posts, which was causing everything else to be out of whack. It should have been targeting only products!

/***************************************************************
 * Change Archive sorting
 * https://codex.wordpress.org/Alphabetizing_Posts
***************************************************************/

function course_dir_sort_order( $query ) {
    if ( $query->is_archive('products') ) {
        $query->set( 'orderby', 'title' );
        $query->set( 'order', 'ASC' );
        $query->set( 'posts_per_page', '-1' );
    }
}
add_action( 'pre_get_posts', 'course_dir_sort_order' );

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.