Как реализовать одноразовые токены, чтобы отмена удаления пользовательского типа записи не вызывала ошибку?

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

У меня есть небольшой плагин, который реализует настраиваемый тип записи и некоторые метаданные. Всё работает, но если я сохраняю настраиваемый тип записи, затем отправляю его в корзину, затем нажимаю «отменить», я получаю ошибку, которую настроил для проверки наличия 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.

Рекомендации по Реализации

  1. Исключите необходимость проверки nonce при восстановления из корзины:

    • Добавьте дополнительную проверку на текущий статус записи. Например, избегайте проверки nonce, если статус переходил из trash в другое состояние.
  2. Фильтрация действий:

    • Используйте фильтры и хуки WordPress, чтобы управлять сохранением мета-данных более детально — например, с помощью add_filter('wp_trash_post').
  3. Контекстная проверка:

    • Имейте в виду, что не всегда нужно проверять 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.

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

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