Este artículo va a ser muy corto. De hecho, va a ser más larga la explicación de cómo he conseguido llegar a la solución del problema, que la explicación de dicha solución.
Recordemos que en el anterior artículo habíamos creado dos ficheros plantilla, tanto para los Custom Post Type (single-stmtwpfl.php) como para las taxonomías (taxonomy-clasificacion.php). Para facilitar el desarrollo de los mismos, lo he hecho directamente en el directorio del tema que tengo instalado. Sin embargo, cuando empaquetemos el plugin para su distribución, al instalarlo en cada sistema, dichas plantillas quedarán alojadas en el directorio del plugin. Por tanto, deberemos decirle a WordPress dónde se encuentran las plantillas para que las utilice cuando sea necesario.
La búsqueda de la solución
Para encontrar cómo hacerlo, estuve buscando por internet largamente, y acabé encontrando una página en la que indicaba cómo hacerlo: Add Page Templates to WordPress with a Plugin. Como el propio título indica, se trata de un Page Template, por lo que no resultaba ser concretamente lo que yo necesitaba.
Tuve, por tanto, que seguir buscando, y acabé encontrando este otro artículo: Plugin Templating within WordPress. Esto se acercaba bastante más, pero todavía no conseguía hacerlo funcionar.
El hallazgo de la solución
Finalmente, después de mucho buscar, se me ocurrió hacer la pregunta justa: «how to use the single_template hook», lo que me envió directamente al Codex de WordPress.
En la página ‘Plugin API/Filter Reference/single template’, explica fácilmente cómo utilizar el gancho single_template.
La solución
El plugin, finalmente, queda así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?php /* Plugin Name: pagetemplater */ /* Filtro */ add_filter( 'single_template', 'selector_plantilla_cpt' ); /* Funciones del plugin */ function selector_plantilla_cpt( $single_template ) { $post_id = get_the_ID(); // Para el resto de tipos if ( get_post_type( $post_id ) == 'stmtwpfl' ) { $single_template = dirname( __FILE__ ) . '/single-stmtwpfl.php'; } return $single_template; } /* Taxonomía */ add_filter( 'taxonomy_template', 'selector_plantilla_txn' ); function selector_plantilla_txn( $taxonomy_template ) { $tipo_consulta = get_query_var( 'taxonomy' ); if ( $tipo_consulta == 'clasificacion' ) { $taxonomy_template = dirname( __FILE__ ) . '/taxonomy-clasificacion.php'; } return $taxonomy_template; } ?> |
Explicación del código
Tiene dos partes, una para cada plantilla. Primero, la plantilla single-stmtwpfl.php:
1 2 3 4 5 6 7 8 9 10 |
add_filter( 'single_template', 'selector_plantilla_cpt' ); function selector_plantilla_cpt( $single_template ) { $post_id = get_the_ID(); if ( get_post_type( $post_id ) == 'stmtwpfl' ) { $single_template = dirname( __FILE__ ) . '/single-stmtwpfl.php'; } return $single_template; } |
Requiere poca explicación. Cuando se produce el gancho single_template, la función selector_plantilla_cpt() mira el id del post y, si el tipo es como nuestro Custom Post Type, ‘stmtwpfl’, devuelve la ubicación del fichero plantilla para que lo utilice.
Pensando que, si había un gancho single_template, también existiría el gancho taxonomy_template, efectivamente obtuve la segunda parte:
1 2 3 4 5 6 7 8 9 |
add_filter( 'taxonomy_template', 'selector_plantilla_txn' ); function selector_plantilla_txn( $taxonomy_template ) { $tipo_consulta = get_query_var( 'taxonomy' ); if ( $tipo_consulta == 'clasificacion' ) { $taxonomy_template = dirname( __FILE__ ) . '/taxonomy-clasificacion.php'; } return $taxonomy_template; } |
Aquí averiguamos si en la consulta general estamos trabajando con la taxonomía ‘clasificacion’, realizando, en caso afirmativo, lo mismo que antes.