Migraciones en WordPress

Reemplazar cadenas de texto codificadas en base 64 dentro de la BBDD de WordPress

¿Cómo lleváis el verano? Espero que muy bien y que aprovechéis para descansar y cargar pilas. Yo aquí ando, de migraciones , de un sitio para otro 😀 Siempre aprendo algo nuevo con cada una de ellas solucionando pequeños problemillas.

En la MegaMeetUp de Amurrio hablé sobre el maravilloso plugin Duplicator y lo bien que funcionaba para cambiar las URLs antiguas por las nuevas.

Justo hoy me ha surgido un contratiempo con Duplicator bastante gordo, después de migrar un sitio hecho con Visual Composer detecté que los elementos que se habían creado con «»HTML puro» estaban codificados en base 64, y mucho peor aún, tenía enlaces que apuntaban a la antigua URL, una verdadera pesadilla.

Decodificar para modificar y volver a codificar

Sólo había 2 alternativas, ir a mano enlace por enlace sustituyéndolo (algo totalmente inviable) o prepararte un script que hiciera el trabajo de decodificar las cadenas en la BBDD, hacer un replace y volver a codificar. Obviamente hice la segunda opción. Después de hacer una profunda búsqueda en Github, me encontré con un script bastante parecido al que yo necesitaba, simplemente tenía que hacer unos cambios, en mi caso necesitaba modificar la columna post_content de la tabla posts

function replace_composer_html_raw_base64(){

    if($_SERVER['REQUEST_URI'] == '/replace_composer_html_raw_base64'){
        global $wpdb;
        
        ini_set('error_reporting', E_ALL);
        ini_set('display_errors', 1);
        ini_set('display_startup_errors', 1);

        $response = $wpdb->get_results('SELECT ID,post_content FROM wp_posts WHERE post_type="page"',ARRAY_A);
        $count = count($response);
//Importante la variable tag, en mi caso cómo es un elemento HTML de visual composer es vc_raw_html.
        $tag = 'vc_raw_html';
        $pattern = '\['.$tag.'].*?\]';

        foreach ($response as $post){

            $matches = '';
            preg_match_all('/' . $pattern . '/s', $post['post_content'], $matches);
            $content = replacedComposerHtmlRawString($matches[0],$tag);

            if(!$content &amp;&amp; count($content)<1){
                continue;
            }

            foreach ($content as $key=>$item){
                $post['post_content'] = str_replace($item['original'],$item['modified'],$post['post_content']);
            }

            //$post['post_content'] = replacedComposerRawFromTo();

            $upd = array(// Actualizamos el post en la BBDD
                'ID'           => $post['ID'],
                'post_content' => $post['post_content'],
            );
            wp_update_post( $upd );
        }

        die('If no errors, all successful! =)  ');
    }
}

function replacedComposerHtmlRawString($strings,$tag){
    
    if(!is_array($strings)){
        return false;
    }
    
    $return=array();
    foreach ($strings as $key=>$string){
        $return[$key]['original']= $string;
        $string = str_replace('['.$tag.']','',$string);
        $string = str_replace('[/'.$tag.']','',$string);
        $string = base64_decode($string);
        $string = rawurldecode($string);//Si algo no funciona trata de cambiar rawurlencode po urlencode, etc... =)


        $string = replacedComposerRawFromTo($string);

        
        $string = rawurlencode($string);
        $string = base64_encode($string);
        $string = '['.$tag.']'.$string.'[/'.$tag.']';
        $return[$key]['modified'] = $string;
    }

    return $return;
}

function replacedComposerRawFromTo($string,$fromTo=false){

    $fromTo=array(
    //Datos de ejemplo, poned los vuestros!!!!
        'urlantigua'=>'urlnueva',

    );

    foreach ($fromTo as $from=>$to){
        $string = str_replace($from,$to,$string);
    }

    return $string;
}

add_action('init', 'replace_composer_html_raw_base64');

Donde pone ‘url_antigua’ lo sustituís por vuestra dirección antigua y en ‘urlnueva’ por la nueva que queréis sustituir. Ponéis el script en vuestro functions.php del tema hijo, lo guardáis y abrís el navegador escribiendo vuestrodominio/replace_composer_html_raw_base64 Y se ejecuta el script haciendo todo el trabajo por nosotros. ¿A que es alucinante?

¡Haced una copia de seguridad de la BBDD antes por favor!

Y no os olvidéis de quitar el script una vez lo hayáis usado (evitad el síndrome de diógenes).

Contadme, ¿alguna vez habéis tenido algún marrón cómo estos?

Añadir tiempo de entrega personalizado en WooCommerce

Tenía muchas ganas de escribir en el blog y es que estamos a tope de trabajo para tener todo listo en septiembre.

Hace unas cuantas semanas publiqué un post comentando que WooCommerce está muy verde para que sea una plataforma operativa y funcional ya que necesitamos instalar bastantes plugins adicionales.

La parte buena es el gran poder de personalización que tenemos los desarrolladores, la buena documentación que existe y las personas de la comunidad que hacen de WooCommerce un potente plugin traducido en multitud de idiomas. La semana pasada me comentaron la posibilidad de añadir a los productos un nuevo campo que fuese «tiempo de entrega» ya que algunos productos los deben de fabricar y otros los tienen en stock. Me dijeron, «mira a ver si hay algún plugin para hacer eso» y yo pensé, pero si es algo muy sencillo de hacer, para que vamos a instalar un plugin si con unas pocas líneas de código lo tenemos.

Custom Fields en WooCommerce

Es muy fácil añadir campos personalizados a nuestros productos de WooCommerce, en mi caso añadí el campo personalizado en la pestaña de inventario (Para añadirlo a la par que añaden el stock del producto), podemos añadirlo en el functions.php del tema hijo o crearnos nuestro propio plugin de personalizaciones.

