获取自定义post_type的存档URL


26

看来是愚蠢的问题。但是,我不知道:(。

我需要在家中显示用于转到自定义post_type的存档URL(archive- {post_type} .php)的按钮。我怎么做?


什么样的按钮,将其添加到导航菜单,还是仅添加通用链接?yoursite.com/type-slug除非您明确将存档URL 设置为其他内容,否则通常为存档URL 。yoursite.com/some-other-url..
t31os 2011年

@ t31os:是的,现在,我像这样对它进行了硬编码。但是,很快将使用@Mike的代码对其进行更改。
ariefbayu

Answers:


25

@Silent:

事实证明WordPress 3.1中有一个功能可以完全满足您的要求,并被命名为get_post_type_archive_link();这是您的称呼方式(假设名为的自定义帖子类型'product'):

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

在发现WordPress确实具有此用例的内置功能之前,以下是我的先前回答。

事先的答案:

除非我忽略了WordPress 3.1的核心源代码中的某些内容,否则我认为您正在寻找一个可以像get_archive_link()这样调用的函数(假设名为的自定义帖子类型'product'):

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

这是源代码,您可以将其放入主题function.php文件或.php您可能正在编写的插件文件中:

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

尽管实际上我还不能100%地确定WordPress可能会在所有用例中使用的逻辑正确,但我仍在100%地确定该逻辑的顺序是正确的,尽管它可能适用于任何特定站点。

建议通过trac将其添加到WordPress,这也是一件好事,我想我会在今天晚些时候做。


顺便说一句,当您提交笔迹时,可以请在这里链接。
ariefbayu

@silent-是的,当然。
MikeSchinkel 2011年

@Mike -我已经写了类似的东西,如果你有没有......)我在想,如果这是@silent脑子里想的,但一个按钮提到了我想别的事..
t31os

@ t31os-这个周末我为URL路由插件使用了相同的逻辑,所以我有了一个开端。:)至于按钮,您可以添加一个答案来解决这个问题?
MikeSchinkel 2011年

我不太确定还有什么要掩盖的,我想您的上述功能可以解决所要求的内容... :)
t31os 2011年

12

当您注册帖子类型时,您可以使用“ has_archive”参数将字符串作为子句传递,并确保您还将rewrite设置为true或数组,但不能设置为false,然后CPT存档URL将为http://www.YOURDOMAIN.com / has_archive_slug例如

例如,如果您在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);

那么您的单个网址是:http : //www.YOURDOMAIN.com/product/postName, 而您的存档网址是:http : //www.YOURDOMAIN.com/products/


3
万岁。我一直以为has_archive是布尔值,但是现在我知道可以给它一个字符串,所以我的单数自定义帖子类型recipe可以有一个复数形式/recipes/
Astrotim 2014年

我不记得他们是否/何时进行切换,或者是否总是出错,但在2017 'rewrite'年仅接受布尔值或数组值。而不是'rewrite' => 'product',您列出的清单,应该改为'rewrite' => array( 'slug' => 'product' ),
迈克(Mike)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.