Uzyskaj niestandardowy adres URL archiwum typu post_type

26

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ć?

ariefbayu
źródło
Jaki rodzaj przycisku, dodaj go do menu nawigacyjnego lub zwykły link? Adres URL archiwum jest na ogół, yoursite.com/type-slugchyba że wyraźnie ustawisz go na coś innego, np. yoursite.com/some-other-url..
t31os
@ t31os: tak, właśnie teraz tak to zakodowałem. Ale wkrótce to zmieni za pomocą kodu @ Mike'a.
ariefbayu

Odpowiedzi:

25

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.

Wcześniejsza odpowiedź:

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.phppliku motywu lub w .phppliku 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.

MikeSchinkel
źródło
btw, kiedy przesyłasz trac, czy możesz, proszę link tutaj.
ariefbayu
@silent - Tak, oczywiście.
MikeSchinkel,
@Mike - napisałbym coś podobnego, gdybyś nie zrobił ...;) Zastanawiałem się, czy właśnie to miał na myśli @silent, ale wzmianka o przycisku kazała mi myśleć o czymś innym ...
t31os
@ t31os - Pracowałem nad tą samą logiką w ten weekend dla mojej wtyczki do routingu adresów URL, więc miałem przewagę. :) Jeśli chodzi o przycisk, możesz dodać odpowiedź, aby rozwiązać ten problem?
MikeSchinkel
Nie jestem do końca pewien, czy zostało coś do zakrycia, myślę, że powyższa funkcja obejmuje to, o co poproszono ... :)
t31os
12

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/

Bainternet
źródło
3
Brawo. Zawsze myślałem, że has_archiveto boolean, ale teraz wiem, że można mu podać ciąg, więc mój szczególny typ niestandardowego postu recipemoże mieć liczbę mnogą/recipes/
Astrotim,
Nie pamiętam, czy / kiedy dokonali zmiany, czy też zawsze był to błąd, ale w 2017 roku 'rewrite'akceptuje tylko wartość logiczną lub tablicę. Zamiast 'rewrite' => 'product',wymienionych, powinno być 'rewrite' => array( 'slug' => 'product' ),.
Mike