Skip to main content

Why doesn't wp_update_post() doesn't update the post_status field?

Tweeted twitter.com/#!/StackWordPress/status/556294260220510208
edited for QA clarity
Source Link
moraleida
  • 2.3k
  • 2
  • 19
  • 32

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: ActuallyI'm starting to think this might be a bug, post_date does change accordinglyso i started a conversation at the wp-hackers mailing list, about this. But post_status seems to be ignoredThere's some fresh install test results on the link.

 

UPDATEOTHER FAILED ATTEMPTS:: Following along, 

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?

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.

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: Actually, post_date does change accordingly. But post_status seems to be ignored.

UPDATE: Following along, 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?

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.

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?

added 280 characters in body
Source Link
moraleida
  • 2.3k
  • 2
  • 19
  • 32

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: Actually, post_date does change accordingly. But post_status seems to be ignored.

UPDATE: Following along, 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?

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.

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: Actually, post_date does change accordingly. But post_status seems to be ignored.

UPDATE: Following along, 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?

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: Actually, post_date does change accordingly. But post_status seems to be ignored.

UPDATE: Following along, 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?

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.

updates and new tests
Source Link
moraleida
  • 2.3k
  • 2
  • 19
  • 32
Loading
added 99 characters in body
Source Link
moraleida
  • 2.3k
  • 2
  • 19
  • 32
Loading
Source Link
moraleida
  • 2.3k
  • 2
  • 19
  • 32
Loading