Làm thế nào tôi có thể chỉnh sửa dữ liệu bài trước khi nó được lưu?


19

Tôi có một plugin và tôi muốn có thể chạy nội dung bài đăng thông qua một số bộ lọc trước khi nó được lưu vào cơ sở dữ liệu. Từ việc nhìn vào plugin api , tôi thấy rằng hai cái móc trông giống như chúng có thể hữu ích:

save_post
wp_insert_post

Vấn đề duy nhất là nó trông giống như save_postkhông cần trả về một biến, và vì vậy tôi không biết làm thế nào để lọc nội dung, và wp_insert_postngoại hình tài liệu.

Tôi muốn làm một cái gì đó như thế này:

add_action('whatever_hook_name','my_function');

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

Tôi sẽ làm một cái gì đó hữu ích hơn là nối thêm dấu thời gian, cụ thể là chạy một số bộ lọc regex, nhưng đây là loại bộ lọc / hành động chung mà tôi đang cố gắng thêm.

Cập nhật

Xin lưu ý rằng tôi muốn chặn dữ liệu theo cách được lưu trong cơ sở dữ liệu - không phải khi nó được hiển thị trong bài đăng (ví dụ: Không phải bằng cách thêm bộ lọc vào the_content)


Lưu ý: Bạn có một thiết kế xấu :-) 1. mỗi lần đăng bài sẽ được lưu, chuỗi này sẽ được nối thêm. (nếu bạn không xóa trước đó, bạn nhận được rất nhiều của " This post was..."s 2. dữ liệu đó một điều này nên được lưu trữ như một giá trị meta của bài :-) BTW: save_postđược gọi sau khi dữ liệu đã được lưu, do đó sau khi nó đã được lưu vào cơ sở dữ liệu (không phải những gì bạn muốn).
jave.web

Câu trả lời:


29

Bộ lọc wp_insert_post_data có thể làm điều đó:

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
đã cho tôi đi đúng hướng, cảm ơn. Tôi nghĩ rằng bạn thực sự cần phải sử dụng add_actionthay vì add_filter. cũng là của bạn wpse35931_filter_post_datafilter_handlerkhông phù hợp ...
cwd

1
chắc chắn là một bộ lọc. Mặc dù các bộ lọc và hành động dựa trên cùng một chức năng cho phép một số chéo. Tuy nhiên, nếu bạn sử dụng điều này như một hành động, bạn sẽ không thể trả lại dữ liệu sẽ xóa toàn bộ điểm. Bạn muốn LỌC dữ liệu và sau đó trả lại.
Jake

2
wp_insert_post_datahoạt động, nhưng hơi áp đảo cho những gì OP (và có lẽ những người khác) muốn thực hiện. Một tùy chọn đơn giản hơn trong tình huống này được content_save_pređề xuất bởi @drzaus.
rinogo

1
Tài liệu dành cho nhà phát triển cho wp_insert_post_databộ lọc: developer.wordpress.org/reference/hooks/wp_insert_post_data
jave.web

Móc này có được gọi bất cứ khi nào bạn a) gọi thủ công wp_insert_post () trong, ví dụ, hàm.php của chủ đề của bạn để chèn / cập nhật bài đăng HOẶC b) bất cứ khi nào bài đăng được lưu bằng bất kỳ phương tiện nào có thể (ví dụ: thông qua phụ trợ, thông qua giao diện , bằng cách nào khác ...)?
Vadim H


2

Bạn cũng có thể kiểm tra móc pre_post_update

add_action('pre_post_update', 'before_data_is_saved_function');

function before_data_is_saved_function($post_id) {

}

1

Thêm mã sau đây để các chủ đề tích cực để thay thế <shell>với [shell]trước khi lưu:

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

0

Nếu bạn chỉ muốn thêm một cái gì đó tương tự vào cuối tất cả các bài viết, thì tôi sẽ đề nghị bạn sử dụng the_contentbộ lọc.

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' );

Cảm ơn nhưng tôi thực sự muốn chỉnh sửa dữ liệu trước khi nó được lưu trong cơ sở dữ liệu.
cwd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.