Skip to content
🔒 4 Formas de anular programaticamente a publicação de um artigo no WordPress

🔒 4 Formas de anular programaticamente a publicação de um artigo no WordPress

O site foi abaixo após uma atualização de plugin, precisa de esconder urgentemente o artigo problemático antes que seja tarde. E, uma semana depois, repô-lo quando o erro estiver corrigido. Ou um cliente pede-lhe para remover um artigo desatualizado dos resultados de pesquisa, mas sem o eliminar permanentemente.

Alterar manualmente o estado via painel de administração funciona para um ou dois artigos. Mas quando são dezenas ou a lógica precisa de ser executada automaticamente, precisa de uma abordagem programática. O WordPress oferece-lhe quatro formas de desp publicar um artigo via PHP: desde um rascunho seguro até à eliminação total.

A seguir, cada método com código pronto a usar, uma explicação e uma dica sobre quando usar cada um.

💡 Visão geral rápida:

  • Transformou um artigo em rascunho via wp_update_post com o estado draft, a forma mais segura e reversível
  • Tornou um artigo privado (private), visível apenas para administradores e editores
  • Enviou um artigo para o futuro via post_date, o artigo desaparece dos resultados de pesquisa até que a data especificada chegue
  • Eliminou permanentemente um artigo via wp_delete_post, um último recurso com avisos e uma cópia de segurança

Passo 1. Rascunho: desp publicar um artigo sem perder dados

O cenário mais comum: precisa de esconder temporariamente um artigo, mas manter todo o conteúdo, o URL e a capacidade de o repor com um clique. Passar a rascunho é a opção ideal.

Apenas o campo post_status na tabela wp_posts é alterado. O artigo em si, os seus meta campos, anexos e URL permanecem intactos. Quando decidir repô-lo, altera o estado de volta para publish.

Código para alterar o estado para draft. Adicione-o ao functions.php do seu tema filho ou via o plugin Code Snippets:

1/**
2 * Converts a post to draft by ID.
3 *
4 * @param int $post_id ID of the post to unpublish.
5 */
6function sd_unpublish_to_draft( $post_id ) {
7 wp_update_post( array(
8 'ID' => $post_id,
9 'post_status' => 'draft',
10 ) );
11}
12
13// Example call: unpublish post with ID = 42
14sd_unpublish_to_draft( 42 );

O wp_update_post() atualiza um registo na base de dados. Passamos apenas o ID e o novo valor de post_status, o WordPress trata de tudo o resto sozinho. Nenhum outro campo é alterado.

Quando usar: ocultação temporária de um artigo para revisão, desativação automática de artigos com relevância expirada (por exemplo, promoções), moderação programática de conteúdo gerado pelo utilizador.

Passo 2. Artigo privado: esconder dos visitantes, manter para os editores

O estado privado é um meio-termo entre público e oculto. O artigo não é visível para visitantes comuns, mas está acessível a administradores e editores no painel de administração. Útil para materiais internos: instruções da equipa, rascunhos de conteúdo de clientes, páginas privadas.

Diferença em relação a um rascunho: um artigo privado está tecnicamente "publicado" e pode ter o seu próprio URL, mas o WordPress verifica as permissões do utilizador antes de o exibir. Um visitante sem a capacidade read_private_posts verá um 404.

O código é semelhante ao anterior, apenas muda o estado:

1/**
2 * Makes a post private — visible only to admins and editors.
3 *
4 * @param int $post_id Post ID.
5 */
6function sd_unpublish_to_private( $post_id ) {
7 wp_update_post( array(
8 'ID' => $post_id,
9 'post_status' => 'private',
10 ) );
11}
12
13// Example call
14sd_unpublish_to_private( 42 );

Nota: se o site tiver funções de utilizador personalizadas com capacidades personalizadas, verifique-as antes da utilização em massa. Por predefinição, os artigos privados são visíveis para as funções editor e administrator.

Quando usar: conteúdo de subscrição premium (em conjunto com plugins de membros), documentação interna da equipa, ocultação de artigos para reaprovação com um cliente antes da republicação.

Passo 3. Data futura: desp publicação diferida

Um truque interessante: em vez de alterar o estado, pode "enviar um artigo para o futuro", definir a data de publicação para o ano 2050. O artigo desaparece instantaneamente dos resultados de pesquisa porque o WordPress só mostra artigos com uma data ≤ ao momento atual.

Este método não altera o post_status: o artigo permanece publish. Simplesmente "ainda não aconteceu" da perspetiva do WordPress. Um ponto positivo: se necessário, pode restaurar a data real e o artigo reaparecerá.

O código usa os campos post_date e post_date_gmt:

1/**
2 * Hides a post by setting its publication date far into the future.
3 *
4 * @param int $post_id Post ID.
5 */
6function sd_unpublish_to_future( $post_id ) {
7 $future_date = '2050-12-31 23:59:59';
8
9 wp_update_post( array(
10 'ID' => $post_id,
11 'post_date' => $future_date,
12 'post_date_gmt' => get_gmt_from_date( $future_date ),
13 ) );
14}
15
16// Example call
17sd_unpublish_to_future( 42 );

O get_gmt_from_date() converte a hora local para GMT, o WordPress armazena ambas as versões da data. Não negligencie o campo GMT: sem ele, o comportamento quando o fuso horário do site muda torna-se imprevisível.

Quando usar: publicação de conteúdo "agendado", ocultação temporária de notícias sem alterar o estado, cenários onde o post_status deve permanecer publish para compatibilidade retroativa com outros plugins.

