Почему действие save_post срабатывает при создании нового сообщения?

31

Я удивлен тем фактом, что моя функция, которую я прикрепил к save_postдействию, срабатывает, когда я нажимаю ссылку «Новая публикация» на панели администратора. Примечание. Это происходит до того, как я нажал Saveили Update, и срабатывает немедленно, а не после истечения времени или автоматического обновления.

С другой стороны, когда я затем что-то набираю и нажимаю кнопки Publishили Updateили Save Draft, оператор echo, который я поместил в свой обработчик действий, не выводит эхо, поэтому кажется, что действие НЕ запускается в любое другое время. Это может быть не связано.

Вот мой код:

add_action('save_post', 'MyNS\save_event_metabox', 10, 2);
function save_event_metabox($post_id, $post){
  echo "<h1>YES!</h1>";
}

Это ДА эхом (вверху страницы), когда я нажимаю ссылку «Новая запись», но НЕ эхом, когда я что-то печатаю, а затем нажимаю Updateили Publishили Save Draft. Это кажется противоречащим документации по save_postдействию и wp_insert_post()функции.

Кто-нибудь может прояснить это для меня?

Том Оже
источник
Потрясающе!!! я сталкиваюсь с той же ситуацией при сохранении пользовательских полей метабокса. Любая идея, что я могу использовать ??
Прасат Надараджа

Ответы:

39

Когда вы нажимаете «Новое сообщение», вы просто загружаете страницу wp-admin/post-new.php.

При этом WordPress всегда будет создавать новый пост («Черновик авто»), чтобы все остальные функции (такие как загрузка медиафайлов) и плагины работали как обычно, даже до того, как вы фактически сохраните черновик или опубликуете публикацию.

И это, в свою очередь, вызывает save_post. Отсюда ваше эхо.

Хорошо, так почему бы мне не получить эхо при обновлении или публикации?

Между сохранением и последующей загрузкой страницы WordPress фактически отправляет GETперенаправление обратно на ту же страницу, которая выглядит прозрачной (вы можете убедиться в этом с помощью монитора HTTP, такого как HttpFox ).

Другими словами;

  1. Вы нажимаете UpdateилиPublish
  2. Браузер отправляет данные на сервер
  3. WordPress обрабатывает его, и в процессе запуска save_post
  4. WordPress отправляет заголовок перенаправления и завершает работу, прежде чем произойдет какой-либо вывод из браузера (включая ваше эхо) *
  5. Браузер выполняет перенаправление и загружает страницу «Редактировать сообщение».

Перенаправление может показаться ненужным (поскольку вы можете просто POSTперейти на одну и ту же страницу), но это часть техники, известной как Post / Redirect / Get, во избежание дублирования отправки форм .

Если вы пытаетесь распечатать пользовательские сообщения, основанные на результате функции, к которой они подключены save_post, ознакомьтесь с этими вопросами / ответами .

* Не совсем верно, ваше эхо на самом деле произойдет до того, как заголовок перенаправления будет отправлен, но браузер либо откажется от него, либо произойдет так быстро, что он никогда не отобразится.

TheDeadMedic
источник
Отлично. Спасибо за такой полный и подробный ответ! Чтобы узнать больше, как вы познакомились с этими знаниями?
Том Оже
Из-за того же разочарования, которое вы испытали;) Возьмите хорошую IDE (я использую phpDesigner) и просто углубитесь в соответствующие файлы администратора.
TheDeadMedic
1
Прямо на брата. Спасибо за то, что были там с вашим опытом!
Том Оже
Потрясающая информация. Я сходил с ума, потому что на моем локальном сервере это работало нормально, но не на моем рабочем сервере ... похоже, на моем локальном сервере не применялась техника post / redirect / get должным образом, потому что это не было отправка заголовка перенаправления (не знаю почему, хотя).
WebMacheter