The get_post_status WordPress PHP filter allows you to modify the post status before it’s returned by the get_post_status()
function.
Usage
add_filter('get_post_status', 'your_function_name', 10, 2); function your_function_name($post_status, $post) { // your custom code here return $post_status; }
Parameters
$post_status
(string): The current post status.$post
(WP_Post): The post object for which the status is being retrieved.
More information
See WordPress Developer Resources: get_post_status
Examples
Change post status to private for a specific category
Change the post status to ‘private’ if the post belongs to a specific category.
add_filter('get_post_status', 'change_status_to_private', 10, 2); function change_status_to_private($post_status, $post) { if (in_category('private', $post)) { return 'private'; } return $post_status; }
Change post status to draft for older posts
Change the post status to ‘draft’ if the post is older than 30 days.
add_filter('get_post_status', 'older_posts_to_draft', 10, 2); function older_posts_to_draft($post_status, $post) { $post_age = (time() - strtotime($post->post_date)) / DAY_IN_SECONDS; if ($post_age > 30) { return 'draft'; } return $post_status; }
Force post status to pending for specific user role
Change the post status to ‘pending’ if the post author has the ‘subscriber’ role.
add_filter('get_post_status', 'subscriber_posts_pending', 10, 2); function subscriber_posts_pending($post_status, $post) { $author = get_userdata($post->post_author); if (in_array('subscriber', $author->roles)) { return 'pending'; } return $post_status; }
Set post status to future for posts with a future publish date
Set the post status to ‘future’ if the post has a future publish date.
add_filter('get_post_status', 'future_posts_status', 10, 2); function future_posts_status($post_status, $post) { if (strtotime($post->post_date) > time()) { return 'future'; } return $post_status; }
Change post status to draft for posts with no title
Change the post status to ‘draft’ if the post has no title.
add_filter('get_post_status', 'no_title_draft_status', 10, 2); function no_title_draft_status($post_status, $post) { if (empty($post->post_title)) { return 'draft'; } return $post_status; }