Özel post_type'nin arşiv URL'sini al


26

Aptalca bir soru gibi görünüyor. Fakat çözemiyorum :(.

Özel post_type'nin arşiv URL'sine (arşiv- {post_type} .php) giden evde düğmeyi görüntülemem gerekiyor. Bunu nasıl yaparım?


Ne tür bir düğme, bir gezinti menüsüne bir tane ekleme veya yalnızca genel bir bağlantı mı? Arşiv URL'si genellikle yoursite.com/type-slugaçıkça başka bir şeye ayarlamadıysanız, örn. yoursite.com/some-other-url..
t31os

@ t31os: evet, şimdi, böyle kodladım. Ancak, yakında @ Mike kodunu kullanarak bunu değiştirecek.
ariefbayu

Yanıtlar:


25

Merhaba @Silent:

WordPress 3.1'de istediğinizi tam olarak yapan ve adlandırılan bir işlev olduğu ortaya çıkıyor get_post_type_archive_link(); İşte nasıl adlandırılacağını (adında özel bir yazı tipi varsayarsak 'product'):

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

Aşağıda WordPress'in bu kullanım durumu için yerleşik bir işlevi olduğunu keşfetmeden önceki cevabım.

Önceki cevap:

WordPress 3.1 için temel kaynak kodunda bir şey görmezden gelmediğim sürece, get_archive_link()şöyle adlandırabileceğiniz bir fonksiyon aradığınızı düşünüyorum (adında özel bir yazı tipi varsayarak 'product'):

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

Ve işte kendi function.phpdosyalarınızın içine ya .phpda yazdığınız bir eklenti için bir dosyaya yerleştirebileceğiniz kaynak kod :

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

Aslında hafta sonu boyunca tam olarak bu mantık üzerinde çalışıyordum, ancak WordPress'in muhtemelen herhangi bir site için çalışmasına rağmen görebileceği tüm kullanım durumlarında genel olarak mantığın sırasının% 100 olduğundan emin değilim.

Bu, WordPress'e bu akşam daha sonra yapacağımı düşündüğüm trac ile eklenmesini önermek için de harika bir şey .


btw, trac'i gönderdiğinde, lütfen buraya bağlayabilir misin?
ariefbayu

@silent - Evet, elbette.
MikeSchinkel

@Mike - Olmasaydı ben de benzer bir şey yazabilirdim ....;) Sessizce aklımda olanın bu olup olmadığını merak ediyordum, ama bir düğmeden bahsetmek başka bir şey düşünmemi
sağladı

@ t31os - Bu haftasonu URL yönlendirme eklentim için aynı mantık üzerinde çalışıyordum, bu yüzden bir başlangıç ​​yaptım. :) Düğme gelince, bu adrese bir cevap ekleyebilirsiniz?
MikeSchinkel

Pek emin şey kapağına orada kalan değilim, bence istendi ne yukarıdaki fonksiyon kapakları ... :)
t31os

12

Yazı tipini kaydettirirken "has_archive" parametresiyle sümüklü bir dize geçirebilir ve yeniden yazmayı doğru ya da bir dizi olarak ayarladığınızdan ancak yanlış olmadığından ve CPT arşiv URL’nizin http://www.YOURDOMAIN.com olacaktır. / has_archive_slug örneğin

register_post_type'nuzu örneğin ayarlarsanız:

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

o zaman tek URL'niz: http://www.YOURDOMAIN.com/product/postName ve arşiv adresiniz : http://www.YOURDOMAIN.com/products/


3
Yaşasın. Her zaman has_archivebir boolean olduğunu düşünmüştüm ama şimdi bir dize verilebileceğini biliyorum, bu yüzden tekil özel yazı recipe/recipes/
tipimde

Anahtarı yaptığında / ne zaman yaptığını veya her zaman hata yaptığını hatırlamıyorum, ancak 2017'de 'rewrite'yalnızca bir boole veya dizi değeri kabul ediyor. 'rewrite' => 'product',Sizin listelediğinizden ziyade , bunun yerine olmalı 'rewrite' => array( 'slug' => 'product' ),.
Mike
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.