맞춤 post_type의 보관 URL 가져 오기


26

바보 같은 질문 인 것 같습니다. 그러나 나는 그것을 알아낼 수 없다 :(.

집에 맞춤 post_type의 보관 URL (archive- {post_type} .php)로 이동하는 버튼을 표시해야합니다. 어떻게합니까?


어떤 종류의 버튼을 탐색 메뉴에 추가하거나 일반 링크에 추가합니까? 아카이브 URL은 일반적으로 yoursite.com/type-slug명시 적으로 다른 것으로 설정하지 않는 한입니다. yoursite.com/some-other-url..
t31os

@ t31os : p, 지금은 그렇게 하드 코딩했습니다. 그러나 곧 @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 );
  }
}

나는 주말 에이 정확한 논리를 실제로 연구하고 있었지만, 비록 특정 사이트에서 작동 할지라도 WordPress가 볼 수있는 모든 사용 사례에서 논리 순서가 일반적으로 정확하다는 것은 100 % 확실하지는 않습니다.

이것은 오늘 저녁에 나중에 할 것이라고 생각하는 trac 을 통해 WordPress에 추가되도록 제안하는 것도 좋습니다 .


당신이 trac를 제출할 때 btw, 당신은 여기에 링크 할 수 있습니까?
ariefbayu

@silent-물론입니다.
MikeSchinkel

@ 마이크 - 당신은 ....하지 않았다면 나는 비슷한 쓴 한 것)이 염두에두고 있었지만, 버튼의 언급은 내가 다른 것을 생각했다 @silent 어떤 경우 궁금 해서요 ..
t31os을

@ t31os-이번 주말에 URL 라우팅 플러그인에 대해 동일한 로직을 사용하고 있었으므로 시작했습니다. :) 버튼에 대해 답을 추가 할 수 있습니까?
MikeSchinkel

나는 다룰 내용이 남아 있는지 잘 모르겠습니다. 위의 함수가 요청한 내용을 다루고 있다고 생각합니다 ... :)
t31os

12

게시물 유형을 등록 할 때 "has_archive"매개 변수를 사용하여 문자열을 슬러그로 전달할 수 있으며 다시 쓰기를 true 또는 배열로 설정하지만 false가 아닌 CPT 아카이브 URL은 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

스위치를 만들었을 때 또는 이것이 항상 오류가 있었는지 기억 나지 않지만 2017 년 'rewrite'에는 부울 값이나 배열 값만 허용합니다. 오히려보다 'rewrite' => 'product',당신이 나열했습니다, 대신해야한다 'rewrite' => array( 'slug' => 'product' ),.
Mike
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.