Usar la misma plantilla para categorías y subcategorías
En WordPress cuando se quieren personalizar las categorías se crea un archivo category.php y se hacen los cambios que se consideren oportunos. Esto afectará a todas las categorías y subcategorías. Pero cuando quiero personalizar sólo una categoría o sólo una subcategoría creo un archivo category-slug.php o category-ID.php según me interese que WordPress la encuentre por su slug o por su identificador.
De esta forma puedo tener una categoría o una subcategoría con diferente aspecto que el resto de las categorías. El inconveniente de esto es que se necesitan tantos archivos como categorías haya en el caso de que se quiera diferenciarlas y personalizarlas todas por separado.
Además los cambios a una categoría no afectan a sus subcategorías con lo que también necesito añadir los archivos PHP correspondientes a esas subcategorías. Si las categorías no son muchas el problema sólo lo encontramos en las subcategorías dependientes. Necesitamos encontrar una forma de que las subcategorías utilicen la misma plantilla que su categoría padre.
Según la Jerarquía de archivos de WordPress el orden de preferencia a la hora de cargar una plantilla o archivo del theme para las categorías sería el siguiente:
1 - category-slug.php
2 - category-ID.php
3 - category.php
4 - archive.php
5 - index.php
El slug es la versión amigable del nombre de la categoría en minúsculas, sin la letra "ñ" y sin acentos. Los espacios entre palabras se sustituyen por un guión "-".
Así para una categoría llamada "Diseño Gráfico" su slug será "diseno-grafico". Lo mismo si se trata de una subcategoría. Esta característica fue añadida en la versión 2.9
Sin embargo, podemos usar cualquier otro nombre de archivo de plantilla. Por ejemplo, sabiendo que una categoría tiene el ID 12, para que sus subcategorías usen su misma plantilla podríamos poner al principio del archivo archive.php lo siguiente:
<?php if (cat_is_ancestor_of(12, $cat) or is_category(12)) { $template = TEMPLATEPATH . "/mi-category.php"; if (file_exists($template)) { load_template($template); exit; } } ?>
Siendo mi-category.php la plantilla de esa categoría y sus subcategorías. Al hacerlo de esta manera no afecta para nada al resto de categorías y subcategorías. Es más, la jerarquía sigue funcionando perfectamente. El único requisito es que no exista el archivo category.php.
Si tu theme usa category.php el código anterior lo puedes poner al principio de este archivo y dejar archive.php intacto.
¿Qué ocurre si quiero que todas las subcategorías usen la plantilla de su categoría padre?
Esto se puede hacer de varias formas. En este caso vamos a usar el slug de la categoría padre como plantilla para las subcategorías.
<?php $term = get_term( get_query_var('cat'), 'category'); $termpar = get_term( $term->parent, 'category'); if (cat_is_ancestor_of($termpar->term_id, $term->term_id) or is_category($termpar->term_id)) { $template = TEMPLATEPATH . "/category-{$termpar->slug}.php"; if (file_exists($template)) { load_template($template); exit; } } ?>
get_query_var obtiene la categoría de la consulta. get_term se encarga de obtener las variables de la categoría y si tiene categoría padre o el nombre de su slug.
Esto es lo que hace el código:
- Si no encuentra una subcategoría (porque es una categoría) se usa la plantilla de la categoría padre category-SlugPadre.php como haría normalmente. Si la plantilla no existe WordPress sigue su ejecución normal.
- Si encuentra una subcategoría también usa la plantilla de la categoría padre category-SlugPadre.php. Si la plantilla no existe WordPress sigue su ejecución normal.
Es decir, sea una categoría o sus subcategorías se utiliza la misma plantilla.
- En caso de no encontrarse el archivo category-SlugPadre.php correspondiente a cada categoría seguiría ejecutando el código de forma normal tanto si se trata de category.php como de archive.php