Ajustes para esconder sin plugins información publicada

Cómo ocultar páginas y entradas en el area de administración de WordPress

Siguiendo con los artículos dedicados a ocultar o restringir el acceso a determinadas secciones en WordPress, a continuación vamos a ver cómo hacer desaparecer (sin eliminar) una o más páginas y/o entradas del area de administración del sistema.

Las razones para esconder información en el panel de control pueden ser varias: prevenir que nuestro cliente cambie algo que no debería cambiar, evitar que se confunda con las páginas que solo están ahí para incluir plantillas personalizadas, páginas innecesarias creadas por algún plugin, por simplificar, por seguridad, para proteger de errores involuntarios…

Así que, convencidos de que no estamos haciendo nada malo, vamos a ver cómo podemos ocultar las páginas que nos convengan añadiendo una función nueva a través de pre_get_posts, un hook que nos permite alterar la consulta original añadiendo y ejecutando funciones antes de que la consulta se lleve a cabo, y sin tener que editar los archivos internos del sistema.

Los siguientes fragmentos de código pueden incluirse en el archivo “functions.php” del tema activo o bien en un plugin de funciones.

Si te sirve de ayuda, desde esta página puedes descargar un plugin de funciones vacío, a punto para activar y utilizar, y aprender más cosas sobre el archivo ‘functions.php’.

Código para ocultar páginas en el backend del sistema

// Ocultamos algunas páginas de la lista en el editor
function mytheme_hide_pages( $query ) {

	// Si no estamos en el area de administración,
	// salimos sin hacer nada.
	if ( !is_admin() )
		return $query;

	// Accedemos a la variable global "$pagenow"
	global $pagenow;

	// Si la página actual es el listado de páginas
	// La URL es "edit.php?post_type=page"
	if ( 'edit.php' == $pagenow && ( get_query_var('post_type') && 'page' == get_query_var('post_type') ) )
		
		// Añadimos el parámetro "post__not_in" a la consulta
		// y ocultamos la lista de páginas especificadas (IDs) en el array
		$query->set( 'post__not_in', array(250,251) );

	// Continuamos con la consulta
	return $query;
}
add_action( 'pre_get_posts' ,'mytheme_hide_pages' );

Código para ocultar entradas de la lista

// Ocultamos algunas entradas de la lista en el editor
function mytheme_hide_posts( $query ) {

	// Si no estamos en el area de administración,
	// salimos sin hacer nada.
	if ( !is_admin() )
		return $query;

	// Accedemos a la variable global "$pagenow"        
	global $pagenow;

	// Si la página actual es el listado de entradas
	// La URL es "edit.php"
	if ( 'edit.php' == $pagenow )

		// Añadimos el parámetro "post__not_in" a la consulta
		// y ocultamos la lista de entradas especificadas (IDs) en el array
		$query->set( 'post__not_in', array(501,548,620,1152) );

	// Continuamos con la consulta
	return $query;
}
add_action( 'pre_get_posts' ,'mytheme_hide_posts' );

En ambos casos, es imprescindible cambiar (en la linea 18) la lista de IDs de las páginas y entradas que queramos ocultar.

Conviene aclarar que con esto no estamos eliminando nada, ni siquiera impidiendo que se editen. Lo único que hemos hecho es ocultarlas (esconderlas de la vista, hacerlas invisibles) en el backend o area de administración. Otros usuarios editores o administradores del sitio web podrán acceder a través del enlace “Editar” (si está definido en la plantilla) o bien, si conocen el número de identificación, podrán acceder sin problema a través de esta URL, tanto para páginas como para entradas (ID = 0000):

http://www.ejemplo.com/wp-admin/post.php?post=0000&action=edit

Por tanto, esto no tiene ningún efecto en la parte de la web abierta a todo el mundo. Las páginas y entradas seguirán siendo accesibles y apareciendo normalmente para nuestras visitas, a no ser que estén protegidas por contraseña y ocultas para determinados usuarios.

Aquí encontrarás información sobre cómo proteger entradas y páginas con contraseña en WordPress o bien cómo mostrar contenido según el usuario que está conectado.

Cómo averiguo el ID de cada página o entrada

Para saber cuál es el número identificador (ID) que WordPress da a nuestros contenidos solo tenemos que situar el cursor encima del título y fijarnos en la dirección que aparece abajo del todo en nuestro navegador. Por ejemplo:

