You have serious issues with your naming conventions, structure of your functions, invalid usage of reserved names and wrong values passed to parameters
First, naming coventions. Function names should be lowercase letters, should not start with a letter and words should be divided by underscores (_
). The same goes for custom post type and taxonomy names. Drop your capital letters. The same goes for rewrite rules
Secondly, don’t create multiple instances that should be hooked to the same function. Properly group your code together in one function, and add that one function to your intended hook, in this case init
Thirdly, don’t use reserved names, even to rewrite slugs. It is confusing and might conflict later with the template hierarchy. In your case, you’ve use category
, which is a reserved name.
Lastly, have a look at the codex for the correct values that should be passed to a particular parameter. cat
excepts only category ID’s, not slugs or name. BTW, you are making use of a custom taxonomy, so you should use the tax_query
parameter and not the category parameters.
For reference
EDIT
One thing I forgot to add, wp_reset_query
is suppose to be used with query_posts
, which you should never use. Whenever using WP_Query
and get_posts
, you need to reset your custom query with wp_reset_postdata
EDIT 2
You’ve missed a couple of points here that I spoke about. What is confusing is that you’ve changed a few things you’ve should have. Before I post code just a few extra things
-
When you create a custom taxonomy, and you need to it to function like build-in categories, you need to set
hierarchical
to true. When you set it to false, your custom taxonomy behave like build-in post tags -
Whenever you create a “category” in a custom taxonomy, it is known as a term.
-
Your taxonomy is called
project
, yet you passInitiatieffase
(which I think might be a term of the taxonomyproject
to the taxonomy parameter. -
When you set field in your
tax_query
toslug
, you have to use the slug of your term in theterms
parameter, not the name of the term. -
Your custom post type is called
project_post_type
but you passproject
(which is your taxonomy name) to thepost_type
parameter in your custom query
This is how your code should look like
<?php
// Register Custom Post Type
function create_cpt_and_ct() {
$labels1 = array(
'name' => _x( 'Projects', 'Post Type General Name', 'text_domain' ),
'singular_name' => _x( 'Project', 'Post Type Singular Name', 'text_domain' ),
'menu_name' => __( 'Project', 'text_domain' ),
'parent_item_colon' => __( 'Parent Item:', 'text_domain' ),
'all_items' => __( 'All Items', 'text_domain' ),
'view_item' => __( 'View Item', 'text_domain' ),
'add_new_item' => __( 'Add New Item', 'text_domain' ),
'add_new' => __( 'Add New', 'text_domain' ),
'edit_item' => __( 'Edit Item', 'text_domain' ),
'update_item' => __( 'Update Item', 'text_domain' ),
'search_items' => __( 'Search Item', 'text_domain' ),
'not_found' => __( 'Not found', 'text_domain' ),
'not_found_in_trash' => __( 'Not found in Trash', 'text_domain' ),
);
$args1 = array(
'label' => __( 'project_post_type', 'text_domain' ),
'description' => __( 'Project Description', 'text_domain' ),
'labels' => $labels1,
'supports' => array( 'title', 'editor', 'thumbnail', ),
'taxonomies' => array( 'project' ),
'hierarchical' => false,
'public' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'show_in_admin_bar' => true,
'menu_icon' => get_template_directory_uri() . '/img/project-icon.png',
'menu_position' => 5,
'can_export' => true,
'has_archive' => true,
'exclude_from_search' => false,
'publicly_queryable' => true,
'capability_type' => 'post',
);
register_post_type( 'project_post_type', $args1 );
$labels2 = array(
'name' => _x( 'Projects', 'Taxonomy General Name', 'text_domain' ),
'singular_name' => _x( 'Project', 'Taxonomy Singular Name', 'text_domain' ),
'menu_name' => __( 'Project', 'text_domain' ),
'all_items' => __( 'All Items', 'text_domain' ),
'parent_item' => __( 'Parent Item', 'text_domain' ),
'parent_item_colon' => __( 'Parent Item:', 'text_domain' ),
'new_item_name' => __( 'New Item Name', 'text_domain' ),
'add_new_item' => __( 'Add New Item', 'text_domain' ),
'edit_item' => __( 'Edit Item', 'text_domain' ),
'update_item' => __( 'Update Item', 'text_domain' ),
'separate_items_with_commas' => __( 'Separate items with commas', 'text_domain' ),
'search_items' => __( 'Search Items', 'text_domain' ),
'add_or_remove_items' => __( 'Add or remove items', 'text_domain' ),
'choose_from_most_used' => __( 'Choose from the most used items', 'text_domain' ),
'not_found' => __( 'Not Found', 'text_domain' ),
);
$args2 = array(
'labels' => $labels2,
'hierarchical' => true,
'public' => true,
'show_ui' => true,
'show_admin_column' => true,
'show_in_nav_menus' => true,
'show_tagcloud' => true,
);
register_taxonomy( 'project', 'project_post_type', $args2 );
}
// Hook into the 'init' action
add_action( 'init', 'create_cpt_and_ct', 0 );
function theme_prefix_rewrite_flush() {
flush_rewrite_rules();
}
add_action( 'after_switch_theme', 'theme_prefix_rewrite_flush' );
And for your tax_query
<?php
$args = array(
'post_type' => 'project_post_type',
'tax_query' => array(
array(
'taxonomy' => 'project',
'field' => 'slug',
'terms' => 'Initiatieffase' //THIS MUST BE YOUR TERM SLUG, NOT NAME
)
)
);
$query = new WP_Query( $args );
$loop = new WP_Query($args);
while ($loop->have_posts()) : $loop->the_post();
?>
<li>
<a href="https://wordpress.stackexchange.com/questions/158121/<?php the_permalink(); ?>"><?php the_post_thumbnail(); ?></a>
</li>
<?php
endwhile;
wp_reset_postdata();
?>
ADDITIONAL READING
EDIT 3
For proper naming and the correct use of templates, go and check the Template Hierarchy in the codex. This should help you out a lot in future
Your single page would be single-{$post_type}.php which translates to single-project_post_type.php. Same goes for your archive page.
As for your custom taxonomy page, you can use taxonomy-$taxonomy.php which translates to taxonomy-project.php