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

Привет @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, что я, думаю, сделаю позже вечером.

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

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

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

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

При регистрации типа записи вы можете передать строку в качестве 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/

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