it-swarm.com.de

Was ist das Erstellungsdatum des Posts für wp_insert_post?

Ich habe den folgenden Haken, der eine Standard "Schärfe" für einen Beitrag festlegt. Für den Kontext ist Hotness ein meta_value, der im Beitrag gespeichert wird und sich jedes Mal ändert, wenn jemand den Beitrag abstimmt oder abstimmt. Ich benutze diesen meta_value, um Posts nach "Was ist gerade heiß?" Zu sortieren. Seite.

Da zum Zeitpunkt der Erstellung des Beitrags in WordPress die "Punktzahl" von Upvotes vs. Downvotes 0 ist, kann ich den Teil der Punktzahl der Hotness-Berechnung komplett weglassen. Wenn der Beitrag erstellt wird, wird nur die Erstellungszeit berücksichtigt:

/* Hook: Add custom postmeta when a new post is created
 * Since: 8.0
 */
add_action( 'wp_insert_post', tjnz_prepare_postmeta );
function tjnz_prepare_postmeta( $post_id ) {
    if ( !wp_is_post_revision( $post_id ) ) {
        $hotness = round( ( time() - 1211380200 ) / 800000, 7 );
        add_post_meta( $post_id, '_tjnz_favorites', 0, true );
        add_post_meta( $post_id, '_tjnz_plays', 0, true );
        add_post_meta( $post_id, '_tjnz_downloads', 0, true );
        add_post_meta( $post_id, '_tjnz_upvotes', 0.000, true );
        add_post_meta( $post_id, '_tjnz_downvotes', 0.000, true );
        add_post_meta( $post_id, '_tjnz_hotness', $hotness, true );
    }
}

Ich frage mich, was passiert, wenn Sie einen Beitrag in WordPress planen. Wird der Haken ausgelöst, wenn ich klicke? Schedule, oder wann veröffentlicht der WordPress-Cronjob den Beitrag?

Wenn der Haken ausgelöst wird, wenn ich klicke ScheduleWie kann ich das effektiv so ändern, dass die in die Datenbank eingefügte Zeit tatsächlich die Veröffentlichungszeit des Posts ist, anstatt dass ich darauf geklickt habe, um den Post zu planen?

Die Codex-Seite für wp_insert_post gibt an, dass das $post-Objekt ein 'post_date_gmt'-Mitglied hat. Es ist dokumentiert als:

'post_date_gmt' => [ Y-m-d H:i:s ] // Die Zeitangabe wurde in GMT gemacht.

Für mich ist unklar, ob sie bedeuten, wann sie in die Datenbank eingefügt werden (Zeitpunkt des Klickens auf die Schaltfläche "Zeitplan") oder wann sie erstellt werden sollen (Zeitpunkt, den ich in den Zeitplan eingegeben habe). Kann das bitte jemand klären?

Bearbeiten:

Nach Prüfung der Antwort von ialocin bin ich zu dem Schluss gekommen, dass meine derzeitige Verwendung des Hooks wp_insert_post nicht zu den gewünschten Ergebnissen führen wird. Ich werde einen anderen Ansatz ausprobieren, möchte aber meine Absichten klarstellen, damit andere verstehen, warum ich das brauche.

Wie ich bereits sagte, berechne ich für jeden Beitrag, den ich verfasse, einen "Hotness" -Wert. Ohne den Einfluss einer Partitur steigt die Schärfe mit der Zeit immer weiter an. Bei Unix Epoch + 1211380200 seconds ist meine 'persönliche Seite Epoch'. Wenn der post_date_gmt eines Posts = 1211380200 ist, wird er im Wesentlichen bei der "Geburt" meiner Site veröffentlicht (dies ist der 21. Mai 2008).

Ich möchte für jeden neuen Beitrag den anfänglichen Hotness-Wert speichern. Daher muss ich das Veröffentlichungsdatum des Beitrags (in GMT Unix-Zeitstempel) kennen und die Zeit zwischen Unix-Epoche und meiner Epoche subtrahieren, die 1211380200 Sekunden beträgt.

