Можно ли в действии save_post определить, создается ли новая запись или обновляется существующая запись?
save-post
wp-update-post
hereswhatidid
источник
источник
Ответы:
Начиная с версии WordPress 3.7. - IIRC -
save_post
ловушка - больше информации о ловушке и ее использовании в Code Reference:save_post
и Codex:save_post
- есть третий параметр,$update
который можно использовать для определения именно этого.Заметка:
$update
это не всегдаtrue
- вы можете увидеть и проверить это самостоятельно с помощью приведенного ниже кода. Это не хорошо документировано, хотя, возможно, далеко не оптимально названо, и, следовательно, создает обманчивые ожидания. Приведенный ниже код можно использовать для некоторой отладки, поэкспериментируйте с тем, когда перехватывать выполнение кода, потому что иначе вы не увидите информацию / сообщения. Я думаю, виновник в обманчивом поведении - обработка ревизий и автосохранение - которые могут быть отключены, но я не рекомендую это и не проверял это. Не уверен, что это требует Trac Ticket , поэтому я не открыл его, если вы так думаете, перейдите по ссылке и сделайте это самостоятельно. Кроме того, как указано в комментариях, если у вас есть конкретная проблема, напишите новый вопрос.источник
$update
Параметр всегда верно , даже если это новый пост. Так что этот параметр бесполезен. Не уверен, работал ли он вообще когда-либо, но он точно работает не так, как задокументировано в последней версии WordPress 4.8.wp_publish_post
, то да. Но это не так для его использования вwp_insert_post
. Я написал функцию отладки, я добавляю ее в ответ.save_post
Крюк имеет 3 - й параметр , который всегда должен быть установлен в значение TRUE, поэтому не уверен , что это связано с другими крюками, не говоря уже о других крючков. Я говорю о крючке в вашем ответе. Это неверноwp_insert_post()
,wp_publish_post()
. Последние есть только будущие посты, там$update
и так будет всегдаtrue
. Иначе, в отношенииwp_insert_post()
,$update
не всегдаtrue
.Способ, которым я выполняю эту проверку (в рамках подключенной функции), заключается в сравнении даты публикации и даты изменения (в GMT для стандартизации)
Это работает, потому что даже при создании к записи прикреплена «измененная» дата, которая в точности совпадает с «созданной» датой, но мы допускаем отклонение в 1 секунду в любом случае, если секунда опрокидывается во время создания пост.
источник
post_date_gmt
есть2019-03-12 01:31:30
иpost_modified_gmt
есть2019-03-12 01:31:31
. :(В итоге я просто проверил наличие пользовательского значения до его установки. Таким образом, если это новая запись, пользовательское значение еще не будет существовать.
источник
Пример ответа на вопрос «Ялоцин» с параметром «обновление»:
источник
if($update)
либо сохранить новый блок первым, но использоватьif( ! $update )
. Последний получит ОП в лучшую практику и предпочтительнее вашего метода стандартами кодирования WordPress в таких случаях, как троичный операторВы можете использовать хук действия pre_post_update для кода обновления и save_post для нового почтового индекса. Работает до обновления поста.
источник
save_post
Хук срабатывает как при создании и обновлении поста (после того, как WordPress сохранил его в базе данных).pre_post_update
срабатывает при обновлении сообщения, но до его обновления - это может быть важно.Как намекнул Даршан Спасибо (и Стивен Харрис), вы можете использовать это
pre_post_update
в своих интересах.Причина, по которой я использовал глобальные переменные, заключается в том, что
function is_new_post() use ( &$new_post )
это недопустимо в PHP (шокирующее ...), поэтому включение этой переменной в область действия функции не работает - следовательно, глобальное.Обратите внимание, что это действительно может быть надежно использовано только внутри / после
save_post
события (которого обычно достаточно, по крайней мере, для того, что мы делаем с ним).источник
Когда сработает save_post, вся информация об этом посте уже доступна, поэтому теоретически вы можете использовать
это не проверено, хотя. знак равно
источник
save_post
самого сообщения, оно уже будет сохранено в базе данных - поэтомуget_posts
вернет текущее сообщение.Другой подход, который использует встроенную функцию и не добавляет базы данных, будет включать
get_post_status()
.Тем не менее, обратите внимание, что это может быть неуместно, если вы планируете позднее установить статус «черновик» - ваши инструкции будут повторены при следующем обновлении сообщения. В зависимости от контекста, вы можете рассмотреть различные строки, которые могут быть возвращены,
get_post_status()
чтобы построить более подходящий сценарий.См. Кодекс для get_post_status () и статуса сообщения
источник
save_post()
она выполняется впервые, но во время этого выполненияget_post_status()
уже возвращается «публикация», а не «черновик», даже если она находится только в процессе публикации.