Exibindo o arquivo de categoria de tipos de postagem personalizados

4

Estou tristemente atrasado para a festa no Custom Post Types e só comecei a usá-los recentemente, então peço desculpas se minhas perguntas parecerem idiotas, mas não consigo encontrar uma resposta para a minha pergunta.

Eu configurei um tipo de postagem personalizado chamado atores com alguns valores de campo personalizados e (crucialmente), estou usando categorias padrão para separar esses atores em listas de homens , mulheres e crianças :

'taxonomies' => array('category', 'post_tag')

... desde que eu pensei que seria uma maneira muito mais limpa e arrumada de ... bem, categorizar os atores. No entanto, estou completamente perplexo com a forma de exibir essas categorias de qualquer maneira ou forma.

Eu tenho um arquivo archive-actors.php personalizado que exibe todos dos atores, mas eu quero poder filtrá-los por categoria; por exemplo. exibir apenas os homens . No entanto, se eu acho que em um URL padrão como mysite.com/category/actors/men acabei de receber

  

Desculpe, mas ainda não há postagens na categoria Men.

A mesma coisa acontece se eu tentar apenas mysite.com/category/men - em nenhum dos casos está usando o modelo archive-actors.php .

Alguém pode ajudar a afastar minha neblina de tédio e me apontar na direção certa para que eu possa filtrar esses atores traquinas?

Editar:

Como @mrwweb alude a abaixo (e esqueci de mencionar que tentei), o seguinte pode ser adicionado ao arquivo functions.php :

function query_post_type($query) {
    $post_types = get_post_types();

    if ( is_category() || is_tag()) {

        $post_type = get_query_var('actors');

        if ( $post_type ) {
            $post_type = $post_type;
        } else {
            $post_type = $post_types;
        }

        $query->set('post_type', $post_type);

        return $query;
    }
}

add_filter('pre_get_posts', 'query_post_type');

... como referenciado aqui que faz work, na medida em que ele exibirá meus tipos de postagem personalizados categorizados na página regular archive.php , mas não utilizará meu archive-actors.php , que é a chave.

    
por indextwo 04.07.2012 / 17:24

3 respostas

3

Você pode forçar o uso de seu modelo para categorias com o filtro category_template :

function wpa57439_category_template( $templates = '' ){
    if( !is_array( $templates ) && !empty( $templates ) ) {
        $templates = locate_template( array( 'archive-actors.php', $templates ), false );
    } 
    elseif( empty( $templates ) ) {
        $templates = locate_template( 'archive-actors.php', false );
    }
    else {
        $new_template = locate_template( array( 'archive-actors.php' ) );
        if( !empty( $new_template ) ) array_unshift( $templates, $new_template );
    }
    return $templates;
}
add_filter( 'category_template', 'wpa57439_category_template' );

adaptado de Hierarquia de filtro no códice.

    
por Milo 04.07.2012 / 18:49
0

Esse é o comportamento esperado dos arquivos de categoria. Como encontrado aqui nos fóruns de suporte, o snippet a seguir deve resolver seu problema (apenas mude "artigo" para o seu tipo de postagem):

add_filter('pre_get_posts', 'query_post_type');
function query_post_type($query) {
  if(is_category() || is_tag()) {
    $post_type = get_query_var('post_type');
    if($post_type)
        $post_type = $post_type;
    else
        $post_type = array('post','articles','nav_menu_item');
    $query->set('post_type',$post_type);
    return $query;
    }
}

ATUALIZAÇÃO: Gah. Eu peguei o trecho errado. Eu pretendia usar este aqui.

    
por mrwweb 04.07.2012 / 17:34
0

Como alternativa, o que você pode fazer é adicionar uma nova regra wp_rewrite para criar uma nova estrutura de URL para exibir somente postagens em uma determinada cpt e categoria. Algo como o .gist que postei aqui:

[editar: não é possível incorporar .gists, então aqui está o código e linky ]

/**
* This could be extrapolated and used for tags or any other taxonomy really.
*/

add_action('init', 'category_cpt_rewrites');

function category_cpt_rewrites() {
    $custom_post_types = array('video', 'audio', 'photo', 'file'); //some example post types
    foreach ( $custom_post_types as $post_type ) {
        $rule = '^' . $post_type . '/category/(.+?)/?$';
        $rewrite = 'index.php?post_type=' . $post_type . '&category_name=$matches[1]';
        add_rewrite_rule($rule,$rewrite,'top');
    }
}

//make sure you flush rules
//this will take the following url structure (video cpt as an example, and politics as a category example) -> video/category/politics and return posts belonging to the politics category that are in the "video" custom post type.

//note that if you want this to be truly effective you'll want to make a custom "the_category()" or similar template function to return the correct url structure for a category list belonging to a custom post type post.
    
por Darren 28.10.2012 / 18:59