// Mostramos el campo personalizado en el backends
add_action( 'woocommerce_product_options_stock_fields', 'my_entrega_personalizada_function' );
function my_entrega_personalizada_function() {
	global $woocommerce, $post;
	woocommerce_wp_textarea_input(
		array(
			'id'          => 'entrega_personalizada',
			'placeholder' => 'Tiempo entrega personalizado',
			'label'       => 'Tiempo de entrega personalizado',
			'description' => 'Añade el tiempo de entrega personalizado',
			'desc_tip'    => 'true',
		)
	);
}

// Guardamos el personalizado
add_action( 'woocommerce_process_product_meta', 'guardar_entrega_personalizada' );
function guardar_entrega_personalizada( $post_id ) {
	if ( 'no' === get_option( 'woocommerce_manage_stock' ) ) {
		return;
	}

	$entrega_personalizada = $_POST['entrega_personalizada'];
	if ( ! empty( $entrega_personalizada ) ) {
		update_post_meta( $post_id, 'entrega_personalizada', esc_html( $entrega_personalizada ) );
	}
}

Con esto, ya tenemos nuestro campo personalizado creado y guardado en el backend. Ahora falta la segunda parte, mostrarlo en el frontend.

Imagen WooCommerce creación de un custom field
El campo personalizado aparece en la edición del producto

Lo voy a mostrar en dos sitios, en el loop de la tienda y dentro del detalle de cada producto, creando una condición de solo mostrar el campo únicamente si lo hemos rellenado. Lo he añadido dentro de un div con una clase y un icono para que quede más bonito 🙂

//Lo mostramos en el loop de la tienda, justo debajo del título del producto
add_action( 'woocommerce_after_shop_loop_item_title', 'custom_field_display_below_title', 2 );
function custom_field_display_below_title(){
    global $product;

    // Get the custom field value
    $custom_field = get_post_meta( $product->get_id(), 'entrega_personalizada', true );

    // Display
    if( ! empty($custom_field) ){
        echo '<div class="info-envio"><p class="recuadro"><i class="qode_icon_font_awesome fa fa-clock-o qode_icon_element" style="color: #000000;"></i>' . esc_html( $custom_field ) . '</p></div>';

    }
}

//Lo mostramos justo debajo del precio del producto

add_action( 'woocommerce_single_product_summary', function() {
global $product;
	$notice = get_post_meta( $product->get_ID(), 'entrega_personalizada', true );

if (!empty($notice)){

	echo '<div class="info-envio"><p class="recuadro">ENTREGA <i class="qode_icon_font_awesome fa fa-clock-o qode_icon_element" style="color: #000000;"></i>' . esc_html( $notice ) . '</p></div>';

}}, 10);
Tienda de WooCommerce con campo personalizado
Así es cómo se ve en la tienda
Producto de WooCommerce con campo personalizado
Así en cómo se ve en la ficha del producto

Pues así de fácil tenemos nuestro propio campo personalizado, imaginaros la de cosas que podéis hacer para tunear vuestras tiendas.

WordPress es seguro, el usuario no

WordPress es seguro, el usuario NO

Esta semana me ha tocado lidiar con varias instalaciones de WordPress llenas de malware… Una auténtica locura. Y la culpa ha sido mía, por tener varios WordPress en el mismo sitio y olvidados. Algunos con contraseñas pobres y otros con varios plugins sin actualizar han sido una diana fácil.

Por eso, cómo recordatorio me gustaría recopilar en este post una serie de recomendaciones a tener en cuenta para proteger nuestras webs.

Actualiza

De verdad, hazme caso, ten tus plugins, tema y WordPress actualizado. Muchas de las actualizaciones corrigen vulnerabilidades, cómo consejo, antes de hacerlo, echa un vistazo al changelog para ver los cambios realizados, primero empieza por los plugins, luego el tema y por último el core de WordPress

Copias de seguridad

Siempre, antes de hacer nada, copia de seguridad, que no esté ubicada en el mismo servidor de la web (obviamente) y cada cierto tiempo comprobar que las copias las está realizando de manera correcta, para luego no llevarnos sorpresas.

Contraseñas robustas

Nada de números consecutivos y cuatro letras, ni os imagináis lo importante que es tener una buena contraseña. Es la primera barrera de seguridad de nuestro sitio. Acostúmbrate a cambiarlas con regularidad, tanto del usuario administrador de WordPress cómo de usuario FTP y usuarios de la BBDD. Elimina usuarios que no uses.

Doble auténtificación

Si aún quieres ir más allá, agrega una segunda autentificación para iniciar sesión en tu instalación de WordPress. puedes usar el plugin fantástico de Two Factor Authentication requiriendo la doble verificación mediante Google Authenticator o correo electrónico.

Busca un buen hosting, especializado en WordPress

Esto es la base de toda web, su ubicación y parte de la seguridad debe de residir en el propio servidor. Contrata un hosting de calidad especializado en WordPress, que te ofrezca garantías y tranquilidad. Hay muchos que te ofrecen alertas de seguridad y que te escanean las webs, es serio, si quieres dormir tranquilo invierte en un buen alojamiento.

Utiliza un buen plugin de seguridad

En el repositorio de WordPress vas a encontrar un montón de plugins para proteger nuestras instalaciones, yo voy a nombrarte 2 que son los que suelo usar. Por una parte Wordfence bastante potente con un scanner que te compara si algún archivo ha sufrido cambios (bastante útil para detectar malware) Además de tener un potente firewall, bloqueo de IPs, límite de intento de accesos etc…

Por otro lado está All In One WP Security, que es totalmente configurable con un medidor de seguridad a modo de guía. Este me gusta mucho por su personalización, eso si, tanto Wordfence como esto hay que configurarlos con mucho cuidado para no ser demasiado restrictivos, porque te puedes bloquear a ti mismo (Si, ya me ha pasado un par de veces y es muy gracioso).

Ocultar rutas

