Persistentes notificaciones de administrador de WordPress: Parte 2
Spanish (Español) translation by Luis Chiabrera (you can also view the original English article)
En
la primera parte de esta serie, aprendimos cómo implementar un aviso
básico de administrador que aparece en la parte superior de cada página
de administración de WordPress. En este tutorial,
comenzaremos a construir un complemento que contenga todo nuestro código
de aviso de administración personalizado.
Comenzaremos por implementar avisos de administrador estándar y los usaremos como base para ejemplos más flexibles y avanzados.
Configurando nuestro complemento
Sin embargo, primero, configuremos un nuevo complemento desde cero que usaremos para todos nuestros avisos de administrador, de modo que estemos listos para comenzar a ingresar el código.
Asumiré aquí que ya tiene configurado un sitio local de desarrollo de WP. Si no, consulte nuevamente los enlaces en la primera parte de esta serie de tutoriales.
Cree una nueva carpeta de complementos llamada admin_notices dentro de / wp-content / plugins /, y luego cree un archivo admin_notices.php que será el archivo de plugin principal.
Abra admin_notices.php en su editor favorito y agregue la estructura básica del complemento:
1 |
<?php
|
2 |
|
3 |
/*
|
4 |
Plugin Name: Admin Notices
|
5 |
Description: Display your own custom admin notices.
|
6 |
Version: 0.1
|
7 |
Author: David Gwyer
|
8 |
Author URI: https://www.wpgoplugins.com
|
9 |
*/
|
10 |
|
11 |
class Gwyer_Admin_Notices { |
12 |
|
13 |
/**
|
14 |
* Register hooks.
|
15 |
*/
|
16 |
public function init() { |
17 |
// Add code here...
|
18 |
}
|
19 |
}
|
20 |
|
21 |
$gwyer_admin_notices = new Gwyer_Admin_Notices(); |
22 |
$gwyer_admin_notices->init(); |
Agregamos un encabezado de complemento básico para que WordPress reconozca nuestro complemento. Esto es seguido por una clase que contendrá métodos para mostrar nuestros avisos de administrador.
Llamé a la clase Gwyer_Admin_Notices para tratar de hacerlo tan único como sea posible. De esta forma, es mucho menos probable que entre en conflicto con un nombre de clase existente.
Comencemos mostrando un aviso de administrador básico y luego agreguemos para hacerlo más útil. Para crear un aviso de administrador, agregue el enlace admin_notices a la función init ():
1 |
add_action( 'admin_notices', array( $this, 'test_notice' ) ); |
El
gancho incluye una función de devolución de llamada test_notice que se
utilizará para generar el marcado de aviso de administrador.
Agregue el siguiente método de clase a Gwyer_Admin_Notices para mostrar el aviso de administración real. Para los mensajes, utilizaremos citas de películas clásicas de los últimos 100 años de películas.
1 |
/** |
2 |
* Output a test admin notice. |
3 |
*/ |
4 |
|
5 |
public function test_notice() {
|
6 |
?> |
7 |
<div class="notice notice-error"><p>Yoo hoo, big summer blow out.</p></div> |
8 |
<?php
|
9 |
}
|
Active el complemento para mostrar el aviso de prueba.



Agreguemos también ejemplos de los otros tipos de aviso administrativo que podemos mostrar incluyendo el tipo descartable al agregar la clase CSS dismissible. Añádalos al método test_notice () debajo del aviso de administración div existente:
1 |
<div class="notice notice-warning"><p>Toto, I've a feeling we're not in Kansas anymore.</p></div> |
2 |
<div class="notice notice-success"><p>You had me at "hello".</p></div> |
3 |
<div class="notice notice-info"><p>Of all the gin joints in all the towns in all the world, she walks into mine.</p></div> |
4 |
<div class="notice notice-success is-dismissible"><p>Nobody puts Baby in a corner.</p></div> |



