รับ URL เก็บถาวรของ post_type ที่กำหนดเอง


26

ดูเหมือนคำถามโง่ ๆ แต่ฉันไม่สามารถคิดออก :(

ฉันต้องแสดงปุ่มที่บ้านที่ไปที่ URL เก็บถาวรของ post_type (archive- {post_type} .php) ฉันจะทำอย่างไร


ปุ่มประเภทใดเพิ่มไปยังเมนู nav หรือเพียงแค่ลิงค์ทั่วไป? โดยทั่วไป URL ที่เก็บถาวรyoursite.com/type-slugเว้นแต่คุณจะกำหนดเป็นอย่างอื่นเช่น yoursite.com/some-other-url..
t31os

@ t31os: ใช่ตอนนี้ฉัน hardcoded มันเป็นอย่างนั้น แต่จะเปลี่ยนมันในไม่ช้าโดยใช้รหัสของ @ Mike
ariefbayu

คำตอบ:


25

สวัสดี@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ซึ่งฉันคิดว่าฉันจะทำต่อไปในเย็นวันนี้


btw เมื่อคุณส่งแทร็คคุณช่วยกรุณาลิงค์ได้ที่นี่
ariefbayu

@silent - ใช่แน่นอน
MikeSchinkel

@ ไมค์ - ฉันจะเขียนสิ่งที่คล้ายกันถ้าคุณไม่ได้ .... ;) ฉันสงสัยว่านี่คือสิ่งที่ @silent มีอยู่ในใจ แต่การกล่าวถึงปุ่มเพียงปุ่มเดียวทำให้ฉันคิดถึงสิ่งอื่น ..
t31os

@ t31os - ฉันทำงานกับตรรกะเดียวกันในสุดสัปดาห์นี้สำหรับปลั๊กอินการกำหนดเส้นทาง URL ของฉันดังนั้นฉันจึงเริ่ม :) สำหรับปุ่มคุณสามารถเพิ่มคำตอบไปยังที่อยู่นั้นได้หรือไม่
MikeSchinkel

ฉันไม่แน่ใจว่ามีของเหลืออะไรให้ครอบคลุมฉันคิดว่าฟังก์ชั่นด้านบนของคุณครอบคลุมถึงสิ่งที่ถูกถาม ... :)
t31os

12

เมื่อคุณลงทะเบียนประเภทโพสต์คุณสามารถส่งสตริงเป็นกระสุนด้วยพารามิเตอร์ "has_archive" และตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าการเขียนเป็นจริงหรืออาร์เรย์ แต่ไม่ใช่เท็จและ URL เก็บถาวร CPT ของคุณจะเป็นhttp://www.YOURDOMAIN.com / has_archive_slugตัวอย่างเช่น

หากคุณตั้งค่าใน register_post_type ของคุณตัวอย่างเช่น:

$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/


3
ไชโย ฉันคิดเสมอว่าhas_archiveเป็นบูลีน แต่ตอนนี้ฉันรู้แล้วว่าสามารถรับสตริงได้ดังนั้นโพสต์ที่กำหนดเองเอกพจน์ของฉันrecipeสามารถมีกระสุนจำนวนมาก/recipes/
Astrotim

ฉันจำไม่ได้ว่า / เมื่อพวกเขาทำสวิตช์หรือหากนี่เป็นข้อผิดพลาดเสมอ แต่ในปี 2560 'rewrite'ยอมรับเฉพาะค่าบูลีนหรืออาร์เรย์ มากกว่าที่คุณมีอยู่ก็ควรจะเป็น'rewrite' => 'product', 'rewrite' => array( 'slug' => 'product' ),
Mike
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.