Ändern Sie das Post-Datum aus einer Metabox

Ich habe ein Problem mit der Aktualisierung des post_date in einer benutzerdefinierten function, die ich geschrieben habe.

Ich versuche, das “post_date” zu meinem benutzerdefinierten “meta_date” -Wert zu ändern.

Hier ist die function:

function cfc_reset_postdate( $data, $postarr ) { // If it is our form has not been submitted, so we dont want to do anything if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; if($data['post_type'] == 'scripture-memory') { $date = get_post_meta( get_the_ID(), 'cfc_date', true ); $date = DateTime::createFromFormat('D - M j, Y', $date); $date = $date->format('Ym-d'); $data['post_date'] = $date; return $data; } add_filter( 'wp_insert_post_data', 'cfc_reset_postdate', '10', 2); 

Ich habe versucht, es mit all diesen Filtern zu verbinden, aber keiner scheint zu funktionieren …

Es funktioniert, außer dass ich zweimal auf die Schaltfläche “Update” klicken muss, um das post_date so zu ändern, dass es mit meinem neuen Meta-Datum übereinstimmt.

Was mache ich falsch?

Solutions Collecting From Web of "Ändern Sie das Post-Datum aus einer Metabox"

A Hinweis: Aktionen und Filter sind nicht wirklich austauschbar: Filter müssen normalerweise die übergebenen Daten zurückgeben oder es wird etwas kaputt gehen.

Ausgehend von dem, was m0r7if3r gesagt hat, ist wp_insert_post_data ein Filter. Sie sollten also die $ -Daten des Posts wp_insert_post_data und sie am Ende der function zurückgeben.

(Alternativ könnten Sie die Variablen, die Sie während einer geeigneten Aktion ändern müssen, global definieren und dann ändern.)

Für ein Tutorial lesen Sie zuerst: http://core.trac.wordpress.org/browser/tags/3.3.1/wp-includes/post.php#L2566

Dann bedenken Sie folgendes (ich habe das nicht getestet, aber es basiert auf Ihrem Code):

 function cfc_reset_postdate( $data ) { $date = get_post_meta( get_the_ID(), 'cfc_date', true ); $date = DateTime::createFromFormat('D - M j, Y', $date); $date = $date->format('Ym-d'); $data['post_date'] = $date; return $data; } add_filter( 'wp_insert_post_data', 'cfc_reset_postdate'); 

Ich habe eine lockere Implementierung für dich. Schauen Sie sich den 'wp_insert_post_data' Filter an, es ist der letzte Filter / die letzte Aktion, die Zugriff auf die Daten hat, die eingefügt werden. Sie sollten nur den ersten Parameter empfangen, der das Datenfeld darstellt, das ändert und dann zurückgibt. Sie haben Zugriff auf alle get_post_meta() , die eingefügt werden sollen. Wenn Sie also Prüfungen durchführen müssen (oder in Ihrem Fall get_post_meta() ), wäre dies ein guter Zeitpunkt, sie zu erledigen. Dieser Filter wird unabhängig davon ausgeführt, ob es sich bei dem Post um einen neuen Post oder um ein Update handelt, aber ansonsten gibt es nicht viele Vorbehalte. Wenn Sie sich die Quelle ansehen müssen, ist dies in Zeile 2567 von /wp-includes/post.php

Ich weiß, das ist eine Frage, die vor einer Weile gestellt wurde, aber nur wenn jemand sich fragte, wäre ein einfacherer Weg das zu tun:

 < ?php $date = get_post_meta($post->ID, "cfc_date", true); echo the_time('Ymd' , $date );?> 

Schauen Sie sich WordPress Codex an