Arquivos de tipo de postagem personalizada por ano e mês?

Respostas:

17

Sim você pode. Tudo que você precisa é criar um filtro para wp_get_archives();que ele aceite o post_typeparâmetro:

function my_custom_post_type_archive_where($where,$args){  
    $post_type  = isset($args['post_type'])  ? $args['post_type']  : 'post';  
    $where = "WHERE post_type = '$post_type' AND post_status = 'publish'";
    return $where;  
}

então chame isso:

add_filter( 'getarchives_where','my_custom_post_type_archive_where',10,2);

Sempre que você desejar exibir o arquivo morto por tipo de postagem personalizado, basta passar os argumentos post_type:

$args = array(
    'post_type'    => 'your_custom_post_type',
    'type'         => 'monthly',
    'echo'         => 0
);
echo '<ul>'.wp_get_archives($args).'</ul>';
Takien
fonte
3
Você tentou esta solução? Ele busca corretamente a lista de meses com uma postagem do seu CPT e o número de postagens, mas os links são inúteis. Clicar nelas leva você ao mês para todo o site, não para o CPT.
Jerclarke
Após algumas pesquisas (consulte a resposta de Tom Nowell abaixo), desisti de arquivos mensais para tipos de postagem personalizados. Em vez disso, usei uma categoria de postagem e alterei minha estrutura de link permanente para /%category%/%year%/%monthnum%/%postname%/. Em seguida, pode ser possível usar um gancho semelhante ao acima, modificar os links para começar em /%category%/vez da data.
Kevin C.
Pergunta sobre isso. Isso cria URLs como: mysite.com/2013/04mas isso leva a um 404. O tipo de postagem personalizada está disponível em: o mysite.com/catsque me faz pensar mysite.com/cats/2013/04que seria o link, mas isso também resolve o 404. Como você faz com que os links de arquivamento funcionem?
precisa saber é o seguinte
2
Melhor ainda, finalmente existe um plugin para lidar com essa funcionalidade ausente no WordPress. Foi criado por um colaborador principal tentando corrigir esse problema no núcleo. O plug-in é fornecido para nos ajudar até que o problema seja resolvido adequadamente no núcleo. wordpress.org/plugins/archives-for-custom-post-types
Trevor
6

Você não sabe, a linha oficial dos desenvolvedores do Wordpress era que os tipos de postagem personalizados não tinham a intenção de fazer o trabalho de postagens normais normais e que, se você precisar publicar arquivos de datas etc., não estará fazendo as coisas corretamente, e é melhor usar formatos de postagem etc.

Os tipos de postagem personalizados destinam-se a aplicativos da Web etc., enquanto que executar algo como configurar um tipo de postagem personalizado que atue como um blog secundário ou paralelo com um nome diferente, por exemplo, blog x notícias, com as mesmas habilidades, não é o que o recurso era. destinado e significaria outros problemas técnicos decorrentes de sua implementação.

Se você ainda insistir nisso, e o simples uso de taxonomias e formatos de postagem personalizados não for suficiente, adicione regras de reescrita em functions.php e redirecione os arquivos de ano / mês em determinados URLs para a página de pós-arquivo e verifique a customização publique a página de arquivamento se você especificou variáveis ​​nas regras de reescrita e carregou um modelo diferente, certificando-se de que nas regras de reescrita defina os valores apropriados.

Tom J Nowell
fonte
Parece um pouco estranho que eles só iriam tão longe com essa funcionalidade. Você pode me dar um exemplo de como as postagens personalizadas devem ser usadas?
Dan Lee
As postagens personalizadas devem ser usadas para qualquer coisa que não seja abrangida pelo escopo das páginas e postagens do blog (ou postagens de blog com um nome diferente, mas funcionam da mesma forma, por exemplo, artigos / notícias / diário / etc). Exemplos de usos corretos de postagens personalizadas incluem : eventos, menus, locais, formulários, logs, etc.
Tom J Nowell
As postagens personalizadas são basicamente o meio de produzir aplicativos da Web, não são o meio de duplicar o menu de postagem no back-end para facilitar a edição (e esse uso tornaria o wordpress muito mais lento e seria mais uma tarefa do que você imagina)
Tom J Nowell
1
UUUUUgh. Esta é a resposta correta para a pergunta tragicamente. Não acredito que a explicação acima se baseie em "não devemos ter URLs de data para CPTs"; no entanto, é quase definitivamente "URLs de data para CPTs são muito complicados" que estão determinando a decisão real de não implementar. CLARAMENTE, há casos em que as pessoas desejam arquivos de datas para um tipo de postagem personalizado, não é possível que esse desejo óbvio desapareça apontando os formatos de postagem.
precisa saber é o seguinte
1
Eu tenho que discordar totalmente. Os tipos de postagem personalizados devem ser usados ​​para o que você quiser, em nenhum lugar do Codex ele diz que é para "aplicativos da web". Além disso, você pode muito bem precisar de uma seção de "notícias" que tenha sua própria taxonomia personalizada e deseje arquivos para eles. Ou mesmo o tipo de "eventos" sugerido, que eu concordo é um uso perfeito para CPTs, mas novamente esses facilmente podem precisar de arquivos baseados em datas.
Trevor
5

