โพสต์ทุกการอัพเดทใน 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
ใช้ฟังก์ชันของคุณเช่นผ่านอาแจ็กซ์