Tipos de postagem personalizados e template_redirect


9

Eu tenho dois tipos de postagem personalizados (por exemplo, post_type_1 e post_type_2) que gostaria de redirecionar para modelos independentes (single-post_type_1.php e single-post_type_2.php) para lidar com a exibição deles. Não quero colocar os modelos de exibição na pasta do tema, pois quero que eles sejam independentes em suas respectivas pastas de plug-ins.

Como posso fazer com que cada um deles registre um gancho template_redirect sem afetar o outro? Ou devo usar uma técnica diferente?

Atualmente, estou fazendo isso no plug-in 1:

add_action( 'template_redirect', 'template_redirect_1' );
function template_redirect_1() {
    global $wp_query;
    global $wp;

    if ( $wp_query->query_vars['post_type'] === 'post_type_1' ) {

        if ( have_posts() )
        {
            include( PATH_TO_PLUGIN_1 . '/views/single-post_type_1.php' );
            die();
        }
        else
        {
            $wp_query->is_404 = true;
        }

    }
}

E isso no Plugin 2:

add_action( 'template_redirect', 'template_redirect_2' );
function template_redirect_2() {
    global $wp_query;
    global $wp;

    if ( $wp_query->query_vars['post_type'] === 'post_type_2' ) {

        if ( have_posts() )
        {
            include( PATH_TO_PLUGIN_2 . '/views/single-post_type_2.php' );
            die();
        }
        else
        {
            $wp_query->is_404 = true;
        }

    }
}

Depois de registrar o gancho template_redirect do plug-in 2, o plug-in 1 não funciona mais.

Estou esquecendo de algo?

Qual é a melhor maneira de fazer isso?

Respostas:


13

Você deve usar o filtro template_include para isso:

add_filter('template_include', 'wpse_44239_template_include', 1, 1);
function wpse_44239_template_include($template){
    global $wp_query;
    //Do your processing here and define $template as the full path to your alt template.
    return $template;
}

template_redirecté a ação chamada diretamente antes dos cabeçalhos serem enviados para a saída do modelo renderizado. É um gancho conveniente para redirecionamentos 404, etc ... mas não deve ser usado para incluir outros caminhos de modelos, pois o WordPress faz isso de forma inata com o filtro 'template_include'.

template_includee single_templateganchos lidam SOMENTE com o caminho do modelo usado para renderizar o conteúdo. Este é o local apropriado para ajustar o caminho do modelo.

Atualização do comentário por @ChipBennett:

single_templatefoi removido a partir de 3.4. Use {posttype} _template.


Então, isso funciona, mas acontece que o template_redirect e o single_template também funcionam. O verdadeiro problema que eu determinei era que eu tinha uma função de classificação de coluna de administrador personalizada que se conecta ao filtro 'request' e não estava limitando a modificação da variável $ vars a apenas quando o tipo de postagem era de um determinado tipo. Mas fico feliz em saber sobre o gancho template_include. Ainda não tenho certeza de qual é a diferença entre template_redirect, template_include e single_template.
anderly

@anderly Atualizei minha resposta. Espero que isto ajude.
precisa saber é o seguinte

Então, e o single_template? Este link ( codex.wordpress.org/Plugin_API/Filter_Reference/single_template ) diz que pode ser usado para ajustar o modelo para uma postagem ou página quando o modelo único é chamado. É isso que estou tentando fazer. De qualquer forma, o uso de filtros template_include ou single_template funciona e parece realizar a mesma coisa.
anderly

11
single_template funciona da mesma maneira, exceto que é chamado condicionalmente. Isso ajuda a isolar as alterações de caminho em vez de usar um filtro de percussão em todo o site.
Brian Fegter

11
Muito legal ... Eu não sabia sobre template_include
helgatheviking
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.