Jedes Post-Update in WordPress wird von der wp_update_post
Funktion durchgeführt.
Diese Funktion hat einige post_content_filtered
Standardeinstellungen 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_filtered
nicht explizit übergeben wird, eine leere Zeichenfolge festgelegt.
Jetzt können wir fragen: Wann wird das post_content_filtered
explizit ü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_filtered
wird gelöscht. einzige Ausnahme ist, wenn post_content_filtered
explizit ü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_post
Funktion 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_data
aus 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_post
Befehl 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 $wpdb
Abfrage handelt, wird unser Filter nicht ausgelöst, sodass das Zurücksetzen problemlos durchgeführt werden post_content_filtered
kann. 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_filtered
Funktion auf, z. B. über Ajax.