Ottieni l'URL dell'archivio post_type personalizzato


26

Sembra una domanda stupida. Ma non riesco a capirlo :(.

Devo visualizzare il pulsante a casa che va all'URL dell'archivio post_type personalizzato (archive- {post_type} .php). Come lo faccio?


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

@ t31os: sì, proprio ora, l'ho codificato in quel modo. Ma presto lo cambierò usando il codice di @ Mike.
ariefbayu

Risposte:


25

Ciao @Silent:

Si scopre che c'è una funzione in WordPress 3.1 che fa esattamente quello che vuoi e che ha il nome get_post_type_archive_link(); ecco come lo chiameresti (assumendo un tipo di post personalizzato chiamato 'product'):

<a href="<?php echo get_post_type_archive_link('product'); ?>">Products</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 principale per WordPress 3.1, penso che tu stia cercando una funzione come quella get_archive_link()che potresti chiamare in questo modo (assumendo un tipo di post personalizzato chiamato 'product'):

<a href="<?php echo get_archive_link('product'); ?>">Products</a>

Ed ecco il codice sorgente che puoi inserire nel function.phpfile del tuo tema o in un .phpfile 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 esatta durante il fine settimana, anche se non sono ancora sicuro al 100% dell'ordine della logica sia genericamente corretto in tutti i casi d'uso che WordPress potrebbe vedere, anche se probabilmente funzionerà per qualsiasi sito specifico.

Questa è anche un'ottima cosa da suggerire per essere aggiunta a WordPress tramite trac che penso che farò più tardi questa sera.


a proposito, quando invii il trac, puoi per favore, collegarlo qui.
ariefbayu

@silent - Sì, certo.
MikeSchinkel,

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

@ t31os - Stavo lavorando sulla stessa logica questo fine settimana per il mio plug-in di routing URL, quindi ho avuto un vantaggio. :) Per quanto riguarda il pulsante, potresti aggiungere una risposta per risolverlo?
MikeSchinkel,

Non sono davvero sicuro che ci sia ancora qualcosa da coprire, penso che la tua funzione sopra copra ciò che è stato chiesto ... :)
t31os

12

quando registri il tipo di post puoi passare una stringa come lumaca con il parametro "has_archive" e assicurarti di impostare anche la riscrittura su true o su un array ma non su false e quindi l'URL dell'archivio CPT sarà http://www.YOURDOMAIN.com / has_archive_slug per esempio

se si imposta ad esempio register_post_type:

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

quindi il tuo unico URL è: http://www.YOURDOMAIN.com/product/postName e il tuo URL di archivio è: http://www.YOURDOMAIN.com/products/


3
Evviva. Avevo sempre pensato che has_archivefosse un booleano, ma ora so che può essere data una stringa, quindi il mio tipo di post personalizzato recipepuò avere una lumaca plurale/recipes/
Astrotim

Non ricordo se / quando hanno effettuato il passaggio o se questo è sempre stato un errore, ma nel 2017 'rewrite'accetta solo un valore booleano o array. Invece di quello 'rewrite' => 'product',che hai elencato, dovrebbe essere invece 'rewrite' => array( 'slug' => 'product' ),.
Mike,
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.