
🔒 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_postcom o estadodraft, 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 */ 6 function 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 14 sd_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 */ 6 function 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 14 sd_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 */ 6 function 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 17 sd_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 */ 9 function 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 31 sd_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 |
| Total | Oculto | Todas as funções com acesso a artigos | Ocultação temporária, revisão |
Privado |
| Total | Oculto | Administradores e editores | Conteúdo interno, premium |
Data futura |
| 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 permanecepublish, 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 estadopublish.
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 chamadawp_cache_flush()ou o hookclean_post_cacheapó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_datedefinida 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.



