Получить URL архива для произвольного типа записей

9 мар. 2011 г., 00:49:05
Просмотры: 42.9K
Голосов: 30

Кажется глупым вопросом. Но я не могу разобраться :(.

Мне нужно отобразить кнопку на главной странице, которая ведет на URL архива произвольного типа записей (archive-{post_type}.php). Как это сделать?

2
Комментарии

Какую кнопку использовать, добавить её в навигационное меню или просто общую ссылку? URL архива обычно выглядит как вашсайт.com/type-slug, если вы явно не задали другой, например вашсайт.com/другой-url.

t31os t31os
9 мар. 2011 г. 01:30:25

@t31os: да, сейчас я жёстко прописал это в коде. Но скоро изменю, используя код от @Mike.

ariefbayu ariefbayu
9 мар. 2011 г. 01:51:25
Все ответы на вопрос 2
7
30

Привет @Silent:

Оказывается, в WordPress 3.1 есть функция, которая делает именно то, что вам нужно, и называется она get_post_type_archive_link(); вот как её можно использовать (предполагая пользовательский тип записи с именем 'product'):

<a href="<?php echo get_post_type_archive_link('product'); ?>">Продукты</a>

Ниже приведён мой предыдущий ответ, до того как я обнаружил, что в WordPress действительно есть встроенная функция для этого случая.

Предыдущий ответ:

Если я не пропустил что-то в исходном коде WordPress 3.1, думаю, вам нужна функция типа get_archive_link(), которую можно вызвать так (предполагая пользовательский тип записи с именем 'product'):

<a href="<?php echo get_archive_link('product'); ?>">Продукты</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, но, вероятно, он будет работать для любого конкретного сайта.

Это также отличная идея для предложения добавления в WordPress через trac, что я, думаю, сделаю позже вечером.

9 мар. 2011 г. 01:42:39
Комментарии

Кстати, когда отправишь трак, можешь, пожалуйста, прикрепить ссылку здесь.

ariefbayu ariefbayu
9 мар. 2011 г. 01:52:30

@silent - Да, конечно.

MikeSchinkel MikeSchinkel
9 мар. 2011 г. 01:59:27

@Mike - Я бы написал что-то похожее, если бы ты не сделал этого.... ;) Мне было интересно, это ли имел в виду @silent, но упоминание кнопки заставило меня думать о другом..

t31os t31os
9 мар. 2011 г. 02:00:54

@t31os - Я как раз работал над такой же логикой на выходных для своего плагина маршрутизации URL, так что у меня было преимущество. :) Что касается кнопки, может ты добавишь ответ по этому поводу?

MikeSchinkel MikeSchinkel
9 мар. 2011 г. 02:08:22

Не уверен, что тут осталось что-то добавить, думаю твоя функция выше полностью покрывает вопрос... :)

t31os t31os
9 мар. 2011 г. 02:13:49

не обращай внимания на кнопку. Это просто обычный тег 'a' ;)

ariefbayu ariefbayu
9 мар. 2011 г. 03:34:42

@silent - Оказывается, в WordPress уже есть нужная функция: get_post_type_archive_link(); я обновил свой ответ.

MikeSchinkel MikeSchinkel
9 мар. 2011 г. 06:30:01
Показать остальные 2 комментариев
2
12

При регистрации типа записи вы можете передать строку в качестве slug в параметре "has_archive" и убедиться, что вы также установили rewrite либо в true, либо в массив, но не в false.

Тогда URL архива вашего CPT будет выглядеть как 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);

Тогда URL одиночной записи будет: http://www.YOURDOMAIN.com/product/postName а URL архива: http://www.YOURDOMAIN.com/products/

9 мар. 2011 г. 01:44:12
Комментарии

Ура. Я всегда думал, что has_archive принимает только булево значение, но теперь я знаю, что можно передать строку, и мой единичный тип записей recipe может иметь множественный слаг /recipes/

Astrotim Astrotim
17 дек. 2014 г. 02:30:26

Не помню, когда они внесли это изменение или всегда была ошибка, но в 2017 году 'rewrite' принимает только булево значение или массив. Вместо указанного вами варианта 'rewrite' => 'product', должно быть 'rewrite' => array( 'slug' => 'product' ),.

Mike Mike
15 нояб. 2017 г. 03:24:27