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.