Wordpress: Как создать уникальное поле с ACF и пользовательским типом записи - PullRequest
1 голос
/ 27 февраля 2020

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

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

function init_members() {
    $labels = array(
        'name'               => 'Members',
        'singular_name'      => 'Member',
        'menu_name'          => 'Members',
        'name_admin_bar'     => 'Member',
        'add_new'            => 'New member',
        'add_new_item'       => 'New member',
        'new_item'           => 'New member',
        'edit_item'          => 'Edit member',
        'all_items'          => 'All members',
        'search_items'       => 'Search member',
        'not_found'          => 'No members found',
        'not_found_in_trash' => 'No members found in trash'
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'exclude_from_search' => true,
        'rewrite' => array('slug' => 'member'),
        'has_archive' => false,
        'supports' => array('title'),
        'show_in_rest' => true,
        'menu_icon' => 'dashicons-groups'

    );
    register_post_type('members', $args);
}
add_action('init', 'init_members');

function add_member_columns ( $columns ) {
    unset($columns['date']);
    return array_merge ( $columns, array (
        'contactperson'   => __ ( 'Contactperson' ),
        'phone_number'   => __ ( 'Phonenumber' ),
        'email'   => __ ( 'Email' ),
    ) );
}
add_filter ('manage_members_posts_columns', 'add_member_columns' );

function fill_member_columns ( $column, $post_id ) {
    switch ( $column ) {
        case 'contactperson':
            echo get_post_meta ( $post_id, 'contactperson', true );
            break;
        case 'phone_number':
            echo get_post_meta ( $post_id, 'phone_number', true );
            break;
        case 'email':
            echo get_post_meta ( $post_id, 'email', true );
            break;
    }
}
add_action ('manage_members_posts_custom_column', 'fill_member_columns', 10, 2 );

Итак, сценарий, который я использую для фильтрации повторяющихся писем, выглядит следующим образом. источник, откуда я его взял, это здесь

add_filter('acf/validate_value/name='.'email', 'acf_unique_value_field', 10, 4);

function acf_unique_value_field($valid, $value, $field, $input) {
    if (!$valid || (!isset($_POST['post_ID']) && !isset($_POST['post_id']))) {
        return $valid;
    }
    if (isset($_POST['post_ID'])) {
        $post_id = intval($_POST['post_ID']);
    } else {
        $post_id = intval($_POST['post_id']);
    }
    if (!$post_id) {
        return $valid;
    }
    $post_type = get_post_type($post_id);
    $field_name = $field['name'];
    $args = array(
        'post_type' => $post_type,
        'post_status' => 'publish, draft, trash',
        'post__not_in' => array($post_id),
        'meta_query' => array(
            array(
                'key' => 'email',
                'value' => $value
            )
        )
    );
    $query = new WP_Query($args);
    if (count($query->posts)){
        return 'This Value is not Unique. Please enter a unique '.$field['label'];
    }
    return true;
}

Я, вероятно, наблюдаю за чем-то довольно очевидным. Но я не могу найти то, что я наблюдаю.

1 Ответ

1 голос
/ 27 февраля 2020

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

Попробуйте выполнить следующее: в acf_unique_value_field(), исправьте ваш запрос следующим образом:

    $args = array(
        'post_type' => $post_type,
        'post_status' => 'publish, draft, trash',
        'post__not_in' => array($post_id),
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
                'key' => 'email',
                'value' => $value
            )
        )
    );
    $query = new WP_Query($args);

'posts_per_page' => -1, будет запрашивать неограниченное количество сообщений.

Кроме того, я видел, что вы используете get_post_meta для получения ACF значения полей. Я советую не делать этого. Вместо этого используйте ACF get_fieldupdate_field для обновления при необходимости).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...