Ciber Geek >

Wordpress

WordPress Litespeed Cache and Shortcodes purging

Litespeed Cache is a really good description of what this plugin does, it’s a caching plugin for sites using Litespeed as a webserver.

At a SaaS I help run we have a couple of WordPress plugins that use shortcodes to show widgets with content, mostly used by news sites, and one of our customers uses Litespeed Cache as the caching solution to keep Google and readers happy.

Edge Side Includes + Litespeed Cache + shortcodes

Luckily the plugin allows an easy ways to update only the content of the shortcode and not the rest of the page. It’s so easy that you can do it just adding one word to the shortcode.

This is the shortcode for our plugin:

[downtack competition="liga-profesional-argentina-2022"]

This is the shortcode using Litespeed’s ESI Blocks:

 [esi downtack competition="liga-profesional-argentina-2022"] 

It’s too easy to be true. But there’s a catch, you also have to specify how long the Time To Live should be, if you don’t Litespeed Cache is gonna use the TTL specified in the “Default Public Cache TTL” option. But one of the solutions is so easy we didn’t have to modify our plugin’s code.

  [esi downtack competition="liga-profesional-argentina-2022" ttl="60"]  

There’s also the option to purge the shortcode programmatically, without the need to add the ttl param.

do_action( 'litespeed_purge', 'esi.downtack' );
method_exists( 'LiteSpeed_Cache_API', 'purge' ) && LiteSpeed_Cache_API::purge( 'esi.downtack' );

This last option is the one we choose as it gives us much more control over the purging of the content and helps the site run smoother as you can purge the cache whenever a change is made.

The shortcode is basically showing a HTML file downloaded from our server so it doesn’t make sense to purge the cache if that file wasn’t updated.

One thing to consider is that if Litespeed is disabled you should update the shortcodes and remove the esi keyword.

Compatibilidad y plugins en Themes Premium para WordPress

Hace unas semanas bajé los datos de algunos themes de WordPress disponibles en ThemeForest y cada tanto en mis ratos libres juego con los datos, como pueden ver en estos artículos anteriores. En el de hoy voy a jugar a ser dios y voy a decirles que tiene que tener su theme para que tengan muchas ventas. Y les voy a mentir, porque obviamente hay muchas variables que no estoy teniendo en cuenta, siendo una de las principales el diseño, el cual es subjetivo, difícil de clasificar/medir, y otras tantas cosas que lo hacen complejo, al menos para mis limitados conocimientos.

¿Pero entonces no tenés en cuenta el diseño?

¡No! Perdón. Bah, más que perdón, es culpa tuya y de tu subjetividad, maldito humano. Lo que si tengo en cuenta en esta ocasión son los plugins que incluye o con los que es compatible cada tema, en general dependiendo del plugin la compatibilidad no es un problema, pero para otros se requiere de algunos detalles para que todo marche sobre ruedas. Un poco el objetivo es identificar aquellos plugins para los que vale la pena invertir tiempo para asegurar la compatibilidad.

DISCLAIMER: En el artículo me refiero a compatibilidad, pero algunos de los plugins están incluidos con el theme directamente.

Empecemos a lo grande, de los 1800 themes de los que tengo datos, estos son los porcentajes de compatibilidad con diferentes plugins o librerías.


Esta tabla incluye todas las plantillas, incluso aquellas que llevaban menos de un día en Themeforest al momento de obtener los datos, por lo que se ve WPML y WooCommerce son 2 plugins populares que hay que considerar.

En la siguiente sección utilizo la información de las plantillas que llevan mas de 30 días en la tienda, ya que he notado que algunas tenían picos de ventas altos al ser publicados pero después decaían. Debería realizar un análisis mas exhaustivo para intentar determinar si se trata de gente que intenta “engañar al sistema” o son cuestiones naturales del mercado.

Datos de los themes con el menor índice de ventas

Ahora voy a por algo que puede brindar un poco mas de información, se tratan de las estadísticas de los últimos 500 y 100 themes cuando se los ordena por el “Índice de ventas”, el cual no es más que la cantidad de ventas que tiene un theme dividido por la cantidad de días que lleva la plantilla en la tienda desde su fecha de creación.

Remarco lo dicho, en las siguientes tablas se dejan de lado los themes que llevan menos de 30 días en la tienda.

Datos de los themes con el mayor índice de ventas

La siguiente tabla contiene a las plantillas con más de 30 días en la tienda que tienen la mayor cantidad de ventas por día (Índice de ventas).


