Ottenere l'URL dell'archivio di un custom post_type

9 mar 2011, 00:49:05
Visualizzazioni: 42.9K
Voti: 30

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?

2
Commenti

Che tipo di pulsante, aggiungerne uno a un menu di navigazione o solo un link generico? L'URL dell'archivio è generalmente yoursite.com/type-slug a meno che non lo imposti esplicitamente su qualcos'altro, ad esempio yoursite.com/some-other-url..

t31os t31os
9 mar 2011 01:30:25

@t31os: sì, al momento l'ho hardcodato in quel modo. Ma presto lo cambierò usando il codice di @Mike.

ariefbayu ariefbayu
9 mar 2011 01:51:25
Tutte le risposte alla domanda 2
7
30

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.

9 mar 2011 01:42:39
Commenti

a proposito, quando invii il trac, potresti per favore linkarlo qui.

ariefbayu ariefbayu
9 mar 2011 01:52:30

@silent - Sì, certo.

MikeSchinkel MikeSchinkel
9 mar 2011 01:59:27

@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 t31os
9 mar 2011 02:00:54

@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?

MikeSchinkel MikeSchinkel
9 mar 2011 02:08:22

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

t31os t31os
9 mar 2011 02:13:49

non preoccuparti del pulsante. È semplicemente un tag 'a' ;)

ariefbayu ariefbayu
9 mar 2011 03:34:42

@silent - Sembra che WordPress avesse già la funzione necessaria: get_post_type_archive_link(); ho aggiornato la mia risposta.

MikeSchinkel MikeSchinkel
9 mar 2011 06:30:01
Mostra i restanti 2 commenti
2
12

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/

9 mar 2011 01:44:12
Commenti

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/

Astrotim Astrotim
17 dic 2014 02:30:26

Non ricordo se/quando abbiano fatto il cambiamento o se fosse sempre un errore, ma nel 2017 'rewrite' accetta solo un valore booleano o un array. Invece di 'rewrite' => 'product', che hai elencato, dovrebbe essere 'rewrite' => array( 'slug' => 'product' ),.

Mike Mike
15 nov 2017 03:24:27