เมื่อใดคอลัมน์ 'post_content_filtered' ในฐานข้อมูลจะถูกล้างโดย WordPress?


29

ปลั๊กอิน WordPress บางตัว (แม้ว่าจะมีน้อยมาก) ใช้post_content_filteredคอลัมน์ในฐานข้อมูลเพื่อบันทึกข้อมูลบางอย่างที่เกี่ยวข้องกับโพสต์

ตัวอย่างเช่นMarkdown on Saveเก็บเวอร์ชัน markdown ของโพสต์แยกกันในpost_content_formattedคอลัมน์และ HTML ที่แยกวิเคราะห์ในpost_contentคอลัมน์ดังนั้นเมื่อปลั๊กอินถูกปิดการใช้งานโพสต์จะไม่คาย Markdown (เนื่องจาก HTML ถูกเก็บไว้ในpost_content)

ตอนนี้ฉันรู้แล้วว่าpost_content_filteredมันใช้สำหรับการจัดเก็บชั่วคราวมากเช่นเนื้อหาในคอลัมน์หายไป (หรือลบ) เมื่อ:

  • คุณทำการเปลี่ยนแปลงโพสต์ (ชื่อแท็กหมวดหมู่ ฯลฯ ) โดยใช้ตัวเลือก 'แก้ไขด่วน'

  • โพสต์ตามกำหนดเวลาได้รับการเผยแพร่ (โดยอัตโนมัติ)

  • คุณทำการแก้ไขโพสต์จำนวนมาก

  • คุณสลับไปมาระหว่างการแก้ไขโพสต์

  • โพสต์จะถูกบันทึกจากตัวแก้ไขภายนอก (เช่นไม่ใช่ตัวแก้ไขโพสต์ WordPress)

คำถาม:

  1. ข้อมูลอื่นในpost_content_filteredคอลัมน์ใดบ้างที่ถูกล้างข้อมูล

  2. มีวิธีที่จะป้องกันไม่ให้สิ่งนี้เกิดขึ้นหรือไม่? (ฉันหมายถึงมีวิธีที่จะทำให้แน่ใจว่าข้อมูลถูกจัดเก็บอย่างถาวรวิธีการpost_contentปฏิบัติต่อคอลัมน์หรือไม่)

คำตอบ:


29

โพสต์ทุกการอัพเดทใน WordPress ได้รับการจัดการโดยwp_update_postฟังก์ชั่น

ฟังก์ชั่นนี้มีค่าเริ่มต้นบางส่วนและสำหรับpost_content_filteredค่าเริ่มต้นคือ '' (สตริงว่าง)

เมื่อค่าเริ่มต้นถูกรวมเข้ากับ args ที่ส่งไปยังฟังก์ชันผ่านwp_parse_argsหมายความว่าทุกครั้งที่โพสต์ได้รับการอัปเดตและpost_content_filteredไม่ผ่านการแจ้งเตือนอย่างชัดเจนจะถูกตั้งค่าเป็นสตริงว่าง

ตอนนี้เราสามารถถาม: เมื่อมีการpost_content_filteredส่งผ่านไปอย่างชัดเจนwp_update_post? คำตอบคือ: ไม่เคยโดย WordPress

ดังนั้นสำหรับคำถามแรกของคุณ:

ข้อมูลอื่น ๆ ในคอลัมน์ post_content_filtered ถูกล้างข้อมูลในสถานการณ์ใดบ้าง

คำตอบสั้น ๆ คือทุกครั้งที่มีการโพสต์มีการปรับปรุงด้วยเหตุผลใดก็ตาม

โปรดทราบว่าการเปลี่ยนแปลงเพียงหนึ่งช่องเท่านั้นคือการอัปเดตโดยเฉพาะการเปลี่ยนแปลงสถานะทั้งหมดคือการอัปเดตเช่นฉบับร่างเพื่อเผยแพร่รอการเผยแพร่ในอนาคตที่จะเผยแพร่เผยแพร่สู่ถังขยะ (การลบโพสต์) และอื่น ๆ ...

หากมีการเปลี่ยนแปลงบางอย่างในโพสต์ก็post_content_filteredจะถูกล้าง; ข้อยกเว้นเพียงอย่างเดียวคือเมื่อpost_content_filteredมีการส่งผ่านไปยังอย่างชัดเจนwp_update_postและตามที่ได้กล่าวไปแล้ว WordPress ไม่เคยทำเช่นนี้

มีวิธีที่จะป้องกันไม่ให้สิ่งนี้เกิดขึ้นหรือไม่? (ฉันหมายถึงมีวิธีที่จะทำให้แน่ใจว่าข้อมูลถูกจัดเก็บอย่างถาวรหรือไม่?

หากคุณสร้างฟิลด์นั้นด้วยรหัสของคุณและคุณต้องการที่จะรักษามันไว้คุณต้องดูทุกการอัปเดตที่ดำเนินการโดย WordPress และป้องกันการเปลี่ยนแปลง

นี่อาจฟังดูยาก แต่ถ้าคุณอ่านประโยคแรกในคำตอบนี้ " ฟังก์ชั่นอัพเดททุกโพสต์ใน WordPress ถูกจัดการโดยwp_update_postฟังก์ชั่น " คุณเข้าใจว่าสิ่งเดียวที่จำเป็นคือดูฟังก์ชั่นนั้นซึ่งโชคดีมีตะขอที่แตกต่างกัน .

เบ็ดที่ฉันแนะนำคือwp_insert_post_dataเหตุผล 2 ประการ:

  • มันทำงานก่อนการอัปเดตดังนั้นคุณไม่ต้องกู้คืนแต่คุณสามารถป้องกันได้
  • มันผ่านพารามิเตอร์ 2 ตัว: ข้อมูลที่ฟังก์ชันกำลังจะอัปเดตและอาร์เรย์ของพารามิเตอร์ที่ส่งผ่านซึ่ง (ในกรณีของการอัปเดต) มี ID ของโพสต์

ดังนั้นเมื่อใช้แบบง่ายget_postคุณสามารถเปรียบเทียบว่าตอนนี้โพสต์นั้นเป็นอย่างไรและโพสต์นั้นเป็นอย่างไร: ถ้าคุณไม่ชอบอะไรคุณสามารถเปลี่ยนได้

รหัสกัน

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;

}

มีปัญหาที่เป็นไปได้ซึ่งฟังก์ชั่นก่อนหน้านี้ป้องกันการทำความสะอาดทุกครั้ง post_content_filteredและถ้าคุณด้วยเหตุผลใดก็ตามต้องการที่จะล้างมัน?

ฉันได้กล่าวว่าการเปลี่ยนแปลงการโพสต์ WP ทุกครั้งจะได้รับการจัดการwp_update_postแต่คุณไม่ใช่ WordPress

คุณสามารถเขียนฟังก์ชั่นเช่น:

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

เป็น$wpdbคำถามที่ไม่เรียกตัวกรองของเราดังนั้นการตั้งค่าใหม่จะทำโดยไม่มีปัญหาและทุกที่ในรหัสของคุณคุณต้องตั้งค่าใหม่post_content_filteredคุณสามารถเรียกใช้ฟังก์ชั่นนี้

คุณสามารถสร้างเมท็อกซ์ด้วยปุ่ม 'ล้างเนื้อหาที่กรอง' และเมื่อคลิกปุ่มนี้เพียงแค่เรียกreset_post_content_filteredใช้ฟังก์ชันของคุณเช่นผ่านอาแจ็กซ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.