이 방법에는 두 가지 단계가 있습니다. 첫째, 사용자 정의 메타 박스 필드 데이터를 저장하는 함수 (sav_post에 후크 됨)와 둘째, 새 post_meta (방금 저장 한)를 읽고 확인하고 결과를 수정하는 함수입니다. 필요에 따라 저장합니다 (또한 save_post에 연결되었지만 첫 번째 이후에). 유효성 검사에 실패하면 유효성 검사기 기능은 실제로 post_status를 "pending"으로 다시 변경하여 게시물이 효과적으로 게시되지 않도록합니다.
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);' ) );
}
}
}
여러 메타 박스 필드의 경우 완료 마커를 추가하고 더 많은 post_meta를 검색하고 더 많은 테스트를 수행하십시오.