Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I'm using this bit to insert/update a custom post type from the front-end. The date is set from a custom jquery datepicker.

    if (strtotime($date) < strtotime('tomorrow')) {
            $newpostdata['post_status'] = 'publish';
    } elseif (strtotime($date) > strtotime('today')) {
            $newpostdata['post_status'] = 'future';
            $newpostdata['post_date'] = date('Y-m-d H:i:s', strtotime($date));
    }

    if ('insert' == $operation) {
        $err = wp_insert_post($newpostdata, true);
    } elseif ('edit' == $operation) {
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
    }

This works when first publishing the post, setting it correctly as publish or future, with the correct date.

This doesn't work when editing the same post, neither from publish to future nor the other way around. Everything else is properly updated, except for the post status/future_date.

UPDATE Oct. 9th I'm starting to think this might be a bug, so i started a conversation at the wp-hackers mailing list, about this. There's some fresh install test results on the link.


OTHER FAILED ATTEMPTS:

i've tried leaving post_status decisions to wp_insert_post() using:

elseif ('edit' == $operation) {
        $newpostdata['post_status'] = '';
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
    }

And this sets the post status to draft while maintaning the requested dates.

I've also tried calling wp_transition_post_status() again (it's called once inside wp_insert_post()):

elseif ('edit' == $operation) {
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
        wp_transition_post_status($old_status, $status, $post_id);
    }

but that also didn't seem to work.

I'm running out of ideas here. Any clues?

share|improve this question
    
I am confused, When editing the post, and setting it to future, the post date doesn't get updated? –  westondeboer Oct 8 '12 at 2:03
    
post date gets updated, but post status doesn't. So if I publish a post today, and then set it to future with a date three days from today, the date gets changed, but post_status is still publish, instead of future –  moraleida Oct 8 '12 at 2:26
    
Ok, this just in: if I strip out the post_status before updating the post, it then gets reverted to draft and still appears in the admin panel as scheduled. So it works, but that still doesn't answer why I can't revert it to future. –  moraleida Oct 8 '12 at 2:33
    
Are you doing this as logged in user with sufficient capabilities? Data manipulation functions tend to check if user is actually allowed to perform it. –  Rarst Oct 9 '12 at 1:03
    
Yes, i'm doing it as an network admin, and also as a "custom" user role. –  moraleida Oct 9 '12 at 1:19
show 3 more comments

2 Answers

up vote 5 down vote accepted

Answer couldn't be simpler.

As pointed out by Otto at the wp-hackers list, problem was me not setting post_date_gmt when using wp_update_post().

Final code looks like this:

if ( $post_date < strtotime( "tomorrow" ) ) {
        $status = 'publish';    
        $newpostdata['post_status'] = $status;
        $newpostdata['post_date'] = date( 'Y-m-d H:i:s',  $post_date );

        // Also pass 'post_date_gmt' so that WP plays nice with dates
        $newpostdata['post_date_gmt'] = gmdate( 'Y-m-d H:i:s', $post_date );

    } elseif ( $post_date > strtotime( 'today' ) ) {
        $status = 'future';    
        $newpostdata['post_status'] = $status;
        $newpostdata['post_date'] = date( 'Y-m-d H:i:s', $post_date );

        // Also pass 'post_date_gmt' so that WP plays nice with dates
        $newpostdata['post_date_gmt'] = gmdate( 'Y-m-d H:i:s', $post_date );
    }

    if ('insert' == $operation) {
        $err = wp_insert_post($newpostdata, true);
    } elseif ('edit' == $operation) {
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
    }
share|improve this answer
add comment

We update the post status all the time, here is an example of how we allow users (on the front end editor that was built) to "pause" ads by changing them to draft:

if ($action == 'pause') {
        $my_post = array();
        $my_post['ID'] = $aid;
        $my_post['post_status'] = 'draft';
        wp_update_post($my_post);
        $action_msg = __('Ad has been paused', 'mytheme');
}
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.