Ciclo

Leer más » Comentar

Cómo eliminar la notificación de actualización de plugins de WooCommerce / WooThemes

Para los que manejáis WooCommerce es muy posible que no sólo utilicéis este metaplugin de WordPress para llevar a cabo ciertas tareas en vuestra tienda, sino que hagáis uso de otros plugins para añadir cierta funcionalidad. Por cierto, recordaros que WooCommerce es un plugin para montar tiendas sobre WordPress, y lo tenemos incluido en la lista de los mejores plugins para profesionales WordPress.

install_woothemes_woocommerce_linuxhispano

Pues bien, cuando hacemos uso de estas extensiones y son las propias de WooThemes (que el nombre no os confunda, esta empresa empezó haciendo temas y luego ya era tarde para cambiar el dominio raíz) nos aparece un mensaje bastante peleón que no podemos descartar (el clásico botón de “dismiss” para que no vuelva a aparecer no está) ¿Qué hacer? A mi personalmente no me gustan estos mensajes tan contaminantes, parece que nos estén obligando a realizar la acción, y ese tipo de checkers lo único que hacen es sobrecargar nuestra web de consultas a servidores externos nuestros. read more

Leer más » 1 Comentario

wp_kses() o cómo limpiar cadenas HTML en WordPress para evitar ataques XSS

Cuando desarrollo plugins y themes para WordPress en CODECTION siempre procuro mirar por la seguridad, “sanitizando” variables tanto para evitar ataques vía inyección SQL como para evitar ataques XSS. Es muy frecuente, que si recibes peticiones y luego las devuelves por pantalla, las variables que manejes, si las maneja el usuario de alguna manera, puedan terminar siendo el origen de una ataque XSS.

Algo tan sencillo como pasar una etiqueta script o iframe en un sitio conveniente y además de un ataque XSS, eres una fuente de phising para el resto de la red. Por fortuna, WordPress facilita mucho la vida al desarrollador al respecto y para evitar este tipo de ataques nos ofrece una función que además es extensible en su funcionamiento vía parámetros.

La función en cuestión es wp_kses() y aunque es similar a strip_tags(), una función nativa de PHP, suele recomendarse para cuestiones de seguridad.

wp_kses-vs-strip_tags

¿Para qué usamos wp_kses?

Básicamente deciros que sirve para limpiar una cadena de elementos HTML indeseados (imaginad otros usos que no sea el de seguridad, se me viene a la cabeza un uso de “limpieza” de una cadena proveniente de Microsft Word o LibreOffice Write).

Tiene esta forma:

wp_kses($string, $allowed_html, $allowed_protocols);

Y los parámetros que recibe indican exactamente:

  • $string: cadena a filtrar
  • $allowed_html: etiquetas HTML que se permitirán y que no se limpiaran
  • $allowed_protocols: protocolos permitidos, por defecto vienen unos pocos y siempre se asegura que no va a permitirse etiquetas ni invocaciones a ficheros JavaScript

La función devolverá el código HTML totalmente limpiado.

El segundo parámetro es interesante, porque podemos definir también qué atributos pasarán de cada etiqueta, un ejemplo curioso:

array(
    'a' => array(
        'href' => array(),
        'title' => array()
    ),
    'br' => array(),
    'em' => array(),
    'strong' => array(),
);

Ejemplo

El ejemplo es original de Simon Wheatly. Tenemos de entrada:

Wisi <a href=”#” style=”color: red;”>defui nunc</a> dignissim <strong class=”weird”>transverbero ideo vel</strong> utinam blandit, iaceo meus epulae enim amet nibh sed brevitas. Pala consequat <script type=”text/javascript” src=”http://example.com/certainly/do/not/want/this.js”></script> capio sino regula typicus <small>luptatum</small> olim ullamcorper uxor in verto.

Vamos a dejar sólo:

  • La etiqueta ‘a’ y sus atributos ‘href’, ‘title’ y ‘target’
  • Y las etiquetas ’em’ y ‘strong’ => array()

El código sería este:

$entrada = 'Wisi <a href="#" style="color: red;">defui nunc</a> dignissim <strong class="weird">transverbero ideo vel</strong> utinam blandit, iaceo meus epulae enim amet nibh sed brevitas. Pala consequat <script type="text/javascript" src="http://example.com/certainly/do/not/want/this.js"></script> capio sino regula typicus <small>luptatum</small> olim ullamcorper uxor in verto.'; $etiquetas_permitidas = array( 'a' => array( 'href' => array(), 'title' => array(), 'target' => array() ), 'em' => array(), 'strong' => array(), ); $salida= wp_kses( $entrada, $etiquetas_permitidas ); echo $salida; read more

Leer más » 1 Comentario

Guardar y cargar datos en la tabla opciones de WordPress

