Intereting Posts
Плагин admin page meta_box переключает и состояние заказа не сохраняет Проблема с одиночной страницей для моего пользовательского сообщения Сохранить переупорядоченные перетаскиваемые элементы сообщения в базу данных wordpress Могу ли я использовать widgets & shortcode, если мне нужно вернуть массив? Какие пути использует WordPress для себя в домене? Как остановить WordPress с помощью утилиты utf8mb4_unicode_520_ci? Правильный способ создания страницы пользовательского поиска для сложных пользовательских типов сообщений wp_register_script (… $ in_footer = true) не работает Крюк, когда новый CPT опубликован и добавлен постмета Сохранение условий для детей на лицевой стороне без установки родительского Работает ли файл auto_update_plugin Filter при вводе в файл functions.php темы Как объединить одно поле с помощью wpdb и group? Query Custom Post Тип сообщения по ключевому слову / url slug Как использовать Категории настраиваемого типа сообщения Выбор URL по умолчанию для категории

Почему save_post _ $ (custom_post_type) уволен, даже если я еще не сохраняю сообщение?

Я регистрирую пользовательский тип сообщения с именем Datasheet. Когда я регистрирую его, я регистрирую обратный вызов для метабоксов

'register_meta_box_cb' => [ $this, "add_metaboxes" ] 

Это мой обратный вызов

 function add_metaboxes ( $post ) { wp_nonce_field ( plugin_basename(__FILE__), 'datasheet_meta_nonce'); add_meta_box( ....... 

Также я зарегистрировал этот крючок

 add_action ('save_post_datasheet', [ $this, 'save_datasheet_meta' ], 10, 2); 

Это обратный вызов

 function save_datasheet_meta ( $post_id, $post ) { $nonce = wp_verify_nonce ( plugin_basename(__FILE__), 'datasheet_meta_nonce'); if (!$nonce) { die ("Security check failed"); } 

Ожидаемый / рассмотренный: я ожидал, что этот последний обратный вызов будет запущен при создании и / или обновлении, но ТОЛЬКО В ЭТИХ СЛУЧАЕ ; поэтому я могу проверить nonces.

Фактическое поведение Если я просто начну создавать новый Datasheet, я получил не что иное, как

 Security check failed 

Это происходит просто при открытии domain.tld/wp-admin/post-new.php?post_type=datasheet из бокового меню администратора

Поэтому я не могу понять, ПОЧЕМУ это действие уволено, просто введя страницу … заставляя мою проверку nonce терпеть неудачу.

Solutions Collecting From Web of "Почему save_post _ $ (custom_post_type) уволен, даже если я еще не сохраняю сообщение?"

У вас не должно быть nonce в вашем метаболизме и, очевидно, не проверять его в вашем обработчике сохранения.

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

Единственное, что делает nonce, заключается в том, чтобы подтвердить, что представление происходит из редактирования страницы, а не из быстрого редактирования, xml-rpc или json api, но для такого использования вам лучше использовать простой скрытый ввод (это может если ваш метабокс содержит только флажки).

Когда вы выбираете «Свой CPT> Добавить новый», WP вызывает get_default_post_to_edit () , который фактически создает «пустую» запись (с 'post_status' => 'auto-draft' ), а затем вызывает wp_insert_post () . Это то, что вызывает save_datasheet_meta() которая должна быть вызвана, прежде чем вы подумаете.

Следовательно, как правило, вы должны добавить некоторые дополнительные проверки здравомыслия в начало любой функции, которую вы подключаете к save_post , ala:

 function save_datasheet_meta ($post_id, $post) { if ('auto-draft' == $post->post_status) { // bail, because your nonce will not be set at this point return ; } // post{,-new}.php enqueue some JS which periodically saves the post_content, // but NOT any post_meta // so, a `save_post` hook func that only cares about updating post_meta should // bail when DOING_AUTOSAVE is true if (defined ('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return ; } $nonce = wp_verify_nonce ( plugin_basename(__FILE__), 'datasheet_meta_nonce'); if (!$nonce) { die ("Security check failed"); } // save post_meta's here return ; }