Archivi di tipo di posta personalizzati per anno e mese?


Risposte:


17

Si, puoi. Tutto ciò che serve è creare un filtro in wp_get_archives();modo che accetti il post_typeparametro:

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

quindi chiama questo:

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

Ogni volta che si desidera visualizzare l'archivio per tipo di post personalizzato, basta passare gli arg post_type:

$args = array(
    'post_type'    => 'your_custom_post_type',
    'type'         => 'monthly',
    'echo'         => 0
);
echo '<ul>'.wp_get_archives($args).'</ul>';

3
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 si passa al mese per l'intero sito, non per il CPT.
jerclarke,

Dopo alcuni scavi (vedi la risposta di Tom Nowell di seguito), ho rinunciato agli archivi mensili per i tipi di post personalizzati. Invece, ho usato una categoria post e ho cambiato la mia struttura permalink in /%category%/%year%/%monthnum%/%postname%/. Quindi, potrebbe essere possibile utilizzare un hook simile a quello sopra, per modificare i collegamenti per iniziare /%category%/anziché solo la data.
Kevin C.

Domanda su questo Questo crea URL come: mysite.com/2013/04ma questo porta a un 404. Il tipo di post personalizzato è disponibile su: il mysite.com/catsche mi fa pensare che mysite.com/cats/2013/04sarebbe quello che dovrebbe essere il link, ma questo si risolve anche in un 404. Come si fa a far funzionare i link di archivio?
gaoshan88,

2
Ancora meglio, c'è finalmente un plugin per gestire questa funzionalità mancante in WordPress. È stato creato da un collaboratore principale che cerca di risolvere questo problema nel core. Il plug-in viene fornito per farci capire fino a quando il problema non viene risolto correttamente nel core. wordpress.org/plugins/archives-for-custom-post-types
Trevor

6

No, la linea ufficiale degli sviluppatori di Wordpress era che i tipi di post personalizzati non erano destinati a svolgere il normale lavoro dei normali post e che se hai bisogno di archivi di date, ecc., Allora non stai facendo le cose correttamente, e stai meglio usando i formati di post ecc.

I tipi di post personalizzati sono destinati ad applicazioni web ecc., Mentre fare qualcosa come impostare un tipo di post personalizzato che funge da blog secondario o parallelo con un nome diverso, ad esempio blog vs notizie, con le stesse capacità, non è ciò che la funzionalità era inteso e significherebbe altri problemi tecnici derivanti dalla sua attuazione.

Se insisti ancora su questo, e semplicemente usare tassonomie personalizzate e formati di post non è abbastanza, potresti aggiungere regole di riscrittura in funzioni.php e reindirizzare archivi anno / mese in determinati URL alla pagina di archivio dei post, quindi controllare la personalizzazione pubblica la pagina di archivio se hai specificato le variabili nelle regole di riscrittura e carica un modello diverso, assicurandoti nelle regole di riscrittura di impostare i valori appropriati.


Sembra un po 'strano che andrebbero così lontano con questa funzionalità. Potete darmi un esempio di come utilizzare i post personalizzati?
Dan Lee,

I post personalizzati devono essere utilizzati per tutto ciò che non rientra nell'ambito delle pagine e dei post di blog (o post di blog con un nome diverso ma che funzionano allo stesso modo, ad esempio articoli / notizie / diario / ecc.) Esempi di usi corretti dei post personalizzati includono : eventi, menu, posizioni, moduli, registri, ecc.
Tom J Nowell

I post personalizzati sono fondamentalmente il mezzo per produrre app Web, non sono i mezzi per duplicare il menu dei post nel backend per una modifica più semplice (e un tale uso renderebbe Wordpress molto più lento e sarebbe più un compito di quanto pensiate di fare)
Tom J Nowell

1
UUUUUgh. Questa è la risposta corretta alla domanda tragicamente. Non riesco a credere che la spiegazione di cui sopra sia basata su "non dovremmo avere gli URL di data per i CPT", ma è quasi sicuramente "Gli URL di data per i CPT sono troppo complicati" che sta guidando l'effettiva decisione di non implementare. CHIARAMENTE ci sono casi in cui le persone vorrebbero archivi di date per un tipo di post personalizzato, non puoi far sparire quell'ovvio desiderio indicando i formati dei post.
jerclarke,

1
Devo dissentire fortemente. I tipi di post personalizzati sono pensati per essere utilizzati per qualsiasi cosa tu voglia che vengano utilizzati, in nessun punto del Codice si dice che siano per "app web". Inoltre, potresti aver bisogno di una sezione "notizie" che ha la sua tassonomia personalizzata e vorresti archivi per quelli. O anche il tipo di "eventi" suggerito, che concordo, è un uso perfetto per i CPT, ma anche quelli facilmente potrebbero aver bisogno di archivi basati sulla data.
Trevor,

5

MODIFICA -> mentre questa risposta funziona ancora per <WP4.4, poiché il supporto 4.4 per i tipi di posta personalizzati è ora incluso inwp_get_archives()


C'è finalmente una soluzione semplice, veloce e facile per gli archivi basati sulla data dei tipi di messaggi personalizzati in WordPress! Questo è stato un problema di vecchia data che è stato registrato qui nel WP Core Trac.

Deve ancora essere risolto, ma uno dei collaboratori di Trac ha pubblicato un semplice plug-in in GitHub che ti permetterà di avere archivi basati sulla data per i CPT.

Dopo aver installato questo plug-in o aver aggiunto manualmente il codice per le tue funzioni, dovresti utilizzare gli archivi per CPT in quanto tali:

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

Nota che questa nuova funzione wp_get_archives_cptfunziona allo stesso modo dello standard, wp_get_archivesquindi puoi usare qualsiasi argomento normale che accetta. Tuttavia, aggiunge semplicemente la possibilità di essere in grado di aggiungere un argomento del nome del tipo di post personalizzato.


2

Scarsa reputazione per aggiungere questo alla risposta di taiken.

Tuttavia, ho voluto aggiungere che la sua risposta ha funzionato per me, tuttavia i collegamenti erano nel formato "localhost / date / 2010". Mentre avevo bisogno del formato "localhost / postslug / 2010". Sono stato in grado di risolvere questo problema utilizzando una sostituzione di stringa sull'output di wp_get_archives.

Quindi, a seconda di come sono impostati i permalink, questo codice risolverà il problema 404 e reindirizzerà i collegamenti alla struttura permalink personalizzata del tipo di post:

$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);

1

Non posso aggiungere al post di Takien, quindi ecco cosa ho finito per 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) { // however you determine what archive you want
        $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'));

Vedi la sua è la tua prima risposta. Solo un suggerimento per rispondere alle domande, non solo aggiungere codice o per quel motivo collegamenti. Sebbene il tuo codice possa funzionare, è sempre bello sapere cosa fa il tuo codice e perché dovrebbe funzionare. Altrimenti la tua risposta è ben formattata. +1 per quello
Pieter Goosen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.