Como se puede apreciar en la tabla, a medida que me acerco a los primeros puestos en este ranking ordenado por “Índice de ventas” se hace más claro que WooCommerce y WPML son importantes en cuanto a compatibilidad se refiere. Eso no implica que no puedan vender un theme que no sea compatible con ninguno de estos plugins, ya que hay que considerar que puede que la razón por la que los themes compatibles con ambos tengan mas ventas esté mas relacionada con el tiempo que le dedica el creador a desarrollar la plantilla, que con la compatibilidad en si.

Una visión global de los plugins y las ventas

Lo siguiente es comparar las plantillas que encabezan la tabla, las que se encuentran al final y el promedio. El “Top 100” se corresponde con los 100 themes con el mayor índice de ventas, y el “Last 100” con los últimos 100 themes ordenados por el mismo índice. Tengan en cuenta que para estos rankings utilicé solo los themes que llevaban mas de 30 días en la tienda, debido a que encontré algunas inconsistencias en el ranking al tomar una muestra unos días después.


Viendo la tabla anterior se hace aparente que la compatibilidad con Woocommerce y WPML es un factor importante a considerar cuando se desarrolla y diseña un theme con el objetivo de venderlo en masa, pero ¿Vale la pena?

Para saber le consulté a Nico Andrade, quien vende themes en Themeforest y está acostumbrado al proceso de hacer una plantilla compatible con Woocomerce y WPML.

Palabras de alguien que sabe:

Hacer un Theme compatible tanto con Woocommerce como con WPML diría que 1 día cada uno.
WPML sin dudas es mas rápido.

Woocommerce puede tardar mas si queres hacer un Shop con un layout distinto en front end. Pero si solo queres hacerlo compatible como en la mayoría de los casos, tardas 1 día a lo sumo 2.

Woocommerce es sin dudas el plugin de ecommerce más popular para WordPress, y considerando el crecimiento que ha tenido el comercio electrónico, tanto en consumidores como en cantidad de vendedores, sin dudas es una alternativa válida. WPML, que es un plugin para traducción, es importante cuando se espera vender en tiendas con usuarios de todo el mundo, y porque también es un plugin popular en su rubro. Nada nuevo bajo el sol.

OK ¿Cómo digiero todo esto?

Acá no hubo ningún avance científico, lo que se puede rescatar es que Woocommerce y WPML son dos plugins que es interesante tener en cuenta cuando se hace un theme premium para venta masiva, si hacen algo a medida para algún cliente serán ustedes quienes deban evaluar lo que éste requiere.

 

Un breve resumen del mercado de plantillas de WordPress de ThemeForest

Nota: A lo largo del post las palabras theme y plantilla se usan como sinónimos.

Hacer plantillas para WordPress puede ser un negocio lucrativo ya que el CMS, aunque tenga sus críticos, se está estableciendo casi como un estándar, en gran parte debido a su facilidad de uso y a su panel de administración que es muy amigable con los usuarios. Otro de los motivos es la gran cantidad de plantillas y plugins, y no me estoy refiriendo solo a los pagos, sino que la calidad de los themes y plugins gratis es también excelente.

Una radiografía de ThemeForest

Para investigar un poco el mercado de las plantillas premium para WordPress decidí ver un poco los números de ThemeForest, por lo que recolecte información sobre los temas ahí disponibles. Los datos fueron obtenidos el día 14 de marzo de 2015 desde la siguiente URL: themeforest.net/category/wordpress

En total obtuve 1800 plantillas existentes para WordPress en la tienda en cuestión, que sumaban un total de 470766 ventas, y considerando el precio actual de cada plantilla, sumaban un total de U$S 24673886, sí, esos son 24 millones de dólares.

Los precios de las plantillas oscilan entre los 33 y los 63 dólares. con un promedio de 49,92 para cada plantilla, y una moda de 58 dólares.

La cantidad de ventas varia bastante, al momento del relevamiento había 14 plantillas sin ventas, pero hay que considerar que éste dato tiene mas valor si se relaciona la cantidad de ventas con el tiempo que lleva disponible en la tienda una plantilla, algo que queda para un próximo artículo mas profundo, después de todo esto era una radiografía, no un análisis de sangre.

El promedio de ventas de una plantilla es de 261.53, con el mínimo en 0 (cero) y el máximo en 8545, que se corresponde al theme llamado BeTheme, el cual está en la tienda desde el 21 de mayo de 2014.

Un intento de infografía.

wordpress themeforest

Me da vergüenza llamarle infografía a esta “cosa”

Los números de las 10 plantillas de WordPress más vendidas *

* Según los datos de ThemeForest.