No regales información, oculta la mayor información posible, os voy a hablar de un plugin muy curioso pero a la vez algo peligroso que si no se configura bien puede llegar a romper nuestro WordPress. Se llama WP Hide & Security Enhancer que lo que te permite es cambiar las URL por defecto de WordPress con la intención de esconder que el sitio web está hecho con WordPress. Oculta archivos del nucleo, página de acceso, temas y rutas de los plugins de ser mostrados en el lado público sin cambiar ningún archivo ni directorio. Yo lo usé para un proyecto y la verdad que funciona muy bien. Utiliza técnicas de reescritura de URLs y filtros de WordPress para aplicar todas las funciones.

Eso si, os cuento que tuve un problema bastante serio usando este plugin junto a WPML, y es que al actualizarlo me petó todo, y lo solucioné desactivando este plugin y dejando las rutas como vienen por defecto. Aún estoy investigando el problema porque aparentemente si es compatible con WPML :/

Protege y usa el archivo .htaccess

El punto indica que es un archivo oculto, y es que es básico de cualquier instalación, contiene ajustes y rutas y es el primero que se carga, un fallo en el y pantallazo en blanco. Para eso, simplemente añade estas líneas de código dentro del propio archivo:

# Protege el archivo htaccess
<files .htaccess>
order allow,deny
deny from all
</files>

Protege el archivo wp-config.php

Otro archivo muy crítico de nuestra instalación de WordPress es el wp-config.php y es que en el está dirección de la BBDD, nombre usuario y contraseña. Datos muy sensibles y que debemos de cuidar. Para ello, en el archivo .htaccess añadiremos las siguientes líneas:

# proteger wp-config.php
<files wp-config.php>
order allow,deny
deny from all
</files>

Cuidado con los archivos adjuntos

Es muy común ver en una instalación de WordPress infectada, en la carpeta uploads, archivos .PHP cuando no deberían de estar ahí. Para evitar que suban extensiones de archivos que no tienen que ver nada con contenidos multimedia, en el .htaccess añadiremos estas líneas, en donde especificaremos las extensiones de archivos que permitiremos:

# seguridad de subida de archivos en carpeta uploads
<Files ~ ".*\..*">
	Order Allow,Deny
	Deny from all
</Files>
<FilesMatch "\.(jpg|jpeg|jpe|gif|png|bmp|tif|tiff|doc|pdf|rtf|xls|numbers|odt|pages|key|zip|rar)$">
	Order Deny,Allow
	Allow from all
</FilesMatch>

Esconde tu versión de WordPress

Entre menos información proporciones, mejor. Ocultar la versión que estás usando de WordPress en un dato menos que tendrá nuestro posible atacante. Esto se hace simplemente añadiendo esta línea a nuestro archivo functions.php del tema hijo (activo) o nuestro plugin de configuraciones (si es que tenemos uno):

remove_action ("wp_head", "wp_generator");

Desactivar el editor de plugins y temas

Desde el backend de WordPress podemos editar los archivos de plugins y temas directamente. Una forma rápida de editar el código si tenemos alguna necesidad, pero también es una forma de poner el WordPress en peligro. Además. desde la versión 4.9 introducieron el editor CodeMirror resaltado de código por colores, líneas de código, e incluso sugerencias de funciones y aviso de errores. Algo super útil, pero a la vez peligroso porque nos hace ser, digamos, vagos de ocultar la edición de plugins y temas. Mi recomendación, ocúltalo en el archivo wp-config.php:

define( 'DISALLOW_FILE_EDIT', true );

Vincula tu web a la Google Search Console (Antigua Webmaster Tools)

Esta potente herramienta de Google para administradores de web te informa en el caso de que Google haya detectado código malicioso en tu web. Una vez solucionado el problema, puedes solicitar desde aquí que Google vuelva a indexar tu web para quitar los posibles avisos.

WordPress es seguro, el usuario NO

Con esta frase me gustaría terminar, después de todo este tiempo te das cuenta que el culpable de que te hayan «hackeado» eres tu, por no haber hecho bien las cosas. Espero que os sirva de ayuda a modo de guía.

WordCamp Madrid 2019

Así vivimos la tercera edición de la WordCamp Madrid

Después de la fantástica WordCamp de Las Palmas de Gran Canaria ya había ganas de volver a disfrutar de estos apasionados y frikis eventos de WordPress, pero este no era una más, si no que el más grande de toda España hasta la fecha, con todos vosotros, la WordCamp Madrid 2019.

GRACIAS

A todos y cada uno que habéis formado parte de este evento, soys la hostia. A los organizadores y voluntarios, que os habéis estado dejando la piel para que todo saliese bien, con nada menos que 600 personas, que se dice pronto.

También un especial agradecimiento al grupo de parlanchines que desinteresadamente han ayudado a los ponentes con sus presentaciones, siento mucho no haber podido asistir el domingo a los ensayos, entre el trabajo y que vivo entre Bilbao y Cantabria de un sitio para otra me es muy dificil sacar tiempo 🙁 Gracias por vuestra mentoría, me sirvió mucho de ayuda!!!

Viernes 5, cena de ponentes

Menos mal que salimos tarde de Bilbao, y digo menos mal porque nos libramos de la que se lió en Somosierra con la nieve, no tuvieron la misma suerte la expedición de Irún que se quedaron 2 horas atrapados, un poco más y organizan alli la WordCamp Nordic

Con un poco de retraso pero logré llegar a la cena, una de las cosas que más me gustó es que fue tipo cocktel lo que te permite hablar con casi todo el mundo porque te puedes ir moviendo, a diferencia de estar en una mesa que hablas con los que tienes al lado sólo. Me encantó poder saludar y conocer a tanta gente. Sobre todo a Carla, después de todo lo que ha vivido este último año allí estaba, con una sonrisa enorme en el equipo de organización.

Sábado 6, conferencias

Llegó el día, nos fuimos corriendo para la Nave después de desayunar para recoger las acreditaciones. Estaba muy nerviosa, además por partida doble porque quedaba poco para dar mi ponencia y es que a las 10:00 de la mañana salían las entradas para el Desafío BestCycling que se celebra en Valencia (El mayor evento de ciclismo indoor del mundo), y las entradas se agotan en 5 minutos, ahí estuve hasta las diez dándole al F5, conseguí pillarlas y ya me tranquilicé un poco.