Esta
es la variedad completa de tipos de avisos administrativos que podemos
mostrar a través de las clases de CSS principales de WordPress. ¡Recuerde, sin embargo, que el aviso de administrador rechazado volverá a aparecer en cada carga de página!
En este contexto, el aviso de administrador 'no permitido' solo significa para la página actual. Tener
avisos de administrador persistentes no es muy flexible, por lo que más
adelante analizaremos específicamente las diferentes formas en que
puede descartar los avisos de administrador de manera efectiva.
Ganchos de aviso de administrador
Hasta ahora, solo hemos utilizado el gancho admin_notice para implementar un aviso de administrador. De
hecho, hay cuatro ganchos de aviso de administración separados que
puede usar para mostrar notificaciones, pero admin_notice es el más
comúnmente utilizado.
Los cuatro ganchos disponibles son:
- admin_notices (usado en la mayoría de las circunstancias)
- network_admin_notices
- all_admin_notices*
- user_admin_notices*
* No hay documentación oficial actualmente disponible para estos ganchos.
Entonces, ¿dónde utilizaría normalmente all_admin_notices, user_admin_notices y network_admin_notices? ¿Y cómo difieren de admin_notices?
Dije
anteriormente que el enlace admin_notices muestra las notificaciones en
todas las páginas de administración, pero esto no es estrictamente
cierto. Si
echas un vistazo a admin-header.php en el núcleo de WordPress, verás
que admin_notices, network_admin_notices y user_admin_notices son
mutuamente excluyentes. Es decir, solo uno de estos ganchos se activa en una página de administración de WordPress.
Una
serie de expresiones condicionales evalúa la página de administración
actual y activa solo una de ellas según el tipo de página de
administración en la que se encuentre actualmente.
En
primer lugar, is_network_admin () comprueba si está en una pantalla de
administración de red (por ejemplo, cualquier página de administración
basada en / wp-admin / network / URL). Si es así, el network_admin_notices engancha incendios.
De
lo contrario, is_user_admin () comprueba si estás en una pantalla de
administración de usuario (por ejemplo, cualquier página de
administración basada en / wp-admin / user / URL). Si es así, el gancho user_admin_notices se dispara.
Y, como ya habrás adivinado, si is_network_admin () y is_user_admin () devuelven falso, el gancho admin_notices se dispara .
Eso simplemente deja el gancho all_admin_notices. Este
enganche no forma parte de la expresión condicional discutida
anteriormente, por lo que este enganche está garantizado para mostrarse
en todas las páginas de administración sin importar qué, incluidas las
páginas de administración de red de varios sitios.
Para
aclarar, para cualquier página de administración de WordPress, solo se
garantiza que el enlace all_admin_notices siempre se activará. De los otros tres ganchos, solo uno disparará dependiendo de la página de administración en la que se encuentre actualmente.
Te
animo a echar un vistazo a admin-header.php (hacia el final del
archivo) para ver cómo WordPress evalúa cuándo usar cada gancho de
avisos de administrador.
Solo
utilizaremos admin_notices a lo largo de esta serie de tutoriales, pero
es posible que necesite algunos de los otros enganches en su propio
proyecto, por lo que vale la pena revisarlos.
Mostrar avisos de administrador en páginas específicas
Pasemos ahora nuestra atención a mostrar avisos de administrador en páginas específicas. Primero, comente la llamada a add_action para que nuestros avisos de prueba ya no se muestren.
Dentro
de init (), agregue una nueva llamada add_action () que usaremos para
mostrar un aviso de administrador en una página de administración
específica.
1 |
add_action( 'admin_notices', array( $this, 'specific_admin_page' ) ); |
A continuación, defina el método specific_admin_page () de la siguiente manera:
1 |
/**
|
2 |
* Output an admin notice on a specific admin screen.
|
3 |
*/
|
4 |
|
5 |
public function specific_admin_page() { |
6 |
|
7 |
$admin_page = get_current_screen(); |
8 |
?>
|
9 |
<div class="notice notice-info"><p>Information: We are currently on the <strong><?php echo $admin_page->base; ?></strong> admin page.</p></div> |
10 |
<?php
|
11 |
}
|
Guarde sus cambios y vea cualquier página en el administrador de WordPress. Voy a probar la página principal del tablero.



Como
puede ver, para cualquier página de administración que visite, el
nombre (base) de la página se muestra en el aviso de administración.
La función get_current_screen () devuelve un objeto WP_Screen con detalles sobre la pantalla de administración actual. La propiedad de objeto particular que nos interesa es WP_Screen-> base, que evalúa el tipo de base de la pantalla actual. Intente cargar diferentes páginas de administración de WordPress para ver qué valores se devuelven para WP_Screen-> base.
Podemos usar el valor base para cargar de forma condicional nuestro aviso de administrador solo en la página del tablero. El valor que debemos verificar es el dashboard. También mostremos un aviso de administrador alternativo si no estamos en la página del panel de administración. Reemplace su definición de specific_admin_page () con:
1 |
/**
|
2 |
* Output an admin notice on a specific admin screen.
|
3 |
*/
|
4 |
public function specific_admin_page() { |
5 |
|
6 |
$admin_page = get_current_screen(); |
7 |
|
8 |
if( $admin_page->base == "dashboard" ) : |
9 |
?>
|
10 |
<div class="notice notice-success"><p>We made it! Welcome to the dashboard.</p></div> |
11 |
<?php
|
12 |
else : |
13 |
?>
|
14 |
<div class="notice notice-error"><p>Where did you go? This isn't the dashboard!</p></div> |
15 |
<?php
|
16 |
endif; |
17 |
}
|



