Kitabı oku: «El gran libro de desarrollo de plugins WordPress», sayfa 2
Mejores prácticas para definir nuestras funciones o variables
Para que no se creen conflictos entre nuestras funciones, clases y variables de WordPress, debemos definirlas de la siguiente manera:
Comprobando que una variable no exista:
Comprobando que una función no exista:
Comprobando que una clase no exista:
Comprobando que una constante no está definida:
Mostrar información de nuestro plugin según el rol que tenga la persona, is_admin();. Determina si la solicitud actual es para una página de interfaz administrativa. Para ver más acerca de esta función, podemos visitar la web oficial de WordPress developers.
https://developer.wordpress.org/reference/functions/is_admin/
Comprobación de las capacidades de usuario
Las capacidades de usuario son las funciones que se pueden realizar dependiendo del rol que tenga la persona dentro de la web. Los roles que puede desempeñar una persona dentro de un proyecto web son:
• Super Admin
• Administrator
• Editor
• Author
• Contributor
• Subscriber
A continuación, mostraremos como ejemplo algunas de las funciones que se pueden realizar con el rol de Super Admin:
• create_sites
• delete_sites
• manage_network
• manage_sites
• manage_network_users
• manage_network_plugins
• manage_network_themes
• manage_network_options
• upload_plugins
• upload_themes
Son muchas más las funciones. Acto seguido, pondremos una tabla con las funciones y los roles que pueden desempeñar dichas funciones.
Para conceder el permiso a un usuario según su rol o mostrarle según qué funciones, podemos utilizar la siguiente función:
current_user_can( string $capability, mixed $args )
También podemos escribir un condicional para ejecutar alguna acción, por ejemplo:
Ahora crearemos un ejemplo, añadiremos una función donde aquel usuario con permisos para editar paginas podrá ver la modificación que añadiremos al head de nuestro WordPress:
Esta función nos puede dar un error Undefined function wp_get_current_user(). Este error se debe a que, durante el proceso de carga, WordPress carga primero todos los archivos y plugins, por último comprueba las capacidades de usuario, por eso nos marca el error de que no está definido.
Para solventar este error, debemos crear una función con el gancho de acción ‘plugins_loaded’; así quedaría el código.
Si vamos a nuestro frontend y comprobamos desde la consola nuestro head, veremos los cambios realizados.
Métodos de validación de datos
Existen varios métodos de validación de datos en WordPress. Entre los más utilizados podemos encontrar los siguientes:
• is_email()
• term_exists()
• username_exists()
• validate_file()
Pondremos un ejemplo de cómo validar un email:
Al aplicar este código de validación, obviamente me devolverá que es correcto, pues el mail cumple con los requisitos, que son:
• Nombre de usuario
• Servidor
• Sin olvidar el punto(.) y la arroba (@)
Si quitásemos el punto y dejáramos: prueba@pruebaeu, me devolvería Email incorrecto. Vamos al frontend en la página de inicio y nos fijamos en la parte superior, y veremos el mensaje Email incorrecto:
Otras funciones para la validación de datos pueden ser funciones de php como:
• isset() - empty()
• mb_strlen() - strlen()
• preg_match, strpos()
• count()
• in_array()
Pondremos un ejemplo de cómo utilizar in_array();
Esto me devolverá true, pues manzana está dentro del array.
Métodos de desinfección para la entrada de datos
Los métodos de sanitización de WordPress nos ayudan a eliminar caracteres extraños o maliciosos en nuestro envío y recepción de datos.
Para ello, utilizaremos las funciones de sanitización de WordPress, que son las siguientes:
• sanitize_email()
• sanitize_file_name()
• sanitize_html_class()
• sanitize_key()
• sanitize_meta()
• sanitize_mime_type()
• sanitize_option()
• sanitize_sql_orderby()
• sanitize_text_field()
• sanitize_title()
• sanitize_title_for_query()
• sanitize_title_with_dashes()
• sanitize_user()
• esc_url_raw()
• wp_filter_post_kses()
• wp_filter_nohtml_kses()
sanitize_email( $email )
Elimina todos los caracteres que no están permitidos en un correo electrónico.
sanitize_file_name( $filename )
Desinfecta un nombre de archivo, reemplazando espacios en blanco con guiones.
Descripción
Elimina caracteres especiales, que son ilegales en los nombres de archivo en ciertos sistemas operativos, y caracteres especiales, que requieren un escape especial para manipular en la línea de comando. Reemplaza espacios y guiones consecutivos con un solo guion. Recorta el período, el guion, y el subrayado, desde el principio y el final del nombre de archivo. No se garantiza que esta función devolverá un nombre de archivo que se puede cargar.
sanitize_html_class( $class, $fallback = ‘’ )
Desinfecta un nombre de clase HTML para garantizar que solo contenga caracteres válidos.
sanitize_key( $key )
Desinfecta una clave de cadena.
Descripción
Las claves se usan como identificadores internos. Se permiten caracteres alfanuméricos en minúscula, guiones y guiones bajos.
sanitize_meta ( $meta_key, $meta_value, $object_type, $object_subtype = ‘’ )
Desinfecta el metavalor.
Parámetros
• $meta_key
( cadena ) (Obligatorio) Clave de metadatos.
• $meta_value
( mixto ) (Requerido) Valor de metadatos para desinfectar.
• $object_type
( cadena ) (Obligatorio) El tipo de metadatos del objeto es para. Acepta ‘publicación’, ‘comentario’, ‘término’, ‘usuario’ o cualquier otro tipo de objeto con una metatabla asociada.
• $object_subtype
( cadena ) (Opcional) El subtipo del tipo de objeto. Valor por defecto: ‘’
sanitize_mime_type( $mime_type )
Desinfecta un tipo mimo.
sanitize_option( $option, $value )
Desinfecta varios valores de opciones según la naturaleza de la opción.
Descripción
Esto es básicamente una declaración de cambio que pasará $value a través de una serie de funciones dependiendo de la $option.
Parámetros
• $option
• ( cadena ) (Obligatorio) El nombre de la opción.
• $value
• ( cadena ) (Obligatorio) El valor no desinfectado.
sanitize_sql_orderby ( $orderby )
Asegura que una cadena sea una cláusula válida de ‘ordenar por’ de SQL.
sanitize_text_field ( $str )
Desinfecta una cadena de entrada del usuario o de la base de datos.
sanitize_title( $title )
Desinfecta un título o devuelve un título alternativo.
sanitize_title_for_query( $title )
Desinfecta un título con el contexto de ‘consulta’.
sanitize_title_with_dashes( $title )
Desinfecta un título, reemplazando espacios en blanco y algunos otros caracteres con guiones.
Descripción
Limita la salida a caracteres alfanuméricos, guion bajo (_) y guion (-). El espacio en blanco se convierte en un guion.
sanitize_user()
Desinfecta un nombre de usuario, eliminando caracteres inseguros.
esc_url_raw( $url )
Realiza esc_url () para el uso de la base de datos.
wp_filter_post_kses( $data )
Desinfecta el contenido de las etiquetas HTML permitidas para el contenido de la publicación.
Descripción
El contenido de la publicación se refiere al contenido de la página del tipo ‘publicación’ y no a los $_POSTdatos de los formularios. Esta función espera datos recortados.
wp_filter_nohtml_kses()
Elimina todo el HTML de una cadena de texto.
Ejemplos
Ejemplo 1
A continuación, pondremos un ejemplo de cómo funciona el método sanitize_text_field()
Estamos inyectando código sql dentro del mensaje. Lo que hace la función de sanitización es eliminar este código. Si vamos a nuestro frontend y observamos en la consola, veremos que lo elimina.
Ejemplo 2
Ahora vamos a realizar un ejemplo con el método sanitize_email(), el cual podemos utilizar por ejemplo cuando recibimos en un formulario el mail de algún usuario.
Para ello, vamos a nuestro archivo principal de nuestro plugin res-pruebas. php y escribimos el siguiente código:
Observemos que estamos introduciendo un email con espacios y caracteres que no se pueden admitir en un correo normal, ahora lo pasamos por el método de sanitización y revisamos nuestro frontend.
Vemos cómo me devuelve solo los caracteres admitidos.
Nonces I
Generalidades
El término «nonce» es la abreviación en inglés de «number used once», o número usado una vez. En WordPress los nonces son cadenas de texto que parecen ser cadenas aleatorias, pero en realidad no lo son, pues son generadas a través de funciones hash.
Una función criptográfica hash (usualmente conocida como “hash”) es un algoritmo matemático que transforma cualquier bloque arbitrario de datos en una nueva serie de caracteres con una longitud fija. Independientemente de la longitud de los datos de entrada, el valor hash de salida tendrá siempre la misma longitud.
Nonces en WordPress
Si vemos el código de los enlaces o código de los formularios de WordPress, podemos detectar alguna de estas cadenas de seguridad.
Nonces en URL
Por ejemplo, cuando queremos eliminar una entrada, veremos una url como se muestra en la siguiente imagen:
_wpnonce es el parámetro por defecto que usa WordPress para el nonce en la url.
Nonces en formularios
Por ejemplo, al crear una nueva entrada, aparece el formulario con los diferentes campos para llenar, pero también aparecen campos ocultos. Lo podemos ver con el Inspector de Código, tal como se muestra en la siguiente imagen:
Vemos que el nombre del input es _wpnonce es el nombre por defecto que usa WordPress para el nonce.
Proteger a los usuarios de ellos mismos
Imagínese que un usuario tiene permisos de administrador y está logueado en su WordPress, él no tiene pensado borrar ninguna entrada. Sin embargo, ¿qué sucede si le envío por correo un enlace con la url para eliminar una entrada? Si el usuario pulsa mi enlace, lo estaré forzando a realizar el borrado de alguna entrada.
Este tipo de ataque es parte de los ataques conocidos como CSRF (Cross Site Request Forgery).
Si el usuario ejecuta alguna acción forzada sin tener un nonce válido, WordPress mostrará la siguiente pantalla por defecto y sin opción a nada.
Creando Nonces en el desarrollo de plugins
Por todo lo anteriormente expuesto, cuando desarrollamos plugins, hay que tener presente el uso de nonces. A continuación, veremos algunos escenarios más comunes:
Nonces en URL
Para agregar un nonce en la url, usamos la función wp_nonce_url(), por ejemplo:
En el código anterior:
• Nuestro nonce se generará a partir del texto «ejemplo-nonce».
• Tendrá como nombre «nonce» (en lugar del nombre por defecto _wpnonce).
Nonces en formulario
En este caso usaremos la función wp_nonce_field(), que creará el campo oculto con el valor del nonce.
En el código anterior:
• Nuestro nonce se generará a partir del texto «ejemplo-nonce».
• tendrá como nombre de campo «nonce» (en lugar del nombre por defecto _wpnonce).
Nonces usando ajax
Para usar nonces con ajax, tenemos que crear el nonce y pasarlo al archivo javascript a través de la función wp_localize_script(). Para la creación del nonce usaremos wp_create_nonce().
Comprobando validez de Nonces en el desarrollo de plugins
Para personalizar el mensaje que se muestra cuando hay un error de nonce, puede usar la función wp_verify_nonce(). El código sería similar al siguiente:
Este código funcionará en todos los casos, para nonces en url, formulario y ajax.
IMPORTANTE:
Los nonces cambian cada 12 horas y es válido por 24 horas (es decir, el nonce actual tiene un período de expiración de 24 horas, pero ese código generado se repetirá solo por 12 horas, y luego cambiará por otro, siendo válidos los 2 en su período de tiempo).
Ejemplos
Ejemplo 1
En este ejemplo veremos cómo insertar un nonce en una url. Para ello, vamos a configurar primero nuestros enlaces y vamos a nuestro panel de administración de WordPress, y en ajustes->enlaces permanentes vamos a clicar la opción nombre de la entrada y hacemos clic en guardar cambios.
Ahora vamos al archivo functions.php de nuestra plantilla restaurante, la ruta es:
C:\wamp64\www\_curso02\wp-content\themes\atr_theme
Aquí encontraremos el archivo functions.php y dentro de este archivo crearemos una variable donde guardaremos la ruta de algún post de nuestra web restaurante. A continuación, con la función wp_nonce_url() pasaremos el nonce de seguridad.
El código seria así:
Observemos qué estamos haciendo en echo para ver la ruta y el nonce que generamos.
Nonces II
Ejemplo 2
En este ejemplo crearemos un nonce para un input de un formulario, crearemos una opción de menú en nuestro panel de administrador y un formulario con un botón de eliminar. En este formulario pasaremos el nonce que hemos creado y lo verificaremos.
Creamos un menú en el panel de administración:
Después creamos la función donde pasaremos un nonce por medio de un formulario:
En el código que acabamos de escribir, validaremos el nonce que hemos creado, y pasamos por el formulario a través del campo input con el name “nonce”. Validaremos si el valor $_POST[‘nonce’] existe y no está vacío:
También utilizaremos una function de WordPress wp_verify_nonce(), para comprobar que el nonce que creamos y pasamos por post sea el mismo:
El resultado de todo este código es que, en nuestro panel de administración, al hacer clic en el botón eliminar, veremos un mensaje tal que hemos verificado correctamente el nonce:
Menús y submenús de administración de WordPress
Creación de menús en la administración
Crear un menú en WordPress es bastante sencillo. Existen varias formas de hacerlo: lo puedes poner en un plugin, lo puedes poner en un tema, y luego lo puedes hacer con clases o con funciones sueltas.
¿Para qué vale tener un menú de administración en WordPress? Si quieres poder personalizar o tener tus propias páginas de configuración para vuestro plugin o vuestro tema, esta es la mejor solución.
Crear un menú en WordPress
Para esto usaremos la función add_menu_page() que nos provee la api de WordPress.
Agregar una página de menú de nivel superior.
Descripción
Esta función tiene una capacidad que se utilizará para determinar si una página se incluye o no en el menú.
La función que está conectada para manejar la salida de la página debe verificar que el usuario también tenga la capacidad requerida.
Parámetros
• $page_title
( cadena ) (obligatorio) El texto que se mostrará en las etiquetas de título de la página cuando se seleccione el menú.
• $menu_title
( cadena ) (obligatorio) El texto que se utilizará para el menú.
• $capability
( cadena ) (Requerido) La capacidad requerida para que en este menú se muestre al usuario.
• $menu_slug
( cadena ) (Obligatorio) El nombre del slug para referirse a este menú. Debe ser único para esta página de menú y solo debe incluir caracteres alfanuméricos en minúscula, guiones y guiones bajos para que sean compatibles con sanitize_key ().
• $function
( invocable ) (Opcional) La función que se llamará para generar el contenido de esta página. Valor por defecto: ‘’
• $icon_url
( cadena ) (Opcional) La url del icono que se utilizará para este menú. Pase un SVG codificado en base64 usando un URI de datos, que se coloreará para que coincida con el esquema de color. Esto debería comenzar con ‘data: image / svg + xml; base64,’. Pase el nombre de una clase auxiliar de Dashicons para usar un icono de fuente, por ejemplo, ‘dashicons-chart-pie’. Pase ‘none’ para dejar div.wp-menu-image vacío para que se pueda agregar un icono a través de CSS. Valor por defecto: ‘’
• $position
( int ) (Opcional) Debe aparecer la posición en el orden de menú de este elemento. Valor predeterminado: nulo
Ejemplo
Crearemos un menú como ejemplo en nuestro plugin pruebas. Lo primero que crearemos es un archivo img en la raíz de nuestro plugin y dentro pondremos un archivo de tipo imagen de 20 px x 20 px que es lo que requiere el estándar de WordPress para los iconos personalizados de nuestros menús.
Después en nuestro archivo principal res-pruebas.php escribiremos el siguiente código para crear el menú:
Creando la función callback del menú
Ahora crearemos la función de llamada o función callback del menú, que es donde pondremos nuestro html. Esta función proviene de la función de creación de la página del menú.
Eliminar menús
Para eliminar algún menú del panel de administración, debemos utilizar la función remove_menu_page(), dentro de la misma función donde se creó el menú.
Eliminaremos el menú RES Prueba Nonce que hemos hecho en ejemplos anteriores.
Si vamos a nuestro panel de administrador, veremos cómo desaparece el menú.
Creación de submenús
Los submenús son páginas de opciones adicionales que van dentro del menú que hemos creado. Para crear un submenú del menú RES Opciones de Página, debemos tener en cuenta el slug que es res_options_page y escribimos lo siguiente:
Ahora crearemos la función de llamada o función callback, donde pondré mi html.
Funcion add_submenu_page()
Agregar una página de submenú.
Descripción
Esta función tiene una capacidad que se utilizará para determinar si una página se incluye o no en el menú.
La función que está conectada para manejar la salida de la página debe verificar que el usuario también tenga la capacidad requerida.
Parámetros
• $parent_slug (cadena ) (Obligatorio)
El nombre del slug para el menú principal (o el nombre de archivo de una página de administración estándar de WordPress).
• $page_title
(cadena ) (obligatorio) El texto que se mostrará en las etiquetas de título de la página cuando se seleccione el menú.
• $menu_title
(cadena ) (obligatorio) El texto que se utilizará para el menú.
• $capability
(cadena ) (Requerido) La capacidad requerida para que este menú se muestre al usuario.
• $menu_slug
(cadena ) (Obligatorio) El nombre del slug para referirse a este menú. Debe ser único para este menú y solo debe incluir caracteres alfanuméricos en minúscula, guiones y guiones bajos para que sean compatibles con sanitize_key ().
• $function
( invocable ) (Opcional) La función que se llamará para generar el contenido de esta página. Valor por defecto: ‘’
• $position
( int ) (Opcional) Debe aparecer la posición en el orden de menú de este elemento. Valor predeterminado: nulo.
Como podemos ver en la imagen, tenemos el menú principal y el submenú. Ganchos Hooks