El programa de este año fue de los más variados y en diferentes formatos, ponencias en el auditorio, talleres y microcharlas de 10 minutos. Hasta los churros estuve por el Happiness Bar, un concepto nuevo de esta WordCamp en donde los asistentes podían preguntar o consultar sus dudas a los ponentes, tal vez hubiera estado bien haberle dado más visibilidad, cómo comenta Fernando en su post. Ya que las casi dos horas que estuve nadie se acercó.

Estaba tan nerviosa que casi no pude ir a ninguna charla antes que la mia, con muchas ganas de verlas en WordPress.tv. Me gustó mucho la de JuanKa porque la mía era un caso práctico aplicando los conceptos de la suya.

Custom Post Type y Custom Fields al poder

En principio la charla la había marcado para principiantes, desde un perfil de desarrollador de WordPress, pasado los días empecé a ver que igual era demasiado cañera porque era muy técnica, además sólo había 10 minutos, a ver cómo cuentas en 10 minutos un desarrollo que ha llevado más de dos meses. Prometo escribir un post detalladamente de cómo realizamos el proyecto. Mi propósito era poder mostrar que con WordPress se pueden hacer un montón de cosas, sin recurrir a plataformas externas. Aquí os dejo los slides para que le echéis un vistazo ->

CSI Madrid

La seguridad informática es algo que me preocupa mucho, y siempre que voy a las WordCamps asisto a las charlas sobre cyber-seguridad, en este caso Nestor nos enseño cómo pueden meter malware en un archivo .ICO, a que es alucinante.

Necesitábamos una pausa después de tanto código ofuscado 😉 Así que paramos para comer y nos hicimos la tradicional foto de grupo.

Raspberry Pi y WordPress

Si con las ponencias anteriores no os había sido suficiente para aprender todo lo que se puede hacer con WordPress vienen Paloma Monzón y Alicia Sánchez para explicarnos que podemos vincular una Raspberry Pi a un WordPress a través de la REST API, es flipante, tanto que me estoy pensando en comprarme un cacharrito de esos.

Migrando un portal en ASP.NET de 150.000 contenidos a WordPress

El título en si ya da miedo, pero Dámaso Velázquez nos enseñó una serie de herramientas para hacer todo este proceso mucho más sencillas, entre ellas el plugin WP ALL IMPORT haciendo un llamamiento a sus desarrolladores para que lo actualicen y lo mantengan al día, ya que ha detectado que al manejar mucha información se realentiza el sitio, su consejo, sólo tenerlo activo cuando se use. Me gustó mucho porque para mi proyecto usé el plugin inverso, WP ALL EXPORT de los mismos creadores.

Accesibilidad para la Web moderna

¿Cuántos de vosotros conocéis personas que sufran algún tipo de discapacidad? Así abría la charla Luis Doviso dándonos una lección de accesibilidad web. Nos sirvió para abrir los ojos y ver que casi ninguna web oficial cumple esos parámetros. Muchas ganas de aprender cómo hacer webs accesibles, os recomiendo el blog de M Carmen de Alba en donde hay un montón de artículos sobre usabilidad web.

WordPress y Google Tag Manager

Charla útil y muy práctica la de Carlos M. Díaz sobre Google Tag Manager, herramienta que hace poco he empezado a usar y en la que estoy algo perdida, pero gracias a la explicación de Carlos he podido entender algunos conceptos básicos.

12 cosas que debes hacer después de una WordCamp

Juan Hernando, también conocido cómo CiudadanoB, maestro de ceremonias dio el punto y final de este día repleto de conocimientos. Cumpliendo la lista de «tareas» que nos dejó.

Mesa de Debate y Birras

En las últimas WordCamps, ya es tradición cerrarlas con una mesa de debate, en este caso sobre el futuro de WordPress, en donde podemos ver diferentes puntos de vista.

Después nos fuimos todos a tomar unas cervezas de After Party, buen ambiente para charlar y seguir conociendo a gente.

Contributor Day

WordPress no sería WordPress sin toda la comunidad que hay detrás que hace que cada día esté presente en más sitios, en este día se organizan diferentes mesas de trabajo para colaborar.

La intro del Contributor fue épica a ritmo de WordPress VS Gutenberg, Elementor & ACF – A mi me gusta el WordPress

Traducción de WordPress 5.2

En la mesa de traducciones nos pusimos manos a la obra y acabamos traduciendo las nuevas cadenas de la próxima actualización de WordPress.

Y con mucha morriña, me volvía a Bilbao después de Esta pedazo de WordCamp. Habéis puesto el listón muy alto, a ver que hacemos ahora aquí después de todo lo que habéis hecho ;P

Gracias a todos los que habéis hecho posible este evento, os llevo en el corazón, nos vemos en la próxima.

WooCommerce está verde

WooCommerce está muy verde

Durante estos días me ha tocado desarrollar una tienda online con WooCommerce y paso tras paso he ido notando varias carencias que a mi parecer me parecen básicas para un software de comercio electrónico.

Cómo medida a esta carencia, existen infinidad de plugins (gratuitos y de pago) que ofrecen nuevas funcionalidades a nuestro ecommerce, pero al final acabas con una instalación de WordPress con más de 30 plugins para tener una tienda operativa y funcional.

Configurando las zonas de envío

Me pasó algo curioso configurando las zonas de envío, en mi caso tenía 2, España peninsular y por otro lado Baleares, Portugal y Francia (Madeira Azores, Córcega y Cerdeña estoy a la espera de confirmación si hace envíos (si, un desarrollador web necesita saber geografía política de los países)). Para ir metiendo las provincias tengo dos opciones, por códigos postales (una locura, un listado gigante de códigos postales) o ir añadiendo las provincias, me decanto por lo segundo.

Tengo un desplegable con todos los países y provincias/estados del mundo en el cual vuelvo a tener dos opciones, buscar en ese listado enorme o teclear la provincia y me van saliendo a medida que escribo, obviamente hago lo segundo. Hasta ahí todo bien, hasta que llego a Córdoba y veo que hay 2 Córdobas (España y Argentina) y en el listado no me especifica a que corresponde cada una. Así que les envío un tweet a los de WooCommerce a ver si saben algo, a lo que responden lo siguiente:

Buscar en el listado gigante

Genial, pero es que en ese listado están todos los países con sus respectivas provincias/estados y lo peor de todo, es que por ejemplo si voy escribiendo «espa…» podría salirme España con sus provincias, pero no busca España entre todo y solo muestra España. Vamos, o lo buscas en el listado dedicándole mucho tiempo y paciencia o lo echas a cara y cruz.

Mi consejo:

Primero os recomiendo configurar los países a donde váis a enviar, para luego en el formulario de zonas de envío, en el listado de países y demás, sólo os salgan a los sitios a dónde enviáis, porque si no es una locura.

WooCommerce por defecto no envía email al cliente cuando un pedido es cancelado o fallido

Esto me pareció bastante grave, porque por defecto no puedes enviar al cliente un email cuando el pedido ha sido cancelado o fallido, en ajustes de WooCommerce te permite más cuentas de correo pero no poner el email del cliente en cuestión.

Me puse a investigar y vi un plugin en el repositorio de WordPress que lo hacía, el problema, que lo han quitado del repositorio por violar nose qué norma y ya no está disponible para su descarga, a si que decidí ponerme por mi cuenta y lanzar mi propio plugin para este proósito:

El plugin es de lo más básico del mundo pero cumple su cometido, aparte de enviar un email al gestor de la tienda, también se lo envía al cliente cuándo se cancela o es fallido. Cómo decía antes, al final acabas con 40 plugins pero bueno es lo que hay, espero que más gente que necesite esta funcionalidad lo pueda solucionar con mi plugin lo podéis descargar aquí

PD: Ahora mi blog es más accesible, ya que he instalado POLLY de AWS que convierte el texto en audio 🙂

Así vivimos la WordCamp Las Palmas de Gran Canaria 2019

El pasado 9 de febrero se celebró la WordCamp Las Palmas de Gran Canaria 2019, y después de habérmela perdido el año pasado este tenía que ir si o si. Desde que pisé Canarias el año pasado estoy enamorada de esa tierra, el clima, su entorno, su comida… Lo tiene todo.

No escribía un resumen desde la WordCamp Bilbao 2018 a si que tengo muchas ganas de compartir la experiencia. Era mi primera vez en Gran Canaria y quería aprovechar el viaje al máximo para conocer la isla así que alquilamos un coche. Llegamos el viernes de madrugada y es que el avión en el que íbamos a ir tuvo un problema «técnico» y nos lo tuvieron que cambiar (menos mal :P).

Museo Elder Las Palmas de Gran Canaria
En la entrada del museo Elder, tomándome un leche y leche para coger energías.

El venue era el Museo Elder de Ciencia y Tecnología en Las Palmas de Gran Canaria, al lado del parque de Santa Catalina en donde ya estaban montando el tinglado para los carnavales. Una pasada de sitio porque además de asistir a la WordCamp pude ver el museo por dentro.

Había 3 tracks, 2 para ponencias y el tercero para talleres con duración de 1 hora. El programa era muy completo y como suele pasar es muy difícil decidirse a donde ir porque todas eran interesantes. He aprendido nuevas funcionalidades y conceptos, de los cuales ya había leído o oído hablar pero no había tenido la oportunidad de escuchar una explicación detallada con ejemplos. A continuación os pongo un pequeño «timeline» con tweets recopilados de las ponencias y talleres a los que asistí en la WordCamp Las Palmas de Gran Canaria 2019.

¡Sal del loop!, descubre «Headless WordPress»

Me pareció muy interesante esta charla porque David nos enseñó el potencial que tiene la API de WordPress que nos permite mediante llamadas obtener datos los cuales podremos procesar desde cualquier lenguaje de programación. Podemos crear un modelo en el que solo usamos el backend de WordPress para gestionar los contenidos y los mostramos a través de la API.

Por qué NO debes utilizar functions.php

Ya había oído hablar de los MU-PLUGINS, pero tampoco había profundizado en ello, pero con la charla de Dani entendí su funcionamiento y cómo debemos usarlo. Totalmente recomendable su charla ya que nos enseña de una manera muy práctica añadir funcionalidades a nuestro Wordpress de forma correcta.

WP-Cron: ni contigo, ni sin ti / WP-Cron

WP-CRON, ese gran desconocido en nuestra instalación de WordPress que se encarga de lanzar las tareas que queremos que se realicen de forma automática. Muy importante optimizar su ejecución si queremos optimizar nuestra web. Mejor que veáis su ponencia 🙂

5 técnicas para recuperar la originalidad en el diseño web

Muy necesaria esta ponencia, y es que cada vez se está perdiendo más la originalidad en el diseño web. mucha culpa tienen los temas y demás que hay actualmente en el mercado que nos «dictan» un diseño preestablecido. Hay que salir de nuestra zona de confort y probar cosas nuevas. Hay que añadirle valor añadido a lo que realizamos y diferenciarnos sobre el resto.

Comienza hoy tu negocio basado en WordPress

Roberto y Mercedes son todo un ejemplo de conocimiento y reciclaje. nos compartieron su experiencia para emprender un negocio con WordPress de una forma muy amena que nos hizo empatizar con ellos. Son un claro ejemplo de éxito profesional. Me encantó su puesta en escena y cercanía.

Flexbox y Grid: los mejores amigos de los maquetadores

Todas las personas que se dedican a maquetar webs deberían de ver esta ponencia. La de temas que hay llenos de divs y tablas que son un auténtico infierno. Gracias a Flex y Grid organizar nuestro contenido es facilísimo. Aprendí muchísimas cosas que quiero poner en práctica, cómo generar una pequeña plantilla con Flex y Grid y obtener los datos mediante la API de WordPress, eso si que sería WPO 😀

Tienda segura… ventas seguras