Todo está bien cuando estamos en la página del tablero, pero intente navegar a cualquier otra página de administración y vea qué sucede.



El
uso de este enfoque simple nos da un poco de flexibilidad al mostrar
avisos de administrador en páginas de administración específicas. Podemos
ampliar esto fácilmente para incluir en la lista blanca cualquier
número de páginas de administración en las que deseemos mostrar los
avisos de administrador.
Una vez más, reemplace la función specific_admin_pages (), esta vez con el siguiente código:
1 |
/**
|
2 |
* Output an admin notice on a specific admin screen.
|
3 |
*/
|
4 |
public function specific_admin_page() { |
5 |
|
6 |
$whitelist_admin_pages = array( 'dashboard', 'upload', 'edit-comments' ); |
7 |
$admin_page = get_current_screen(); |
8 |
|
9 |
if( in_array( $admin_page->base, $whitelist_admin_pages ) ) : |
10 |
?>
|
11 |
<div class="notice notice-success"><p>We made it! This is the '<?php echo $admin_page->base; ?>' admin page.</p></div> |
12 |
<?php
|
13 |
else : |
14 |
?>
|
15 |
<div class="notice notice-error"><p>Not on your nelly! This page isn't on my list.</p></div> |
16 |
<?php
|
17 |
endif; |
18 |
}
|
En
lugar de buscar una sola página de administración, ahora verificamos si
el nombre base de la página de administración actual está en la matriz $
whitelist_admin_pages. Cuando navegamos hacia el
tablero de instrumentos, la biblioteca de medios o las páginas de
administración de comentarios, vemos nuestro aviso de administrador de
éxito.



Y cuando visitamos cualquier otra página de administración (no incluida en nuestra matriz blanca), vemos un aviso de administrador alternativo.



¿Qué hay de mostrar un aviso de administrador en la página de opciones de un complemento? ¿Cómo haríamos eso? Antes de entrar en esto, primero tenemos que configurar una página de opciones ficticias para nuestro complemento.
Cree
un nuevo archivo llamado plugin-options.php dentro de la carpeta del
plugin admin-notes que agregamos anteriormente, y agregue el siguiente
código:
1 |
<?php
|
2 |
|
3 |
class Gwyer_Plugin_Options { |
4 |
|
5 |
/**
|
6 |
* Register hooks.
|
7 |
*/
|
8 |
public function init() { |
9 |
add_action( 'admin_init', array( $this, 'register_plugin_settings' ) ); |
10 |
add_action('admin_menu', array( $this, 'create_admin_menu_page' ) ); |
11 |
}
|
12 |
|
13 |
public function create_admin_menu_page() { |
14 |
|
15 |
// Create new top-level menu
|
16 |
add_options_page('Admin Notices', 'Admin Notices', 'manage_options', __FILE__, array( $this, 'render_options_page' ) ); |
17 |
}
|
18 |
|
19 |
public function register_plugin_settings() { |
20 |
register_setting( 'admin-notices-plugin-settings', 'text-option' ); |
21 |
}
|
22 |
|
23 |
public function render_options_page() { |
24 |
?>
|
25 |
<div class="wrap"> |
26 |
<h1>Admin Notices Plugin</h1> |
27 |
|
28 |
<form method="post" action="options.php"> |
29 |
<?php settings_fields( 'admin-notices-plugin-settings' ); ?> |
30 |
<?php do_settings_sections( 'admin-notices-plugin-settings' ); ?> |
31 |
<table class="form-table"> |
32 |
<tr valign="top"> |
33 |
<th scope="row">Enter some text</th> |
34 |
<td><input type="text" name="text-option" value="<?php echo esc_attr( get_option( 'text-option' ) ); ?>" /></td> |
35 |
</tr>
|
36 |
</table>
|
37 |
<?php submit_button(); ?> |
38 |
</form>
|
39 |
</div>
|
40 |
<?php
|
41 |
}
|
42 |
}
|
43 |
|
44 |
$gwyer_plugin_options = new Gwyer_Plugin_Options(); |
45 |
$gwyer_plugin_options->init(); |
En
la parte superior de admin-notices.php (directamente encima de la
declaración de clase), incluya la clase de opciones del complemento en
el archivo de complemento principal con:
1 |
require_once(dirname(__FILE__) . '/plugin-options.php' ); |
No
voy a entrar en demasiados detalles sobre cómo funciona el código en
plugin-options.php, ya que podría ser un tutorial completo por sí mismo. Si
desea una actualización, le recomiendo echar un vistazo a la página del
Codex de WordPress al agregar páginas de opciones de complementos.
Básicamente, todo lo que hacemos es agregar una nueva subpágina de avisos de administrador al menú de configuración. La página de opciones del complemento contiene un solo campo de texto en el que puede introducir una cadena. Cuando se hace clic en el botón Guardar cambios, los contenidos del campo de texto se guardan en la base de datos de WordPress.
Este es solo un ejemplo escueto de una página de configuración de complementos solo para demostración. No
incluye las funciones necesarias de desinfección o traducción
recomendadas para un complemento de producción destinado a la versión
general.
Vaya a Configuración> Notificaciones de administrador para ver la página de opciones del complemento.



