Правильный подход к проверке ввода пользовательских полей


У меня есть пользовательский тип записи с несколькими пользовательскими полями. Я собираюсь провести некоторую проверку этих полей, потому что они будут использоваться другими службами в дальнейшем. Поэтому важно, чтобы он не мог быть сохранен до тех пор, пока он не будет введен правильно. Проверка достаточно сложна и требует специальной логики.

К сожалению, в данном конкретном случае также не получится использовать плагин.

Есть ли идеальный крючок для использования в этом случае? На высоком уровне - что лучший способ сделать это.

Author: hakre, 2011-02-08

2 answers

Пример кода в add_meta_box() документация использует save_post крюк (в самом конце wp_insert_post() функция) для добавления пользовательских данных полей из метабокса.

Вы, должно быть, уже используете что-то подобное в своих метабоксах, разве это не подходящее место для проверки ваших данных?..

 4
Author: Rarst, 2011-02-09 06:42:31

( Взято из моего ответа на аналогичный вопрос, опубликованный здесь)

Этот метод состоит из двух шагов: во-первых, функция для сохранения пользовательских данных поля метабокса (подключена к 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 и выполните больше тестов..

 1
Author: somatic, 2017-04-13 12:37:45