É possível, dentro da ação save_post, determinar se é uma nova postagem sendo criada ou uma postagem existente sendo atualizada?
save-post
wp-update-post
hereswhatidid
fonte
fonte
Respostas:
Desde a versão 3.7 do WordPress. - IIRC - o
save_post
gancho - mais informações sobre o gancho e seu uso em Referência de Código:save_post
e Codex:save_post
- possui um terceiro parâmetro$update
que pode ser usado para determinar exatamente isso.Nota:
$update
nem sempre é possíveltrue
- você pode ver e testar você mesmo com o código abaixo. No entanto, ele não está bem documentado, possivelmente longe de ser o ideal, e, portanto, cria expectativas enganosas. O código abaixo pode ser usado para alguma depuração, brinque com quando interceptar a execução do código, porque, caso contrário, você não verá as informações / mensagens. Penso que o culpado de comportamento enganoso é o tratamento de revisões e salvamentos automáticos - que podem ser desativados, mas eu não recomendo e ainda não os testei. Não tenho certeza se isso merece um bilhete Trac , então eu não abri um, se você acha, siga o link e faça você mesmo. Além disso, conforme declarado nos comentários, se você tiver um problema específico, poste uma nova pergunta.fonte
$update
parâmetro SEMPRE é verdadeiro mesmo quando é uma nova postagem. Portanto, este parâmetro é inútil. Não tenho certeza se alguma vez funcionou, mas com certeza não está funcionando da maneira que está documentada na versão mais recente do wordpress 4.8.wp_publish_post
, então sim. Mas isso não é verdade para seu uso nowp_insert_post
. Eu escrevi uma função de depuração, adiciono-a à resposta.save_post
gancho tem um terceiro parâmetro que é sempre definido como TRUE, portanto, não saiba o que isso tem a ver com outros ganchos, sem falar sobre outros ganchos. Estou falando do gancho na sua resposta. Isto está incorreto.wp_insert_post()
,wp_publish_post()
. Este último é apenas posts futuros,$update
está definido para ser sempretrue
. Caso contrário, no que diz respeitowp_insert_post()
,$update
nem sempre étrue
.A maneira como realizo essa verificação (dentro de uma função ligada) é comparar a data de postagem e a data de modificação (em GMT para padronização)
Isso funciona porque, mesmo na criação, a postagem tem uma data 'modificada' anexada a ela, que é exatamente a mesma que a data 'criada', mas permitimos uma variação de 1 segundo de qualquer maneira, caso um segundo passe durante a criação de o post.
fonte
post_date_gmt
é2019-03-12 01:31:30
e opost_modified_gmt
é2019-03-12 01:31:31
. :(Acabei verificando a existência de um valor personalizado antes de defini-lo. Dessa forma, se for uma postagem recém-criada, o valor personalizado ainda não existiria.
fonte
Exemplo para resposta de ialocina com o parâmetro "update":
fonte
if($update)
ou manter o novo bloco em primeiro lugar, mas usandoif( ! $update )
. Este último terá OP em melhor prática e é preferido sobre o seu método pelo WordPress padrões de codificação em casos como o operador ternárioVocê pode usar o gancho de ação pre_post_update para o código de atualização e save_post para o novo código postal. Funciona antes de uma postagem ser atualizada.
fonte
save_post
gancho é acionado tanto quando um post é criado e atualizado (após WordPress salvou-lo para o banco de dados).pre_post_update
é acionado quando uma postagem é atualizada, mas antes da atualização, isso pode ser importante.Como Darshan Thanki sugeriu (e Stephen Harris elaborou mais adiante), você pode usar
pre_post_update
a seu favor.A razão pela qual eu usei globals é porque
function is_new_post() use ( &$new_post )
não é válido em PHP (chocante ...), portanto, puxar essa variável para o escopo da função não funciona - daí o global.Observe que isso só pode ser usado de maneira confiável dentro / após o
save_post
evento (o que geralmente é suficiente, pelo menos para o que estamos fazendo com ele).fonte
Quando save_post é acionado, todas as informações sobre essa postagem já estão disponíveis; portanto, em teoria, você pode usar
isso não foi testado, no entanto. =)
fonte
save_post
postagem, ela já estará salva no banco de dados -get_posts
retornando a postagem atual.Outra abordagem que usa uma função interna e nenhuma adição ao banco de dados envolveria
get_post_status()
.Observe, no entanto, que talvez não seja apropriado se você planeja definir o status novamente como "rascunho" - suas instruções serão repetidas na próxima vez que você atualizar a postagem. Dependendo do contexto, convém considerar as várias cadeias que podem ser retornadas
get_post_status()
para criar um cenário mais apropriado.Veja Codex para obter get_post_status () e Status da postagem
fonte
save_post()
é executado pela primeira vez, mas durante essa execuçãoget_post_status()
já retorna 'publicar' e não 'rascunho', mesmo que seja apenas no processo de publicação.