web-dev-qa-db-fra.com

wp_update_post () ne met pas à jour post_status?

J'utilise ce bit pour insérer/mettre à jour un type de publication personnalisé à partir du serveur frontal. La date est définie à partir d'un datepicker personnalisé jQuery.

    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);
    }

Cela fonctionne lors de la première publication du message, définissez-le correctement en tant que publish ou future, avec la date correcte.

Cela ne fonctionne pas lors de l'édition du même message, ni de publish à future ni l'inverse. Tout le reste est correctement mis à jour, à l'exception du statut de la publication /date ultérieure.

UPDATE 9 octobre Je commence à penser que cela pourrait être un bogue, alors j'ai entamé une conversation sur la liste de diffusion wp-hackers , à ce sujet. Il y a des résultats de tests d'installation récents sur le lien.


AUTRES TENTATIVES ÉCHOUÉES:

j'ai essayé de laisser les décisions post_status à wp_insert_post() en utilisant:

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

Et cela définit le statut de la publication sur draft tout en maintenant les dates demandées.

J'ai aussi essayé d'appeler wp_transition_post_status() encore (ça s'appelle une fois dans wp_insert_post ()):

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

mais cela aussi ne semble pas fonctionner.

Je manque d'idées ici. Des indices?

4
moraleida

La réponse ne pourrait être plus simple.

Comme l'a souligné Otto sur la liste de wp-hackers, le problème était que je ne configurais pas post_date_gmt lors de l'utilisation de wp_update_post().

Le code final ressemble à ceci:

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);
    }
10
moraleida

J'ai également essayé le code ci-dessus en utilisant wp_update_post(), mais cela ne fonctionne pas bien avec WordPress 3.9, cela rend post_status vide et a supprimé tous les champs personnalisés. J'ai donc créé une requête personnalisée à l'aide de la classe wpdb. J'espère que cela fonctionnera pour vous tous:

$wpdb->query( 
    $wpdb->prepare( 
        "UPDATE $wpdb->posts SET post_status = 'draft' WHERE ID = %d", 
        $post_id 
    )
);    

et cela a bien fonctionné sur mon localhost et hébergement aussi.

2
mindlogixtech

$ newpostdata ['post_date'] = date ('Y-m-d H: i: s', $ post_date);

Cela renverra la première date de php 1970, utilisez strtotime pour convertir une chaîne en temps

$ newpostdata ['post_date'] = date ('Y-m-d H: i: s', strtotime ($ post_date));

1
Nayem Majhar

Nous mettons constamment à jour le statut de la publication. Voici un exemple de la manière dont nous permettons aux utilisateurs (sur l'éditeur frontal construit) de "suspendre" les annonces en les transformant en brouillon:

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');
}
1
Sethmatics