it-swarm.com.de

wp_update_post () aktualisiert post_status nicht?

Ich verwende dieses Bit, um einen benutzerdefinierten Beitragstyp vom Front-End aus einzufügen/zu aktualisieren. Das Datum wird von einem benutzerdefinierten Abfragedatum eingestellt.

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

Dies funktioniert Wenn Sie den Beitrag zum ersten Mal veröffentlichen, setzen Sie ihn korrekt als publish oder future mit dem richtigen Datum.

Das funktioniert nicht beim Bearbeiten desselben Posts, weder von publish zu future noch umgekehrt. Alles andere wird korrekt aktualisiert, mit Ausnahme des Poststatus /zukünftiges Datum.

UPDATE 9. Oktober Ich fange an zu denken, dass dies ein Fehler sein könnte, also habe ich eine Unterhaltung auf der Mailing-Liste von wp-Hackern gestartet , darüber. Auf dem Link sind einige Testergebnisse zur Neuinstallation zu finden.


ANDERE VERSAGTE VERSUCHE:

ich habe versucht, post_status Entscheidungen wp_insert_post() zu überlassen.

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

Dadurch wird der Post-Status auf draft gesetzt, während die angeforderten Daten beibehalten werden.

Ich habe auch versucht, wp_transition_post_status() erneut aufzurufen (wird einmal in wp_insert_post () aufgerufen):

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

aber das schien auch nicht zu funktionieren.

Mir gehen hier die Ideen aus. Irgendwelche Hinweise?

4
moraleida

Die Antwort könnte nicht einfacher sein.

Wie von Otto in der Liste der WP-Hacker hervorgehoben, bestand das Problem darin, dass ich bei der Verwendung von wp_update_post() keinen post_date_gmt gesetzt habe.

Der endgültige Code sieht folgendermaßen aus:

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

Ich habe den obigen Code auch mit wp_update_post() ausprobiert, aber es funktioniert nicht gut mit WordPress 3.9, es macht post_status leer und löscht alle benutzerdefinierten Felder. Ich habe daher eine benutzerdefinierte Abfrage mit der Klasse wpdb erstellt. Ich hoffe das wird für euch alle funktionieren:

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

und das funktionierte gut auf meinem localhost und auch beim hosting.

2
mindlogixtech

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

Dies wird das erste Anfangsdatum von PHP 1970 zurückgeben. Verwenden Sie strtotime, um die Zeichenfolge in die Zeit umzuwandeln

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

1
Nayem Majhar

Wir aktualisieren den Post-Status ständig. Dies ist ein Beispiel dafür, wie wir Nutzern (im erstellten Front-End-Editor) ermöglichen, Anzeigen zu "pausieren", indem sie sie in Entwurf ändern:

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