it-swarm.com.de

Wann wird die Spalte 'post_content_filtered' in der Datenbank von WordPress gelöscht?

Einige WordPress-Plugins (obwohl nur sehr wenige) verwenden die Spalte post_content_filtered in der Datenbank, um einige Daten zu einem Beitrag zu speichern.

Zum Beispiel speichert Markdown on Save die Markdown-Version eines Beitrags separat in der Spalte post_content_formatted und den analysierten HTML-Code in der Spalte post_content, sodass die Beiträge bei Deaktivierung des Plugins nicht Markdown ausspucken (weil HTML ist) gespeichert in post_content).

Jetzt wurde mir klar, dass post_content_filtered ziemlich häufig für die temporäre Speicherung verwendet wird, d. H. Der Inhalt in der Spalte geht verloren (oder wird gelöscht), wenn:

  • mit der Option "Schnellbearbeitung" können Sie Änderungen an einem Beitrag (Titel, Tags, Kategorien usw.) vornehmen

  • ein geplanter Beitrag wird (automatisch) veröffentlicht

  • sie führen Bulk-Bearbeitungen an Posts durch

  • sie wechseln zwischen den Überarbeitungen eines Beitrags

  • ein Beitrag wird von einem externen Editor gespeichert (d. h. nicht vom WordPress-Beitragseditor).

Fragen:

  1. In welchen anderen Situationen werden die Daten in der Spalte post_content_filtered gelöscht?

  2. Gibt es eine Möglichkeit, dies überhaupt zu verhindern? (Ich meine, gibt es eine Möglichkeit, um sicherzustellen, dass die Daten dauerhaft gespeichert werden, wie die Spalte post_content behandelt wird?)

27
its_me

Jedes Post-Update in WordPress wird von der Funktion wp_update_post ausgeführt.

Diese Funktion hat einige Standardeinstellungen, und für post_content_filtered ist der Standardwert '' (leere Zeichenfolge).

Sobald die Standardeinstellungen mit den über wp_parse_args an function übergebenen Argumenten zusammengeführt wurden, bedeutet dies, dass jedes Mal, wenn ein Beitrag aktualisiert und post_content_filtered nicht explizit übergeben wird, eine leere Zeichenfolge festgelegt wird.

Jetzt können wir fragen: Wann wird der post_content_filtered explizit an wp_update_post übergeben? Die Antwort lautet: nie per WordPress.

Also für deine erste Frage:

In welchen anderen Situationen werden die Daten in der Spalte post_content_filtered gelöscht?

Die kurze Antwort lautet: Jedes Mal, wenn ein Beitrag aus irgendeinem Grund aktualisiert wird .

Es ist zu beachten, dass das Ändern nur eines Feldeseine Aktualisierung ist, insbesondere ist jede Statusänderung eine Aktualisierung, z. Entwurf zum Veröffentlichen, Ausstehend zum Veröffentlichen, Zukünftiges Veröffentlichen, Veröffentlichen im Papierkorb (Löschen eines Beitrags) usw.

Wenn sich in einem Beitrag etwas ändert, wird post_content_filtered gelöscht. Die einzige Ausnahme ist, wenn post_content_filtered explizit an wp_update_post übergeben wird und dies, wie bereits gesagt, niemals von WordPress durchgeführt wird.

Gibt es eine Möglichkeit, dies überhaupt zu verhindern? (Ich meine, gibt es eine Möglichkeit, um sicherzustellen, dass die Daten dauerhaft gespeichert werden?

Wenn Sie dieses Feld mit Ihrem Code erstellen und es beibehalten möchten, müssen Sie jedes von WordPress durchgeführte Update überprüfen und die Änderung verhindern.

Das mag nach harter Arbeit klingen, aber wenn Sie den ersten Satz in dieser Antwort lesen: " Jedes Post-Update in WordPress wird von der Funktion wp_update_post", verstehen Sie, dass es nur darauf ankommt, sich das anzuschauen Funktion, die zum Glück verschiedene Haken hat.

Der Haken, den ich vorschlage, ist der wp_insert_post_data aus zwei Gründen:

  • Es läuft vor dem Update, so dass Sie nicht wiederherstellen müssen aber Sie können verhindern
  • Es werden 2 Parameter übergeben: die Daten, die von der Funktion aktualisiert werden, und ein Array der übergebenen Parameter, die (im Falle einer Aktualisierung) die ID des Posts enthalten

Mit einem einfachen get_post können Sie also vergleichen, wie der Post jetzt ist und wie der Post sein wird: Wenn Ihnen etwas nicht gefällt, können Sie es ändern.

Codieren wir:

add_filter( 'wp_insert_post_data', 'preserve_content_filtered', 999, 2 );

function preserve_content_filtered ( $data, $postarr ) {

    /* If this is not an update, we have nothing to do */
    if ( ! isset($postarr['ID']) || ! $postarr['ID'] ) return $data;

    /*
     * Do you want you filter per post_type?
     * You should, to prevent issues on post type like menu items.
     */
    if ( ! in_array( $data['post_type'], array( 'post', 'page' ) ) ) return $data;

    /* How post is now, before the update */
    $before = get_post( $postarr['ID'] ); 

    /* If content_filtered is already empty we have nothing to preserve */
    if ( empty( $before->post_content_filtered ) ) return $data;

    if ( empty( $data['post_content_filtered'] ) ) {
        /*
         * Hey! WordPress wants to clear our valuable post_content_filtered...
         * Let's prevent it!
         */
        $data['post_content_filtered'] = $before->post_content_filtered;
    }

    return $data;

}

Es gibt ein mögliches Problem, bei dem die vorherige Funktion die Bereinigung von jedem post_content_filtered verhindert. Und wenn Sie es aus irgendeinem Grund löschen möchten?

Ich habe gesagt, dass jede WP Änderung von wp_update_post behandelt wird, aber Sie sind nicht WordPress.

Sie können eine Funktion schreiben wie:

function reset_post_content_filtered( $postid ) {
    global $wpdb;
    $wpdb->query( $wpdb->prepare(
        "UPDATE $wpdb->posts SET `post_content_filtered` = '' WHERE `ID` = %d", $postid
    ) );
}

Da es sich um eine $wpdb-Abfrage handelt, wird unser Filter nicht ausgelöst. Das Zurücksetzen ist also problemlos möglich. Überall in Ihrem Code, wo Sie post_content_filtered zurücksetzen müssen, können Sie diese Funktion aufrufen.

Sie können auch eine Metabox mit der Schaltfläche "Inhalt gefiltert löschen" erstellen. Wenn Sie auf diese Schaltfläche klicken, rufen Sie einfach Ihre reset_post_content_filtered -Funktion auf, z. über Ajax.

28
gmazzap