Archivi dei Custom Post Type per Anno e Mese?

16 nov 2011, 17:07:55
Visualizzazioni: 38.6K
Voti: 17

Come si possono visualizzare gli archivi di un Custom Post Type organizzati per Anno e Mese?

1
Commenti

La mia soluzione qui sotto funziona se stai usando una versione < WP 4.4, ma dalla release di WP 4.4, wp_get_archives() FINALMENTE supporta i custom post type: https://developer.wordpress.org/reference/functions/wp_get_archives/

Trevor Trevor
2 gen 2016 01:31:35
Tutte le risposte alla domanda 5
4
17

Sì, puoi farlo. Tutto ciò che devi fare è creare un filtro per wp_get_archives(); in modo che accetti il parametro post_type:

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;  
}

poi chiama questo:

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

Ogni volta che vuoi visualizzare gli archivi per un custom post type, passa semplicemente l'argomento post_type:

$args = array(
    'post_type'    => 'your_custom_post_type',
    'type'         => 'monthly',
    'echo'         => 0
);
echo '<ul>'.wp_get_archives($args).'</ul>';
12 feb 2012 19:04:38
Commenti

Hai provato questa soluzione? Recupera correttamente l'elenco dei mesi con un post dal tuo CPT e il numero di post, ma i link sono inutili. Cliccandoli ti porta al mese per l'intero sito, non per il CPT.

jerclarke jerclarke
21 set 2012 19:12:35

Dopo alcune ricerche (vedi la risposta di Tom Nowell qui sotto), ho rinunciato agli archivi mensili per i custom post type. Invece, ho utilizzato una categoria di post e ho modificato la struttura dei permalink in /%category%/%year%/%monthnum%/%postname%/. Quindi, potrebbe essere possibile utilizzando un hook simile a quello sopra, modificare i link per iniziare con /%category%/ invece della sola data.

Kevin C. Kevin C.
23 mar 2013 00:31:28

Domanda su questo. Questo crea URL come: mysite.com/2013/04 ma portano a un 404. Il custom post type è disponibile su: mysite.com/cats il che mi fa pensare che mysite.com/cats/2013/04 dovrebbe essere il link corretto, ma anche questo risulta in un 404. Come si fa a far funzionare i link degli archivi?

gaoshan88 gaoshan88
11 apr 2013 08:56:15

Ancora meglio, esiste finalmente un plugin per gestire questa funzionalità mancante in WordPress. È stato creato da un contributor del core che sta cercando di risolvere questo problema nel core. Il plugin viene fornito per aiutarci fino a quando il problema non verrà risolto correttamente nel core. https://wordpress.org/plugins/archives-for-custom-post-types/

Trevor Trevor
9 lug 2014 21:01:44
8

Non è consigliato, la posizione ufficiale degli sviluppatori di WordPress era che i tipi di post personalizzati (custom post types) non erano pensati per sostituire i normali post, e che se hai bisogno di archivi di post con date ecc., non stai usando la funzionalità correttamente, e sarebbe meglio utilizzare i formati di post (post formats) ecc..

I tipi di post personalizzati sono pensati per applicazioni web ecc., mentre creare qualcosa come un tipo di post personalizzato che funga da blog secondario o parallelo con un nome diverso, ad esempio blog vs notizie, con le stesse funzionalità, non è lo scopo per cui questa funzionalità è stata progettata, e potrebbe portare ad altri problemi tecnici derivanti dalla sua implementazione.

Se sei ancora determinato a farlo, e semplicemente utilizzare tassonomie personalizzate e formati di post non è sufficiente, potresti aggiungere regole di riscrittura (rewrite rules) in functions.php e reindirizzare gli archivi annuali/mensili in determinati URL alla pagina di archivio dei post, e poi verificare nella pagina di archivio del tipo di post personalizzato se hai specificato delle variabili nelle tue regole di riscrittura e caricare un template diverso, assicurandoti nelle regole di riscrittura di impostare i valori appropriati.

16 nov 2011 17:22:40
Commenti

Sembra un po' strano che siano arrivati solo fino a questo punto con questa funzionalità. Puoi farmi un esempio di come dovrebbero essere utilizzati i custom post?

Dan Lee Dan Lee
17 nov 2011 15:02:20

I custom post dovrebbero essere utilizzati per tutto ciò che non rientra nell'ambito delle pagine e degli articoli del blog (o articoli del blog con un nome diverso ma che funzionano allo stesso modo, ad esempio articoli/notizie/diario/ecc.)

Esempi di utilizzi corretti dei custom post includono: eventi, menu, località, moduli, log, ecc.

Tom J Nowell Tom J Nowell
17 nov 2011 15:05:30

I custom post sono fondamentalmente il mezzo per produrre web app, non sono il mezzo per duplicare il menu degli articoli nel backend per una modifica più semplice (e un tale utilizzo renderebbe WordPress molto più lento e sarebbe un compito più arduo di quanto si possa pensare)

Tom J Nowell Tom J Nowell
17 nov 2011 15:12:31

