is_post_type_viewable( string|WP_Post_Type $post_type ): bool

Determines whether a post type is considered “viewable”.


For built-in post types such as posts and pages, the ‘public’ value will be evaluated.
For all others, the ‘publicly_queryable’ value will be used.


Post type name or object.


bool Whether the post type should be considered viewable.


function is_post_type_viewable( $post_type ) {
	if ( is_scalar( $post_type ) ) {
		$post_type = get_post_type_object( $post_type );

		if ( ! $post_type ) {
			return false;

	if ( ! is_object( $post_type ) ) {
		return false;

	$is_viewable = $post_type->publicly_queryable || ( $post_type->_builtin && $post_type->public );

	 * Filters whether a post type is considered "viewable".
	 * The returned filtered value must be a boolean type to ensure
	 * `is_post_type_viewable()` only returns a boolean. This strictness
	 * is by design to maintain backwards-compatibility and guard against
	 * potential type errors in PHP 8.1+. Non-boolean values (even falsey
	 * and truthy values) will result in the function returning false.
	 * @since 5.9.0
	 * @param bool         $is_viewable Whether the post type is "viewable" (strict type).
	 * @param WP_Post_Type $post_type   Post type object.
	return true === apply_filters( 'is_post_type_viewable', $is_viewable, $post_type );


apply_filters( ‘is_post_type_viewable’, bool $is_viewable, WP_Post_Type $post_type )

Filters whether a post type is considered “viewable”.


5.9.0Added is_post_type_viewable hook to filter the result.
4.6.0Converted the $post_type parameter to accept a WP_Post_Type object.
4.5.0Added the ability to pass a post type name in addition to object.

User Contributed Notes

You must log in before being able to contribute a note or feedback.