BuddyPress Global Search da error en algunas búsquedas: cómo solucionarlo con código
Hola, amigos de Piensa para Crear. 👋
Si tienes una comunidad en WordPress con BuddyPress, bbPress o WooCommerce, seguramente conoces BuddyPress Global Search. Es un plugin gratuito que integra un buscador global en tu red social, permitiendo encontrar usuarios, grupos, foros y productos desde un solo lugar.
Es una herramienta excelente. Pero como todo plugin, a veces da problemas. Y hay uno en particular que es muy frustrante: al buscar ciertas palabras, la búsqueda devuelve un error en lugar de resultados.
En este post te explico cómo diagnosticar ese problema con Query Monitor y cómo solucionarlo modificando el código del plugin.
🧠 El problema: error en búsquedas específicas
Síntoma: Algunas búsquedas funcionan perfectamente. Otras —con palabras específicas— devuelven un error de cualquier tipo: página en blanco, error de PHP, mensaje de error genérico.
Lo extraño: El problema no es consistente. La misma palabra puede fallar en un momento y funcionar en otro. O fallar solo cuando se combina con ciertos filtros.
La causa más común: Un error de código en el plugin, específicamente en la forma en que maneja los resultados de búsqueda cuando un elemento no tiene HTML generado.
🔍 Paso 1: Diagnosticar con Query Monitor
Query Monitor es un plugin gratuito de WordPress que te muestra errores de PHP, consultas lentas, hooks y mucho más. Es la herramienta perfecta para diagnosticar este tipo de problemas.
Cómo usarlo
Instala y activa Query Monitor desde Plugins → Añadir nuevo.
Reproduce el error: Haz la búsqueda que falla.
Revisa el panel de Query Monitor: Aparecerá en la barra superior del admin (o como widget en el front-end, según configuración).
Busca la pestaña "PHP Errors" o "Errors": Ahí verás el error exacto y la línea de código que lo está causando.
Apunta la ruta del archivo y la línea: Por ejemplo,
wp-content/plugins/buddypress-global-search/includes/search-types/class.BBoss_Global_Search_Type.phplínea 99-107.
En nuestro caso, el problema estaba en la función get_html() de la clase BBoss_Global_Search_Type, en las líneas 99-107.
📄 Paso 2: El código problemático
Este es el código original que causa el error:
public function get_html( $itemid, $template_type='' ){ if( !$this->search_results['html_generated'] ){ $this->generate_html( $template_type ); $this->search_results['html_generated'] = true;//do once only } return isset( $this->search_results['items'][$itemid] ) ? @$this->search_results['items'][$itemid]['html'] : ''; }
🔍 ¿Qué hace este código?
Comprueba si el HTML ya se generó. Si no, lo genera.
Marca
html_generatedcomotruepara no regenerarlo.Devuelve el HTML del ítem si existe, o una cadena vacía si no.
⚠️ ¿Dónde está el error?
El problema está en la última línea:
return isset( $this->search_results['items'][$itemid] ) ? @$this->search_results['items'][$itemid]['html'] : '';
El operador @ se usa para suprimir errores en PHP. Se pone antes de una expresión para que, si esa expresión genera un error o advertencia, no se muestre.
Pero en este caso, el @ está mal aplicado:
El
@está antes de$this->search_results['items'][$itemid]['html'].Si
['html']no existe en el array, PHP genera un error (o advertencia) por acceder a un índice indefinido.El
@suprime ese error... pero en versiones modernas de PHP (7.4+, 8.x), suprimir errores no siempre funciona o genera comportamientos inesperados.Además, el
@también puede suprimir errores legítimos que necesitas ver para diagnosticar.
Resultado: En lugar de mostrar un error claro, la búsqueda falla silenciosamente o devuelve un error genérico.
✅ Paso 3: La solución
Reemplaza el código problemático por este:
public function get_html( $itemid, $template_type='' ){ if( !$this->search_results['html_generated'] ){ $this->generate_html( $template_type ); $this->search_results['html_generated'] = true;//do once only } return isset( $this->search_results['items'][$itemid]['html'] ) ? $this->search_results['items'][$itemid]['html'] : ''; }
🔍 ¿Qué cambió?
Antes:
return isset( $this->search_results['items'][$itemid] ) ? @$this->search_results['items'][$itemid]['html'] : '';
Después:
return isset( $this->search_results['items'][$itemid]['html'] ) ? $this->search_results['items'][$itemid]['html'] : '';
Los dos cambios son:
Se añadió
['html']dentro delisset():Antes:
isset( $this->search_results['items'][$itemid] )Después:
isset( $this->search_results['items'][$itemid]['html'] )¿Por qué? Ahora comprueba si el índice
htmlexiste, no solo si el ítem existe. Esto evita el error cuando un ítem no tiene HTML generado.
Se eliminó el
@antes de$this:Antes:
@$this->search_results['items'][$itemid]['html']Después:
$this->search_results['items'][$itemid]['html']¿Por qué? Ya no es necesario suprimir errores, porque el
isset()ahora comprueba correctamente que el índicehtmlexista antes de acceder a él.
Resultado: La búsqueda devuelve una cadena vacía cuando no hay HTML, en lugar de lanzar un error. El problema se soluciona.
📁 Paso 4: Cómo aplicar el cambio correctamente
⚠️ Advertencia importante
Nunca edites los archivos de un plugin directamente sin tomar precauciones. Si el plugin se actualiza, perderás los cambios.
Opciones para aplicar el cambio:
Opción A: Editar el archivo directamente (temporal)
Accede a los archivos de tu WordPress por FTP o desde el administrador de archivos de tu hosting.
Ve a:
wp-content/plugins/buddypress-global-search/includes/search-types/class.BBoss_Global_Search_Type.phpAbre el archivo con un editor de texto (Notepad++, VS Code, etc.).
Busca las líneas 99-107 (o busca la función
get_html).Reemplaza el código problemático por la versión corregida.
Guarda el archivo.
⚠️ Advertencia: Cada vez que actualices el plugin, este cambio se perderá. Tendrás que volver a aplicarlo.
Opción B: Usar un plugin de snippets (recomendado)
Si quieres que el cambio persista incluso después de actualizar el plugin, puedes usar un mu-plugin o un plugin de snippets como Code Snippets.
Con Code Snippets:
Instala y activa Code Snippets.
Ve a Snippets → Add New.
Pega el siguiente código:
add_action( 'plugins_loaded', function() { // Verifica que la clase exista antes de modificarla if ( class_exists( 'BBoss_Global_Search_Type' ) ) { // Aquí no puedes sobrescribir el método directamente, // pero puedes usar un filtro si el plugin lo ofrece. // Si no, la opción es editar el archivo directamente. } });
⚠️ Limitación: Si el plugin no ofrece un filtro para modificar get_html(), no puedes sobrescribir el método desde un snippet. La única opción es editar el archivo directamente (Opción A) o crear un fork del plugin.
Opción C: Reportar el bug al desarrollador
La mejor solución a largo plazo es reportar el bug al equipo de BuddyPress Global Search para que lo corrijan en una futura actualización.
¿Dónde reportarlo?
Foro de soporte del plugin en WordPress.org.
Repositorio de GitHub del plugin (si existe).
Foro de BuddyPress.
Incluye:
Descripción del problema.
Pasos para reproducirlo.
El error exacto de Query Monitor.
El código problemático y la solución propuesta.
🧪 Paso 5: Verificar que funciona
Después de aplicar el cambio:
Limpia la caché de tu sitio (y de tu navegador).
Reproduce la búsqueda que antes fallaba.
Verifica que ahora devuelve resultados en lugar de un error.
Prueba con varias palabras para asegurarte de que no hay otros errores.
⚠️ Consideraciones importantes
1. Haz backup antes de editar
Siempre haz un backup de tu sitio (archivos y base de datos) antes de editar archivos de plugins. Si algo sale mal, puedes restaurar.
2. Usa un entorno de staging
Si tu hosting lo permite, prueba el cambio en un entorno de staging antes de aplicarlo en producción.
3. Documenta el cambio
Anota qué archivo editaste, qué línea y qué cambiaste. Así, cuando actualices el plugin, sabrás qué volver a aplicar.
4. Compatibilidad con versiones de PHP
Este error es más común en PHP 7.4+ y PHP 8.x, porque el manejo de errores cambió. En versiones antiguas de PHP, el @ suprimía el error y la búsqueda seguía funcionando (mal, pero funcionaba). En PHP moderno, el error se propaga.
5. Alternativas si no quieres editar código
Si no te sientes cómodo editando archivos:
Reporta el bug al desarrollador y espera una actualización.
Usa otro plugin de búsqueda como SearchWP o Relevanssi.
Contrata a un desarrollador para que aplique el cambio.
🎯 Conclusión: un bug común con solución simple
BuddyPress Global Search es un plugin excelente, pero este bug en la función get_html() puede causar errores frustrantes en las búsquedas. La solución es una línea de código: añadir ['html'] al isset() y eliminar el @.
Resumen del proceso:
Diagnostica con Query Monitor.
Identifica el archivo y la línea.
Aplica el cambio (editar archivo o esperar actualización).
Verifica que funciona.
Reporta el bug al desarrollador.
💬 ¿Necesitas ayuda para diagnosticar errores en tu WordPress o solucionar problemas con plugins de BuddyPress?
En Piensa para Crear ofrecemos servicios de diagnóstico, desarrollo y soporte para comunidades WordPress.
Contáctanos aquí y hablemos.
❓ Preguntas frecuentes
¿Qué es Query Monitor?
Es un plugin gratuito de WordPress que muestra errores de PHP, consultas lentas, hooks y más. Es la mejor herramienta para diagnosticar problemas.
¿Por qué el código original falla?
Porque el isset() solo comprueba si el ítem existe, no si el índice html existe. Y el @ suprime errores pero no soluciona el problema de fondo.
¿Qué hace el @ en PHP?
Suprime errores y advertencias. Se usa para evitar que un error se muestre, pero no es una buena práctica en producción.
¿Dónde está el archivo que debo editar?
En wp-content/plugins/buddypress-global-search/includes/search-types/class.BBoss_Global_Search_Type.php, líneas 99-107 (aproximadamente).
¿El cambio se pierde al actualizar el plugin?
Sí, si editas el archivo directamente. Por eso es importante documentar el cambio o reportar el bug al desarrollador.
¿Puedo aplicar el cambio desde un snippet?
Depende del plugin. Si no ofrece un filtro para modificar get_html(), no puedes sobrescribir el método desde un snippet. La opción es editar el archivo o esperar una actualización.
¿Cómo reporto el bug?
En el foro de soporte del plugin en WordPress.org, o en el repositorio de GitHub si existe. Incluye la descripción del problema, los pasos para reproducirlo y el código problemático.
¿Qué pasa si no aplico la solución?
Las búsquedas que fallen seguirán devolviendo errores. Si el error es grave, puede afectar la experiencia de tus usuarios.
Comentarios
Publicar un comentario