Вопрос или проблема
У меня есть небольшой плагин, который реализует настраиваемый тип записи и некоторые метаданные. Всё работает, но если я сохраняю настраиваемый тип записи, затем отправляю его в корзину, затем нажимаю «отменить», я получаю ошибку, которую настроил для проверки наличия nonce. Ошибка выбрасывается, но запись всё равно удаляется из корзины. Но я хочу знать, как лучше предотвратить возникновение этой ошибки. Вот как я это реализовал:
Я использовал hook post_submitbox_start
, чтобы добавить nonce на админ-страницу для ввода метаданных.
public function register(){
add_action( 'post_submitbox_start', array($this,'add_cpt_nonce') );
}
function add_cpt_nonce($post)
{
wp_nonce_field( '_save_cpt'.$post->ID, 'my_cpt_nonce' );
}
Когда запись сохраняется, я использую функцию для валидации метаданных. В этой функции есть проверка на наличие nonce, и если он не установлен, выбрасывается ошибка. Это та ошибка, которая выбрасывается, когда я отменяю размещение записи в корзине.
function save_cpt_meta_data($post_id, $post)
{
if (in_array($post->post_status, array('auto-draft', 'trash' , 'draft'))) {
// завершить выполнение, nonce не будет установлен
return;
}
// проверка на установку nonce -- ЭТО ОШИБКА, КОТОРАЯ ВЫБРАСЫВАЕТСЯ
if( !isset( $_POST['my_cpt_nonce'] ))
{
$status = $post->post_status;
return wp_die("Nonce error.");
}
//...
}
Какой лучший способ обрабатывать отмену удаления из корзины настраиваемых типов записей и обойти эту проверку / ошибку для nonce.
Ответ или решение
В вашей ситуации возникает проблема с обработкой несуществующих меток безопасности (nonce) при восстановлении пользовательских типов записей из корзины. Давайте разберемся, как правильно реализовать nonce и избежать таких ошибок.
Основы реализации Nonce
Теория: Nonce (Number used once) — это уникальный одноразовый код, используемый для защиты данных в формах от атак повторного отправления и CSRF (Cross-Site Request Forgery). Использование nonce в WordPress позволяет убедиться, что запрос отправлен пользователем, который имеет права на выполнение этого действия.
Пример: Например, добавление nonce в форму на странице администратора позволяет удостовериться, что данные отправлены именно с этой страницы и именно авторизованным пользователем.
Применение: Использование nonce включает его генерацию и встраивание в HTML форму, а затем проверку nonce при обработке данных.
Проблема с Undo для Корзины
Когда вы восстанавливаете запись из корзины, статус такой записи меняется с trash
на другой (например, draft
), и в этот момент nonce не существует из-за специфики операции восстановления. Стандартная проверка на наличие nonce не работает, так как при нажатии на "Undo" не происходит отправка формы, в которой типично передаются nonce.
Рекомендации по Реализации
-
Исключите необходимость проверки nonce при восстановления из корзины:
- Добавьте дополнительную проверку на текущий статус записи. Например, избегайте проверки nonce, если статус переходил из
trash
в другое состояние.
- Добавьте дополнительную проверку на текущий статус записи. Например, избегайте проверки nonce, если статус переходил из
-
Фильтрация действий:
- Используйте фильтры и хуки WordPress, чтобы управлять сохранением мета-данных более детально — например, с помощью
add_filter('wp_trash_post')
.
- Используйте фильтры и хуки WordPress, чтобы управлять сохранением мета-данных более детально — например, с помощью
-
Контекстная проверка:
- Имейте в виду, что не всегда нужно проверять nonce, особенно при выполнении специфических действий, таких как восстановление записи.
Корректная Реализация
function save_cpt_meta_data($post_id, $post) {
// Исключаем некоторые состояния
if (in_array($post->post_status, array('auto-draft', 'trash', 'draft'))) {
return;
}
// Добавляем проверку на изменение статуса из trash
if (wp_get_post_revisions($post_id)) {
return; // если это восстановление, проходим мимо
}
// Проверяем nonce только если это не восстановление
if (!isset($_POST['my_cpt_nonce']) || !wp_verify_nonce($_POST['my_cpt_nonce'], '_save_cpt' . $post->ID)) {
return wp_die("Ошибка nonce.");
}
// Ваша логика сохранения мета-данных
}
Дополнительные Меры
- Убедитесь, что ваш nonce создается и проверяется, используя правильные экшены и фильтры.
- Можно логгировать действия для отладки — это позволит увидеть, как обрабатываются ваши функции при определенных действиях.
- Задействуйте
error_log()
для отладки процесса, чтобы в реальном времени отслеживать, что происходит в ваших проверках.
Обновление Логики
Для улучшения функции восстановления можно использовать хуки, такие как before_delete_post
и trashed_post
, чтобы более эффективно управлять состояниями записи и исключать проверку nonce в моменты, когда это нецелесообразно.
Заключение
Решение проблемы с ошибкой nonce при "Undo" требует изменения подхода к проверке состояния записи и дополнительных условий проверки. Применяя более избирательный подход к проверке nonce, можно избежать ненужных ошибок и улучшить надежность вашего функционала в WordPress.