Dapatkan URL arsip post_type khusus

26

Sepertinya pertanyaan bodoh. Tapi, saya tidak tahu :(.

Saya perlu menampilkan tombol di rumah yang menuju ke URL arsip post_type khusus (archive- {post_type} .php). Bagaimana aku melakukan itu?

ariefbayu
sumber
Tombol apa, tambahkan satu ke menu nav, atau hanya tautan umum? URL arsip umumnya yoursite.com/type-slugkecuali Anda secara eksplisit mengaturnya ke sesuatu yang lain, misalnya. yoursite.com/some-other-url..
t31os
@ t31os: yup, sekarang, saya hardcodenya seperti itu. Tapi, akan segera mengubahnya menggunakan kode @ Mike.
ariefbayu

Jawaban:

25

Hai @Silent:

Ternyata ada fungsi di WordPress 3.1 yang melakukan persis apa yang Anda inginkan dan namanya get_post_type_archive_link(); begini cara Anda menyebutnya (dengan asumsi jenis pos khusus bernama 'product'):

<a href="<?php echo get_post_type_archive_link('product'); ?>">Products</a>

Di bawah ini adalah jawaban saya sebelumnya sebelum saya menemukan bahwa WordPress memang memiliki fungsi bawaan untuk use case ini.

Jawaban sebelumnya:

Kecuali saya mengabaikan sesuatu dalam kode sumber inti untuk WordPress 3.1 Saya pikir Anda mencari fungsi seperti get_archive_link()yang Anda sebut seperti ini (dengan asumsi jenis posting kustom bernama 'product'):

<a href="<?php echo get_archive_link('product'); ?>">Products</a>

Dan inilah kode sumber yang dapat Anda tempatkan ke function.phpfile tema Anda atau dalam .phpfile untuk plugin yang mungkin Anda tulis:

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 );
  }
}

Saya benar-benar bekerja pada logika yang tepat ini selama akhir pekan meskipun saya belum 100% yakin bahwa urutan logika secara umum benar di semua kasus penggunaan yang mungkin dilihat oleh WordPress meskipun mungkin akan bekerja untuk situs tertentu.

Ini juga merupakan hal yang bagus untuk disarankan ditambahkan ke WordPress melalui trac yang saya pikir akan saya lakukan nanti malam.

MikeSchinkel
sumber
btw, saat Anda mengirimkan trac, tolong, tautkan di sini.
ariefbayu
@silent - Ya, tentu saja.
MikeSchinkel
@ Mike - Saya akan menulis sesuatu yang serupa jika Anda tidak ....;) Saya bertanya-tanya apakah ini yang ada dalam pikiran @silent, tetapi menyebutkan tombol membuat saya memikirkan sesuatu yang lain ..
t31os
@ t31os - Saya sedang mengerjakan logika yang sama akhir pekan ini untuk plugin perutean URL saya, jadi saya sudah memulai. :) Adapun tombol, Anda bisa menambahkan jawaban ke alamat itu?
MikeSchinkel
Saya tidak begitu yakin ada yang tersisa untuk dibahas, saya pikir fungsi Anda di atas mencakup apa yang diminta ... :)
t31os
12

ketika Anda mendaftarkan jenis posting, Anda dapat meneruskan string sebagai siput dengan parameter "has_archive" dan pastikan Anda juga mengatur penulisan ulang menjadi true atau array tetapi tidak false dan kemudian URL arsip CPT Anda akan menjadi http://www.YOURDOMAIN.com / has_archive_slug misalnya

jika Anda mengatur register_post_type Anda misalnya:

$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);

maka url tunggal Anda adalah: http://www.YOURDOMAIN.com/product/postName dan url arsip Anda adalah: http://www.YOURDOMAIN.com/products/

Bainternet
sumber
3
Hore. Saya selalu berpikir has_archiveitu boolean, tapi sekarang saya tahu itu bisa diberikan string, jadi tipe posting khusus tunggal saya recipedapat memiliki siput jamak/recipes/
Astrotim
Saya tidak ingat apakah / ketika mereka beralih atau jika ini selalu salah, tetapi pada 2017 'rewrite'hanya menerima nilai boolean atau array. Daripada yang 'rewrite' => 'product',telah Anda daftarkan, itu seharusnya 'rewrite' => array( 'slug' => 'product' ),.
Mike