Nhận URL lưu trữ của post_type tùy chỉnh


26

Có vẻ như câu hỏi ngu ngốc. Nhưng, tôi không thể tìm ra nó :(.

Tôi cần hiển thị nút ở nhà để đi tới URL lưu trữ của post_type tùy chỉnh (archive- {post_type} .php). Làm thế nào để làm điều đó?


Loại nút nào, thêm một nút vào menu điều hướng, hoặc chỉ một liên kết chung? URL lưu trữ nói chung yoursite.com/type-slugtrừ khi bạn đặt nó rõ ràng thành một cái gì đó khác, ví dụ. yoursite.com/some-other-url..
t31os

@ t31os: yup, ngay bây giờ, tôi đã mã hóa nó như thế. Nhưng, sẽ sớm thay đổi nó bằng mã của @ Mike.
ariefbayu

Câu trả lời:


25

Xin chào @Silent:

Hóa ra có một chức năng trong WordPress 3.1 thực hiện chính xác những gì bạn muốn và nó được đặt tên get_post_type_archive_link(); đây là cách bạn gọi nó (giả sử một loại bài đăng tùy chỉnh có tên 'product'):

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

Dưới đây là câu trả lời trước của tôi trước khi tôi phát hiện ra rằng WordPress thực sự có một chức năng tích hợp cho trường hợp sử dụng này.

Trả lời trước:

Trừ khi tôi bỏ qua một cái gì đó trong mã nguồn cốt lõi cho WordPress 3.1 Tôi nghĩ rằng bạn đang tìm kiếm một chức năng get_archive_link()mà bạn có thể gọi như thế này (giả sử loại bài đăng tùy chỉnh có tên 'product'):

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

Và đây là mã nguồn mà bạn có thể đặt vào function.phptệp của chủ đề hoặc trong .phptệp cho một plugin bạn có thể đang viết:

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

Tôi thực sự đã làm việc với logic chính xác này vào cuối tuần qua mặc dù tôi chưa chắc chắn 100% thứ tự logic là chính xác trong tất cả các trường hợp sử dụng mà WordPress có thể thấy mặc dù nó có thể sẽ hoạt động cho bất kỳ trang web cụ thể nào.

Đây cũng là một điều tuyệt vời để đề xuất được thêm vào WordPress thông qua trac mà tôi nghĩ rằng tôi sẽ làm vào tối nay.


btw, khi bạn gửi trac, bạn có thể vui lòng, liên kết nó ở đây.
ariefbayu

@silent - Vâng, tất nhiên rồi.
MikeSchinkel

@Mike - Tôi đã viết một cái gì đó tương tự nếu bạn chưa ....;) Tôi đã tự hỏi liệu đây có phải là điều @silent có trong đầu không, nhưng việc đề cập đến một nút đã khiến tôi nghĩ đến điều gì khác ..
t31os

@ t31os - Tôi đã làm việc với cùng một logic vào cuối tuần này cho plugin định tuyến URL của mình, vì vậy tôi đã bắt đầu. :) Đối với nút, bạn có thể thêm một câu trả lời cho địa chỉ đó?
MikeSchinkel

Tôi không thực sự chắc chắn có bất cứ điều gì còn lại để che đậy, tôi nghĩ rằng chức năng trên của bạn bao gồm những gì đã được hỏi ... :)
t31os

12

Khi bạn đăng ký loại bài đăng, bạn có thể chuyển một chuỗi dưới dạng slug với tham số "has_archive" và đảm bảo bạn cũng đặt viết lại thành đúng hoặc một mảng nhưng không sai và sau đó URL lưu trữ CPT của bạn sẽ là http://www.YOURDOMAIN.com / has_archive_slug chẳng hạn

nếu bạn đặt trong register_post_type của bạn chẳng hạn:

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

thì url duy nhất của bạn là: http://www.YOURDOMAIN.com/product/postName và url lưu trữ của bạn là: http://www.YOURDOMAIN.com/products/


3
Hoan hô. Tôi đã luôn nghĩ has_archivelà một boolean, nhưng bây giờ tôi biết nó có thể được cung cấp một chuỗi, vì vậy loại bài tùy chỉnh số ít của tôi recipecó thể có một sên số nhiều/recipes/
Astrotim

Tôi không nhớ nếu / khi họ thực hiện chuyển đổi hoặc nếu điều này luôn bị lỗi, nhưng năm 2017 'rewrite'chỉ chấp nhận giá trị boolean hoặc mảng. Thay vì 'rewrite' => 'product',bạn đã liệt kê, thay vào đó nên được 'rewrite' => array( 'slug' => 'product' ),.
Mike
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.