Tipos de postagem personalizados e template_redirect

8

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. Eu não quero colocar os modelos de exibição na pasta do tema como eu quero que eles sejam independentes em suas respectivas pastas de plugins.

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

Atualmente, estou fazendo isso no Plugin 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 hook template_redirect do plugin 2, o plugin 1 não funciona mais.

Estou sentindo falta de algo?

Qual é a melhor maneira de fazer isso?

    
por anderly 02.03.2012 / 17:32

1 resposta

13

Você deve estar usando 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 fazer 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'.

Os ganchos

template_include e single_template lidam APENAS com o caminho do modelo usado para renderizar o conteúdo. Este é o local adequado para ajustar um caminho de modelo.

Atualize o comentário de @ChipBennett:

single_template foi removido a partir de 3.4. Use {posttype} _template em seu lugar.

    
por Brian Fegter 02.03.2012 / 17:58