Existe uma variável para um nome de modelo?

8

Um que você chamou de modelo com get_template_part() (ou locate_template() ) existe uma maneira de saber em qual modelo você está.

Por exemplo, se você chamar get_template_part('loop','archive'); de archive.php

e, em seguida, estão trabalhando no seu arquivo loop-archive.php. Existe uma maneira de definir uma variável que tenha o nome da parte do modelo atual .... então $template = 'loop-archive' . melhor ainda, talvez em duas partes, então 'loop' e 'archive', mas eu posso fazer isso com alguma divisão de string.

Pergunta # 10537 parece ser uma espécie de relacionado, mas não parece cobrir o template parts .

    
por helgatheviking 18.08.2012 / 16:39

4 respostas

2

Não existe uma variável global central que retorne o contexto atual. No entanto, você pode construir o seu próprio, usando tags condicionais de modelo contextuais. Você pode percorrer as tags condicionais na mesma ordem do núcleo do WordPress, seguindo wp-includes/template-loader.php .

Basta envolver sua saída em uma função de tema personalizada. Aqui está como eu faço (nota: eu não acho que eu siga estritamente 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;
}

Depois, passo o oenology_get_context() como parâmetro, por exemplo:

get_template_part( 'loop', oenology_get_context() );

Acho que algo nesse sentido seria um bom candidato para o núcleo, embora não tenha certeza da melhor maneira de implementá-lo. Eu adoraria enviar um patch, no entanto.

    
por Chip Bennett 22.08.2012 / 04:45
4

pouco de um facepalm, porque a resposta está no PHP puro

$path_parts = pathinfo(__FILE__);
//var_dump($path_parts); 
echo $path_parts['filename'];
    
por helgatheviking 18.08.2012 / 19:05
2

Se você observar o código-fonte da função get_template_part , verá:

function get_template_part( $slug, $name = null ) {
    do_action( "get_template_part_{$slug}", $slug, $name );

    $templates = array();
    if ( isset($name) )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";

    locate_template($templates, true, false);
}

Ele cria uma matriz de dois nomes de modelo: {$slug}-{$name}.php e {$slug}.php e usa load_template para encontrar o arquivo de modelo e inclua-o (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:

function my_get_template_part( $slug, $name = null, $include = false ) {
    do_action( "get_template_part_{$slug}", $slug, $name );

    $templates = array();
    if ( isset($name) )
        $templates[] = "{$slug}-{$name}.php";

    $templates[] = "{$slug}.php";

    return locate_template($templates, $include, false);
}

Uso:

// Don't load the template
$template = my_get_template_part( 'loop', 'archive', false );

// Or load the template
$template = my_get_template_part( 'loop', 'archive', true );

// Get the file name only
$template = basename( $template );

// Without .php extension
$template = substr( $template, 0, -4 );

Você pode jogar mais com $template para conseguir o que deseja.

    
por Anh Tran 22.08.2012 / 03:25
2

Listar todos os condicionais que são true

Como todas as funções is_*() 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 forma: obtenha simplesmente todos os que são true .

Eu escrevi um ticket em core / trac que adiciona uma função à lista todos eles.

Enquanto isso, você pode usar as duas funções listadas como plug-ins auxiliares que mostram a você qual solicitação condicional está disponível. Ele imprimirá um var_dump() abaixo do rodapé (ambos admin & public) no shutdown hook.

<?php
/** Plugin Name: (#62232) »kaiser« List all conditionals that are true */
function get_conditionals()
{ 
    global $wp_query; 

    foreach ( get_object_vars( $wp_query ) as $is_key => $is_value ) 
    { 
            if ( $is_value && preg_match( "/is_/", $is_key ) ) 
                    $conditionals[] = $is_key; 
    } 

    return var_dump( $conditionals );
} 
add_action( 'shutdown', 'get_conditionals' );

Dessa forma, você pode simplesmente percorrê-los.

@scribu adicionou sua própria função ao ticket (uma solução interessante também).

<?php
/** Plugin Name: (#62232) »scribu« List all conditionals that are true */
function get_query_flags( $wp_query = null ) {
    if ( !$wp_query )
        $wp_query = $GLOBALS['wp_query'];

    $flags = array();

    foreach ( get_object_vars( $wp_query ) as $key => $val ) {
        if ( 'is_' == substr( $key, 0, 3 ) && $val )
            $flags[] = substr( $key, 3 );
    }

    return var_dump( $flags );
}
add_action( 'shutdown', 'get_query_flags' );

Desempenho

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 caractere a/b/c() .

Como você pode ver, a função de codificação rígida do Chips é mais rápida, depois a minha e a última é neste caso o scribus.

Atualizar

Se você me conhece, conhece meu amor pelos iteradores por sua elegância, clareza e capacidade de manter 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 um \FilterIterator , precisando apenas de um único método retrabalhado.

<?php

namespace WPSE;

class ConditionalsFilter extends \FilterIterator
{
    /**
     * Accepts properties that start with 'is_' and have a positive boolean value
     * @return bool
     */
    public function accept()
    {
        return 0 === strncasecmp( $this->key(), 'is_', 3 )
            and filter_var(
                $this->current(),
                FILTER_VALIDATE_BOOLEAN,
                FILTER_NULL_ON_FAILURE
            );
    }
}

Pode ser usado com facilidade. O $it->current() contém o valor, enquanto $it->key() retorna o nome da condicional / propriedade.

$cond = new WPSE\ConditionalsFilter( new \ArrayIterator(
    get_object_vars( $GLOBALS['wp_query'] )
) );
foreach ( $cond as $c )
{
    var_dump(
        $cond->key(),
        $cond->current()
    );
}
    
por kaiser 08.09.2012 / 02:25