Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom Post Types and Categories

I've been trying for days to create a custom post type, with categories. So far, I have this working, and I can add content easily, and assign it to a category. My code is below.

What I don't understand, and can't seem to work is creating an archive page to display posts of a category.
For example: My post type is called Adverts. My category is called Photographers.

Is it possible for the page to dynamically work out what category you're on and display all custom posts belonging to that category?

function my_custom_post_advert() {
    $labels = array(
        'name'               => _x( 'Adverts', 'post type general name' ),
        'singular_name'      => _x( 'Advert', 'post type singular name' ),
        'add_new'            => _x( 'Add New', 'advert' ),
        'add_new_item'       => __( 'Add New Advert' ),
        'edit_item'          => __( 'Edit Advert' ),
        'new_item'           => __( 'New Advert' ),
        'all_items'          => __( 'All Adverts' ),
        'view_item'          => __( 'View Advert' ),
        'search_items'       => __( 'Search Adverts' ),
        'not_found'          => __( 'No adverts found' ),
        'not_found_in_trash' => __( 'No adverts found in the Trash' ), 
        'parent_item_colon'  => '',
        'menu_name'          => 'Adverts'
    );
    $args = array(
        'labels'        => $labels,
        'description'   => 'Holds our adverts and advert specific data',
        'public'        => true,
        'menu_position' => 5,
        'supports'      => array( 'title', 'editor', 'thumbnail', 'excerpt', 'category' ),
        'has_archive'   => true,
    );
    register_post_type( 'advert', $args );  
}
add_action( 'init', 'my_custom_post_advert' );

function my_taxonomies_advert() {
    $labels = array(
        'name'              => _x( 'Advert Categories', 'taxonomy general name' ),
        'singular_name'     => _x( 'Advert Category', 'taxonomy singular name' ),
        'search_items'      => __( 'Search Advert Categories' ),
        'all_items'         => __( 'All Advert Categories' ),
        'parent_item'       => __( 'Parent Advert Category' ),
        'parent_item_colon' => __( 'Parent Advert Category:' ),
        'edit_item'         => __( 'Edit Advert Category' ), 
        'update_item'       => __( 'Update Advert Category' ),
        'add_new_item'      => __( 'Add New Advert Category' ),
        'new_item_name'     => __( 'New Advert Category' ),
        'menu_name'         => __( 'Advert Categories' ),
    );
    $args = array(
        'labels' => $labels,
        'hierarchical' => true,
    );
    register_taxonomy( 'advert_category', 'advert', $args );
}
add_action( 'init', 'my_taxonomies_advert', 0 );
like image 269
Craig Eves Avatar asked May 17 '13 15:05

Craig Eves


2 Answers

You basically need to create a page template that contains a customized wp_query so WordPress can determine what category you're on.

Once you have your page template created then you can create a page in your WordPress admin ... selecting the new page template as your template.

And if you want the category to be dynamic you could always setup your page template to accept a $_GET parameter to determine which category to display adverts from. Like so:

http://example.com/adverts-listing/?mycat=photographers

or

http://example.com/adverts-listing/?mycat=programmers

etc.

Here's an example of what the page template may look like (course this will vary on what theme you're using ... this example was built to use the twentyfourteen theme):

<?php
/**
 * Template Name: Advert Listing
 *
 */

get_header(); ?>

  <section id="primary" class="content-area">
    <div id="content" class="site-content" role="main">

    <?php
      // Set the args array for the query to happen
      $args = array(
        'post_type' => 'adverts',
        'post_status' => 'publish',
        'posts_per_page' => 10
      );

      // Dynamically set the mycat argument from a $_GET parameter
      if( isset($_GET['mycat']) ) {
        $args['tax_query'] => array(
          array(
            'taxonomy' => 'advert_category',
            'field' => 'slug',
            'terms' => $_GET['mycat']
          )
        );
      }

      // Issue the query
      $q = null;
      $q = new WP_Query($args);

      // Start the loop
      if( $q->have_posts() ) : ?>
        <header class="page-header">
          <h1 class="page-title"><?php _e( 'Advert Listing:', 'twentyfourteen' ); ?></h1>
        </header>

        <?php

        while ($q->have_posts()) : $q->the_post();
          ?>

          <article id="post-<?php the_ID(); ?>" class="post-<?php the_ID(); ?> adverts type-adverts status-publish hentry">

            <header class="entry-header">
              <a href="<?php echo get_permalink(get_the_ID()); ?>"><h3 class="entry-title"><?php the_title(); ?></h3></a>
            </header><!-- .entry-header -->

            <div class="entry-content">
              <?php the_excerpt(); ?>
            </div>

          </article>

          <?php

        endwhile;

        // Previous/next post navigation.
        twentyfourteen_paging_nav();

      else :
        // If no content, include the "No posts found" template.
        get_template_part( 'content', 'none' );

      endif;

      wp_reset_query();  // Restore global post data stomped by the_post().
      ?>

    </div><!-- #content -->
  </section><!-- #primary -->

<?php

get_sidebar( 'content' );
get_sidebar();
get_footer();
like image 149
supercleanse Avatar answered Nov 01 '22 10:11

supercleanse


You should be able to navigate to /adverts. Also, has_archive should create an archives page for you.

like image 29
Daniel Avatar answered Nov 01 '22 09:11

Daniel