Principales lecciones aprendidas al optimizar WordPress (para el éxito del cliente)
Publicado: 2022-09-15¿Cuándo fue la última vez que tuviste un momento de nube nueve?
¿Pasando la escuela con gran éxito... o cuando tu novia/novio aceptó tu propuesta?
¡Tuve una nube nueve hace dos semanas! Hablaba en WordCamp Mumbai 2017, la WordCamp más grande de la India.
El tema era algo cercano a mi corazón y algo con lo que trato todos los días: lecciones aprendidas optimizando WordPress para el éxito del cliente.
Se trata de los problemas que enfrenté al tratar con grandes bases de datos de WordPress y cómo los abordé.
¿Qué me animó a hablar en WordCamp Mumbai?
Desarrollar un complemento de WordPress es una gran experiencia de aprendizaje. Tiene la oportunidad de ampliar un excelente marco, centrarse en escribir código que resuelva los problemas de los clientes y trabajar con excelentes miembros del equipo.
En StoreApps, los desarrolladores no solo escriben código, sino que también dan soporte a los clientes. Resolver las consultas de los clientes me ha dado algunas de las lecciones más importantes.
Así que todo eso es mi rutina diaria, y es bastante emocionante.
¿Pero sabes qué es más emocionante para mí? ¡Trabajar con grandes bases de datos y resolver problemas complejos de bases de datos!
Nuestros complementos son utilizados por más de 35000 usuarios. Y he visto muchos desafíos trabajando con grandes tiendas de WooCommerce y sitios populares de WordPress.
Afortunadamente, pude resolver estos desafíos y aprendí mucho.
Pero espere, al igual que yo, habría cientos de otros desarrolladores enfrentando problemas similares al trabajar con WordPress y WooCommerce.
Así que decidí compartir mis lecciones con otros.
¡Y qué mejor plataforma que una oportunidad de hablar en el WordCamp más grande de la India!
Los tres problemas que me dieron noches de insomnio (con soluciones y lecciones aprendidas de ellos)
Finalmente, aquí están los tres problemas de los que estaba hablando. Entonces, comencemos con ellos uno por uno.
Reduciendo el tiempo de carga de la página de 3 minutos a milisegundos...
Problema
Enfrenté una situación con el complemento Smart Coupons en el que una funcionalidad simple de mostrar cupones en las páginas cruciales de la tienda (es decir, carrito, pago y páginas de mi cuenta) detuvo el proceso de pago.
Smart Coupons es un complemento para crear y administrar cupones y certificados de regalo a granel para una tienda WooCommerce.
Solución
Ahora, el uso de WP Query habría resultado en múltiples JOIN , ya que mostrar los cupones disponibles para un usuario específico requiere la evaluación de múltiples metacondiciones.
Entonces, en lugar de usar la forma ideal de consultar la base de datos, es decir, WP Query, escribí consultas SQL personalizadas .
Además, en las consultas personalizadas, lo que hice fue:
- En lugar de verificar todas las metacondiciones en una sola consulta de MySQL, simplemente evalué la primera metacondición
- Después de eso, almacené la lista separada por comas de post_ids (ids de cupones) en la tabla de opciones
- Y luego, simplemente mapeo reduje el mismo conjunto de post_ids evaluando cada una de las otras metacondiciones
Esto lo hice hasta que obtuve un conjunto final de post_ids que debían mostrarse para el usuario específico.
Mejorando la solución
Esto resolvió los problemas de carga de la página. Sin embargo, para que la página se cargue en milisegundos, como sugirió nuestro amigo, tuve que redefinir el problema.
En lugar de mostrar todos los cupones para los que el usuario es elegible,
Establecí un límite para la cantidad de cupones que se mostrarían a los usuarios en las páginas de carrito y pago.
¿Cómo un error de tiempo de espera se convirtió en la característica más vendida de nuestro complemento?
Problema
Para procesar una actualización de base de datos muy grande, había escrito consultas personalizadas, ya que el uso de las funciones básicas de WordPress posiblemente se convertiría en una gran sobrecarga.
Ejemplo: si uno tuviera que reducir los precios de todos los productos en su tienda en un 40 %, simplemente necesita seleccionar 'Precio', 'disminuir en un 40 %' y presionar el botón de actualización. Esto es fácilmente posible utilizando nuestro complemento Smart Manager, diseñado para facilitar las actualizaciones masivas en sus tiendas WooCommerce.
Sin embargo, el proceso de actualización por lotes comenzó a estancarse y a generar errores de tiempo de espera cada vez que alguien intentaba actualizar 1k productos o toda la tienda a la vez .
Inicialmente, comencé a buscar la optimización de las consultas, pero eso no ayudó.
Mi situación era similar a la de un concursante de Takeshi's Castle. No importa cuánto lo intenté, seguí cayendo en el agua.
Solución
Se dice que a veces hay que salir del problema y observarlo a vista de pájaro para encontrar la causa exacta.
Hice lo mismo y descubrí que el problema real era
no a nivel de consulta sino a nivel de solicitud .
Entonces, lo que hice fue que, en lugar de una sola solicitud para hacer todas las actualizaciones, dividí lo mismo en varias llamadas AJAX sucesivas para hacer un lote más pequeño de actualizaciones y eliminar por completo los errores de tiempo de espera.
Mejorando la solución
Ahora, este enfoque de dividir una solicitud única en varias solicitudes AJAX más pequeñas no solo resolvió el error de tiempo de espera, sino que también mejoró la experiencia de usuario de la actualización por lotes .
Ahora el gerente de la tienda estaba siendo actualizado sobre el progreso de la actualización, lo que simplemente aumentó su confianza en el producto.
Además, el mismo enfoque ha permitido que Smart Manager maneje actualizaciones por lotes para la tienda WooCommerce de cualquier forma y tamaño y convirtió a Smart Manager en uno de los complementos más vendidos de StoreApps.
¿Cómo los entornos de alojamiento compartido nos obligaron a reescribir nuestro complemento?
Problema
Para cualquier complemento de informes, es muy importante proporcionar informes de estadísticas no solo precisos sino también rápidos. Ahora, obtener estadísticas de informes requería múltiples consultas que involucraban la unión de 2 tablas principales de WordPress, es decir, publicaciones y postmeta.
Como ya se vio anteriormente, los JOIN son muy caros .
En Smart Reporter (nuestra solución de informes para WooCommerce), mostramos 20 estadísticas de informes diferentes en una sola vista de página y también en la carga de la página.
Solución
Entonces, seguí el mismo enfoque que siguen la mayoría de las soluciones de informes, que fue crear una tabla de resumen, es decir, una tabla personalizada de estructura plana.
Esta tabla contendría un resumen de todos los datos requeridos por el complemento y, por lo tanto, eliminaría el uso de uniones y mejoraría los tiempos de carga de la página.
Además, para mantener actualizadas estas tablas de resumen, utilizamos acciones y filtros de WordPress.
Resumen de lecciones
- Siga las mejores prácticas tanto como sea posible
- Sin consultas en bucle
- Evite las uniones complejas grandes
- Haz más a nivel de MySQL que a nivel de PHP
- Profundice en el código
- Resumen/Personalizado/Tablas temporales
- Atención a UX – capacidad de respuesta, notificaciones…
- ¿Estás resolviendo el problema correcto?
¿Cuál es tu elección?
Estoy seguro de que ha lidiado con algunos problemas enormes y ha encontrado soluciones para ellos. Háganos saber al respecto en nuestra sección de comentarios a continuación. Sería realmente valioso para los lectores.