Вопрос или проблема
Я разрабатываю индивидуальную тему с нуля и создаю кастомный тип поста, и получаю это предупреждение при редактировании кастомного типа поста. Я также разрабатываю кастомное мета-окно с двумя полями ввода и использую 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">Имя автора </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-полей.
Давайте рассмотрим шаги, которые помогут вам решить эту проблему:
-
Проблема с неуникальными идентификаторами: Поскольку в WordPress nonce используется для проверки, что данные отправлены из вашего интерфейса, каждая nonce-пара должна быть уникальной для каждого метабокса, чтобы избежать конфликтов. Используйте уникальные названия для вашего nonce.
-
Измените свой код: Вам нужно изменить код метабокса, чтобы 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 </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
}
- Сохранение данных: Убедитесь, что вы правильно проверяете 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 (межсайтового скриптинга).
- Проверка: Не забудьте протестировать свой код после этих изменений, чтобы убедиться, что конфликты nonce устранены и его функциональность работает как положено.
Следуя этим рекомендациям, вы сможете устранить предупреждения о неуникальных идентификаторах и улучшить свою реализацию метабоксов в WordPress. Если у вас возникнут дополнительные вопросы, не стесняйтесь их задавать.