ฉันมีประเภทโพสต์ที่กำหนดเองEvent
ที่มีฟิลด์วันที่ / เวลาที่กำหนดเองเริ่มต้นและสิ้นสุด (เป็นเมท็อกซ์ในหน้าจอแก้ไขโพสต์)
ฉันต้องการตรวจสอบให้แน่ใจว่ากิจกรรมไม่สามารถเผยแพร่ (หรือกำหนดเวลา) โดยไม่ต้องกรอกวันที่เนื่องจากจะทำให้เกิดปัญหากับเทมเพลตที่แสดงข้อมูลกิจกรรม (นอกเหนือจากข้อเท็จจริงที่ว่ามันเป็นข้อกำหนดที่จำเป็น!) อย่างไรก็ตามฉันต้องการที่จะมีเหตุการณ์ฉบับร่างที่ไม่มีวันที่ที่ถูกต้องในขณะที่พวกเขากำลังเตรียมการ
ฉันกำลังคิดที่save_post
จะทำการตรวจสอบ แต่ฉันจะป้องกันไม่ให้เกิดการเปลี่ยนแปลงสถานะได้อย่างไร
แก้ไข 1:นี่คือเบ็ดที่ฉันใช้ตอนนี้เพื่อบันทึก post_meta
// Save the Metabox Data
function ep_eventposts_save_meta( $post_id, $post ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( !isset( $_POST['ep_eventposts_nonce'] ) )
return;
if ( !wp_verify_nonce( $_POST['ep_eventposts_nonce'], plugin_basename( __FILE__ ) ) )
return;
// Is the user allowed to edit the post or page?
if ( !current_user_can( 'edit_post', $post->ID ) )
return;
// OK, we're authenticated: we need to find and save the data
// We'll put it into an array to make it easier to loop though
//debug
//print_r($_POST);
$metabox_ids = array( '_start', '_end' );
foreach ($metabox_ids as $key ) {
$events_meta[$key . '_date'] = $_POST[$key . '_date'];
$events_meta[$key . '_time'] = $_POST[$key . '_time'];
$events_meta[$key . '_timestamp'] = $events_meta[$key . '_date'] . ' ' . $events_meta[$key . '_time'];
}
$events_meta['_location'] = $_POST['_location'];
if (array_key_exists('_end_timestamp', $_POST))
$events_meta['_all_day'] = $_POST['_all_day'];
// Add values of $events_meta as custom fields
foreach ( $events_meta as $key => $value ) { // Cycle through the $events_meta array!
if ( $post->post_type == 'revision' ) return; // Don't store custom data twice
$value = implode( ',', (array)$value ); // If $value is an array, make it a CSV (unlikely)
if ( get_post_meta( $post->ID, $key, FALSE ) ) { // If the custom field already has a value
update_post_meta( $post->ID, $key, $value );
} else { // If the custom field doesn't have a value
add_post_meta( $post->ID, $key, $value );
}
if ( !$value )
delete_post_meta( $post->ID, $key ); // Delete if blank
}
}
add_action( 'save_post', 'ep_eventposts_save_meta', 1, 2 );
EDIT2:และนี่คือสิ่งที่ฉันพยายามใช้เพื่อตรวจสอบข้อมูลการโพสต์หลังจากบันทึกลงในฐานข้อมูล
add_action( 'save_post', 'ep_eventposts_check_meta', 99, 2 );
function ep_eventposts_check_meta( $post_id, $post ) {
//check that metadata is complete when a post is published
//print_r($_POST);
if ( $_POST['post_status'] == 'publish' ) {
$custom = get_post_custom($post_id);
//make sure both dates are filled
if ( !array_key_exists('_start_timestamp', $custom ) || !array_key_exists('_end_timestamp', $custom )) {
$post->post_status = 'draft';
wp_update_post($post);
}
//make sure start < end
elseif ( $custom['_start_timestamp'] > $custom['_end_timestamp'] ) {
$post->post_status = 'draft';
wp_update_post($post);
}
else {
return;
}
}
}
ปัญหาหลักของปัญหานี้คือปัญหาที่อธิบายไว้ในคำถามอื่น : การใช้wp_update_post()
ภายในsave_post
hook จะทำให้เกิดการวนซ้ำไม่สิ้นสุด
edit3:ฉันคิดวิธีที่จะทำมันโดย hooking แทนwp_insert_post_data
save_post
ปัญหาเดียวคือตอนนี้post_status
ถูกเปลี่ยนกลับ แต่ตอนนี้ข้อความที่ทำให้เข้าใจผิดว่า "โพสต์เผยแพร่" ปรากฏขึ้น (โดยการเพิ่ม&message=6
URL ที่เปลี่ยนเส้นทาง) แต่สถานะถูกตั้งค่าเป็นแบบร่าง
add_filter( 'wp_insert_post_data', 'ep_eventposts_check_meta', 99, 2 );
function ep_eventposts_check_meta( $data, $postarr ) {
//check that metadata is complete when a post is published, otherwise revert to draft
if ( $data['post_type'] != 'event' ) {
return $data;
}
if ( $postarr['post_status'] == 'publish' ) {
$custom = get_post_custom($postarr['ID']);
//make sure both dates are filled
if ( !array_key_exists('_start_timestamp', $custom ) || !array_key_exists('_end_timestamp', $custom )) {
$data['post_status'] = 'draft';
}
//make sure start < end
elseif ( $custom['_start_timestamp'] > $custom['_end_timestamp'] ) {
$data['post_status'] = 'draft';
}
//everything fine!
else {
return $data;
}
}
return $data;
}