Internet está lleno de fraudes y estafas, justo ayer recibimos notificaciones de que se están recibiendo correos electrónicos en donde se notifica que un tercero está interesado en tu dominio .EU (que es mentira) y que si quieres protegerlo y registrarlo pagues más de 200€. Hay que andarse con mucho cuidado y tomar nota de los consejos que nos cuenta Tomás en su ponencia para detectar si una tienda online es falsa. Muy interesante la plataforma que ha creado junto con Luis https://fakeinet.com/ . Un directorio de tiendas falsas para ayudar a la gente a no ser engañada.

Taller de ciberseguridad… Muy bien, pero ¿cómo?

Néstor nos enseñó diferentes acciones para ayudar a proteger nuestros sitios webs. Cabe destacar que hoy en día es muy importante el uso de 2FA (doble autenticación) para evitar un posible «hackeo» de nuestro usuario. Mejor que veáis su taller porque nos enseña un montón de cosas

WordPress no necesita plugins de seguridad 

Seguimos con la seguridad, y es que la primera barrera frente a los ataques es nuestro servidor, así nos lo explicó Javier. Es muy importante estar en un servidor actualizado y con la última tecnología.

Cómo me ayudó WordPress a crear un negocio digital para viajar por el mundo

Última ponencia de la WordCamp y la que más energía e ilusión ha trasmitido, Vanesa es todo un ejemplo de emprendimiento y de lucha por lograr sus sueños. Ha convertido su pasión en su trabajo y le permite viajar por todo el mundo. Una auténtica nómada digital.

Me voy de Canarias con muchos objetivos en la mente y con ganas de volver 🙂 Estos eventos te permiten aparte de aprender poder compartir tus experiencias, conocer a gente con la que poder hablar en el mismo idioma y establecer sinergías aparte de hacer grandes amigos. Nos vemos en la próxima WordCamp 😉

Un agradecimiento en especial a todas las personas que han logrado que este evento fuera posible. Nos habéis hecho sentir como en casa.

PD: No todo fue WordPress, aprovechamos nuestra estancia es esta isla afortunada para darnos una vuelta e inmortalizar paisajes y lugares tan bonitos como este en La Garita:

exportación en Dolibarr

Dolibarr – Mostrar los impuestos locales en las exportaciones de la facturación

Es una verdadera locura adaptar los programas a las necesidades de los clientes, y más si hablamos de programas de facturación y contabilidad.

Cada país es distinto y dentro de cada país cada empresa un mundo, pero algo tan básico como exportar la facturación y no mostrar los impuestos locales es un problema. Si bien Dolibarr te permite configurar impuestos personalizamos (Ejemplo, IRPF) a la hora de generar un archivo de exportación no te muestra en el listado de campos disponibles los impuestos locales (LocalTax).FournisseurCada país es distinto y dentro de cada país cada empresa un mundo, pero algo tan básico como exportar la facturación y no mostrar los impuestos locales es un problema. Si bien Dolibarr te permite configurar impuestos personalizamos (Ejemplo, IRPF) a la hora de generar un archivo de exportación no te muestra en el listado de campos disponibles los impuestos locales (LocalTax).

Dolibarr tiene dos campos en la tabla de facturas (facture) referentes a los impuestos locales.

Se llaman localtax1 y localtax2, sin embargo no aparecen en el listado para la exportación de la facturación.

Dolibarr invoices
Documentación de Dolibarr estructura de la tabla «facture».

Si están en la BBDD, ¿por qué no es posible seleccionarlos para su exportación?

Revisando donde se realiza esta operación en Dolibarr, localizamos la clase modFacture (para facturas de clientes) en donde están los campos disponibles para la exportación y vemos que en los Arrays no están esos 2 campos añadidos.

htdocs/core/modules/modFacture.class.php

Solución, añadirlos al Array

Hay 3 Arrays con los campos disponibles para ser exportados

$this->export_fields_array
$this->export_TypeFields_array
$this->export_entities_array

Siguiendo la estructura podemos añadir en los arrays localtax1 y localtax2. (En mi caso solo estoy usando localtax2 que es en donde se almacena la retención IRPF) Realizar el mismo proceso si también queremos añadir esos campos para las facturas de proveedores, en el archivo dolibarr/htdocs/core/modules/modFournisseur.class.php

Dolibarr exportar facturas
Localización de los 3 Arrays

Una vez añadido los campos a los Array, guardamos y procedemos a hacer una nueva exportación y veremos que tendremos disponible los campos que hemos añadidos preparados para ser seleccionados y exportados junto a los demás.

Listado de los campos disponibles para la exportación, en mi caso llamé a localtax2 IRPF

Inconveniente de esta solución

EL principal inconveniente de modificar ese archivo es que si actualizamos Dolibarr, perderemos los cambios realizados y tendremos que añadir esos campos a los Arrays. Por eso, desde aquí solicitamos que esos campos se incluyan en el core de Dolibarr, ya que son dos campos de la tabla de facturación y si se están usando se necesita la opción de su exportación en los informes.

Os animo a formar parte del proyecto de Dolibarr en Github mejorando esta magnífica herramienta OpenSource.

WooCommerce – Reemplaza el rango de precio variable por el precio seleccionado

Después de haber estado meses ausente y haber sufrido un traslado de dominio y una migración de hosting vuelvo a estar online y con el nuevo editor de bloques Gutenberg. Aprovechando la mención os recomiendo el nuevo curso que ha sacado Fernando Tellado de Ayuda WordPress gratuito hasta el 31 de enero en donde a través de 50 lecciones hace un repaso a todo el editor de bloques que tanta controversia ha tenido dentro de la comunidad.

Repositorio de WordPress

Esta vez os presento mi primer plugin subido al repositorio de WordPress, relacionado con los productos con variaciones en WooCommerce. Comenzó con un problema que tenía en una tienda Online, si bien por defecto WooCommerce muestra el rango de precios para los productos variables (algo bastante lioso y la verdad es que yo lo quitaría) hay varios plugins en el repo que modifican eso y muestran el precio inferior.

