Obtenez l'URL d'archive de post_type personnalisé

26

Cela semble être une question stupide. Mais, je ne peux pas le comprendre :(.

J'ai besoin d'afficher un bouton à la maison qui va à l'URL d'archive de post_type personnalisé (archive- {post_type} .php). Comment je fais ça?

ariefbayu
la source
Quel type de bouton, en ajouter un à un menu de navigation ou simplement un lien générique? L'URL de l'archive est généralement yoursite.com/type-slugsauf si vous la définissez explicitement sur autre chose, par exemple. yoursite.com/some-other-url..
t31os
@ t31os: yup, en ce moment, je l'ai codé en dur comme ça. Mais, le changera bientôt en utilisant le code de @ Mike.
ariefbayu

Réponses:

25

Salut @ Silent:

Il s'avère qu'il y a une fonction dans WordPress 3.1 qui fait exactement ce que vous voulez et elle est nommée get_post_type_archive_link(); voici comment vous l'appeleriez (en supposant un type de publication personnalisé nommé 'product'):

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

Ci-dessous est ma réponse précédente avant de découvrir que WordPress avait en effet une fonction intégrée pour ce cas d'utilisation.

Réponse précédente:

À moins d'avoir oublié quelque chose dans le code source principal de WordPress 3.1, je pense que vous recherchez une fonction comme celle get_archive_link()que vous pourriez appeler comme ceci (en supposant un type de publication personnalisé nommé 'product'):

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

Et voici le code source que vous pouvez placer dans le function.phpfichier de votre thème ou dans un .phpfichier pour un plugin que vous pourriez écrire:

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

Je travaillais en fait sur cette logique exacte au cours du week-end, bien que je ne sois pas encore sûr à 100% que l'ordre de la logique est générique dans tous les cas d'utilisation que WordPress pourrait voir, bien qu'il fonctionnera probablement pour n'importe quel site spécifique.

C'est aussi une bonne chose à suggérer d'être ajouté à WordPress via trac, ce que je pense que je ferai plus tard ce soir.

MikeSchinkel
la source
btw, lorsque vous soumettez le trac, pouvez-vous le lier ici.
ariefbayu
@silent - Oui, bien sûr.
MikeSchinkel
@Mike - J'aurais écrit quelque chose de similaire si tu n'avais pas ....;) Je me demandais si c'était ce que @silent avait en tête, mais la mention d'un bouton me faisait penser à autre chose ..
t31os
@ t31os - Je travaillais sur la même logique ce week-end pour mon plugin de routage d'URL, j'ai donc eu une longueur d'avance. :) Quant au bouton, pourriez-vous ajouter une réponse pour y remédier?
MikeSchinkel
Je ne suis pas vraiment sûr qu'il reste quelque chose à couvrir, je pense que votre fonction ci-dessus couvre ce qui a été demandé ... :)
t31os
12

lorsque vous enregistrez le type de publication, vous pouvez passer une chaîne en tant que slug avec le paramètre "has_archive" et assurez-vous que vous définissez également la réécriture sur true ou un tableau mais pas false, puis l'URL de votre archive CPT serait http://www.YOURDOMAIN.com / has_archive_slug par exemple

si vous définissez par exemple votre 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);

alors votre URL unique est: http://www.YOURDOMAIN.com/product/postName et votre URL d'archive est: http://www.YOURDOMAIN.com/products/

Bainternet
la source
3
Hourra. J'avais toujours pensé que has_archivec'était un booléen, mais maintenant je sais qu'on peut lui donner une chaîne, donc mon type de message personnalisé recipepeut avoir un slug pluriel/recipes/
Astrotim
Je ne me souviens pas si / quand ils ont fait le changement ou si c'était toujours une erreur, mais en 2017 'rewrite'n'accepte qu'une valeur booléenne ou tableau. Plutôt que celui que 'rewrite' => 'product',vous avez énuméré, il devrait plutôt l'être 'rewrite' => array( 'slug' => 'product' ),.
Mike