UUUUUgh. Questa è purtroppo la risposta corretta alla domanda. Non riesco a credere che la spiegazione sopra si basi sul "non dovremmo avere URL con date per i CPT", è quasi sicuramente "Gli URL con date per i CPT sono troppo complicati" che guida la decisione effettiva di non implementarli. CHIARAMENTE ci sono casi in cui le persone vorrebbero archivi per data per un custom post type, non puoi far sparire questo ovvio desiderio indicando i post format.

jerclarke jerclarke
21 set 2012 20:36:02

Devo fortemente dissentire. I custom post type sono pensati per essere usati per qualsiasi cosa tu voglia usarli, da nessuna parte nel Codex c'è scritto che sono per "web app". Inoltre, potresti benissimo avere bisogno di una sezione "notizie" con la sua tassonomia personalizzata e vorresti degli archivi per quelle. O anche il suggerito tipo "eventi", che concordo siano un uso perfetto per i CPT, ma di nuovo quelli potrebbero facilmente aver bisogno di archivi basati sulla data.

Trevor Trevor
3 gen 2015 00:02:06

Una sezione notizie suggerisce un post format o una tassonomia che indichi che hai classificato un post come notizia. Un custom post type non è necessario per una cosa del genere. In ogni caso, percepisco che la tua definizione di web app potrebbe non essere la stessa della mia, definirò semplicemente la mia interpretazione in questo contesto come qualsiasi cosa che non sia una pagina statica, o un post di blog, che richieda una rappresentazione simile a un post dei contenuti, e ti rimanderei al core developer di WordPress che originariamente ha affermato questo (probabilmente Otto o Nacin)

Tom J Nowell Tom J Nowell
4 gen 2015 00:26:04

In effetti definiamo le web app in modo diverso. La buona notizia è che Jack Lenox di Automattic ha un plugin che ora abiliterà gli archivi per i CPT, vedi la mia risposta qui sotto. Quindi ora possiamo finalmente creare facilmente archivi per data per cose come "Eventi" che potrebbero davvero usufruire di questa funzionalità.

Trevor Trevor
23 gen 2015 23:25:26

Immagino che la posizione ufficiale degli sviluppatori di WordPress sia cambiata :) ... Questa funzionalità è ora nel core.

Trevor Trevor
23 mag 2016 09:48:21
Mostra i restanti 3 commenti
0

MODIFICA -> mentre questa risposta funziona ancora per versioni < WP4.4, dalla 4.4 il supporto per i Custom Post Types è ora incluso in wp_get_archives()


Finalmente c'è una soluzione semplice, veloce e facile per gli archivi basati su data dei Custom Post Types in WordPress! Questo è stato un problema di lunga data che è documentato qui nel WP Core Trac.

Non è ancora stato risolto ma uno dei collaboratori del Trac ha pubblicato un semplice plugin su GitHub che ti permetterà di avere archivi basati su data per i CPT.

Dopo aver installato questo plugin, o aggiunto manualmente il codice alle tue funzioni, puoi usare gli archivi per i CPT in questo modo:

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

Nota che questa nuova funzione wp_get_archives_cpt funziona come il normale wp_get_archives, quindi puoi usare qualsiasi argomento che normalmente accetta. Tuttavia, semplicemente aggiunge la possibilità di poter specificare un argomento con il nome del custom post type.

3 gen 2015 00:08:06
0

Non ho abbastanza reputazione per aggiungere questo alla risposta di taiken, mi dispiace.

Volevo però aggiungere che la sua risposta ha funzionato per me, tuttavia i link erano nel formato 'localhost/date/2010'. Mentre io avevo bisogno del formato 'localhost/postslug/2010'. Sono riuscito a risolvere utilizzando una sostituzione di stringa sull'output di wp_get_archives.

Quindi, a seconda di come sono impostati i tuoi permalink, questo codice risolverà il problema del 404 e reindirizzerà i link alla struttura dei permalink del custom post type:

$yearly_archive = wp_get_archives(array( 'type' => 'yearly', 'post_type' => '<nome del tuo post type>', 'echo' => '0') );
$blog_url = get_bloginfo('url');
echo str_replace(($blog_url . '/date'), ($blog_url . '<slug del tuo post type>'),$yearly_archive);
12 set 2013 11:58:26
1

Non posso aggiungere al post di takien quindi ecco cosa ho dovuto fare:

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) { // comunque tu determini quale archivio vuoi
        $link = str_replace($wp_rewrite->front, '/resource/news/', $link);
    }

    return $link;
}

Chiamata a wp_get_archives()

wp_get_archives(array('post_type'=>'news', 'type'=>'yearly'));
17 apr 2014 19:06:41
Commenti

Ecco la tua prima risposta. Solo un suggerimento quando rispondi alle domande: non limitarti ad aggiungere codice o, per quel che vale, link. Anche se il tuo codice potrebbe funzionare, è sempre bello sapere cosa fa il tuo codice e perché dovrebbe funzionare. Altrimenti la tua risposta è ben formattata. +1 per quello

Pieter Goosen Pieter Goosen
17 apr 2014 19:28:16