La cuestión que con eso también causaba confusión, ya que al forzar mostrar siempre el de menor importe al cambiar en el seleccionable una variación más cara se quedaban fijo siempre el de menor importe y luego al lado del seleccionable el precio del producto actual.

WooCommerce - Reemplaza el rango de precio variable por el precio seleccionado

Se quedaban dos precios en pantalla, un verdadero problema.

Con este plugin se realizan dos cosas, primero por defecto siempre se mostrarán los precios de menor importe y una vez dentro del producto al seleccionar una opción en el menú desplegable, en el precio principal quedará reflejado siempre el coste del producto seleccionado, ocultando el precio que está al lado del seleccionable, para que o haya dos precios en un mismo producto.

Me parecía algo bastante útil y que seguro que a más que uno de habrá tenido que pasar. Por eso he preparado un pequeño plugin para que lo puedo instalar quien lo necesite. Además me vendrá genial para futuras ocasiones ya que soy propensa a olvidarme de las cosas que voy haciendo 😀

¿Qué os parece la gestión que hace WooCommerce para los productos con variaciones?

Personalmente creo que hay muchas cosas mejorables, además viendo el fallo detectado el otro día que fallaba para productos con más de 20 variaciones

Por cierto que no he dicho ni el nombre ni el link del plugin, se llama «WooCommerce – Replace the Variable Price range by the chosen variation price» y lo podéis descargar aquí

WooCommerce - Reemplaza el rango de precio variable por el precio seleccionado
WordCamp Bilbao 2018

Experiencia en la WordCamp Bilbao 2018

Este fin de semana se celebró la WordCamp Bilbao 2018 en donde nos reunimos todos los frikis de WordPress para hablar y compartir nuestras experiencias y batallas.

Éste año he querido poner mi granito de arena, ya que es la WordCamp de mi ciudad y quería echar una mano así que estuve por allí de voluntaria ayudando a los organizadores. Entre todos nos organizamos las tareas e hicimos un gran trabajo en equipo pudiendo disfrutar del evento.

El venue

Este año estuvimos en el Museo Marítimo de Bilbao, que no lo conocía por dentro (y eso que vivo en frente). El espacio estaba muy bien para el número de personas que éramos, con dos tracks, el A en un auditorio con un palco  VIP en la parte superior que permitía poder asistir a la ponencia y salir sin molestar a nadie, y el B con unos ventanales con unas vistas espectáculares a la ría. Lo que más me ha sorprendido es el equipo de grabación que ha habido en esta WordCamp y es que aparte de emitirlo en streaming iban subiendo los videos al momento y ya están disponibles para poder ver las ponencias, han hecho un trabajo de 10.

La RGPD, WP-CLI, colores y hola Dorothea

La RGPD es el tema de actualidad y el que más dolores de cabeza está dando y es que estamos «acojonados» porque no sabemos que va a pasar a partir del 25 de mayo. Os recomiendo que veáis la ponencia de Fernando Tellado ¡Te ha pillado el toro! Guía urgente para cumplir la RGPD en tu web en donde nos explica que acciones debemos implementar en nuestras webs para cumplir la nueva ley (La estoy escuchando mientras escribo este post).

Fernando García Rebolledo nos estuvo contando como usar WP-CLI como un profesional quitando el miedo a usar la terminal. Muy útil la herramienta para gestionar varias instalaciones de WordPress. Lo tengo en mi lista de cosas pendientes por probar.

Estuvimos hablando de la teoría del color con Mónica Martín en donde nos explicó como podemos crear paletas de colores para usar en los temas de WordPress. Nos enseñó un montón de herramientas que nos ayudan a la hora de combinar colores para que no se maten entre ellos. La verdad es que me sorprendió muchísimo porque no tenía ni idea de como se eligen los colores de una paleta a la hora de maquetar una web.

Javier Casares nos contó la extraña historia del plugin Hello Dolly (En mi ponencia en Madrid comento este plugin, que viene por defecto al instalar un WordPress) y lo utiliza de ejemplo para explicarnos como va el tema de gestión de versiones cuando subimos un plugin al repositorio de WordPress.

Networking y Birras

Lo mejor de estos eventos es el momento de hablar y compartir experiencias, se aprendé un montón y además se pueden crear sinergias muy interesantes. Tuvimos la suerte que hacía un día espectacular a si que pudimos estar en la calle tranquilamente tomándomos unas cervezas.

After Party

