No hay una variable global central que devuelva el contexto actual. Sin embargo, puede construir el suyo, utilizando etiquetas condicionales de plantilla contextual . Puede recorrer las etiquetas condicionales en el mismo orden que el núcleo de WordPress, siguiendo wp-includes/template-loader.php
.
Simplemente envuelva su salida en una función de tema personalizada. Así es como lo hago (nota: no creo que siga estrictamente template-loader.php):
function oenology_get_context() {
$context = 'index';
if ( is_home() ) {
// Blog Posts Index
$context = 'home';
if ( is_front_page() ) {
// Front Page
$context = 'front-page';
}
}else if ( is_date() ) {
// Date Archive Index
$context = 'date';
} else if ( is_author() ) {
// Author Archive Index
$context = 'author';
} else if ( is_category() ) {
// Category Archive Index
$context = 'category';
} else if ( is_tag() ) {
// Tag Archive Index
$context = 'tag';
} else if ( is_tax() ) {
// Taxonomy Archive Index
$context = 'taxonomy';
} else if ( is_archive() ) {
// Archive Index
$context = 'archive';
} else if ( is_search() ) {
// Search Results Page
$context = 'search';
} else if ( is_404() ) {
// Error 404 Page
$context = '404';
} else if ( is_attachment() ) {
// Attachment Page
$context = 'attachment';
} else if ( is_single() ) {
// Single Blog Post
$context = 'single';
} else if ( is_page() ) {
// Static Page
$context = 'page';
}
return $context;
}
Luego, solo paso oenology_get_context()
como parámetro, por ejemplo:
get_template_part( 'loop', oenology_get_context() );
Creo que algo en este sentido sería un buen candidato para el núcleo, aunque no estoy seguro de la mejor manera de implementarlo. Sin embargo, me encantaría enviar un parche.
template-loader.php
.index
nunca coincidiría, ya seais_front_page()
ois_home()
se dispararía.is_home()
debe ser lo primero, ya que devuelvefront-page
incluso cuando la configuración de "última publicación" está activada y no hay portada. Acabo de probar.is_home() && 'page'
, dependiendo de las necesidades. Para obtener más información sobre las publicaciones de blog y la página estática en la página principal, consulte mi propia respuesta, aquí: wordpress.stackexchange.com/questions/208503/… . Por cierto, @Chip y @helgatheviking, sería mejor usar un enswitch
lugar de tantoselseif
(es más eficiente ;-). ¡Saludos!un poco de facepalm, porque la respuesta está en PHP puro
fuente
Si observa el código fuente de la
get_template_part
función, verá:Crea una matriz de 2 nombres de plantilla:
{$slug}-{$name}.php
y se{$slug}.php
usaload_template
para buscar el archivo de plantilla e incluirlo (el segundo parámetro estrue
, lo que significa incluir ese archivo).Puede imitar esta función para devolver la ruta del archivo de plantilla en lugar de incluirla, como:
Uso:
Puedes jugar más
$template
para obtener lo que quieres.fuente
archive.php
y reutilizarlaloop-archive.php
Listar todos los condicionales que son
true
Como todas las
is_*()
funciones tienen su equivalente en una variable de consulta (las funciones son solo envoltorios), también puede acceder a ellas de otra manera: Obtenga simplemente todo lo que haytrue
.Escribí un ticket en core / trac que agrega una función para enumerarlos a todos.
Mientras tanto, puede usar ambas funciones enumeradas como complementos auxiliares que le muestran en qué solicitud qué condicional está disponible. Imprimirá un
var_dump()
debajo del pie de página (tanto admin como público) en elshutdown
gancho.De esta manera, simplemente puede recorrerlos.
@scribu agregó su propia función al ticket (una solución interesante también).
Actuación
Ejecuté una prueba de rendimiento en cada función en medio de una plantilla usando
timer_start/*_stop();
. Para ser justos, cambié el nombre de todas las funciones a un nombre de un personajea/b/c()
.Como puede ver, la función codificada de Chips es la más rápida, luego la mía y la última en este caso es scribus.
Actualizar
Si me conoces, entonces conoces mi amor por los iteradores por su elegancia, claridad y su capacidad de mantener solo un elemento en la memoria en lugar de copiar una matriz completa durante el bucle. Entonces, aquí hay una clase personalizada rápida que se extiende a
\FilterIterator
, por lo tanto, solo necesita un método modificado.Se puede usar con bastante facilidad. El
$it->current()
mantiene el valor, mientras que$it->key()
devuelve el nombre condicional / propiedad.fuente