Esta es la parte BuzzFeed del post (?), resulta que los 10 temas más vendidos son los siguientes:

  1. BeTheme – Responsive Multi-Purpose WordPress Theme
  2. Story – Creative Responsive Multi-Purpose Theme
  3. Stockholm – A Genuinely Multi-Concept Theme
  4. Hemlock – A Responsive WordPress Blog Theme
  5. ROSA – An Exquisite Restaurant WordPress Theme
  6. SEO WP – Social Media and Digital Marketing Agency
  7. Hazel – Multi-Concept Creative WordPress Theme
  8. BuzzBlog – Clean & Personal WordPress Blog Theme
  9. BuildPress – Construction Business WP Theme
  10. Lobo – Portfolio for Freelancers & Agencies

Ojo, este ranking está basado solo en numero de ventas, por lo que se ven favorecidos los que llevan mas tiempo en ThemeForest. Si tomamos estas 10 plantillas y las reordenamos por la cantidad de ventas por día, se obtiene la siguiente lista.

  1. Stockholm – A Genuinely Multi-Concept Theme
  2. BeTheme – Responsive Multi-Purpose WordPress Theme
  3. BuildPress – Construction Business WP Theme
  4. Story – Creative Responsive Multi-Purpose Theme
  5. Hemlock – A Responsive WordPress Blog Theme
  6. SEO WP – Social Media and Digital Marketing Agency
  7. Hazel – Multi-Concept Creative WordPress Theme
  8. ROSA – An Exquisite Restaurant WordPress Theme
  9. BuzzBlog – Clean & Personal WordPress Blog Theme
  10. Lobo – Portfolio for Freelancers & Agencies

Las 10 plantillas mas vendidas suman un total de 42910 ventas, lo que significa un 9,11% del total de ventas. Y en cuanto a dinero suman U$2332390, equivalente al 9,45% del total de ventas en dinero.

Por último, un poco de datos duros.

En el próximo articulo voy a intentar profundizar un poco más en estos datos, y acepto sugerencias de otras tiendas de las cuales obtener información.

2 formas poco ortodoxas de cambiar la contraseña de WordPress

Si pueden hacer mediante la función de recordar contraseña, listo, no busquen mas, utilicen esa opcion. El tema es que a veces no se puede, tal vez hay algo mal configurado, o no queremos que el cliente se entere, por lo que enviarle un mail no es una opción (no sean boludos y envíenselo igual).

Restaurar la contraseña de WordPress con acceso mediante FTP

Para cambiar la contraseña si tienen acceso mediante FTP, o como sea que tengan acceso al archivo “functions.php” de la plantilla que están utilizando, pueden añadir el siguiente código para realizar el cambio de contraseña.

if($_GET['parametroprivado']){
var_dump(get_users(array( 'fields' => array( 'display_name', 'ID'))));
}

if($_GET['nuevapassword'] && $_GET['idusuario']){
wp_set_password( $_GET['nuevapassword'], $_GET['idusuario'] );
}

¿Qué te fumaste, pibe? ¡Nada, lo juro! Ahora les explico el porque de esos parámetros locos, como pista les cuento que es pura paranoia.

La idea del script anterior es la siguiente, al añadir esas lineas dentro de las etiquetas <?php ?> en su archivo “functions.php”, lo que hace es mostrar los usuarios y sus respectivas IDs, pero solamente si la URL tiene el parámetro “parametroprivado“, de otro modo estarían largando cosas al mundo exterior, y si bien no representa un problema de seguridad tan grave, al menos no en éste caso que solo estamos mostrando la ID y el nombre de usuario, si puede resultar feo para los usuarios que van a cargar una pagina y se van a encontrar con un pedazo de código PHP listando sus usuarios.

¿Para que necesito la ID y el nombre de usuario?

La ID es porque la necesitan pasar como parámetro en el paso 2, y el nombre es para saber que ID se corresponde con cada usuario.

Para ver el listado su URL deberia quedar mas o menos así.

http://susitio.com/?parametroprivado=1

Cambiar la contraseña

Supongamos que hicieron el paso anterior y ya vieron cual era la ID del usuario al que le quieren cambiar o poner una nueva contraseña (sé que alguien puede haber borrado sin querer un campo en la base de datos).

Ahora para realizar el cambio van a tener que acceder a la siguiente URL, y añadir como parametros la ID del usuario y la nueva contraseña.

http://susitio.com/?nuevapassword=123456&idusuario=2

Donde nuevapassword es la nueva contraseña, e idusuario es la ID que vieron anteriormente.

Y bueno, después de que cargue dicha URL la contraseña se va a ser la que pasaron como parámetro.