Si usas WordPress como desarrollador sabrás que hay varias formas de almacenar datos sobre su base de datos sin necesidad de crear nuevas tablas. Hoy os voy a explicar una de ellas. Aparte de esta que voy a explicaros, existen básicamente dos más:

  • Para guardar tipos de datos (menos usuarios) y sus metadatos (o atributos)
  • Para guardar datos de usuarios y sus metadatos

Estructura

Esta en concreto usa la tabla opciones, wp_options o prefijo_options y para entender cómo usar las funciones y el objetivo de la misma, lo mejor es ver su forma. Esta tabla tiene la siguiente estructura:

  • option_id: su clave primaria
  • option_name: nombre de la opción
  • option_value: valor de la opción
  • option_autoload: indica si debe cargarse o no de primeras

Como veis, tenemos la estructura típica de las tablas hash: clave / valor con: option_name / option_value tan de moda ahora en bases de datos no relacionales y tan útiles. read more

Leer más » 1 Comentario

./adb: No existe el archivo o el directorio, problemas desarrollando con Android

Probablemente hayáis tenido problemas intentando desarrollar con Android cuando habéis intentado echar a andar el fichero adb para por ejemplo lanzar el emulador.

El problema es que al ejecutarlo dice algo así como: “./adb: No existe el archivo o el directorio” aunque estemos en el terminal y veamos con nuestros ojos que está el fichero, que tiene el bit de ejecución marcado y que todo es correcto.

Si te ocurre esto, lo más seguro es que estés usando una distribución de 64 bits y el IDE de Android necesita compatibilidad con 32 bits. read more

Leer más » 1 Comentario

Diferencia entre wp_ajax y wp_ajax_nopriv

Cuando trabajas con AJAX en WordPress, si quieres hacerlo bien, debes hacer llamadas a admin-ajax.php y desde ahí gestionar las peticiones y sus salidas. Si conocéis esta técnica, conoceréis las funciones: wp_ajax_(acción) y wp_ajax_nopriv_(acción) (de la que no encuentro una referencia directa en el Codex, es raro). read more

Leer más » 1 Comentario

Localizar calendario datepicker de jQuery UI: formato de fecha y nombres de los meses

Cuando hacemos desarrollos web para proyectos con algún apartado de gestión basado en formularios, lo más normal, es que terminemos teniendo que introducir fechas. Las fechas son un tanto problemáticas, tanto por su posterior manejo, como por su introducción por parte del usuario. ¿Por qué? Por dos razones:

  • Hay que introducirlas en un determinado formato, en español es primero el día, luego el mes y luego el año, todo separado por barras “tipo Unix”. Podemos hablar de diferentes formatos, depende del país y la cultura y podemos hablar también de fechas incluyendo el día de la semana o incluso el nombre del mes con letras.
  • Es más fácil y más gráfico hacer clic sobre un día en un calendario que escribir la secuencia a mano.

Una buena solución suele ser manejar un calendario que salga directamente sobre el campo de texto como este que os muestro a continuación: read more

Leer más » 3 Comentarios

Ordenar una consulta con query_posts en WordPress por un meta_value

Cuando trabajamos con consultas en WordPress, es muy probable que necesitemos ordenar la salida de alguna forma diferente a la estándar que suele ser por fecha de forma que el más reciente aparezca primero y vayan apareciendo de forma sucesiva entradas más antiguas.

Si usamos WordPress como una API o como una plataforma de aplicaciones, más que como un CMS y más aún como un CMS orientado a blogs, este hecho es una auténtica necesidad. read more

Leer más » 10 Comentarios

Modificar o activar el tamaño de caché de MySQL

En las instalaciones por defecto de MySQL, en muchas ocasiones, o aparece deshabilitada la caché de consultas o aparece, pero con muy poco espacio disponible.

Como podréis figuraros, la caché de consultas almacena en memoria física, la RAM, las últimas consultas realizadas y su resultado, de forma que si alguien repite dichas consultas, el acceso a su resultado sea casi inmediato comparado con recurrir a la base de datos en sí, a la que probablemente debamos acceder a disco y recorrer sus complejos árboles B y B+ internos.

El resultado de usar caché de MySQL es muy evidente en cuando a velocidad y en una entrada posterior os comentaré cómo sacar estadísticas para ver con más concreción cuál es la mejora.

¿Cómo activarla? ¿Cómo aumentar su tamaño?

Para ver si está activada nos dirigimos al fichero my.cnf (que probablemente esté en /etc o /etc/mysql) y buscamos dentro las siguientes cadenas:

Leer más » 3 Comentarios

Eliminar enlaces de una cadena en PHP

En alguna ocasión, mostrando un extracto o por cualquier otra razón, a lo mejor necesitáis eliminar los enlaces de una cadena que manejáis en PHP. Para esta labor, podemos usar el siguiente código, que se basa en el uso de una expresión regular:

$cadena = preg_replace('/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i', '', $cadena);

Con esto tendríamos la  cadena sin enlaces: HTTP, HTTPS, FTP o FILE, si queréis podéis ampliar la primera parte de la expresión regular para incluir más posibilidades. read more

