Це здається дурним питанням. Але я не можу цього зрозуміти :(
Мені потрібно відобразити вдома кнопку, яка переходить до спеціальної URL-адреси архіву post_type (archive- {post_type} .php). Як це зробити?
Це здається дурним питанням. Але я не можу цього зрозуміти :(
Мені потрібно відобразити вдома кнопку, яка переходить до спеціальної URL-адреси архіву post_type (archive- {post_type} .php). Як це зробити?
Відповіді:
Привіт @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 може бачити, хоча, ймовірно, буде працювати для будь-якого конкретного сайту.
Це також чудова річ, яку я можу запропонувати додати до WordPress через trac, що, думаю, я зроблю пізніше цього вечора.
коли ви реєструєте тип публікації, ви можете передати рядок як slug з параметром "has_archive" і переконайтесь, що ви також встановили перезапис на true або масив, але не false, і тоді ваша URL-адреса архіву CPT буде http://www.YOURDOMAIN.com / has_archive_slug, наприклад
якщо ви встановите у своєму регістровому_типі наприклад:
$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/
'rewrite'
приймає лише булеве значення або значення масиву. Замість того, щоб 'rewrite' => 'product',
ви перерахували, це натомість має бути 'rewrite' => array( 'slug' => 'product' ),
.
yoursite.com/type-slug
якщо ви прямо не встановили його на щось інше, наприклад.yoursite.com/some-other-url
..