http://www.ejemplo.com/wp-admin/post.php?post=5622&action=edit

En este caso, el ID de la entrada será “5622”. Este es el número que habrá que añadir en el código anterior.

Añadir una columna “ID” en el editor

Opcionalmente, si necesitamos hacer un uso más frecuente de este identificador, otra opción podría ser añadir una columna nueva que muestre este número en las tablas de administración de WordPress.

Para ello tendremos que agregar este fragmento de código:

// Añadimos una columna "ID" en el editor de páginas y en el de entradas
function mytheme_id_column($defaults){
	$defaults['wps_post_id'] = __('ID');
	return $defaults;
}
function mytheme_custom_id_column($column_name, $id){
	if ( $column_name === 'wps_post_id' ) {
		echo $id;
    }
}
// Editor de entradas (posts)
add_filter( 'manage_posts_columns', 'mytheme_id_column', 5 );
add_action( 'manage_posts_custom_column', 'mytheme_custom_id_column', 5, 2 );

// Editor de páginas (pages)
add_filter( 'manage_pages_columns', 'mytheme_id_column', 5 );
add_action( 'manage_pages_custom_column', 'mytheme_custom_id_column', 5, 2 );

// Evitamos que la nueva columna ID ocupe demasiado espacio
// incluyendo una linea de CSS en la cabecera (ancho = 80px)
function mytheme_admin_style_id_column() {
    echo '<style type="text/css">
			.column-wps_post_id { width: 80px !important; }
		  </style>';
}
add_action('admin_head', 'mytheme_admin_style_id_column');

Lo más probable es que por defecto, la nueva columna “ID” sea demasiado ancha, así que hemos añadido una linea de CSS en la cabecera que se encargará de este pequeño problema, haciendo que la nueva columna ocupe solo 80px.

Conclusión

El sistema de gestión de usuarios y privilegios de WordPress es enormemente flexible para conseguir casi cualquier cosa que nos propongamos, pero cuando los ajustes que queremos hacer son menores y tan específicos como ocultar una sola página de la lista, viene bien poder configurar el sistema sin tocar los archivos del núcleo y sin tener que depender de ningún plugin.

Comentarios

  1. Yo implementé una variante de esta función, y es la siguiente:

    //Función para ocultar páginas de la administración al resto de usuarios - Elige los IDs de página que no se mostrarán
    add_action( 'pre_get_posts' ,'ocultar_paginas' );
    function ocultar_paginas( $query ) {
    		$current_user = wp_get_current_user();
            if($current_user->ID == 1)
                    return $query;
            global $pagenow;
            if( 'edit.php' == $pagenow && ( get_query_var('post_type') && 'page' == get_query_var('post_type') ) )
                    $query->set( 'post__not_in', array(2,4,8,16,32) ); // ID de las páginas a ocultar
            return $query;
    }
    

    Tan sólo tendríais que modificar el ID del usuario que será el único que podrá visualizar esa(s) página(s), y los ID’s de las páginas a ocultar para el resto de los usuarios.

  2. Daniel

    Buena idea. Así podemos modificar lo que puede ver cada usuario.
    Gracias por la aportación!

  3. De nada, Daniel. Gracias a ti por este blog tan bueno que llevas con publicaciones tan interesantes sobre WordPress.
    Eso es lo bueno, increíble y maravilloso del mundo del software libre y código abierto… que cada uno aporta sus ideas, soluciones y diferentes puntos de vista a los problemas que surgen. :D

    P.S.: no sabía que los comentarios aceptaban los tags “[ php ]” para incluir código, si no lo hubiese puesto. Así que gracias por incluirlo también. :P

  4. Vaya, ahora “la cagué” con ese comentario. Jaja. Y no puedo editarlo, así que puedes editarlo para que no quede como que puse una tontería random.

  5. Daniel

    No pasa nada. Ya está arreglado. He puesto espacios en la etiqueta PHP para que no la interprete como código. Gracias por preocuparte :-)

Y tú qué opinas?

Las URLs se convertirán en enlaces automáticamente. Tu dirección de email no se publicará ni se utilizará para enviar ningún tipo de información. Los mensajes que no aporten nada al tema que se trata en esta entrada se borrarán. Las imágenes que aparecen al lado de cada autor utilizan el servicio de Gravatar. Recuerda que puedes usar etiquetas HTML como <a href>, <code>, <em> o <strong> en los comentarios.

(necesario)

(opcional)