WordPress'teki her mesaj güncellemesi wp_update_post
işlev tarafından gerçekleştirilir .
Bu işlev bazı varsayılan değerlere sahiptir ve post_content_filtered
varsayılan değer için '' (boş dize).
Varsayılanlar, işlev üzerinden geçirilen hatalarla birleştirildiğinde, wp_parse_args
bir gönderi her güncelleştirildiğinde ve post_content_filtered
açıkça iletilmediğinde, boş bir dizeye ayarlanır.
Şimdi şunu sorabiliriz: post_content_filtered
açıkça ne zaman geçirilir wp_update_post
? Cevap: asla WordPress tarafından.
Yani ilk sorunuz için:
Hangi durumlarda, post_content_filtered sütunundaki veriler silinir?
Kısa cevap: herhangi bir nedenle, bir gönderi her güncellendiğinde .
Yalnızca bir alan değiştirme geldiğini hatırlatırız olan bir güncelleme, özellikle, her durum değişikliği bir güncelleme, çöp kutusuna yayımlamak, (bir post silme) yayımlamak için geleceği yayımlamak bekleyen yayınlamaya örneğin taslak, vb olduğunu ...
Bir yayında bir şey değişirse, o post_content_filtered
zaman temizlenir; tek istisna post_content_filtered
açıkça açıkça iletildiği zaman wp_update_post
ve daha önce de belirtildiği gibi bu asla WordPress tarafından yapılmıyor.
Bunun olmasını engellemenin bir yolu var mı? (Verilerin kalıcı olarak depolandığından emin olmanın bir yolu var mı?
Bu alanı kodunuzla oluşturursanız ve korumak istiyorsanız, WordPress tarafından gerçekleştirilen her güncellemeye bakmak ve değişikliği önlemek zorundasınız .
Bu zor bir iş gibi gelebilir, ancak bu cevabın ilk cümlesini okursanız, " WordPress'teki her gönderi güncellemesi wp_update_post
işlev tarafından işlenir ", ihtiyacınız olan tek şey, neyse ki farklı kancalara sahip olan bu işleve bakmaktır. .
Önerdiğim kanca wp_insert_post_data
2 sebepten dolayı:
- Bu ishal önce bunu yapmak zorunda kalmamak için, güncelleme kurtarmak ancak yapabilirsiniz önlemek
- 2 parametreden geçer: fonksiyonun güncelleneceği veri ve geçirilen parametrelerin bir dizisi (güncelleme durumunda) gönderinin kimliğini içerir.
Yani basit kullanarak get_post
, yazının şimdi nasıl olduğunu ve yazının nasıl olacağını karşılaştırabilirsiniz: eğer bir şeyi sevmiyorsanız, onu değiştirebilirsiniz.
Hadi kodlayalım:
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;
}
Önceki işlevin her post_content_filtered
temizliği engellediği olası bir sorun var . Ve eğer sen , herhangi bir nedenden dolayı, bunu temizlemek istiyor?
Her WP sonrası değişikliğin ele alındığını wp_update_post
söyledim, ancak WordPress değilsiniz.
Gibi bir işlev yazabilirsiniz:
function reset_post_content_filtered( $postid ) {
global $wpdb;
$wpdb->query( $wpdb->prepare(
"UPDATE $wpdb->posts SET `post_content_filtered` = '' WHERE `ID` = %d", $postid
) );
}
Bir $wpdb
sorgu olarak, filtremizi tetiklemez, bu nedenle sıfırlama işlemi sorunsuz bir şekilde yapılır ve kodunuzda sıfırlamanız gereken her yerde post_content_filtered
bu işlevi çağırabilirsiniz.
Ayrıca 'Filtrelenmiş içeriği temizle' düğmesinin bulunduğu bir meta kutu da oluşturabilirsiniz ve bu düğmeye tıklandığında yalnızca reset_post_content_filtered
işlevinizi çağırın , örneğin Ajax aracılığıyla.