Get custom post_type’s archive URL

Hi @Silent:

Turns out there is a function in WordPress 3.1 that does exactly what you want and it is named get_post_type_archive_link(); here’s how you’d call it (assuming a custom post type named 'product'):

<a href="https://wordpress.stackexchange.com/questions/11531/<?php echo get_post_type_archive_link("product'); ?>">Products</a>

Below is my prior answer before I discovered that WordPress did indeed have a function built-in for this use case.

Prior Answer:

Unless I overlooked something in the core source code for WordPress 3.1 I think you are looking for a function like get_archive_link() which you might call like this (assuming a custom post type named 'product'):

<a href="https://wordpress.stackexchange.com/questions/11531/<?php echo get_archive_link("product'); ?>">Products</a>

And here’s the source code which you can place into your theme’s function.php file or in a .php file for a plugin you might be writing:

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

I was actually working on this exact logic over the weekend although I’m not yet 100% sure the order of the logic is generically correct across all use-cases that WordPress might see although it will probably work for any specific site.

This is also a great thing to suggest be added to WordPress via trac which I think I will do later this evening.

Leave a Comment