Pulsa ESC para cerrar

Curso WordpressCurso Wordpress

Ocultar entradas de la portada, los archivos y la búsqueda sin hacerlas privadas

WordPress tiene tres estados para que algo no se vea: borrador (no existe para el público), privado (solo lo ven usuarios con permisos) y protegido con contraseña. Pero hay un caso que no cubren: una entrada pública, que cualquiera puede abrir con el enlace, pero que no aparezca en ningún listado.

Ejemplos:

  • Una página de «gracias por suscribirte» con un regalo descargable.
  • Contenido que envías por correo a tu lista y no quieres en la portada.
  • Una entrada antigua que mantienes por los enlaces que recibe, pero que ya no quieres destacar.
  • Una entrada de prueba que necesitas compartir para revisión.

Dónde aparece una entrada

Para que esté realmente «oculta», hay que sacarla de varios lugares:

  1. La portada del blog.
  2. Los archivos de categorías, etiquetas, autor y fecha.
  3. La búsqueda interna.
  4. Los feeds RSS.
  5. Los bloques y widgets de entradas recientes o relacionadas.
  6. El mapa del sitio y, si quieres, Google.

La solución: un campo y un filtro

Marcamos las entradas a ocultar con un campo personalizado cwp_oculta y las excluimos de todas las consultas públicas que no sean la propia entrada. Guárdalo como wp-content/mu-plugins/cwp-entradas-ocultas.php:

<?php
/**
 * Plugin Name: Entradas ocultas de los listados (Curso WordPress)
 */

function cwp_ids_ocultos() {
	$ids = wp_cache_get( 'cwp_ids_ocultos' );
	if ( false === $ids ) {
		$ids = get_posts( array(
			'post_type'        => 'any',
			'meta_key'         => 'cwp_oculta',
			'fields'           => 'ids',
			'posts_per_page'   => 500,
			'no_found_rows'    => true,
			'suppress_filters' => true,
		) );
		wp_cache_set( 'cwp_ids_ocultos', $ids );
	}
	return $ids;
}

// 1 a 5: fuera de portada, archivos, búsqueda, feeds y bloques de consulta.
add_action( 'pre_get_posts', function ( $consulta ) {
	// No tocar el escritorio, la entrada individual ni la propia consulta que busca las ocultas.
	if ( is_admin() || $consulta->is_singular() || $consulta->get( 'p' ) || $consulta->get( 'name' ) || 'cwp_oculta' === $consulta->get( 'meta_key' ) ) {
		return;
	}
	$ocultos = cwp_ids_ocultos();
	if ( $ocultos ) {
		$consulta->set( 'post__not_in', array_merge( (array) $consulta->get( 'post__not_in' ), $ocultos ) );
	}
} );

// 6a: fuera del mapa del sitio de WordPress.
add_filter( 'wp_sitemaps_posts_query_args', function ( $args ) {
	$args['post__not_in'] = array_merge( $args['post__not_in'] ?? array(), cwp_ids_ocultos() );
	return $args;
} );

// 6b: noindex para que Google no la muestre en los resultados.
add_filter( 'wp_robots', function ( $robots ) {
	if ( is_singular() && get_post_meta( get_queried_object_id(), 'cwp_oculta', true ) ) {
		$robots['noindex'] = true;
		$robots['follow']  = true;
	}
	return $robots;
} );

Cómo marcar una entrada como oculta

Agrégale el campo personalizado cwp_oculta con el valor 1:

  • En el editor de bloques, activa Preferencias → General → Campos personalizados, y en el recuadro que aparece bajo el contenido, agrega cwp_oculta = 1.
  • O con WP-CLI: wp post meta add 123 cwp_oculta 1.

Para que vuelva a aparecer, borra el campo.

Al usar pre_get_posts, la exclusión también funciona en los bloques Últimas entradas y Bucle de consulta, y en la mayoría de los widgets y plugins de entradas relacionadas, porque todos usan consultas de WordPress.

Oculta no es lo mismo que secreta. Cualquiera que tenga el enlace puede verla y compartirla. Si el contenido es para pocas personas, usa protegida con contraseña o un plugin de membresías.

Alternativa sin código para casos simples

Si solo quieres quitar unas entradas de la portada, el bloque Bucle de consulta de los temas de bloques permite excluir una categoría en sus filtros. Crea una categoría «Oculta», asígnala a esas entradas y exclúyela en la consulta de la portada. No las saca de la búsqueda ni de los feeds, pero para muchos casos basta.

¿Para qué necesitas entradas ocultas en tu sitio? Cuéntanos tu caso en el foro y vemos si esta es la mejor solución.