Los administradores de tiendas online creadas en Prestashop se encuentran con uno de los problemas heredados de versiones anteriores más comunes y que, inexplicablemente, los desarrolladores de este CMS para e-commerce aún no lo han solucionado en la versión 1.6.
Consiste en que el proceso de búsquedas no tiene en cuenta las referencias de las combinaciones de los productos. Es decir, si un producto tiene combinaciones (talla, modelo, color, etc.) y cada combinación tiene su propia referencia, el buscador no es capaz de encontrar dicha referencia. El motivo es que el sistema no indexa las referencias en las combinaciones de los productos.
Veamos un ejemplo para entenderlo mejor. Supongamos que vendemos una camiseta cuya referencia genérica es «CAMI-0000». Esta referencia, al ser la del producto, es indexada y, por lo tanto, puede ser encontrada a través del buscador de Prestashop. Hasta aquí, todo normal. Dicha camiseta tiene varias posibilidades de combinación según sea para hombre o mujer, según la talla y según el color. Así, por ejemplo, tendríamos que para la combinación «hombre, talla S y color azul» estaría la referencia «CAMI-0001», para la combinación «mujer, talla S y color rosa» estaría la referencia «CAMI-0002», y así sucesivamente con tantas combinaciones posibles, y para cada combinación su respectiva referencia.
Pues bien, para esas referencias «CAMI-0001», «CAMI-0002» y sucesivas, y que se corresponden con las posibles combinaciones del producto, Prestashop no es capaz de indexarlas y tenerlas en cuenta, y, por lo tanto, tampoco es capaz de encontrarlas en el proceso de búsqueda interno. Esto es un problema grave de funcionalidad, ya que los clientes nunca podrán encontrar directamente la combinación del producto deseado y deben «jugar» con las combinaciones del producto genérico hasta encontrar la combinación deseada. En el mundo del comercio electrónico, cada clic y segundo que tarda el usuario en hacer su compra es un paso atrás hacia la venta final.
Por suerte, este error se puede solucionar. Sí, como lo lees. Se puede dar solución al indexar referencias en combinaciones de productos en Prestashop. Veamos cómo hacerlo en las siguientes líneas de este artículo. Está comprobado que funciona para las versiones 1.5 y 1.6 de Prestashop.
Antes de nada, debemos entender el procedimiento «override» de Prestashop. Este procedimiento hace que podamos modificar el código fuente de cualquier clase, controlador o módulo de Prestashop sin perder el código fuente original. Esto es fundamental cuando se desea, por ejemplo, actualizar cualquier módulo o el propio Prestashop a nuevas versiones sin perder las modificaciones realizadas en el código.
El funcionamiento del procedimiento «override» es muy sencillo. En el directorio donde tienes instalado Prestashop encontrarás una carpeta llamada «override», que a su vez tiene dentro 3 carpetas: «classes», «controllers» y «modules». Después basta con crear en la carpeta que corresponda el fichero PHP que amplíe la funcionalidad a mejorar con el mismo nombre que el original. Lo que hace Prestashop es cargar primero el código que encuentre en el directorio «override» y después el original, así cualquier función que se llame igual en el override será sustituida por la original.
Si deseas obtener más información sobre el funcionamiento del «override» de Prestashop, aquí te dejo el enlace a la documentación oficial de Prestashop sobre el override. Comentar que es un método que yo empleo en mis desarrollos en Prestashop y que resulta muy efectivo y eficaz.
Volviendo al tema que nos ocupa, aquí te explico paso a paso lo que tienes que hacer para solucionar el error de Prestashop de no indexar referencias en combinaciones de productos. Vamos allá:
1) Accede a la carpeta raíz donde está instalado tu sitio web en Prestashop y entra en la carpeta «/override/classes/».
2) Crea un nuevo fichero que se llame «Search.php«. Si ya lo tienes creado previamente porque ya se amplió en su momento las funciones de búsqueda, no es necesario que lo crees.
3) Edita este fichero creado «Search.php» con el bloc de notas, por ejemplo, o con cualquier software de edición de código (Dreamweaver, PHPstorm, Aptana Studio, etc…).
4) Si el fichero lo has creado tú, estará vacío, así que copia el código que te pongo a continuación y pégalo en dicho fichero:
<?php class Search extends SearchCore { // Override: añadida funcionalidad que incluye la referencia de los atributos de un producto en las búsquedas de la tienda public static function getAttributes($db, $id_product, $id_lang) { if (!Combination::isFeatureActive()) return ''; $attributes = ''; $attributesArray = $db->executeS(' SELECT al.name, pa.reference FROM '._DB_PREFIX_.'product_attribute pa INNER JOIN '._DB_PREFIX_.'product_attribute_combination pac ON pa.id_product_attribute = pac.id_product_attribute INNER JOIN '._DB_PREFIX_.'attribute_lang al ON (pac.id_attribute = al.id_attribute AND al.id_lang = '.(int)$id_lang.') '.Shop::addSqlAssociation('product_attribute', 'pa').' WHERE pa.id_product = '.(int)$id_product); foreach ($attributesArray as $attribute) $attributes .= $attribute['name'] . ' ' . $attribute['reference']; return $attributes; } } ?>
Si el fichero ya estaba creado, copia sólo la parte de código que te pongo a continuación y pégalo en dicho fichero antes del cierre de la última llave «}»:
// Override: añadida funcionalidad que incluye la referencia de los atributos de un producto en las búsquedas de la tienda public static function getAttributes($db, $id_product, $id_lang) { if (!Combination::isFeatureActive()) return ''; $attributes = ''; $attributesArray = $db->executeS(' SELECT al.name, pa.reference FROM '._DB_PREFIX_.'product_attribute pa INNER JOIN '._DB_PREFIX_.'product_attribute_combination pac ON pa.id_product_attribute = pac.id_product_attribute INNER JOIN '._DB_PREFIX_.'attribute_lang al ON (pac.id_attribute = al.id_attribute AND al.id_lang = '.(int)$id_lang.') '.Shop::addSqlAssociation('product_attribute', 'pa').' WHERE pa.id_product = '.(int)$id_product); foreach ($attributesArray as $attribute) $attributes .= $attribute['name'] . ' ' . $attribute['reference']; return $attributes; }
5) Guarda el fichero «Search.php» que acabas de editar.
6) Sube el fichero por FTP a la misma ubicación de tu sitio web en Prestashop.
7) Accede a la zona de administración de tu sitio web en Prestashop y ves a la opción «Preferencias > Buscar«. En la sección «INDEXANDO» haz clic en «Reconstruir el índice completo» y espera a que acabe el proceso.
8) Fin. La modificación ya está aplicada.
Ahora sólo tienes que probar que funciona la búsqueda en tu sitio web. Busca una referencia de una combinación y verás como Prestashop encuentra el producto y te lo muestra en la página de resultados.
Llegados a este punto, si has seguido todos los pasos, este problema ya ha debido solucionarse en tu sitio web de Prestashop. Que este CMS no logre indexar referencias en combinaciones de productos es un fallo de funcionalidad que, por suerte y como has visto, es posible darle solución añadiendo un poco de código.
Si tienes problemas al aplicar la solución o si te ha sido de ayuda, deja tu comentario u opinión. Estaré encantado de leerte y atenderte.
Probado en 1.7.3.3, funciona perfecto. Muchas gracias
Hola.
Gracias por tu comentario. Me alegro que te haya funcionado.
Un saludo.
Muchas gracias Oscar por la aportación, lo he intentado probar en prestshop 1.7 y no consigo que funcione. Sabes si el codigo que has facilitado es compatible? Muchas gracias!
Hola Martín. Gracias por tu comentario.
Este código no está probado que funcione en la versión 1.7 de Prestashop, por lo que si te atreves puedes probar.
Si lo consigues, háznoslo saber.
Saludos.