Правильный подход к проверке ввода пользовательских полей
У меня есть пользовательский тип записи с несколькими пользовательскими полями. Я собираюсь провести некоторую проверку этих полей, потому что они будут использоваться другими службами в дальнейшем. Поэтому важно, чтобы он не мог быть сохранен до тех пор, пока он не будет введен правильно. Проверка достаточно сложна и требует специальной логики.
К сожалению, в данном конкретном случае также не получится использовать плагин.
Есть ли идеальный крючок для использования в этом случае? На высоком уровне - что лучший способ сделать это.
2 answers
Пример кода в add_meta_box()
документация использует save_post
крюк (в самом конце wp_insert_post()
функция) для добавления пользовательских данных полей из метабокса.
Вы, должно быть, уже используете что-то подобное в своих метабоксах, разве это не подходящее место для проверки ваших данных?..
( Взято из моего ответа на аналогичный вопрос, опубликованный здесь)
Этот метод состоит из двух шагов: во-первых, функция для сохранения пользовательских данных поля метабокса (подключена к save_post), а во-вторых, функция для чтения этой новой записи (которую вы только что сохранили), ее проверки и изменения результата сохранения по мере необходимости (также подключена к 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);' ) );
}
}
}
Для нескольких полей метабокса просто добавьте больше маркеров завершения и извлеките больше post_meta и выполните больше тестов..