ฉันจะแก้ไขข้อมูลโพสต์ก่อนที่จะบันทึกได้อย่างไร


19

ฉันมีปลั๊กอินและฉันต้องการเรียกใช้เนื้อหาโพสต์ผ่านตัวกรองบางตัวก่อนที่จะถูกบันทึกลงในฐานข้อมูล จากการดูplugin apiฉันเห็นว่า hooks สองตัวที่ดูเหมือนว่าพวกเขาอาจมีประโยชน์:

save_post
wp_insert_post

ปัญหาเดียวคือมันดูเหมือนว่าsave_postไม่จำเป็นต้องส่งคืนตัวแปรดังนั้นฉันจึงไม่รู้วิธีกรองเนื้อหาและwp_insert_postดูเป็นเอกสาร

ฉันต้องการทำสิ่งนี้:

add_action('whatever_hook_name','my_function');

function my_function($post_content){
    return $post_content.' <br> This post was saved on '.time();
}

ฉันจะทำสิ่งที่มีประโยชน์มากกว่าผนวกเวลาคือการใช้ตัวกรอง regex บางตัว แต่นี่เป็นตัวกรอง / แอ็คชั่นทั่วไปที่ฉันพยายามเพิ่ม

ปรับปรุง

โปรดทราบว่าฉันต้องการที่จะสกัดกั้นข้อมูลเกี่ยวกับวิธีที่จะถูกบันทึกไว้ในฐานข้อมูล - ไม่ใช่เมื่อมันถูกแสดงในโพสต์ (เช่น: ไม่โดยการเพิ่มตัวกรองไปthe_content)


หมายเหตุ: คุณมีการออกแบบที่ไม่ดี :-) 1. บันทึกทุกครั้งที่โพสต์ข้อความนี้จะถูกต่อท้าย (ถ้าคุณไม่ลบข้อมูลก่อนหน้านี้คุณจะได้รับข้อมูลจำนวนมาก " This post was..." s 2. ข้อมูลนี้ควรถูกเก็บไว้เป็นค่าเมตาของโพสต์ :-) BTW: save_postถูกเรียกหลังจากข้อมูลถูกบันทึกดังนั้นหลังจากนั้น บันทึกลงในฐานข้อมูลแล้ว (ไม่ใช่สิ่งที่คุณต้องการ)
jave.web

คำตอบ:


29

wp_insert_post_dataกรองสามารถทำเช่นนั้น:

add_filter( 'wp_insert_post_data' , 'filter_post_data' , '99', 2 );

function filter_post_data( $data , $postarr ) {
    // Change post title
    $data['post_title'] .= '_suffix';
    return $data;
}

2
พาฉันไปในทิศทางที่ถูกต้องแล้วขอบคุณ ฉันคิดว่าคุณต้องการจริงที่จะใช้แม้ว่าแทนadd_action add_filterของคุณwpse35931_filter_post_dataและfilter_handlerไม่สอดคล้องกันด้วย ...
cwd

1
มันเป็นตัวกรองแน่นอน แม้ว่าตัวกรองและการกระทำนั้นขึ้นอยู่กับฟังก์ชั่นเดียวกันซึ่งอนุญาตให้ครอสโอเวอร์บางตัว อย่างไรก็ตามหากคุณใช้สิ่งนี้เป็นการกระทำคุณจะไม่สามารถส่งคืนข้อมูลที่จะลบจุดทั้งหมด คุณต้องการกรองข้อมูลแล้วส่งคืน
Jake

2
wp_insert_post_dataใช้งานได้ แต่ค่อนข้างเอาชนะได้สำหรับสิ่งที่ OP (และบางทีคนอื่น ๆ ) ต้องการบรรลุ ตัวเลือกที่ง่ายกว่าในสถานการณ์นี้content_save_preเป็นไปตามที่ @drzaus แนะนำ
rinogo

1
นักพัฒนาเอกสารสำหรับwp_insert_post_dataตัวกรอง: developer.wordpress.org/reference/hooks/wp_insert_post_data
jave.web

เบ็ดนี้ถูกเรียกเมื่อใดก็ตามที่คุณ a) โทรด้วยตนเองเช่น wp_insert_post () ใน, เช่น function.php ของชุดรูปแบบของคุณเพื่อแทรก / อัพเดทโพสต์หรือ b) ทุกครั้งที่โพสต์จะถูกบันทึกด้วยวิธีการใด ๆ อย่างอื่น ... )?
Vadim H


2

คุณยังสามารถตรวจสอบตะขอ pre_post_update

add_action('pre_post_update', 'before_data_is_saved_function');

function before_data_is_saved_function($post_id) {

}

1

เพิ่มรหัสต่อไปนี้ในธีมที่ใช้งานเพื่อแทนที่<shell>ด้วย[shell]ก่อนบันทึก:

 add_filter('content_save_pre', 'my_sanitize_content', 10, 1);
 function my_sanitize_content($value) {
   return str_replace('<shell>', '[shell]', $value);
 }

0

หากคุณต้องการเพิ่มสิ่งที่คล้ายกันในตอนท้ายของโพสต์ทั้งหมดฉันขอแนะนำให้คุณใช้the_contentตัวกรอง

function append_to_content( $content ) {
    global $post;
    return $content.'<br />This post was saved on '.$post->post_date;
}
add_filter( 'the_content', 'append_to_content' );

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