How do I query a custom post type with a custom taxonomy?

  • For some reason I'm finding it a struggle to grab any posts using a custom taxonomy... can anyone unravel my stupidity?

     $args = array(
        'post_type' => 'adverts',
        'advert_tag' => 'politics' // Doesn't seem to work.
      );
    
    query_posts($args); 
    
    while ( have_posts() ) : the_post();
     //Show Posts
    endwhile;
    

    Taxonomy Declaration:

    add_action( 'init', 'add_custom_taxonomy', 0 );
    function add_custom_taxonomy() {
    register_taxonomy('advert_tag', 'Adverts', array(
      'hierarchical' => true,
      'labels' => array(
        'name' => _x( 'Advert Tags', 'taxonomy general name' ),
        'singular_name' => _x( 'Advert Tag', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Advert Tags' ),
        'all_items' => __( 'All Advert Tags' ),
        'parent_item' => __( 'Parent Advert Tag' ),
        'parent_item_colon' => __( 'Parent Advert Tag:' ),
        'edit_item' => __( 'Edit Advert Tag' ),
        'update_item' => __( 'Update Advert Tag' ),
        'add_new_item' => __( 'Add New Advert Tag' ),
        'new_item_name' => __( 'New Advert Tag Name' ),
        'menu_name' => __( 'Advert Tags' ),
      ),
      'rewrite' => array(
        'slug' => 'advert-tags',
        'with_front' => false,
        'hierarchical' => true
      ),
    ));
      }
    

    Custom Post Type Declaration:

      add_action( 'init', 'create_post_type' );
      function create_post_type() {
        register_post_type( 'Adverts',
        array(
            'labels' => array(
                'name' => __( 'Adverts' ),
                'singular_name' => __( 'Advert'),
                'add_new' => __( 'Add New' ),
                'add_new_item' => __( 'Add a New Advert' ),
                'edit' => __( 'Edit' ),
                'edit_item' => __( 'Edit Advert' ),
                'new_item' => __( 'New Advert' ),
                'view' => __( 'View' ),
                'view_item' => __( 'View Advert' ),
                'search_items' => __( 'Search Adverts' ),
                'not_found' => __( 'No Adverts found' ),
                'not_found_in_trash' => __( 'No Adverts found in Trash' ),
                ),
            'supports' => array(
                    'title',
                    'thumbnail',
                ),
            'has_archive' => true,
            'menu_position' => 10,
            'public' => true,
            'rewrite' => array( 'slug' => 'adverts' ),
            'taxonomies' => array('advert_tag')
        )
    );
    

    }

  • Firs of all don't use query_posts() ever, read more about it here: When should you use WP_Query vs query_posts() vs get_posts()?.

    You have to use WP_Query to fetch posts what you need. Read documentation for it. In your case the query could be like this:

    $the_query = new WP_Query( array(
        'post_type' => 'Adverts',
        'tax_query' => array(
            array (
                'taxonomy' => 'advert_tag',
                'field' => 'slug',
                'terms' => 'politics',
            )
        ),
    ) );
    
    while ( $the_query->have_posts() ) :
        $the_query->the_post();
        // Show Posts ...
    endwhile;
    
    /* Restore original Post Data 
     * NB: Because we are using new WP_Query we aren't stomping on the 
     * original $wp_query and it does not need to be reset.
    */
    wp_reset_postdata();
    

    Just noticed that it seems to pull all posts with the custom post type 'Adverts'. However this seems to do the job: $the_query = new WP_Query( array( 'post_type' => 'Adverts', 'advert_tag' => 'politics' ));

    @Stephen {tax} was deprecated since version 3.1 in favor of {tax_query} and {tax_query} was introduced. this still works but we should not use the deprecated functions. tax_query is used with an array of taxonomy queries. i was working on FAQs Custom Post type and it worked for me pretty much the same way as {tax} taxonomy slug argument in WP_Query does.

License under CC-BY-SA with attribution


Content dated before 6/26/2020 9:53 AM