Hola @marta_tienda30 y @pablo_bici,
tenéis razón, la clase Search en PrestaShop 1.7.x es complicada porque prioriza la eficiencia de la búsqueda indexada en ps_search_word y ps_search_index. Tu enfoque de modificar Search::find directamente para añadir un LEFT JOIN y una condición OR es una solución común, pero tiene las limitaciones de rendimiento y no aprovecha el índice.
El error o la falta de resultados al añadir OR pcd.referencia_interna LIKE ... probablemente se debe a que la consulta base ya filtra por los resultados del índice de búsqueda, y al añadir tu OR con LEFT JOIN, estás introduciendo una lógica que no siempre se combina bien con esa base. Además, el DISTINCT que pones al principio puede ser problemático junto a otras uniones que la función find ya añade internamente.
Una forma más limpia y compatible con 1.7.7.7 para que tu campo personalizado sea searchable, sin reescribir toda la lógica de Search::find, es asegurar que tu campo se añada al índice de búsqueda de PrestaShop. Esto se hace modificando la indexación. Sin embargo, si quieres una solución rápida para buscar en campos no indexados directamente en el find sin tocar el proceso de indexación, puedes modificar el WHERE de la consulta principal.
Para integrarlo en la lógica existente de Search::find sin reescribirlo, podrías hacer algo así. Ten en cuenta que esto es un override y requerirá reindexar la búsqueda para que surta efecto y limpiar la caché:
class Search extends SearchCore
{
public static function find($id_lang, $expr, $page_number = 1, $page_size = 10, $order_by = 'position', $order_way = 'desc', $ajax = false, $use_cookie = true)
{
// Ejecuta la lógica original de Search::find y obtiene la consulta SQL base.
// Luego, modificamos esa consulta para añadir nuestro campo.
// Esto es un ejemplo simplificado, la lógica real es más compleja.
$originalResult = parent::find($id_lang, $expr, $page_number, $page_size, $order_by, $order_way, $ajax, $use_cookie);
// Aquí deberías modificar la consulta SQL que se genera *dentro* de parent::find
// para incluir tu campo. Como Search::find es estática, y compleja,
Como ves, la modificación directa de Search::find para añadir un campo no indexado es un parche rápido pero no ideal. La complejidad de Search::find hace que inyectar un LEFT JOIN y un OR correctamente sea difícil sin romper la lógica existente.
Para una solución robusta que indexe tu campo referencia_interna y lo haga searchable de manera eficiente, lo ideal es usar un módulo que se encargue de extender el proceso de indexación de PrestaShop. Así tu campo personalizado se incluirá en el índice de búsqueda y las consultas serán rápidas y consistentes. Un módulo como la herramienta de buscar en el campo está diseñado específicamente para esto, evitando overrides complejos que pueden romperse con actualizaciones.