it-swarm-pt.tech

Arquivos de tipo de postagem personalizados por data e taxonomia

Vamos usar o exemplo clássico de um tipo de postagem personalizado chamado "filmes", com sua própria taxonomia chamada "gênero".

Ao registrar o tipo de postagem personalizada (com um slug "movie"), os permalinks já estão configurados para

<domain>/movie/action/ 

... para ver todos os filmes no gênero de ação.

Mas, arquivos por data, como

<domain>/2010/09/

... não sei sobre o tipo de postagem personalizada.

O arquivamento baseado em data mais próximo em que consigo trabalhar é:

<domain>/2010/?post_type=movies

... que lista todos os tipos de postagem personalizados publicados durante o ano atual (2010). Por algum motivo, o mês, a taxonomia e um termo não podem ser adicionados ao URL para obter o resultado esperado.

O que deve ser feito para permitir que URLs sejam assim ...

<domain>/2010/09/movie/action/

... para trabalhar como esperado, para listar todos os filmes de ação publicados em setembro de 2010?

6
Werner

Sim, não há suporte interno para arquivos CPT, mas isso não significa que você não pode estender WP para fornecê-lo. Eu mesmo fiz isso no outro dia ...

Isso não criará os arquivos baseados em data que você está procurando, mas fornecerá um comportamento de arquivamento virtual para tipos de postagem personalizados. Adicionar a data deve ser apenas uma questão de ajustar as regras de reescrita (na verdade, os permalinks baseados em data podem funcionar como estão) ...

EXEMPLO: você tem um tipo personalizado de "filmes" e um único post de filme chamado "ido com o vento". Esse código fornecerá uma estrutura de URL de website.com/movies/gone-with-thewind. Além disso, acessar website.com/movies listará apenas os filmes (como um arquivo de categoria, embora ele não chame o modelo archive.php para saída, mas formatará a saída como o modelo de loop index.php padrão).

function register_post_type_archives( $post_type, $base_path = '' ) {
    global $wp_rewrite;
    if ( !$base_path ) {
        $base_path = $post_type;
    }
    $rules = $wp_rewrite->generate_rewrite_rules($base_path);
    $rules[$base_path.'/?$'] = 'index.php?paged=1';
    foreach ( $rules as $regex=>$redirect ) {
        if ( strpos($redirect, 'attachment=') == FALSE ) {
            $redirect .= '&post_type='.$post_type;
            if (  0 < preg_match_all('@\$([0-9])@', $redirect, $matches) ) {
                for ( $i=0 ; $i < count($matches[0]) ; $i++ ) {
                    $redirect = str_replace($matches[0][$i], '$matches['.$matches[1][$i].']', $redirect);
                }
            }
        }
        add_rewrite_rule($regex, $redirect, 'top');
    }
}

chame essa função logo após ter gerado seu tipo de postagem personalizado:

register_post_type('movies', $args);
register_post_type_archives('movies');

Em seguida, se desejar usar modelos personalizados para controlar a saída dessas listagens quase arquivadas, você poderá usar isto:

add_action('template_redirect', 'post_type_templates');
function post_type_templates() {
    $post_type = get_query_var('post_type');
    if (!empty($post_type)) {
        locate_template(array("{$post_type}.php","index.php"), true);
        die;
    }
}

Agora você pode criar um template "movies.php" em seu tema e personalizar a saída do loop ao seu gosto.

ATUALIZAÇÃO: ter a funcionalidade de arquivamento para tipos personalizados é excelente, mas percebi que precisava de uma maneira de acessá-los. Você pode, obviamente, codificar os botões em algum lugar que apontam para as slugs, mas eu fiz uma função para gerar uma barra de navegação wp3.0 com todos os meus tipos personalizados nela. Agora ele gera uma nova barra de navegação e a torna a principal, mas você pode alterá-la para ser secundária ou apenas adicionar itens a uma barra de navegação existente. Nota: os links de navegação só funcionarão se você estiver usando as regras de reescrita acima.

function register_typenav() {
    $mainnav = wp_get_nav_menu_object('Types Nav');
    if (!$mainnav) {
        $menu_id = wp_create_nav_menu( 'Types Nav' );
        // vav item for each post type
        $types = get_post_types( array( 'exclude_from_search' => false ), 'objects' );
        foreach ($types as $type) {
            if (!$type->_builtin) {
                wp_update_nav_menu_item( $menu_id, 0, array(
                    'menu-item-type' => 'custom',
                    'menu-item-title' => $type->labels->name,
                    'menu-item-url' => get_bloginfo('url') . '/' . $type->rewrite['slug'] . '/',
                    'menu-item-status' => 'publish'
                    )
                );
            }
        }
    if ($mainnav && !has_nav_menu( 'primary-menu' ) ) {
        $theme = get_current_theme();
        $mods = get_option("mods_$theme");
        $key = key($mods['nav_menu_locations']);
        $mods['nav_menu_locations'][$key] = $mainnav->term_id;
        update_option("mods_$theme", $mods);
    }
}
add_action('init', 'register_typenav');
6
somatic

Os Tipos de Postagens Personalizadas não são projetados para fornecer arquivamento, como acontece com o tipo comum de postagens no blog. Isso pode ser algo que será alterado no futuro.

Este é o elo que faltava: Melhorias nos Tipos de Postagens Personalizadas (CPT) que merecem consideração em 3.1 .

2
hakre

Este plugin fornece exatamente o que você quer. Funciona bem com o Wordpress 3.3.1.

1
baxang