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 );
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();
You should be able to navigate to /adverts. Also, has_archive
should create an archives page for you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With