Retrieves the post status based on the post ID.
Description
If the post ID is of an attachment, then the parent post status will be given instead.
Parameters
$post
int|WP_Postoptional- Post ID or post object. Defaults to global $post.
Default:
null
Source
function get_post_status( $post = null ) {
// Normalize the post object if necessary, skip normalization if called from get_sample_permalink().
if ( ! $post instanceof WP_Post || ! isset( $post->filter ) || 'sample' !== $post->filter ) {
$post = get_post( $post );
}
if ( ! is_object( $post ) ) {
return false;
}
$post_status = $post->post_status;
if (
'attachment' === $post->post_type &&
'inherit' === $post_status
) {
if (
0 === $post->post_parent ||
! get_post( $post->post_parent ) ||
$post->ID === $post->post_parent
) {
// Unattached attachments with inherit status are assumed to be published.
$post_status = 'publish';
} elseif ( 'trash' === get_post_status( $post->post_parent ) ) {
// Get parent status prior to trashing.
$post_status = get_post_meta( $post->post_parent, '_wp_trash_meta_status', true );
if ( ! $post_status ) {
// Assume publish as above.
$post_status = 'publish';
}
} else {
$post_status = get_post_status( $post->post_parent );
}
} elseif (
'attachment' === $post->post_type &&
! in_array( $post_status, array( 'private', 'trash', 'auto-draft' ), true )
) {
/*
* Ensure uninherited attachments have a permitted status either 'private', 'trash', 'auto-draft'.
* This is to match the logic in wp_insert_post().
*
* Note: 'inherit' is excluded from this check as it is resolved to the parent post's
* status in the logic block above.
*/
$post_status = 'publish';
}
/**
* Filters the post status.
*
* @since 4.4.0
* @since 5.7.0 The attachment post type is now passed through this filter.
*
* @param string $post_status The post status.
* @param WP_Post $post The post object.
*/
return apply_filters( 'get_post_status', $post_status, $post );
}
Hooks
- apply_filters( ‘get_post_status’,
string $post_status ,WP_Post $post ) Filters the post status.
Changelog
Version | Description |
---|---|
2.0.0 | Introduced. |
will return one of: publish, future, draft, pending, private
A basic example:
To return the localized label for the post status, get_post_status_object must be used:
Basic example:
Default post status includes:
publish
,future
,draft
,pending
,private
.'publish' === $current_status == 'publish'
should be..'publish' === $current_status
Documentation above says both that, if no ID or $post is passed then it will default to both the global $post AND null.
In my testing it does NOT default to the global $post, so if used in the Loop you must still pass either the ID or the $post, eg:
get_post_status ( get_the_ID() )
get_post_status()
returns the global$post
status if no parameter is provided.