Cách chính xác để hook khi cập nhật bài viết


19

tôi cố gắng hook khi bài viết được cập nhật nhưng tất cả hook tôi cố gắng không bao giờ thực hiện ngoại trừ updated_post_meta

add_action('updated_post_meta', 'my_function');

function my_function($post_id) {    
    echo 'This is my post ID : '.$post_id;
}

Tôi đã thử điều này add_action('save_post', 'my_function');nhưng không có id nào bị dội lại hoặc có thể tin nhắn này đã lặp lại nhưng không bao giờ hiển thị vì tiêu đề chuyển hướng được gửi.


2
bạn có một khoảng trắng sau save_post, đó là một lỗi đánh máy ở đây, hay đó là trong mã gốc của bạn? Ngoài ra, cho phép gỡ lỗi trong khi phát triển.
Milo

@Milo xin lỗi lỗi đánh máy, nhưng không phải trong mã gốc
thực sự là

nếu đó là trường hợp, thì bạn sẽ thấy đầu ra của mình ở góc trên cùng bên trái của màn hình khi tạo một bài đăng mới. lưu một bài đăng hiện có xảy ra trước khi chuyển hướng, vì vậy bạn sẽ không thấy bất cứ điều gì trừ khi bạn đã bật gỡ lỗi.
Milo

Câu trả lời:


55

Khi một bài viết được cập nhật, có một số hook được kích hoạt:

  • 'pre_post_update'là một hành động được kích hoạt ngay trước khi bài đăng được cập nhật, đối số được truyền là 2: $post_ID$datađó là một mảng của tất cả các colums cơ sở dữ liệu khác của bảng bài
  • 'transition_post_status'là một hook được kích hoạt khi cập nhật và vượt qua 3 đối số: $ new_post_status $old_post_status$post(object).
  • Sau đó, có 2 hook chuyển tiếp khác được kích hoạt, nhưng chúng được đặt tên động, điều đó có nghĩa là hành động hiệu quả được kích hoạt phụ thuộc vào trạng thái bài cũ và mới. "{$old_status}_to_{$new_status}""{$new_status}_{$post->post_type}". Đầu tiên chỉ truyền đối tượng post làm đối số, thứ hai truyền id bài và đối tượng post. Tìm tài liệu ở đây .
  • 'edit_post'vượt qua 2 đối số: $post_ID$post(đối tượng)
  • 'post_updated'vượt qua 3 đối số : $post_ID, $post_after(đối tượng đăng sau khi cập nhật), $post_before(đối tượng đăng trước khi cập nhật)
  • Một hook động khác: "save_post_{$post->post_type}"phụ thuộc vào loại bài đăng, ví dụ: đối với các bài đăng tiêu chuẩn là 'save_post_post'và đối với các trang là 'save_post_page', hook này vượt qua 3 đối số : $post_ID, $post(đối tượng) và $updateđó là một boolean (đúng hoặc sai) đúng khi bạn thực hiện cập nhật, trong thực tế cái móc này cũng bị bắn khi bài đăng được lưu lần đầu tiên.
  • ' save_post' được kích hoạt cả khi cập nhật và lưu lần đầu tiên và vượt qua 3 đối số tương tự của hook trước đó.
  • ' save_post_{$post_type}' được kích hoạt cả khi cập nhật và lưu lần đầu tiên và vượt qua 2 đối số đầu tiên của hook trước đó.
  • Cuối cùng, bạn có ' wp_insert_post' , được kích hoạt cả khi cập nhật và lưu lần đầu tiên và vượt qua 3 đối số tương tự của 2 hook trước đó.

Các hook này được kích hoạt mỗi khi một bài đăng được cập nhật, cả thông qua các trang quản trị trong phần phụ trợ và thông qua khi được cập nhật "thủ công" bằng cách sử dụng wp_update_posthoặc các wp_insert_postchức năng.

Khi bài đăng được cập nhật bằng các trang quản trị, có thêm các hook được kích hoạt, một ví dụ là 'update_post_redirect'hoặc 'post_updated_messages'. (Xem nàynày WPSE câu trả lời cho các ví dụ sử dụng).

Lưu ý rằng nếu bạn muốn sử dụng một số đối số hook, đó không phải là đối số đầu tiên, bạn phải khai báo rõ ràng trong add_actioncuộc gọi.

Ví dụ: nếu bạn muốn sử dụng '$update'đối số (đó là lần thứ 3) của 'save_post'hook bạn cần thêm 3dưới dạng $accepted_argsparam trên add_action( xem tài liệu ):

// if you don't add 3 as as 4th argument, this will not work as expected
add_action( 'save_post', 'my_save_post_function', 10, 3 );

function my_save_post_function( $post_ID, $post, $update ) {
  $msg = 'Is this un update? ';
  $msg .= $update ? 'Yes.' : 'No.';
  wp_die( $msg );
}

Lưu ý cuối cùng về thời gian : bạn phải chắc chắn rằng nó add_actionđược gọi trước khi hành động được kích hoạt, hoặc nó sẽ không làm gì cả.

Ví dụ mã này:

wp_update_post( $post );
add_action( 'save_post', 'my_function', 10, 3 );

sẽ không làm gì cả, vì hành động được thêm vào sau khi hook được bắn. Ở đây thật đơn giản để nhận ra nó, trong thế giới thực, mã không phải lúc nào cũng như vậy.


Tôi nghĩ rằng móc hành động 'save_post' cũng được kích hoạt khi nhấn Thêm mới (Đăng, Trang, CPT) trong bảng điều khiển. Để thấy mình chỉ cần chạy mã này. function save_post_test( $post_id, $post, $update ) { print ' post_id : '; var_export( $post_id ); print ' post : '; var_export( $post ); print ' update : '; var_export( $update ); wp_die( 'save_post hook runs when you click Add New..' ); } add_action( 'save_post', 'save_post_test', 10, 3 );Tại sao hành động 'save_post' chạy trên Thêm mới thay vì trên Xuất bản? Để thực hiện bài viết tự động tôi giả sử.
lowTechsun

@lowtechsun Giống như đã nói trong A, các hook được kích hoạt mỗi khi bài đăng được cập nhật, tức là được lưu trong DB. Khi bạn nhấn "Thêm mới", gần với tải trang, WP sẽ tạo một bài đăng dự thảo được lưu trữ trong DB để anh ta móc ra.
gmazzap

Xin cám ơn sự phúc đáp của bạn. Chỉ cần tìm hiểu về điều này ngày hôm qua và nghĩ rằng khái niệm này là khó hiểu. Có nghĩa là đầu tiên tôi mở trang để thêm một bài mới. Ở giai đoạn này, tôi nghĩ rằng tôi chưa tạo ra một bài viết. Chỉ khi tôi nhấn Publish tôi mới nghĩ bài mới được tạo. Tiếp tục, tôi hy vọng WP sẽ xóa bài đăng tự động nếu tôi nhấn Thêm mới nhưng sau đó rời khỏi trang mà không nhấn Xuất bản?
lowTechsun

2

Tại sao không móc vào post_updated_messages. Bằng cách đó bạn có thể hiển thị thông báo này giống như bài đăng wordpress mặc định được cập nhật.

add_filter('post_updated_messages', 'your_message');

function your_message(){
}

Hãy tìm một ví dụ ở đây:

http://codex.wordpress.org/Function_Reference/register_post_type

Dưới post_updated_messages

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.