Нужно ли одноразовое поле для каждого мета-блока, который я добавляю в свой пользовательский тип записи admin?


16

В настоящее время я работаю над страницей администратора с моим пользовательским типом записи, и я застрял в решении, следует ли снова добавить одноразовое поле для второго метабокса или нет. Я очень плохо знаком с пользовательскими типами постов, и поиск в Интернете по этому поводу не дает такого большого количества результатов.

Есть предположения? Благодарю.

Ответы:


13

Я бы порекомендовал так.

У вас есть (и должен) быть свой собственный одноразовый номер, с помощью которого можно проверить происхождение данных и намерения пользователя. Если у вас есть только один одноразовый номер для метабокса - тогда вы столкнетесь с проблемами, если этот метабокс будет удален (не то же самое, что скрытый). В случае удаления второй метабокс никогда не будет (или, по крайней мере, должен) сохранять, так как одноразовый номер отправляется дольше.

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


редактировать

Как указывалось, есть только одна форма для экрана редактирования сообщения. Таким образом, в теории вам нужно только одно одноразовое поле для проверки действия и источника данных. Однако, поскольку метабоксы могут быть удалены - наличие поля nonce только в одном метабоксе не гарантирует, что nonce будет там. Поместив одноразовое поле в каждое метабокс, вы можете проверить, были ли данные из этого метабокса отправлены (и действительно ли они находятся там, где вы думаете) перед обработкой каких-либо данных. Например:

save_post_call_back($post_id){

  //Check this is not an auto-save route

  if(nonce of metabox1 present and valid){
     //Process data from metabox1
  }else{
    //Either metabox removed - or invalid nonce. Take no action.
  }

  if(nonce of metabox2 present and valid){
     //Process data from metabox2
  }else{
    //Either metabox removed - or invalid nonce. Take no action.
  }

}

Имя поля Nonce должен быть уникальным для METABOX (и не вступают в противоречие с любыми другими временными значениями, которые присутствуют на форме от других плагинов).

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


хмм. но есть только один <form>тег на странице администратора. поле nonce должно быть уникальным для формы или нет? tia, @Stephen
Ана Пан

Да, поэтому одноразовое имя должно быть уникальным для метабокса, чтобы вы могли проверить его для каждого метабокса. Значение nonce должно быть уникальным для выполняемого действия и источника данных (например, поскольку «быстрое редактирование» и обычный экран редактирования оба запускают save_postдействие).
Стивен Харрис

обновленный ответ, надеюсь, уточнить, что я говорю :)
Стивен Харрис

Дело в том, что 1) поскольку для всего экрана редактирования существует только один тег формы, и 2) к нему автоматически добавляется одноразовый номер . Почему вы должны добавить больше? Это всегда будет иметь одноразовый смысл, несмотря ни на что ... Я указал на это в своем ответе и получил отрицательное голосование, спасибо людям ... Цель, на мой взгляд, редактировать страницу с помощью содержимого или метаданных, например. одно nonce поле ... Также, когда я пытался добавить больше, он даже не работал с несколькими мета-боксами !!
Оззи

1
Смотри мой ответ. save_postможет вызываться из разных контекстов, поэтому одноразовый номер не гарантируется. Это также удобный способ проверить, что ваш обратный вызов действительно должен что-то делать. При добавлении нескольких одноразовых номеров используйте уникальные имена. Это работает.
Стивен Харрис

5

Вы также можете подключить поле отправки, которое никогда не исчезнет, ​​добавив к нему поле nonce

add_action( 'post_submitbox_start', 'theme_submitdiv_extra' );
function theme_submitdiv_extra()
{
  wp_nonce_field( 'theme_meta_box_nonce', 'meta_box_nonce' );
}

Затем в вашем действии save_post:

if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'theme_meta_box_nonce' ) ) return;

1

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

Кодекс: wp_nonce_field

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

может быть, вы можете исследовать и использовать check_admin_referer (), чтобы убедиться, что ваш запрос со страницы администратора


-1

В WP 3.5.2 вся страница редактирования обернута в тег формы, поэтому вы НЕ должны добавлять свои собственные теги формы !! Если вы все равно сделаете это и попытаетесь добавить еще один отдельный пользовательский мета-бокс, то при сохранении произойдет сбой и вы попадете в wp-admin home только при попытке сохранить !!

Также НЕ добавляйте поле NONCE, так как в форме должно быть только одно (это также может привести к сбою !!) И редактирование страницы уже имеет поле nonce!

Редактировать:

Дело в том, что 1) поскольку для всего экрана редактирования существует только один тег формы , как признал автор правильного ответа, и 2) к нему автоматически добавляется одноразовый номер . Почему вы должны добавить больше? Это всегда будет иметь одноразовый номер, несмотря ни на что ...

На мой взгляд, намерение редактировать страницу по содержанию или метаданным, например. одно nonce поле ... Также, когда я пытался добавить больше, он даже не работал с несколькими мета-боксами !! Один из них будет работать, а другой не удастся, и только перенаправит пользователя на wp-admin home!


Вы ответили одинаково на два вопроса, это было случайно? Какой из двух вы хотели ответить?
первое

Извините, случайно, этот. Если вы используете компонент метабокса firebug или chrome view, добавленный с тэгом формы в wp 3.6, он автоматически удаляет обернутую во всю форму для сообщения. Так как это не так? Зачем вам тогда добавлять несколько одноразовых полей?
Оззи

попробуйте, и вы увидите
OZZIE
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.