web-dev-qa-db-fra.com

Obtenir l'URL d'archive personnalisée de post_type

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

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

25
ariefbayu

Bonjour @Silent:

Il se trouve qu'il existe une fonction dans WordPress 3.1 qui fait exactement ce que vous voulez et qui s'appelle get_post_type_archive_link(); voici comment vous l'appelleriez (en supposant un type d'article personnalisé nommé 'product'):

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

Voici ma réponse précédente avant de découvrir que WordPress possédait bien une fonction intégrée pour ce cas d'utilisation.

Réponse précédente:

Sauf si j'ai oublié quelque chose dans le code source principal de WordPress 3.1, je pense que vous recherchez une fonction telle que get_archive_link() que vous pourriez appeler comme ceci (en supposant un type d'article personnalisé nommé 'product'):

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

Et voici le code source que vous pouvez placer dans le fichier function.php de votre thème ou dans un fichier .php pour un plug-in que vous écrivez peut-être:

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

En fait, je travaillais sur cette logique exacte ce week-end, même si je ne suis pas encore sûr à 100% que l'ordre de la logique est génériquement correct dans tous les cas d'utilisation que WordPress pourrait voir, bien que cela fonctionnera probablement pour un site spécifique.

C’est aussi une bonne chose de suggérer d’être ajouté à WordPress viatrac, ce que je pense faire plus tard dans la soirée.

25
MikeSchinkel

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

si vous définissez dans votre register_post_type par exemple:

$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 l'URL de votre archive est: http://www.YOURDOMAIN.com/products/

12
Bainternet