Có hai bước cho phương thức: thứ nhất, một chức năng lưu dữ liệu trường metabox tùy chỉnh của bạn (được nối với save_post) và thứ hai, một chức năng để đọc post_meta mới (mà bạn vừa lưu), xác thực nó và sửa đổi kết quả của tiết kiệm khi cần thiết (cũng được nối với save_post, nhưng sau lần đầu tiên). Hàm xác thực, nếu xác thực không thành công, thực sự thay đổi post_status trở lại "đang chờ xử lý", ngăn chặn hiệu quả bài đăng được xuất bản.
Vì hàm save_post được gọi rất nhiều, mỗi hàm có kiểm tra để chỉ thực thi khi người dùng có nghĩa là xuất bản và chỉ cho loại bài đăng tùy chỉnh của bạn (mycustomtype).
Tôi cũng thường thêm một số thông báo thông báo tùy chỉnh để giúp người dùng biết lý do tại sao bài đăng của họ không được xuất bản, nhưng chúng có một chút phức tạp để đưa vào đây ...
Tôi đã không kiểm tra mã chính xác này, nhưng đó là phiên bản đơn giản hóa những gì tôi đã thực hiện trong các thiết lập loại bài đăng tùy chỉnh quy mô lớn.
add_action('save_post', 'save_my_fields', 10, 2);
add_action('save_post', 'completion_validator', 20, 2);
function save_my_fields($pid, $post) {
// don't do on autosave or when new posts are first created
if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || $post->post_status == 'auto-draft' ) return $pid;
// abort if not my custom type
if ( $post->post_type != 'mycustomtype' ) return $pid;
// save post_meta with contents of custom field
update_post_meta($pid, 'mymetafield', $_POST['mymetafield']);
}
function completion_validator($pid, $post) {
// don't do on autosave or when new posts are first created
if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || $post->post_status == 'auto-draft' ) return $pid;
// abort if not my custom type
if ( $post->post_type != 'mycustomtype' ) return $pid;
// init completion marker (add more as needed)
$meta_missing = false;
// retrieve meta to be validated
$mymeta = get_post_meta( $pid, 'mymetafield', true );
// just checking it's not empty - you could do other tests...
if ( empty( $mymeta ) ) {
$meta_missing = true;
}
// on attempting to publish - check for completion and intervene if necessary
if ( ( isset( $_POST['publish'] ) || isset( $_POST['save'] ) ) && $_POST['post_status'] == 'publish' ) {
// don't allow publishing while any of these are incomplete
if ( $meta_missing ) {
global $wpdb;
$wpdb->update( $wpdb->posts, array( 'post_status' => 'pending' ), array( 'ID' => $pid ) );
// filter the query URL to change the published message
add_filter( 'redirect_post_location', create_function( '$location','return add_query_arg("message", "4", $location);' ) );
}
}
}
Đối với nhiều trường metabox, chỉ cần thêm nhiều dấu hoàn thành và truy xuất thêm post_meta và thực hiện thêm các bài kiểm tra ..