To wydaje się głupie pytanie. Ale nie mogę tego rozgryźć :(.
Muszę wyświetlić w domu przycisk, który prowadzi do niestandardowego adresu URL archiwum post_type (archive- {post_type} .php). W jaki sposób mogę to zrobić?
To wydaje się głupie pytanie. Ale nie mogę tego rozgryźć :(.
Muszę wyświetlić w domu przycisk, który prowadzi do niestandardowego adresu URL archiwum post_type (archive- {post_type} .php). W jaki sposób mogę to zrobić?
Odpowiedzi:
Cześć @Silent:
Okazuje się, że w WordPress 3.1 jest funkcja, która robi dokładnie to, co chcesz i ma nazwę get_post_type_archive_link()
; oto jak byś to nazwał (zakładając niestandardowy typ wpisu o nazwie 'product'
):
<a href="<?php echo get_post_type_archive_link('product'); ?>">Products</a>
Poniżej moja poprzednia odpowiedź, zanim odkryłem, że WordPress rzeczywiście ma wbudowaną funkcję dla tego przypadku użycia.
Chyba że przeoczyłem coś w podstawowym kodzie źródłowym WordPressa 3.1. Myślę, że szukasz funkcji, get_archive_link()
którą możesz wywołać w ten sposób (zakładając niestandardowy typ wpisu o nazwie 'product'
):
<a href="<?php echo get_archive_link('product'); ?>">Products</a>
A oto kod źródłowy, który możesz umieścić w function.php
pliku motywu lub w .php
pliku wtyczki, którą możesz pisać:
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 );
}
}
Właściwie pracowałem nad tą dokładną logiką przez weekend, chociaż nie jestem jeszcze w 100% pewien, że kolejność logiki jest ogólnie poprawna we wszystkich przypadkach użycia, które może zobaczyć WordPress, chociaż prawdopodobnie będzie działać dla dowolnej konkretnej strony.
Jest to również świetna rzecz, którą można zasugerować, aby dodać ją do WordPressa przez trac, co myślę, że zrobię później tego wieczoru.
po zarejestrowaniu typu postu możesz przekazać ciąg jako ślimak z parametrem „has_archive” i upewnij się, że ustawiłeś przepisanie na true lub tablicę, ale nie fałsz, a wtedy adres URL archiwum CPT to http://www.YOURDOMAIN.com Na przykład / has_archive_slug
jeśli ustawisz na przykład swój typ_postu:
$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);
Twój pojedynczy adres URL to: http://www.YOURDOMAIN.com/product/postName, a adres URL archiwum to: http://www.YOURDOMAIN.com/products/
has_archive
to boolean, ale teraz wiem, że można mu podać ciąg, więc mój szczególny typ niestandardowego postu recipe
może mieć liczbę mnogą/recipes/
'rewrite'
akceptuje tylko wartość logiczną lub tablicę. Zamiast 'rewrite' => 'product',
wymienionych, powinno być 'rewrite' => array( 'slug' => 'product' ),
.
yoursite.com/type-slug
chyba że wyraźnie ustawisz go na coś innego, np.yoursite.com/some-other-url
..