Skip to content
🔒 4 Formas de despublicar una entrada en WordPress mediante programación

🔒 4 Formas de despublicar una entrada en WordPress mediante programación

El sitio se cayó tras una actualización de plugin, necesita ocultar urgentemente la publicación problemática antes de que sea demasiado tarde. Y una semana después, volver a mostrarla cuando el error esté corregido. O un cliente le pide retirar un artículo desactualizado de los resultados de búsqueda, pero no eliminarlo permanentemente.

Cambiar manualmente el estado desde el panel de administración funciona para una o dos publicaciones. Pero cuando hay docenas o la lógica debe ejecutarse automáticamente, necesita un enfoque programático. WordPress le ofrece cuatro maneras de despublicar una publicación mediante PHP: desde un borrador seguro hasta la eliminación total.

A continuación, cada método con código listo para usar, una explicación y una indicación de cuándo usar cada uno.

💡 Resumen rápido:

  • Convierta una publicación en borrador mediante wp_update_post con el estado draft, la opción más segura y reversible
  • Haga una publicación privada (private), visible solo para administradores y editores
  • Envíe una publicación al futuro mediante post_date, la publicación desaparece de los resultados de búsqueda hasta que llegue la fecha especificada
  • Elimine permanentemente una publicación mediante wp_delete_post, último recurso con advertencias y copia de seguridad

Paso 1. Borrador: despublicar una publicación sin perder datos

El escenario más común: necesita ocultar temporalmente una publicación pero conservar todo el contenido, la URL y la capacidad de restaurarla con un clic. Cambiar a borrador es la opción ideal.

Solo cambia el campo post_status en la tabla wp_posts. La publicación en sí, sus metacampos, archivos adjuntos y URL permanecen intactos. Cuando decida restaurarla, cambia el estado de nuevo a publish.

Código para cambiar el estado a draft. Agréguelo al archivo functions.php de su tema hijo o mediante el 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 );

wp_update_post() actualiza un registro en la base de datos. Solo pasamos el ID y el nuevo valor de post_status, WordPress se encarga de todo lo demás por sí solo. No se modifica ningún otro campo.

Cuándo usarlo: ocultar temporalmente una publicación para revisión, desactivar automáticamente publicaciones con relevancia caducada (por ejemplo, promociones), moderación programática de contenido generado por usuarios.

Paso 2. Publicación privada: ocultar a los visitantes, conservar para los editores

El estado privado es un punto intermedio entre público y oculto. La publicación no es visible para los visitantes habituales, pero es accesible para administradores y editores en el panel de administración. Útil para materiales internos: instrucciones del equipo, borradores de contenido para clientes, páginas privadas.

Diferencia con un borrador: una publicación privada está técnicamente "publicada" y puede tener su propia URL, pero WordPress verifica los permisos del usuario antes de mostrarla. Un visitante sin la capacidad read_private_posts verá un error 404.

El código es similar al anterior, solo cambia el 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: si el sitio tiene roles de usuario personalizados con capacidades personalizadas, verifíquelos antes de un uso masivo. Por defecto, las publicaciones privadas son visibles para los roles editor y administrator.

Cuándo usarlo: contenido de suscripción premium (junto con plugins de membresía), documentación interna del equipo, ocultar publicaciones para una nueva aprobación con el cliente antes de republicar.

Paso 3. Fecha futura: despublicación diferida

Un truco interesante: en lugar de cambiar el estado, puede "enviar una publicación al futuro", establecer la fecha de publicación al año 2050. La publicación desaparece instantáneamente de los resultados de búsqueda porque WordPress solo muestra publicaciones con una fecha ≤ al momento actual.

Este método no cambia post_status: la publicación permanece como publish. Simplemente "aún no ha ocurrido" desde la perspectiva de WordPress. Un punto a favor: si es necesario, puede restaurar la fecha real y la publicación reaparecerá.

El código utiliza los campos post_date y 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 );

get_gmt_from_date() convierte la hora local a GMT, WordPress almacena ambas versiones de la fecha. No descuide el campo GMT: sin él, el comportamiento al cambiar la zona horaria del sitio se vuelve impredecible.

Cuándo usarlo: publicación de contenido "programado", ocultar temporalmente noticias sin cambiar el estado, escenarios donde post_status debe permanecer como publish por compatibilidad con otros plugins.

Paso 4. Eliminación: cuando la publicación ya no se necesita en absoluto

wp_delete_post() es una operación irreversible. La publicación se elimina de la base de datos, junto con todos sus metacampos, relaciones de taxonomía y (opcionalmente) archivos adjuntos.

