Cómo leer el código fuente para diagnosticar errores
La habilidad más importante del Módulo 4: cuando algo no funciona,
cómo encontrar la causa leyendo el código de LearnPress y WordPress.
Esta lección no crea código nuevo. Vamos a aprender la metodología
de diagnóstico que usamos a lo largo del Módulo 4 para encontrar y corregir
los problemas específicos de LearnPress 4.x. Es la habilidad que te permite
resolver problemas que nadie más documentó.
En este módulo encontramos tres situaciones donde el enfoque «estándar» falló:
| Lo que intentamos | Lo que pasó | Cómo lo resolvimos |
|---|---|---|
| Activar todos los overrides de LP | 0 de 0 — LP 4.x los desactiva por defecto | Filtro learn-press/override-templates |
Override de tarjetas de cursos con archivos en loop/course/ |
0 de 0 — LP 4.x usa una clase PHP | Filtros learn-press/layout/list-courses/* |
Override del avatar con profile/avatar.php |
0 de 0 — la llamada al archivo estaba comentada | Filtro learn-press/user/html-avatar-edit |
En los tres casos el proceso para encontrar la solución fue el mismo.
Vamos a verlo paso a paso.
El flujo de diagnóstico en 5 pasos
Crear el override y recargar la página
Copiamos el archivo template del plugin a nuestro child theme,
le agregamos nuestra clase CSS y recargamos el navegador.
Verificar con F12 → Ctrl+F → buscar la clase
Abrimos las herramientas del desarrollador y buscamos la clase nueva.
Si aparece 1 of 1, funciona. Si aparece 0 of 0,
hay un problema — continuamos al paso 3.
¿1 of 1? Listo.
El override funciona. No hace falta seguir.
Buscar el archivo original del plugin
Navegamos a wp-content/plugins/learnpress/templates/ y
buscamos el archivo que copiamos. Lo abrimos y leemos cómo está escrito.
Buscar dónde se carga ese template
Buscamos en el código del plugin quién llama a ese archivo con
learn_press_get_template(). Miramos si esa llamada
fue comentada o reemplazada por código PHP.
Buscar el apply_filters() y usarlo
Dentro de la clase PHP que reemplazó al template, buscamos
apply_filters() cerca de la línea que genera el HTML
que queremos modificar. Ese nombre de hook es el que usamos con
add_filter() en nuestro functions.php.
Si el override del archivo no funciona (0 de 0 en F12), la causa casi siempre
es que LP 4.x movió esa lógica a una clase PHP. Buscá
apply_filters()cerca del HTML que querés modificar, y ese hook es tu solución.
Señales para saber si el override funciona o no
El F12 es tu mejor herramienta. Hay dos resultados posibles al buscar la clase:
Funciona: 1 of 1
La clase aparece en el HTML. El override está activo y WordPress
está usando nuestro archivo.
No funciona: 0 of 0
La clase no existe en el HTML. WordPress está usando el template
del plugin, no el nuestro. Hay que investigar por qué.
Resultado que indica un problema
Dónde mirar en el código del plugin
Los archivos más importantes para el diagnóstico están en dos carpetas del plugin:
├── templates/ ← Los archivos que se pueden sobreescribir
│ ├── profile/
│ │ ├── avatar.php ← este existe, pero en LP 4.x ya no se carga
│ │ ├── tabs.php ← este SÍ se carga todavía
│ │ └── tabs/
│ │ └── my_courses.php ← este SÍ se carga
│ └── loop/course/
│ └── meta.php ← en LP 4.x ya no se usa para /cursos/
│
└── inc/
└── templates/ ← Las clases PHP que reemplazaron a los archivos
├── class-lp-template-profile.php ← aquí encontramos avatar() comentado
└── class-lp-template-course.php
└── TemplateHooks/ ← Clases nuevas de LP 4.x con apply_filters()
├── UserTemplate.php ← aquí está html_avatar_edit()
└── Course/
└── ListCoursesTemplate.php ← aquí están los filtros de tarjetas
inc/TemplateHooks/.En LP 4.x, cuando un override de archivo no funciona, la lógica se mudó a
alguna clase dentro de
TemplateHooks/. Ahí es donde hay quebuscar el
apply_filters() que nos dará el hook para usar conadd_filter().
Ejemplo completo: el caso del avatar
Veamos el proceso completo aplicado al caso del avatar de la lección 4.10.
Es el ejemplo más claro de todo el módulo.
Paso 1 y 2 — Creamos el archivo y F12 devolvió 0 de 0.
Paso 3 — Abrimos el archivo original del plugin:
$user = LP_Profile::instance()->get_user();
?>
<div class=«lp-user-profile-avatar»>
<?php echo wp_kses_post( $user->get_profile_picture() ); ?>
</div>
El archivo existe y parece normal. Pero si nadie lo llama, no importa.
Paso 4 — Buscamos quién llama a avatar.php en el plugin:
$lp_profile = LP_Profile::instance();
$user = $lp_profile->get_user();
$userModel = UserModel::find( $user->get_id(), true );
$userTemplate = new UserTemplate();
echo $userTemplate->html_avatar_edit( $userModel ); ← nueva forma LP 4.x
// learn_press_get_template( ‘profile/avatar.php’ ); ← comentado con //
}
El doble barra // al principio de la línea significa que ese código
está comentado — es como si no existiera. LP 4.x desactivó
la carga del archivo y puso en su lugar una llamada a UserTemplate.
Paso 5 — Abrimos UserTemplate.php y buscamos apply_filters:
‘learn-press/user/html-avatar-edit’, ← ¡este es el hook!
[
‘wrapper’ => ‘<div class=»user-avatar»>’,
‘avatar’ => $img_avatar,
‘btn_edit’ => $html_btn_to_edit_avatar,
‘wrapper_end’ => ‘</div>’,
],
$user
);
$html = Template::combine_components( $section );
Encontramos el hook 'learn-press/user/html-avatar-edit'.
Vemos que el array tiene una clave 'wrapper' con el
<div> que nos interesa. Ahora sabemos exactamente qué hacer:
if ( isset( $section[‘wrapper’] ) ) {
$section[‘wrapper’] = ‘<div class=»user-avatar lms-perfil-avatar«>’;
}
return $section;
}, 10, 2 );
No importa qué componente no funcione — el camino es siempre el mismo:
F12 muestra 0 de 0 → leer la clase PHP del plugin → encontrar
apply_filters() → usar ese hook con add_filter().
¿Cuándo usar archivo y cuándo usar filtro?
No siempre es necesario buscar el filtro. Hay una forma rápida de saber
qué método usar antes de empezar:
* This template can be overridden by copying it to yourtheme/learnpress/...Copiá el archivo al child theme y modificalo.
Buscá
apply_filters() y usá add_filter().
Verificar con F12 y seguir el flujo de diagnóstico.
El texto «This template can be overridden» que aparece al principio
de muchos archivos de LearnPress es la señal oficial de que ese archivo
admite override por parte de un child theme.
| Template | ¿Admite override de archivo? | Resultado en LP 4.x |
|---|---|---|
profile/tabs.php |
Sí | Archivo funciona |
profile/my_courses.php |
Sí | Archivo funciona |
content-lesson/content.php |
Sí | Archivo funciona |
profile/avatar.php |
Sí (el archivo dice que sí) | Comentado en la clase → filtro |
loop/course/meta.php |
Sí (el archivo dice que sí) | Clase PHP nueva → filtro |
Resumen de la lección 4.11
leer la clase PHP del plugin → encontrar
apply_filters() →usar ese hook con
add_filter().
«0 of 0» = investigar. Buscar siempre la clase CSS que agregamos.
inc/TemplateHooks/.Cuando un archivo override falla, la lógica se mudó ahí. Buscar
apply_filters() cerca del HTML que queremos modificar.
(carpeta
templates/) y clases PHP con filtros(carpeta
TemplateHooks/). Hay que saber en cuál está cada cosa.
No solo a LearnPress — WooCommerce, BuddyPress y muchos otros plugins
usan el mismo patrón de
apply_filters() para hacer sustemplates extensibles desde un child theme.