Event
시작 및 종료 날짜 / 시간 사용자 정의 필드를 포함 하는 사용자 정의 게시물 유형 이 있습니다 (게시 편집 화면에서 메타 박스로).
날짜를 채우지 않고는 이벤트를 게시 (또는 예약) 할 수 없도록하고 싶습니다. 필요한 요구 사항 외에도 이벤트 데이터를 표시하는 템플릿에 문제가 발생할 수 있기 때문입니다. 그러나 준비 중에 유효한 날짜가 포함되지 않은 초안 이벤트를 가질 수 있기를 원합니다.
나는 접선의 생각 save_post
점검을 수행하는,하지만 어떻게 내가 일어나는 상태 변화를 방지 할 수 있습니까?
EDIT1 : 이것은 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
훅 내에서 사용 하면 무한 루프가 트리거됩니다.
EDIT3 :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;
}