Найдены 2 элемента с неуникальными идентификаторами (#_ajax_nonce) и (#_wpnonce)

Вопрос или проблема

Я разрабатываю индивидуальную тему с нуля и создаю кастомный тип поста, и получаю это предупреждение при редактировании кастомного типа поста. Я также разрабатываю кастомное мета-окно с двумя полями ввода и использую nonce в нем. Любая помощь в удалении этих предупреждений?

Вот код кастомного мета-окна в functions.php

//Кастомное мета-окно

function register_book_meta_box(){
    add_meta_box('book_meta_box_id', 'Подробности о книге','design_book_meta_box','books','advanced','high');
}
add_action('add_meta_boxes','register_book_meta_box');

function design_book_meta_box($post){
    wp_nonce_field(basename(__FILE__),'book_cpt_nonce')
    ?>
        <div>
            <label for="book-author">Имя автора&nbsp;&nbsp;</label>
            <input type="text" name="book-author" placeholder="Имя автора" value="<?php echo get_post_meta( $post->ID, 'book-author-key', true );?>">
        </div>
        <div>
            <label for="year">Год издания</label>
            <input type="number" id="year" name="year" min="1455" max="2020" value="<?php echo get_post_meta( $post->ID, 'book-year-key', true );?>">
            <span id="errorMsg" style="display:none;">Год издания должен быть в диапазоне от 1455 до 2020</span>
        </div>

    <?php
}
function save_book_meta_data($post_id)
{
    if(!isset($_POST['book_cpt_nonce']) || !wp_verify_nonce($_POST['book_cpt_nonce'],basename(__FILE__))){
        return $post_id;
    }
    if (array_key_exists('book-author', $_POST)) {
        update_post_meta( $post_id,'book-author-key', $_POST['book-author']
        );
    }
    if (array_key_exists('year', $_POST)) {
        update_post_meta( $post_id,'book-year-key', $_POST['year']
        );
    }
}
add_action('save_post', 'save_book_meta_data');

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

function save_book_meta_data( $post_id ) {
    if( !current_user_can( 'edit_post', $post_id ) ) {
            return $post_id;
        }
        if( !isset( $_POST['book_cpt_nonce'] ) || !wp_verify_nonce( $_POST['book_cpt_nonce'], basename( __FILE__ ) ) ) {
            return $post_id;
        }
        $ali_book_meta['book-author-key']       = esc_textarea( $_POST['book-author-key'] );
        $ali_book_meta['book-year-key']         = esc_textarea( $_POST['book-year-key'] );
        foreach( $ali_book_meta as $key => $value ) :
            if( 'revision' === $post->post_type ) {
                return;
            }
            if( get_post_meta( $post_id, $key, false ) ) {
                update_post_meta( $post_id, $key, $value );
            } else {
                add_post_meta( $post_id, $key, $value);
            }
            if( !$value ) {
                delete_post_meta( $post_id, $key );
            }
        endforeach;
}
add_action( 'save_post', 'save_book_meta_data', 1, 2 );

Я не знаю, решает ли это вашу настоящую проблему, но вы можете попробовать и посмотреть, что получится.

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

Ответ или решение

Ваше сообщение о том, что были найдены два элемента с неуникальным идентификатором (#_ajax_nonce) и (#_wpnonce), связано с тем, что вы создаете пользовательскую метабокс в вашем кастомном типе записей, но при этом не используете уникальные имена для ваших nonce-полей.

Давайте рассмотрим шаги, которые помогут вам решить эту проблему:

  1. Проблема с неуникальными идентификаторами: Поскольку в WordPress nonce используется для проверки, что данные отправлены из вашего интерфейса, каждая nonce-пара должна быть уникальной для каждого метабокса, чтобы избежать конфликтов. Используйте уникальные названия для вашего nonce.

  2. Измените свой код: Вам нужно изменить код метабокса, чтобы nonce был уникальным. Например, вот как вы можете это сделать:

function design_book_meta_box($post) {
    // Создайте уникальный nonce
    wp_nonce_field('book_cpt_nonce_action', 'book_cpt_nonce');

    ?>
    <div>
        <label for="book-author">Author Name&nbsp;&nbsp;</label>
        <input type="text" name="book-author" placeholder="Author Name" value="<?php echo esc_attr(get_post_meta($post->ID, 'book-author-key', true)); ?>">
    </div>
    <div>
        <label for="year">Published Year</label>
        <input type="number" id="year" name="year" min="1455" max="2020" value="<?php echo esc_attr(get_post_meta($post->ID, 'book-year-key', true)); ?>">
        <span id="errorMsg" style="display:none;">Published Year Must be range from 1455 - 2020</span>
    </div>
    <?php
}
  1. Сохранение данных: Убедитесь, что вы правильно проверяете nonce в функции сохранения. Также измените проверку в функции save_book_meta_data:
function save_book_meta_data($post_id) {
    // Проверка прав пользователя
    if (!current_user_can('edit_post', $post_id)) {
        return $post_id;
    }

    // Проверка nonce
    if (!isset($_POST['book_cpt_nonce']) || !wp_verify_nonce($_POST['book_cpt_nonce'], 'book_cpt_nonce_action')) {
        return $post_id;
    }

    // Сохранение данных метаполей
    $book_author = isset($_POST['book-author']) ? sanitize_text_field($_POST['book-author']) : '';
    $book_year = isset($_POST['year']) ? absint($_POST['year']) : '';

    // Обновление или добавление метаданных
    update_post_meta($post_id, 'book-author-key', $book_author);
    update_post_meta($post_id, 'book-year-key', $book_year);
}
add_action('save_post', 'save_book_meta_data');

Также важно правильно обрабатывать и выводить данные, чтобы избежать XSS (межсайтового скриптинга).

  1. Проверка: Не забудьте протестировать свой код после этих изменений, чтобы убедиться, что конфликты nonce устранены и его функциональность работает как положено.

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

Оцените материал
Добавить комментарий

Капча загружается...