Esto no es "despublicar" en sentido estricto. Pero en el contexto de la gestión programática de contenido, la eliminación es la cuarta herramienta, la más drástica. Y requiere medidas de seguridad.

Antes de ejecutar, haga una copia de seguridad completa de la base de datos. El script a continuación primero muestra una lista de lo que se eliminará, y solo después, la versión de producción.

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 );

El indicador $force_delete:

  • false, la publicación va a la Papelera, puede restaurarse en un plazo de 30 días.
  • true, eliminación permanente, no se puede restaurar ni siquiera desde la base de datos (sin una copia de seguridad).

La función registra mediante error_log(), los mensajes aparecerán en wp-content/debug.log cuando WP_DEBUG esté habilitado. En producción, sustitúyalo por su propio mecanismo de notificación.

Cuándo usarlo: limpieza automática de publicaciones spam, eliminación de contenido caducado (ofertas de empleo, eventos), rotación programática de contenido con eliminación completa de entradas antiguas.

Comparación de los cuatro métodos

Método

Estado de la publicación

Reversibilidad

Visibilidad para lectores

Visibilidad en administración

Cuándo usarlo

Borrador

draft

Total

Oculto

Todos los roles con acceso a publicaciones

Ocultación temporal, revisión

Privado

private

Total

Oculto

Administradores y editores

Contenido interno, premium

Fecha futura

publish

Total

Oculto hasta la fecha

Todos

Publicación programada, calendario

Eliminación

-

Solo desde la Papelera (30 días)

-

Solo administradores

Eliminación total, limpieza

⁉️🤔 Preguntas frecuentes

¿Cuál es la diferencia entre despublicar y eliminar?

Despublicar (borrador/privado/futuro) mantiene la publicación en la base de datos: el contenido, la URL, los archivos adjuntos y el historial SEO permanecen. La eliminación (wp_delete_post) borra el registro por completo. Para ocultar temporalmente, use siempre un borrador, es seguro y reversible en un segundo.

¿Qué método no requiere cambiar post_status?

Enviar al futuro mediante post_date. La publicación permanece como publish, pero WordPress la considera "aún no ocurrida" y no la muestra a los visitantes. Esto puede ser importante si otros plugins o fragmentos de código dependen del estado publish.

¿Puedo despublicar varias publicaciones a la vez?

Sí, envuelva la llamada a la función en un bucle sobre un array de IDs. Añada wp_die() o un límite en el número de publicaciones por ejecución para evitar colapsar el sitio durante una operación masiva: array_slice($post_ids, 0, 50) para un lote de 50.

¿Necesito limpiar la caché después de un cambio de estado programático?

Absolutamente. WordPress vacía la caché interna de publicaciones cuando se llama a wp_update_post(), pero la caché externa (plugins como WP Rocket, caché del servidor, CDN) debe limpiarse por separado. Añada una llamada a wp_cache_flush() o el gancho clean_post_cache después del cambio de estado.

¿Es seguro ejecutar wp_delete_post en producción?

Solo con medidas de seguridad. Antes de llamar: (1) verifique current_user_can('delete_posts'), (2) solicite confirmación mediante un token nonce separado, (3) registre el ID y el título de la publicación que se está eliminando. Y lo más importante, una copia de seguridad. Incluso en la Papelera, una publicación vive 30 días, después de lo cual WordPress la elimina automáticamente.

Qué usar en su caso: la conclusión

Los cuatro métodos cubren casi cualquier escenario de gestión programática de publicaciones. La elección se reduce a una pregunta: ¿necesita conservar la publicación?

  • Si necesita ocultar temporalmente una publicación para revisión, opte por un borrador (draft). Un par de líneas, riesgo cero.
  • Si el contenido es para un círculo limitado de personas, estado privado (private). Los editores lo ven, los visitantes no.
  • Si necesita ocultar una publicación sin cambiar su estado, una fecha futura (post_date establecida a 2050). Un truco ingenioso pero funcional.
  • Si la publicación definitivamente no se necesita, eliminación (wp_delete_post). Pero primero, una ejecución de prueba y una copia de seguridad completa.

Comience con un envoltorio en functions.php para un método, por ejemplo, un borrador. Una vez que entienda la lógica de wp_update_post(), los otros tres métodos los tendrá listos en cinco minutos.

¿Y qué método usa usted para la gestión programática de publicaciones? Escriba en los comentarios, es interesante comparar enfoques.