EDIT -> enquanto esta resposta ainda funciona para <WP4.4, pois o suporte ao 4.4 para tipos de postagem personalizados agora está incluído nowp_get_archives()


Finalmente, existe uma solução simples, rápida e fácil para arquivos baseados em datas de tipos de postagem personalizados no WordPress! Esse é um problema de longa data registrado aqui no WP Core Trac.

Ainda não foi resolvido, mas um dos colaboradores do Trac postou um plugin simples no GitHub que permitirá que você tenha arquivos baseados em datas para CPTs.

Após instalar este plug-in ou adicionar o código para suas funções manualmente, você pode usar arquivos para CPTs como:

<?php wp_get_archives_cpt( 'post_type=custom_post_type' ); ?>

Observe que essa nova função wp_get_archives_cptfunciona da mesma forma que o padrão, wp_get_archivespara que você possa usar qualquer um dos argumentos regulares que ela aceita. No entanto, ele simplesmente adiciona a capacidade de você poder adicionar um argumento de nome de tipo de postagem personalizado.

Trevor
fonte
2

Não há reputação suficiente para adicionar isso à resposta do taiken, desculpe.

No entanto, queria acrescentar que sua resposta funcionou para mim, no entanto, os links estavam no formato 'localhost / date / 2010'. Considerando que eu precisava do formato 'localhost / postslug / 2010'. Consegui consertar isso usando uma sequência de substituição na saída de wp_get_archives.

Portanto, dependendo de como os seus links permanentes estão definidos, esse código corrigirá o problema 404 e redirecionará os links para a estrutura do link permanente do tipo de postagem personalizada:

$yearly_archive = wp_get_archives(array( 'type' => 'yearly', 'post_type' => '<your post type name>', 'echo' => '0') );
$blog_url = get_bloginfo('url');
echo str_replace(($blog_url . '/date'), ($blog_url . '<your post type slug>'),$yearly_archive);
mrbencowell
fonte
1

Não é possível adicionar à postagem de takien, então aqui está o que acabei fazendo:

functions.php

add_action('init', 'my_year_archive_rewrites');  
function my_year_archive_rewrites() {   
    add_rewrite_rule('resource/news/([0-9]{4})/page/?([0-9]{1,})/?', 'index.php?post_type=news&year=$matches[1]&paged=$matches[2]', 'top');
    add_rewrite_rule('resource/news/([0-9]{4})/?', 'index.php?post_type=news&year=$matches[1]', 'top');
}

add_filter('getarchives_where', 'my_custom_post_type_archive_where', 10, 2);
function my_custom_post_type_archive_where($where,$args){  
    $post_type = isset($args['post_type']) ? $args['post_type'] : 'post';  
    return "WHERE post_type = '$post_type' AND post_status = 'publish'";
}

add_filter('year_link', 'my_year_link');
function my_year_link($link) {
    global $wp_rewrite;

    if(true) { // however you determine what archive you want
        $link = str_replace($wp_rewrite->front, '/resource/news/', $link);
    }

    return $link;
}

Chamando wp_get_archives ()

wp_get_archives(array('post_type'=>'news', 'type'=>'yearly'));
pkmatte
fonte
Veja que a sua é a sua primeira resposta. Apenas uma dica ao responder perguntas, não basta adicionar código ou links para esse assunto. Embora seu código possa funcionar, é sempre bom saber o que seu código faz e por que deve funcionar. Caso contrário, sua resposta será bem formatada. +1 para isso #
Pieter Goosen