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

29

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

Zum Beispiel speichert Markdown on Save die Markdown-Version eines Posts separat in der post_content_formattedSpalte und den analysierten HTML- post_contentCode in der Spalte, sodass die Posts bei Deaktivierung des Plugins nicht Markdown ausspucken (da HTML in gespeichert ist post_content).

Jetzt wurde mir klar, dass dies post_content_filteredzum temporären Speichern verwendet wird, dh 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 (dh nicht vom WordPress-Beitragseditor)

Fragen:

  1. In welchen anderen Situationen werden die Daten in der post_content_filteredSpalte 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 post_contentSpalte behandelt wird?)

da ich bin
quelle

Antworten:

29

Jedes Post-Update in WordPress wird von der wp_update_postFunktion durchgeführt.

Diese Funktion hat einige post_content_filteredStandardeinstellungen und für den Standardwert ist '' (leere Zeichenfolge).

Sobald die Standardwerte mit den übergebenen Argumenten zusammengeführt werden wp_parse_args, wird bei jeder Aktualisierung eines Beitrags, der post_content_filterednicht explizit übergeben wird, eine leere Zeichenfolge festgelegt.

Jetzt können wir fragen: Wann wird das post_content_filteredexplizit übergeben wp_update_post? Die Antwort lautet: Niemals mit 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 aktualisiert wird, aus irgendeinem Grund .

Beachten Sie, dass nur ein Feld zu ändern ist ein Update, insbesondere ist jede Statusänderung ein Update, zB Entwurf zu veröffentlichen, zu veröffentlichen anhängig ist , künftig zu veröffentlichen, zu veröffentlichen , um Müll (Beiträge löschen), und so weiter ...

Wenn sich in einem Beitrag etwas ändert, post_content_filteredwird gelöscht. einzige Ausnahme ist, wenn post_content_filteredexplizit übergeben wird wp_update_post, und wie bereits gesagt, wird dies nie von WordPress durchgeführt.

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 wp_update_postFunktion behandelt ", verstehen Sie, dass Sie sich nur diese Funktion ansehen müssen, die zum Glück unterschiedliche Haken hat .

Der Haken, den ich vorschlage, ist wp_insert_post_dataaus zwei Gründen:

  • Es wird vor dem Update ausgeführt, sodass Sie keine Wiederherstellung durchführen müssen, aber Sie können dies 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_postBefehl 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 jede post_content_filtered Reinigung verhindert . Und wenn Sie es aus irgendeinem Grund löschen möchten?

Ich habe gesagt, dass jede WP-Änderung von behandelt wird wp_update_post, 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 $wpdbAbfrage handelt, wird unser Filter nicht ausgelöst, sodass das Zurücksetzen problemlos durchgeführt werden post_content_filteredkann. Sie können diese Funktion überall in Ihrem Code aufrufen , wo ein Zurücksetzen erforderlich ist .

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_filteredFunktion auf, z. B. über Ajax.

gmazzap
quelle