Mi parte favorita de la jerarquía de plantillas de Wordpress es la capacidad de crear rápidamente archivos de plantilla para páginas mediante slug, sin tener que editar la página en Wordpress para seleccionar una plantilla.
Actualmente podemos hacer esto:
page- {slug} .php
Pero me gustaría poder hacer esto:
single- {post_type} - {slug} .php
De modo que, por ejemplo, en un tipo de publicación llamado review
, podría hacer una plantilla para una publicación llamada "Mi gran revisión" ensingle-review-my-great-review.php
¿Alguien ha configurado esto antes? single-{post_type}-{slug}.php
single-{post_type}-{slug}.php
, por lo que actualizar a WP 3.4 es otra opción.Respuestas:
A) La base en el núcleo
Como puede ver en la explicación de la Jerarquía de plantillas del Codex ,
single-{$post_type}.php
ya es compatible.B) Extendiendo la Jerarquía central
Ahora con mucho gusto hay algunos filtros y ganchos dentro
/wp-includes/template-loader.php
.do_action('template_redirect');
apply_filters( 'template_include', $template )
get_query_template( $type, ... )
llamado:"$type}_template"
B.1) Cómo funciona
is_*()
.is_single() && $template = get_single_template()
get_query_template( $type, $templates )
, ¿dónde$type
estásingle
"{$type}_template"
filtroC) La solución
Como solo queremos extender la jerarquía con una plantilla que se carga antes que la
"single-{$object->post_type}.php"
plantilla real , interceptaremos la jerarquía y agregaremos una nueva plantilla al comienzo de la matriz de plantillas.NOTA: (Si desea usar algo diferente a la babosa de objetos predeterminada) Tendrá que ajustar de
$slug
acuerdo con su estructura de enlace permanente. Solo usa lo que necesites de lo global(object) $post
.Entradas Trac
Como el enfoque anterior no es compatible actualmente (solo puede filtrar la ruta localizada de esta manera), aquí hay una lista de tickets de trac:
get_query_template()
fuente
)
dentro del filtro. Fijo. Tal vez desee intercambiar el guión con un subrayado antes de la babosa dentro de la plantilla. Solo para que el sufijo se destaque mejor al mirar las plantillas.$templates
es una matriz. Vea las funciones principales en este pastebin (sin fecha de vencimiento). Asegúrese de probar esto con una instalación sin complementos y el tema predeterminado. Luego, active uno tras otro y vea si el error aún se produce.slug
solo está disponible para términos y taxonomías. Debe reemplazarlo$post->post_name
con lo que se ajuste a su estructura de enlace permanente. Actualmente no hay forma de hacer esto automáticamente para todos los casos con recuperar y reemplazar la ruta dependiendo de su estructura perma y reglas de reescritura. Espere otra actualización.Siguiendo la imagen de la Jerarquía de plantilla , no veo esa opción.
Así que aquí está cómo lo haría:
Solución 1 (Mejor en mi opinión)
Haga un archivo de plantilla y asócielo a la revisión.
Al agregar el archivo php de plantilla en su directorio de temas, aparecería como una opción de plantilla en la página de edición de su publicación.
Solución 2
Esto probablemente podría lograrse usando el
template_redirect
gancho.En el archivo functions.php:
EDITAR
file_exists
Cheque agregadofuente
exit;
ahí?exit()
es necesario para evitar cargar la plantilla predeterminada.La respuesta principal (de hace 4 años) ya no funciona, pero el códice de WordPress tiene la solución aquí :
fuente
Usar plantillas de página
Otro enfoque para la escalabilidad sería duplicar la funcionalidad desplegable de la plantilla de página en el
page
tipo de publicación para su tipo de publicación personalizada.Código reutilizable
La duplicación en el código no es una buena práctica. En el tiempo extra, puede causar una gran hinchazón en una base de código cuando, por lo tanto, es muy difícil de administrar para un desarrollador. En lugar de crear una plantilla para cada slug, lo más probable es que necesites una plantilla de uno a muchos que se pueda reutilizar en lugar de una a una post-a-plantilla.
El código
Esta es una respuesta un poco tardía, pero pensé que sería valioso ya que nadie en la web ha documentado este enfoque hasta donde puedo decir. Espero que esto ayude a alguien.
fuente
En mi caso, tengo tipos de publicaciones personalizadas de Álbum y Pista vinculadas por una taxonomía de Álbum. Quería poder usar diferentes plantillas individuales para las publicaciones de Álbum y Pista dependiendo de su taxonomía de Álbum.
Basado en la respuesta de Kaiser anterior, escribí este código. Funciona bien.
Nota. No necesitaba la add_action ().
Ahora puedo crear plantillas llamadas single-gregory-cpt-track-tax-serendipity.php y single-gregory-cpt-album-tax-serendipity.php y WP las usará automáticamente; 'tax-serendipity' es la babosa para el primer término de taxonomía del Álbum.
para referencia, el gancho del filtro 'single_template' se declara en:
/wp-includes/theme.php:
get_query_template()
Gracias Kaiser por el código de muestra.
Saludos, Gregory
fuente
Actualización para el código Brians, descubrí que cuando no se usaba el cuadro desplegable, la opción de plantilla "predeterminada" se guardaba en wp_page_template, lo que hacía que intentara encontrar una plantilla llamada predeterminada. este cambio solo comprueba la opción "predeterminada" al guardar y elimina el mensaje meta en su lugar (útil si cambia la opción de plantilla a la predeterminada)
fuente