Restaurar la contraseña de WordPress con acceso la base de datos

La otra forma es hacerlo mediante la base de datos, por ejemplo con PHPMyAdmin pueden acceder a la base de datos donde está instalado WordPress, ir a la tabla “wp_users” y buscar el campo “user_pass” del usuario al que le quieren modificar la contraseña, en dicho campo deben ingresar el hash MD5 de la contraseña, para hacerlo pueden usar alguno de los servicios para generar estos hashes.

Así se vería la tabla luego de que le ingresan la contraseña hasheada, específicamente el campo “user_pass” es el que tiene esos “códigos raros”.

wodpress contraseña md5

MD5 “común”

Un detalle es que WordPress soporta MD5 por cuestiones de retrocompatibilidad, pero cuando detecta que una contraseña esta hasheada utilizando este algoritmo, la “re-hashea” utilizando algo un poco mas robusto, por lo que si luego de iniciar sesión vuelven a ingresar, van a ver que el valor en el campo “user_pass” cambió.

wordpress contraseña hash

Contraseña “re-hasheada” por WordPress

Magia, si tienen consultas dejen un comentario e intentaré ayudarlos.

 

ORDER BY avanzado para loops con WordPress (usando WP_Query)

Todo en WordPress es sencillo, hasta que empezamos a hacer cosas mas especificas, y no es porque no tengamos las herramientas para hacerlo, sino porque muchas veces no las conocemos y terminamos escribiendo algún código ninja para salir del paso, y no digo que esté mal, pero en incontables ocasiones terminamos reinventando la rueda, y no de la mejor manera.

reinventar la rueda

Reinventando la rueda

Uno de éstos casos es cuando usamos la clase WP_Query para crear loops customizados, o como deseen llamarlos. En ésta ocasión la idea es ahondar sobre el orden de los posts que se obtienen en el Loop.

WP_Query orderby

En éste ejemplo usamos el parámetro ORDER BY, y elegimos los parámetros “author” y “title”, o sea, ordenamos primero por autor, y si hay 2 posts que tienen el mismo autor, entonces el titulo es el que “decide” el orden.

$args = array( 'orderby' => 'author title', 'order' => 'DESC' );

$query = new WP_Query($args);

El resultado de ésta query es el siguiente:

SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  WHERE 1=1  AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish')  ORDER BY wp_posts.post_author,wp_posts.post_title DESC LIMIT 0, 10

Como ven, en la query generada vemos que se utilizan las columnas “post_author” y “post_title” en el ORDER BY, ésto tiene algunas limitaciones, como por ejemplo, que no se puede ordenar en forma ascendente en una columna y descendente en la otra.

Además, existen casos en lo que se requiere ordenar por día y por otra columna, por autor, por dar un ejemplo, en ése caso hay un problema, si usamos el “orderby” con el parámetro “date”, el segundo parámetro no tendría sentido (en la mayoría de los casos), ya que el parámetro “date” se corresponde con la fecha del post, que tiene incluido la hora, minutos y segundos, por lo tanto es raro que 2 posts tengan la misma fecha, aunque hay casos en los que sí, como cuando los posts fueron migrados a WordPress y los datos de la fecha estaban incompletos.

Filtro posts_orderby

Con el filtro “posts_orderby” lo que se logra es modificar la parte del ORDER_BY de la query que genera WP_Query, su uso es muy sencillo.

add_filter('posts_orderby', 'posts_orderby');

function posts_orderby($orderby_for_query) {
$orderby_for_query = "LEFT(wp_posts.post_date, 10) DESC, wp_posts.post_title ASC";
return $orderby_for_query;
}

$args = ' ';
$the_query = new WP_Query($args);
var_dump($the_query->request);

El resultado del “var_dump” es el siguiente.

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') ORDER BY LEFT(wp_posts.post_date, 10) DESC, wp_posts.post_title ASC LIMIT 0, 10

Como ven, el filtro modificó la parte del ORDER_BY con lo que añadimos en la funcion “posts_orderby”. La función LEFT, es una función de MySQL, lo que hace es obtener una subcadena de una cadena, en éste caso la idea es reducir la columna “post_date” para obtener solo la parte del año, mes y día, de ésa forma se logra orden por día, y por el otro atributo que se desee.

Si tienen varias queries, pueden “remover el filtro”, para evitar que afecte a otros loops.

remove_filter( 'posts_orderby', 'posts_orderby' );

Lo ideal, es llamar a ésta función después de crear la query.

Como aclaración, ésto también funciona en las queries por defecto de WordPress (en las que no es necesario crear una instancia de WP_Query).