Veritabanındaki 'post_content_filtered' sütunu ne zaman WordPress tarafından silinir?


29

Bazı WordPress eklentileri (çok az olmasına rağmen) post_content_filteredbir gönderiyle ilgili bazı verileri kaydetmek için veritabanındaki sütunu kullanın .

Örneğin, Kayıt Üzerindeki Markdown, bir gönderinin markdown sürümünü post_content_formattedsütunda ve sütunda ayrıştırılmış HTML'yi ayrı olarak depolar; post_contentböylece, eklenti devre dışı bırakıldığında, gönderiler Markdown'ı patlatamaz (çünkü HTML saklanır post_content).

Şimdi bunun post_content_filteredgeçici depolama için çok fazla kullanıldığını fark ettim , yani sütundaki içerik şu durumlarda kaybolur (veya silinir):

  • 'Hızlı Düzenleme' seçeneğini kullanarak bir yayında (başlık, etiketler, kategoriler, vb.) değişiklikler yapabilirsiniz.

  • zamanlanmış bir yayın (otomatik olarak) yayınlanır

  • yayınlarda toplu düzenlemeler yapıyorsunuz

  • bir yayının revizyonları arasında geçiş yaparsınız

  • Bir gönderi harici bir düzenleyiciden kaydedilir (yani, WordPress gönderi düzenleyicisine değil)

Sorular:

  1. Hangi durumlarda, post_content_filteredsütundaki veriler silinir?

  2. Bunun olmasını engellemenin bir yolu var mı? (Yani, verinin kalıcı olarak depolandığından, post_contentsütunun işlenme biçiminden emin olmanın bir yolu var mı?)

Yanıtlar:


29

WordPress'teki her mesaj güncellemesi wp_update_postişlev tarafından gerçekleştirilir .

Bu işlev bazı varsayılan değerlere sahiptir ve post_content_filteredvarsayılan değer için '' (boş dize).

Varsayılanlar, işlev üzerinden geçirilen hatalarla birleştirildiğinde, wp_parse_argsbir gönderi her güncelleştirildiğinde ve post_content_filteredaçıkça iletilmediğinde, boş bir dizeye ayarlanır.

Şimdi şunu sorabiliriz: post_content_filteredaçı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_filteredzaman temizlenir; tek istisna post_content_filteredaçıkça açıkça iletildiği zaman wp_update_postve 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_postiş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_data2 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_postsö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 $wpdbsorgu 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_filteredbu 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_filteredişlevinizi çağırın , örneğin Ajax aracılığıyla.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.