Fue un día duro así que decidimos quedarnos en casa viendo en la televisión anuncios de televisiones (https://diariodeunfriki.com/ no has escrito tu post aún ¬¬). En todas las after party me pasa una movida, y es que en esta llamó la munipa a casa porque «supuestamente» estábamos metiendo jaleo. No se puede ni respirar…

Contributor Day

Ahí estuvimos el domingo dándolo todo, estuve por la mesa de traducciones traduciendo algunas cadenas, y es que se aprendé mogollon traduciendo cadenas, como que por ejemplo el archivo humans.txt se usa para añadir el equipo de personas que está detrás de la empresa o web y Google ya lo está empezando a indexar.

Como siempre, lo mejor de las WordCamp es la comida, jajaja y este año hasta tuvimos puesto de perritos calientes. Fue una experiencia muy bonita y además tuve la oportunidad de poder echar una mano. Somos la mejor comunidad de Open Source del mundo!

Añadir reseñas de Google en WordPress

Aún con la resaca de la WordCamp Madrid 2018 escribo un nuevo post para enseñaros como he conseguido añadir la reseñas de Google en WordPress usando un plugin del repositorio. Después de estar mirando las valoraciones y en el foro de soporte vi que el plugin Google Reviews Widget era justo lo que necesitaba. Es freemium, quiere decir, que en el repo está la versión gratuita con algunas funcionalidades, pero si queremos tener todas tenemos que comprarlo, para lo que yo lo quería me era de sobra el free. Os cuento como funciona para configurarlo y poderlo añadir a una página a pesar de que en la versión gratis no trae esa opción.

Necesitamos una Google Places API server key

Una vez que tenemos el plugin instalado, para configurarlo primero tenemos que entrar en Google Place API y obtener una clave para Google Places API Web Service. En la web de Google vienen todas las instrucciones para generarla, una vez la tengamos tenemos que ir a Ajustes -> Google Reviews Widget y abrir la pestaña de Settings.

Google API Places Key

Debajo de Google API Places Key, en el INPUT añadimos la clave generada y establecemos el idioma

Configuramos el Widget para cargar las reseñas

Una vez tenemos la API podemos configurar el widget para mostrar las reseñas de Google en WordPress, para ello vamos a Widgets y añadimos el objeto Google Reviews Widget, si lo váis a añadir a un widget genial, lo ponéis en el sitio en donde lo queráis añadir, si lo váis a poner en una página o entrada, añadir el widget en un sitio que no sea visible de la web, para ello yo voy a usar el plugin Widget Shortcode que nos creará en Widgets un espacio que no es visible desde el frontend.

Si os resulta complicado, podéis comprar la licencia del plugin que viene la opción de generar un shortcode, de la otra forma, necesitamos el plugin de Widget Shortcode. (Nose si me habéis entendido, decírmelo en los comentarios :P)

Yo lo voy a añadir a una parte que no es visible. Desplegamos la configuración y la primera cosa que hay que rellenar es el Google Place ID del negocio de las reseñas que queráis añadir en la web. Para obtener el ID de vuestro negocio se puede hacer mediante la herramienta de Google PlaceID Finder que nos permite buscar en el mapa por el nombre de la empresa y nos mostrará su ID. Hay un problema, que si se acaba de añadir la empresa recientemente en Google My Business no aparece en dicho mapa (que fue mi caso, como no) Así que después de hacer una investigación por los grupos de soporte de Google di con una solución para obtener el ID del negocio.

JSON de Google al rescate

Gracias a la API de Google Maps podemos obtener el ID de cualquier ubicación de Google My business en formato JSON, algo bastante guay y útil para el desarrollo de aplicaciones con Google Maps, funciona de la siguiente manera:

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location="latitud","longitud"&radius=1000&keyword="nombre del negocio separado con + los espacios"&key="clave de la api de Google, creada en el paso anterior"

Lo que está en negrita lo sustituimos por nuestros datos (Quitando las comillas dobles) y estó nos devolverá un JSON en donde entre otros datos tendremos el ID, os pongo un ejemplo para que lo veáis mejor, por ejemplo, La Nave de Madrid, que está en Google By Business, vamos a obtener el ID, para ello la URL quedaría así:

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=40.347816,-3.696360&radius=1000&keyword=la+nave&key="nuestra API key de Google"

JSON que devuelve:

{
"html_attributions" : [],
"results" : [
{
"geometry" : {
"location" : {
"lat" : 40.3478149,
"lng" : -3.6963606
},
"viewport" : {
"northeast" : {
"lat" : 40.34961312989272,
"lng" : -3.694919920107278
},
"southwest" : {
"lat" : 40.34691347010727,
"lng" : -3.697619579892722
}
}
},
"icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/generic_business-71.png",
"id" : "f2303e6f039093a1115c438e9e8f61f3add33229",
"name" : "La Nave",
"opening_hours" : {
"open_now" : true,
"weekday_text" : []
},
"photos" : [
{
"height" : 3024,
"html_attributions" : [
"\u003ca href=\"https://maps.google.com/maps/contrib/116689621246882345984/photos\"\u003emaría ortiz\u003c/a\u003e"
],
"photo_reference" : "CmRaAAAAr_722NBb1iBbhYnXC9Pex_4aHYqztUjfg-6Q-11qbdCADdMHYHwEtctVNNAbDh5o5rdFxm6C6dUwRpEYNTgnJzlobexarurFeEOfMKKE7XVJ2Zns-Ihtb2tSEPtiOIPYEhAdxhKh8EbmawHfDXnvbjVaGhRx9EjZdOCd-mg55Rzopn07wWA5Cw",
"width" : 4032
}
],
"place_id" : "ChIJa8RkatwmQg0RNamu1Dmy4SM",
"rating" : 4.2,
"reference" : "CmRbAAAAOV5haydOMtkdH-B1OC45bFjOQNn1lGLiAJTBE9rFE0DZ02AX2zcIzANtkZLNZhkk24bjwne2Th71dPlqomLdOnPTMX-E9_lE3l7C9cU2Ax5d9QQnEALtmm9cm1FAwKyMEhAf6D8wfu-9-WKZMSEXDA0rGhQN5yFIuvZhFwexQdHRnPJuTLzckw",
"scope" : "GOOGLE",
"types" : [ "point_of_interest", "establishment" ],
"vicinity" : "Calle Cifuentes, 5, Madrid"
}
],
"status" : "OK"
}

Te todo ese tocho, el datoque necesitamos es el

Perfecto, ya tenemos el identificador para añadirlo en el widget, lo ponemos y mágia, ya tenemos las reseñas:

Reseñas Google Widget WordPress

Automáticamente recoge las últimas reseñas añadidas

Sólo tiene una pega, y es que Google solo devuelve 5 reseñas 🙁 Pero bueno, si quiere ver más reseñas, que entre al Google Maps, yo personalmente creo que con 5 es de sobra. La versión gratuita viene con pocas opciones de personalización pero si sabemos algo de CSS si que podemos cambiar los estilos.

Ahora solo falta coger el shortcode y añadirlo donde queramos, yo en este caso tengo el plugin Widget Shortcode instalado, por lo que al final del widget se ha autogenerado un shortcode que copiaré y pegaré en la página o post donde quiera añadirlo.

Shortcode widget google reseñas wordpress

El shortcode generado por el plugin Widget Shortcode

Y listo, ya tenemos las reseñas en WordPress 🙂 Ya os digo que si no os queréis complicar la vida podéis comprar el plugin y así tendréis todas sus funcionalidades Comprar Plugin

Me ha servido de ayuda y por eso lo comparto, espero que a vosotros también.