Ottenere l'URL dell'archivio di un custom post_type
Sembra una domanda stupida, ma non riesco a trovare la soluzione :(.
Ho bisogno di visualizzare un pulsante nella home che porta all'URL dell'archivio di un custom post_type (archive-{post_type}.php). Come posso farlo?

Ciao @Silent:
Si scopre che esiste una funzione in WordPress 3.1 che fa esattamente ciò che desideri e si chiama get_post_type_archive_link()
; ecco come la chiameresti (assumendo un custom post type chiamato 'product'
):
<a href="<?php echo get_post_type_archive_link('product'); ?>">Prodotti</a>
Di seguito la mia risposta precedente, prima di scoprire che WordPress aveva effettivamente una funzione integrata per questo caso d'uso.
Risposta Precedente:
A meno che non abbia trascurato qualcosa nel codice sorgente di WordPress 3.1, penso che tu stia cercando una funzione come get_archive_link()
che potresti chiamare così (assumendo un custom post type chiamato 'product'
):
<a href="<?php echo get_archive_link('product'); ?>">Prodotti</a>
Ed ecco il codice sorgente che puoi inserire nel file function.php
del tuo tema o in un file .php
per un plugin che potresti scrivere:
if (!function_exists('get_archive_link')) {
function get_archive_link( $post_type ) {
global $wp_post_types;
$archive_link = false;
if (isset($wp_post_types[$post_type])) {
$wp_post_type = $wp_post_types[$post_type];
if ($wp_post_type->publicly_queryable)
if ($wp_post_type->has_archive && $wp_post_type->has_archive!==true)
$slug = $wp_post_type->has_archive;
else if (isset($wp_post_type->rewrite['slug']))
$slug = $wp_post_type->rewrite['slug'];
else
$slug = $post_type;
$archive_link = get_option( 'siteurl' ) . "/{$slug}/";
}
return apply_filters( 'archive_link', $archive_link, $post_type );
}
}
In realtà stavo lavorando su questa logica proprio durante il weekend, anche se non sono ancora sicuro al 100% che l'ordine della logica sia universalmente corretto per tutti i casi d'uso che WordPress potrebbe incontrare, sebbene probabilmente funzionerà per qualsiasi sito specifico.
Questa è anche una grande funzionalità da suggerire per l'aggiunta a WordPress tramite trac, cosa che penso di fare più tardi questa sera.

@Mike - Avrei scritto qualcosa di simile se non l'avessi fatto tu... ;) Mi chiedevo se fosse questo ciò che @silent aveva in mente, ma il riferimento a un pulsante mi ha fatto pensare a qualcos'altro..

@t31os - Stavo lavorando sulla stessa logica questo weekend per il mio plugin di routing degli URL, quindi avevo un vantaggio. :) Per quanto riguarda il pulsante, potresti aggiungere una risposta per affrontare quel punto?

Non sono sicuro che ci sia altro da dire, penso che la tua funzione sopra copra quanto richiesto... :)

quando registri un post type puoi passare una stringa come slug con il parametro "has_archive" e assicurati di impostare anche rewrite a true o a un array ma non a false e quindi l'URL dell'archivio del tuo CPT sarebbe http://www.YOURDOMAIN.com/has_archive_slug per esempio
se imposti nel tuo register_post_type per esempio:
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => 'product',
'capability_type' => 'post',
'has_archive' => 'products',
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title','editor','author','thumbnail','excerpt','comments')
);
register_post_type('product',$args);
allora il tuo URL singolo sarà: http://www.YOURDOMAIN.com/product/nomePost e il tuo URL archivio sarà: http://www.YOURDOMAIN.com/products/

Evviva. Pensavo sempre che has_archive
fosse un booleano, ma ora so che può ricevere una stringa, quindi il mio custom post type singolare recipe
può avere uno slug plurale /recipes/
