Não há uma variável global principal que retorne o contexto atual. No entanto, você pode criar seu próprio, usando tags condicionais de modelo contextual . Você pode percorrer as tags condicionais na mesma ordem que o núcleo do WordPress, seguindo wp-includes/template-loader.php
.
Basta agrupar sua saída em uma função Tema personalizada. Aqui está como eu faço isso (nota: acho que não sigo estritamente o 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;
}
Então, eu apenas passo oenology_get_context()
como parâmetro, por exemplo:
get_template_part( 'loop', oenology_get_context() );
Penso que algo nesse sentido seria um bom candidato para o núcleo, embora não tenha certeza da melhor maneira de implementar. Eu adoraria enviar um patch, no entanto.
template-loader.php
.index
nunca corresponderia, como umis_front_page()
ouis_home()
provocaria.is_home()
deve ser a primeira, pois é devolvidafront-page
mesmo quando a configuração "última postagem" está ativada e a primeira página não está presente. Apenas testado.is_home() && 'page'
, dependendo das necessidades. Para obter informações mais abrangentes sobre as postagens do blog e a página estática na primeira página, consulte minha própria resposta, aqui: wordpress.stackexchange.com/questions/208503/… . BTW, @Chip e @helgatheviking, seria melhor usar use um emswitch
vez de tantoselseif
(é mais eficiente ;-). Saudações!um pouco de facepalm, porque a resposta está em PHP puro
fonte
Se você olhar o código fonte da
get_template_part
função, verá:Ele cria uma matriz de 2 nomes de modelos:
{$slug}-{$name}.php
e{$slug}.php
e usoload_template
para encontrar o arquivo de modelo e incluí-lo (o segundo parâmetro étrue
, o que significa incluir esse arquivo).Você pode imitar essa função para retornar o caminho do arquivo de modelo em vez de incluí-lo, como:
Uso:
Você pode jogar mais
$template
para conseguir o que deseja.fonte
archive.php
, e reutilizá-lo emloop-archive.php
Listar todos os condicionais que são
true
Como todas as
is_*()
funções têm seu equivalente em uma variável de consulta (as funções são apenas invólucros), você também pode acessá-las de outra maneira: obtenha simplesmente tudo o que étrue
.Eu escrevi um ticket no core / trac que adiciona uma função para listar todos eles.
Enquanto isso, você pode usar as duas funções listadas como plug-ins auxiliares que mostram em qual solicitação qual condicional está disponível. Ele será impresso
var_dump()
abaixo do rodapé (admin e public) noshutdown
gancho.Dessa forma, você pode simplesmente passar por eles.
@scribu adicionou sua própria função ao ticket (uma solução interessante também).
atuação
Eu executei um teste de desempenho em cada função no meio de um modelo usando
timer_start/*_stop();
. Para ser justo, renomei todas as funções para um nome de um caracterea/b/c()
.Como você pode ver, a função codificada Chips é mais rápida, depois a minha e a última é, neste caso, o scribus.
Atualizar
Se você me conhece, conhece o meu amor pelos iteradores por sua elegância, clareza e capacidade de armazenar apenas um único item na memória, em vez de copiar uma matriz inteira durante o loop. Então, aqui está uma classe personalizada rápida que estende a
\FilterIterator
, portanto, precisando apenas de um único método reformulado.Pode ser usado facilmente. O
$it->current()
mantém o valor, enquanto$it->key()
retorna o nome condicional / propriedade.fonte