**Update**: Now that you've changed your question (and made my originaly answer look completely wrong!), I haven't used those functions specifically but I have successfully used the `transition_post_status` action (also referenced in the [Codex page](https://codex.wordpress.org/Post_Status_Transitions)) to detect status changes. Something similar to this has worked for me before: add_action( 'transition_post_status', 'my_status_change', 10, 3 ); function my_status_change( $new_status, $old_status, $post ) { if ($new_status=="future" && $new_status=="publish"){ // do stuff.... } } <hr> I think you might have mixed up 2 hooks? The [Codex](https://codex.wordpress.org/Post_Status_Transitions) refers to the following hooks: 1. **{old_status}_to _{new_status} Hook** > An {old_status}_to_{new_status} action will execute when a post transitions from {old_status} to {new_status}. In your case: future_to_*publish* (future_to_*post* won't work because *post* isn't a status 2. **{status}_{post_type} Hook** > A {status}_{post_type} action will execute when a post of type {post_type} transitions to {status} from any other status. In your case: This would be publish_post (I think this may be where you got them mixed up?) I assume you only want future to publish transitions so try: add_action( 'future_to_publish', 'future_publish' );