Wenn ich Inhalte veröffentliche, plane ich oft mehrere Posts, die während der Woche "on air" gesendet werden, da ich nicht genug Zeit habe, um jeden Tag etwas zu veröffentlichen. Es ist wichtig, dass die Beiträge den richtigen Anfangswert haben, da dies die Grundlage für jede weitere Berechnung ist.

Mein neuer Ansatz wäre es, sich in Übergänge nach dem Status einzuklinken. Bitte helfen Sie mir, dies richtig zu machen:

add_action( 'transition_post_status', 'tjnz_prepare_postmeta', 10, 3 );
function tjnz_prepare_postmeta( $new_status, $old_status, $post ) {
    if ( $new_status == 'publish' && $old_status != 'publish' ) {
        $hotness = round( ( $post->post_date_gmt - 1211380200 ) / 800000, 7 );
        update_post_meta( $post->ID, '_tjnz_favorites', 0 );
        update_post_meta( $post->ID, '_tjnz_plays', 0 );
        update_post_meta( $post->ID, '_tjnz_downloads', 0 );
        update_post_meta( $post->ID, '_tjnz_upvotes', 0.000 );
        update_post_meta( $post->ID, '_tjnz_downvotes', 0.000 );
        update_post_meta( $post->ID, '_tjnz_hotness', $hotness );
    }
}

Der Grund, warum ich auch $old_status überprüfe, liegt darin, dass ich davon ausgehe, dass $new_status und $old_status'publish' sind, wenn ich pdate einen bereits veröffentlichten Beitrag mache. Ich möchte nicht ​​jedes Mal versehentlich einen der Meta-Werte zurücksetzen, wenn ich einen vorhandenen veröffentlichten Beitrag aktualisiere.

Ich habe auch add_post_meta in update_post_meta geändert, da auf diese Weise sichergestellt werden kann, dass die richtigen Werte in die Datenbank eingefügt werden, unabhängig davon, ob ein Beitrag direkt veröffentlicht oder geplant ist. Ich glaube, wenn die Meta-Werte noch nicht existieren, wird update_post_meta tatsächlich als add_post_meta-Funktion fungieren.

4
Marc Dingena

Die kurze Antwort lautet: post_date und post_date_gmt werden auf das Datum festgelegt, an dem Sie die Veröffentlichung geplant haben - nicht auf das Datum, an dem Sie die Veröffentlichung erstellt haben -, sodass post_date und post_date_gmt das Veröffentlichungsdatum haben.


Update:

Als Antwort auf Kommentar:

  1. Wann wird der Haken wp_insert_post ausgelöst?

    • Eigentlich beide Male, also weiter klicken Schedule und über die geplante Änderung des Post-Status von künftig zu veröffentlichen.
    • Warum? Erstens, weil:
    • Und zweitens, weil es Teil ist von:
    • Welche wird ausgelöst durch:
    • Schauen Sie sich die Dokumentation (en) genauer an und lernen Sie den Quellcode kennen, hier hauptsächlich post.php , um immer zu verstehen, was wirklich passiert.

  2. Können/sollen Sie die Funktion time() verwenden?

    • Sie können natürlich die neuen Informationen von 1. berücksichtigen.
    • Wenn Sie darauf angewiesen sein sollten, sind die Informationen, die Sie benötigen, bereits verfügbar. Wenn dies der Fall ist, gibt es keinen Grund, die gleichen Informationen zweimal abzurufen.
    • Wenn also post_date und post_date_gmt die Informationen enthalten, die Sie benötigen, dh wie festgelegt, das Veröffentlichungsdatum, verwenden Sie diese.
    • Oder verwenden Sie post_modified und post_modified_gmt, wenn Sie Änderungen widerspiegeln möchten.

Der tatsächliche Ansatz, den Sie wählen werden, hängt wirklich von Ihren Bedürfnissen/Plänen ab, über die ich wenig weiß. Soweit ich das beurteilen kann, sollten Sie auf jeden Fall überlegen, einen anderen oder mehrere Haken zu verwenden. Schauen Sie sich Post Status Transitions an, damit andere dies berücksichtigen. Untersuchen Sie außerdem die Quelle - post.php -, um mehr darüber zu erfahren, wann und wie diese Hooks verwendet werden. Es gibt viele Fragen dazu hier, suchen Sie einfach danach.

4
Nicolai