Leer más » 1 Comentario

Agrupar misma regla CSS para varios elementos

Cuando estás creando reglas CSS, es muy frecuente que diseñes reglas para cada elemento o grupo de elemento definiendo clases. Es correcto agrupar elementos en grupos mediante las clases, sin embargo, también es correcto definir una sola regla CSS para varios identificadores y clases o partes de reglas que son comunes a varias.

Esto es correcto pero es menos usado y conocido y de ahí la entrada de hoy.

¿Por qué conviene hacerlo?

Básicamente por simplidad y velocidad. Velocidad en dos aspectos, por un lado, por tiempo de transmisión (menos tamaño del fichero CSS resultante), por otro lado, por tiempo de interpretación (menos reglas que interpretar y menos reglas sobre las que buscar al renderizar).

¿Cómo se hace?

Probablemente ya lo sepáis pero merece la pena volver a comentar la sintaxis. Tened en cuenta que ciertos framework como jQuery también hacen uso de la misma sintaxis y puede seros útil.

Veamos un ejemplo esclarecedor:

Leer más » 1 Comentario

Registrar y encolar scripts en WordPress

Probablemente, conozcáis el uso de las funciones para registrar estilos y scripts en WordPress. Básicamente hay dos funciones para cada caso, una para registrar y otra para encolar, respectivamente son las siguientes:

Estilos

Scripts

¿Qué es registrar y qué es encolar? Cuando registras un script o un estilo, defines características básicas del mismo, dónde se encuentra el fichero, qué dependencias tiene (imagínate que jQuery UI requiere de jQuery), la versión que es, etc. Metainformación del script o estilo que permite a WordPress “hacerse un esquema” para hacer la mejor combinación posible cuando sean necesario.

Leer más » 1 Comentario

Prevenir enlace duplicado cuando usas add_menu_page en WordPress

Si alguna vez desarrolláis temas o plugins con WordPress, es muy probable que necesitéis manejar los menú del escritorio. En el caso que en lugar de querer poner vuestro panel de opciones en la sección de “Ajustes” queráis hacerlo directamente en vuestra propia sección, manejaréis la función add_menu_page.

Como veis en la referencia y sin entrar en detalles, esta función nos permite crear un menú para luego poder poner nuestras opciones dentro de él. Sin embargo, por defecto, realiza una acción que quizás no sea del todo de vuestro gusto.

¿Cuál? Básicamente queréis un menú que sea: MiPlugin, y dentro de él haya: Nuevo, Editar, Listar, por ejemplo. Para insertar las opciones, usaréis la función add_submenu_page.

¿Qué problema tendréis? El resultado será el siguiente, tras el menú MiPlugin estarán estas opciones: MiPlugin, Nuevo, Editar y Lista. ¿Por qué aparece repetido el título en la primera opción?

Leer más » 1 Comentario

¿Por qué no debemos usar require_once en PHP? ¿Qué soluciones tengo?

Cuando desarrollamos es muy frecuente que necesitemos leer código de otros ficheros, los lenguajes y las tecnología difieren en la forma, pero es algo básico y común a todos ellos (salvo excepciones). En PHP una forma cómoda de hacerlo es con require_once o include_once.

¿Por qué cómoda? Porque incluimos ficheros sin preocuparnos de si ya han sido incluidos. PHP lo hace por nosotros.

¿Qué problema hay? PHP al buscar si han sido incluidos o no, consume una cantidad de recursos y de tiempo de ejecución que siempre que podamos, debemos ahorrárnoslo.

¿Qué soluciones hay frente a este problema? Voy a detallar algunas de ellas, pero seguro que tú conoces alguna más que te funciona.

Usar un framework o un CMS

Si usas un entorno de este tipo, probablemente él te dote de funciones similares en funcionalidad que esquivan este problema. Por ejemplo en WordPress uso mucho get_template_part.

Indicar mediante define si se ha incluido o no

La idea sería algo así:

if (!defined('MiFichero')) {
    require('MiFichero');
    define('MiFicherp', 1);
}

De esta forma, con esta bandera, ya tenemos siempre presentes si está incluido o no (podemos hacer una función con ese código para reutilizarlo).

Leer más » 6 Comentarios

Keep it simple, stupid! Una filosofía aplicable a todos los aspectos de la tecnología

Si eres usuario de Linux o de la tecnología libre en general, no por el uso de la misma sino por la forma de hacer y crear tecnología, eres usuario de software en el que sus directrices más básicas, usan el principio KISS. Esta palabra, que significa beso en inglés, en este caso representa las iniciales de “Keep it simple, stupid!” y es una filosofía en la que se fundamenta el desarrollo de Unix y que sin lugar a dudas podréis usar en vuestros desarrollos.

Keep it simple, stupid!

¿En qué se basa exactamente? En una serie de principios que ponemos a continuación y que os traduzo para que podáis conocer y así, aplicar a vuestros propios desarrollos:

Leer más » 1 Comentario