In my website I have three custom post types: scripts, scenes and plugins. When visiting the archive page of a single post type (i.e. by going to mysite.com/plugins) you correctly see all the posts of that type.
In archive.php, how can I find out which custom post type the user is looking at right now?
I tried the following:
<?php
global $post;
$postTypeLabels = get_post_type_labels(get_post_type_object($post));
echo var_export($postTypeLabels);
?>
But I’m getting the this:
Post name is stdClass::__set_state(
array( 'name' => 'Posts',
'singular_name' => 'Post',
'add_new' => 'Add New',
'add_new_item' => 'Add New Post',
'edit_item' => 'Edit Post',
'new_item' => 'New Post',
'view_item' => 'View Post',
'search_items' => 'Search Posts',
'not_found' => 'No posts found.',
'not_found_in_trash' => 'No posts found in Trash.',
'parent_item_colon' => NULL,
'all_items' => 'All Posts',
'menu_name' => 'Posts',
'name_admin_bar' => NULL,
)
)
I’m guessing that, since I am in an archive page, the $post is not correct.
P.S. I know that I can create archive-plugins.php for the plugins archive. Unfortunately, I have installed a theme that, as far as I know, kinda prevents that. So this is not an option.
There are a several of ways to do this. Put:
In your
archive.php
and you should see two of those ways.$wp_query->query
will havepost_type
component for custom post types. That will not be there forpost
post types.get_queried_object
will return quite a bit of data for custom post types but null forpost
post type.There are also some related template tags that might help.
is_post_type_archive
comes to mind.Between those you should have the information you need to put together whatever logic you need. It is not clear from you question what the end result is supposed to be, so I can’t really write much.
Since you specifically named
archive.php
that is what I tested in. You may need different code for some other template, especially withget_queried_object
which returns very different information depending on the context.Here is the function you want:
I see this in a few comments on the accepted answer, but wanted to make this point clear for others skimming over these answers: The
global $wp_query
object is more reliable for getting the archive’s post type. Specifically from$wp_query->query['post_type']
.You can use
get_queried_object()
but it has caveats. Namely if you have other query parameters like taxonomy terms. In that caseget_queried_object()
will return a WP_Term object instead of the post type you are probably looking for.So if the archive has a clean query for a post type, then
get_queried_object()
will work. But for more reliability use theglobal $wp_query
object.Here is a function you can use in your theme for this:
I thinks that is the answer for your question.
Happy coding!!!
Why not just use
get_query_var('post_type')
?https://developer.wordpress.org/reference/functions/get_query_var/
No other nice option rather than template making!
Or Including a template file when that custom post type archive (according to its url) is accessed.
See further links for more info:
http://codex.wordpress.org/Function_Reference/load_template
wordpress – load a template based on the URI
http://www.mihaivalentin.com/wordpress-tutorial-load-the-template-you-want-with-template_redirect/