it-swarm-pt.tech

Exibindo o arquivo de categoria de tipos de postagem personalizados

Estou tristemente atrasado para a festa em 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 minha pergunta.

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

'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, forma ou formulário.

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

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

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

Alguém pode ajudar a afastar meu nevoeiro de mente maçante e me apontar na direção certa para que eu possa filtrar esses atores traquinas?

Editar:

Como @mrwweb alude 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 trabalho, na medida em que ele exibirá meus tipos de postagem personalizados categorizados na página archive.php normal, mas não utilizará meu archive-actors.php, que é a chave.

4
indextwo

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 codex.

4
Milo

Esse é o comportamento esperado dos arquivos de categoria. Conforme encontrado aqui nos fóruns de suporte, o snippet a seguir deve resolver o problema (basta alterar "artigo" para o 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.

0
mrwweb

Alternativamente, o que você pode fazer é simplesmente adicionar uma nova regra wp_rewrite para criar uma nova estrutura de URL para exibir apenas postagens em uma determinada cpt e categoria. Algo como o .Gist que postei aqui:

[edit: 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.
0
Darren