Como
era de esperar, el aviso de administrador que agregamos anteriormente
se muestra en nuestra página de opciones de complementos. El
mensaje de error se muestra porque nuestra página de opciones de
complementos no está en la $ whitelist_admin_pages array de páginas de
administración permitidas. Arreglemos eso ahora.
Para agregar nuestra página de opciones a la matriz, necesitamos saber el nombre base. Dentro de specific_admin_page (), cambie el aviso de error admin div a lo siguiente:
1 |
<div class="notice notice-error"><p>Not on your nelly! This '<?php echo $admin_page->base; ?>' page isn't on my list.</p></div> |
Todavía recibimos el mismo aviso de error de administración que antes, pero esta vez incluye el nombre base que necesitamos, que resulta ser settings_page_admin-notice / plugin-options. Ese no es un nombre que pudiéramos haber adivinado fácilmente, ¡así que valió la pena tomarse el tiempo para imprimirlo!
Agregue el nombre base a la matriz $ whitelist_admin_pages, que ahora debería verse así:
1 |
$whitelist_admin_pages = array( |
2 |
'settings_page_admin-notices/plugin-options', |
3 |
'dashboard', |
4 |
'upload', |
5 |
'edit-comments'
|
6 |
);
|
Actualice la página de opciones del complemento para ver el aviso de administrador actualizado.



Ahora
que conocemos el nombre base de la página de opciones del complemento,
podemos crear fácilmente un aviso de administrador que solo se muestra
en esa página de administración. Elimine
settings_page_admin-notices / plugin-options de la matriz $
whitelist_admin_pages y comente la segunda llamada a la función
add_action en init (). A continuación, agregue una tercera acción que usaremos para nuestra página de opciones de complementos, solo aviso de administrador. Su función init () ahora debería verse así:
1 |
/**
|
2 |
* Register hooks.
|
3 |
*/
|
4 |
public function init() { |
5 |
//add_action( 'admin_notices', array( $this, 'test_notice' ) );
|
6 |
//add_action( 'admin_notices', array( $this, 'specific_admin_page' ) );
|
7 |
add_action( 'admin_notices', array( $this, 'plugin_admin_notice' ) ); |
8 |
}
|
9 |
Vamos a desarrollar la función de devolución de llamada plugin_admin_notice () ahora. Agregue este nuevo método a la clase Gwyer_Admin_Notices:
1 |
/**
|
2 |
* Output an admin notice on the plugin options page.
|
3 |
*/
|
4 |
public function plugin_admin_notice() { |
5 |
|
6 |
$whitelist_admin_pages = array( 'settings_page_admin-notices/plugin-options' ); |
7 |
$admin_page = get_current_screen(); |
8 |
|
9 |
if( in_array( $admin_page->base, $whitelist_admin_pages ) ) : |
10 |
?>
|
11 |
<div class="notice notice-info"><p>Welcome to the Admin Notices plugin page!</p></div> |
12 |
<?php
|
13 |
endif; |
14 |
}
|
Esto es muy similar a specific_admin_page () excepto que hemos eliminado la expresión condicional. También
agregamos un botón de descarte al agregar la clase de CSS is-dismissible,
por lo que ahora también se puede cerrar el aviso de administrador.



Intente cargar otras páginas de administración para confirmar que el aviso de administrador solo se muestra en la página de opciones del complemento.
Conclusión
En este tutorial, aprendimos más sobre los avisos administrativos y los diversos ganchos disponibles para mostrarlos. También cubrimos cómo mostrar notificaciones de administrador solo en páginas específicas del administrador de WordPress. Desarrollamos un complemento dedicado para contener todo el código de aviso de administración personalizado.
En
la tercera parte, ampliaremos el complemento mostrando cómo activar los
avisos administrativos cuando ocurren ciertos eventos. Recuerde, la naturaleza de código abierto de WordPress hace que sea fácil de aprender y ampliar. Con ese fin, tenemos mucho que revisar y estudiar en Envato Market si tiene curiosidad.
A continuación, centraremos nuestra atención en descubrir cómo podemos resolver el problema de notificación administrativa persistente para que no vuelvan a aparecer cuando se actualice la página. Implementaremos varios métodos diferentes en nuestro complemento personalizado para permitirnos hacer esto.