Passo 4. Eliminação: quando o artigo já não é necessário

O wp_delete_post() é uma operação irreversível. O artigo é eliminado da base de dados, juntamente com todos os seus meta campos, relações de taxonomia e (opcionalmente) anexos.

Isto não é "despublicar" no sentido estrito. Mas no contexto da gestão programática de conteúdo, a eliminação é a quarta ferramenta, a mais drástica. E requer salvaguardas.

Antes de executar, faça uma cópia de segurança completa da base de dados. O script abaixo primeiro produz uma lista do que será eliminado, e só depois, a versão de produção.

1/**
2 * Deletes a post. First — dry-run with info output, then — actual deletion.
3 *
4 * WARNING: irreversible operation. Backup before running.
5 *
6 * @param int $post_id Post ID.
7 * @param bool $force_delete true — delete permanently (skip trash), false — move to trash.
8 */
9function sd_delete_post_safe( $post_id, $force_delete = false ) {
10 $post = get_post( $post_id );
11
12 if ( ! $post ) {
13 error_log( "Post with ID {$post_id} not found." );
14 return;
15 }
16
17 // Dry-run: output info without deleting
18 error_log( sprintf(
19 'READY TO DELETE: ID=%d, title="%s", status=%s, attachments=%d',
20 $post->ID,
21 $post->post_title,
22 $post->post_status,
23 count( get_attached_media( '', $post_id ) )
24 ) );
25
26 // Uncomment the following line for actual deletion:
27 // wp_delete_post( $post_id, $force_delete );
28}
29
30// Dry-run: only outputs info
31sd_delete_post_safe( 12341, false );

O sinalizador $force_delete:

  • false, o artigo vai para a Lixeira, pode ser restaurado no prazo de 30 dias.
  • true, eliminação permanente, não pode ser restaurado nem mesmo via base de dados (sem uma cópia de segurança).

A função regista via error_log(), as mensagens aparecerão em wp-content/debug.log quando o WP_DEBUG estiver ativo. Em produção, substitua pelo seu próprio mecanismo de notificação.

Quando usar: limpeza automática de artigos de spam, eliminação de conteúdo expirado (ofertas de emprego, eventos), rotação programática de conteúdo com remoção total de entradas antigas.

Comparação dos quatro métodos

Método

Estado do artigo

Reversibilidade

Visibilidade para leitores

Visibilidade na administração

Quando usar

Rascunho

draft

Total

Oculto

Todas as funções com acesso a artigos

Ocultação temporária, revisão

Privado

private

Total

Oculto

Administradores e editores

Conteúdo interno, premium

Data futura

publish

Total

Oculto até à data

Todos

Publicação agendada, calendário

Eliminação

-

Apenas da Lixeira (30 dias)

-

Apenas administradores

Eliminação total, limpeza

⁉️🤔 Perguntas frequentes

Qual é a diferença entre desp publicar e eliminar?

Despublicar (rascunho/privado/futuro) mantém o artigo na base de dados: conteúdo, URL, anexos e histórico de SEO permanecem. A eliminação (wp_delete_post) apaga o registo completamente. Para ocultação temporária, use sempre um rascunho, é seguro e reversível num segundo.

Qual é o método que não requer a alteração do post_status?

O envio para o futuro via post_date. O artigo permanece publish, mas o WordPress considera que "ainda não aconteceu" e não o mostra aos visitantes. Isto pode ser importante se outros plugins ou snippets dependerem do estado publish.

Posso desp publicar vários artigos de uma só vez?

Sim, envolva a chamada da função num ciclo sobre um array de IDs. Adicione wp_die() ou um limite no número de artigos por execução para evitar bloquear o site durante uma operação em massa: array_slice($post_ids, 0, 50) para um lote de 50.

Preciso de limpar a cache após uma alteração programática de estado?

Absolutamente. O WordPress limpa a cache interna de artigos quando o wp_update_post() é chamado, mas a cache externa (plugins como WP Rocket, cache do servidor, CDN) deve ser limpa separadamente. Adicione uma chamada wp_cache_flush() ou o hook clean_post_cache após a alteração de estado.

É seguro executar o wp_delete_post em produção?

Apenas com salvaguardas. Antes de chamar: (1) verifique current_user_can('delete_posts'), (2) solicite confirmação via um token nonce separado, (3) registe o ID e o título do artigo que está a ser eliminado. E, mais importante, uma cópia de segurança. Mesmo na Lixeira, um artigo vive 30 dias, após os quais o WordPress o elimina automaticamente.

O que usar no seu caso: a conclusão

Os quatro métodos cobrem quase qualquer cenário de gestão programática de publicações. A escolha resume-se a uma pergunta: precisa de manter o artigo?

  • Se precisa de esconder temporariamente um artigo para revisão, opte por um rascunho (draft). Umas poucas linhas, risco zero.
  • Se o conteúdo é para um círculo restrito de pessoas, estado privado (private). Os editores veem-no, os visitantes não.
  • Se precisa de esconder um artigo sem alterar o seu estado, uma data futura (post_date definida para 2050). Um truque engenhoso, mas funcional.
  • Se o artigo definitivamente não é necessário, eliminação (wp_delete_post). Mas primeiro, um teste simulado e uma cópia de segurança completa.

Comece com um wrapper no functions.php para um método, por exemplo, um rascunho. Assim que compreender a lógica do wp_update_post(), os outros três métodos montam-se em cinco minutos.

E qual é o método que usa para a gestão programática de artigos? Escreva nos comentários, é interessante comparar abordagens.