มีสองขั้นตอนในวิธีการ: ขั้นแรกให้ฟังก์ชั่นเพื่อบันทึกข้อมูลฟิลด์ metabox แบบกำหนดเองของคุณ (เชื่อมต่อกับ save_post) และที่สองฟังก์ชั่นเพื่ออ่าน post_meta ใหม่ (ซึ่งคุณเพิ่งบันทึกไว้) ตรวจสอบและแก้ไขผลลัพธ์ บันทึกตามความจำเป็น (รวมถึง save_post ด้วย แต่หลังจากครั้งแรก) ฟังก์ชันตัวตรวจสอบความถูกต้องหากการตรวจสอบล้มเหลวจริง ๆ แล้วเปลี่ยน post_status กลับไปเป็น "รอดำเนินการ" จริง ๆ แล้วป้องกันไม่ให้โพสต์ถูกเผยแพร่อย่างมีประสิทธิภาพ
เนื่องจากฟังก์ชั่น save_post ได้รับการเรียกเป็นจำนวนมากแต่ละฟังก์ชั่นจะตรวจสอบเพื่อดำเนินการเฉพาะเมื่อผู้ใช้หมายถึงการเผยแพร่และเฉพาะประเภทโพสต์ที่กำหนดเองของคุณ (mycustomtype)
ฉันมักจะเพิ่มข้อความประกาศที่กำหนดเองเพื่อช่วยให้ผู้ใช้ทราบว่าเหตุใดโพสต์ของพวกเขาจึงไม่เผยแพร่ แต่สิ่งเหล่านั้นมีความซับซ้อนเล็กน้อยที่จะรวมที่นี่ ...
ฉันไม่ได้ทดสอบรหัสที่แน่นอนนี้ แต่เป็นรุ่นที่ง่ายขึ้นของสิ่งที่ฉันทำในการตั้งค่าประเภทโพสต์ที่กำหนดเองขนาดใหญ่
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);' ) );
}
}
}
สำหรับเขตข้อมูล metabox หลายแห่งเพียงเพิ่มเครื่องหมายความสมบูรณ์มากขึ้นและดึง post_meta เพิ่มเติมและทำการทดสอบเพิ่มเติม ..