보관 페이지에 대한 사용자 정의 게시물 유형 슬러그 가져 오기


14

보관 페이지에있을 때 사용자 정의 게시물 유형 슬러그를 어떻게 발견합니까?

예를 들어 템플릿을 /products/실행 archive-products.php하면 포스트 유형 슬러그를 어떻게 (실용적으로) 얻을 수 있습니까?

감사

답변:


18

현재 게시물 유형을 얻으려면을 사용하십시오 get_post_type(). 그런 다음 get_post_type_object()슬러그와 같이 필요한 모든 데이터를 요청 하십시오.

$post_type = get_post_type();
if ( $post_type )
{
    $post_type_data = get_post_type_object( $post_type );
    $post_type_slug = $post_type_data->rewrite['slug'];
    echo $post_type_slug;
}

1
나는 (테스트하지 않은) get_queried_object()적은 정보로 동일한 정보를 얻을 것이라고 생각 합니다.
Rarst

@Rarst 어쩌면 내가 제안한 코드가 이해하기 쉽다고 생각합니다.
fuxia

1
get_post_type은 현재 페이지의 게시 유형을 리턴하고 아카이브 페이지에있을 때이 함수는 "page"를 리턴하므로 Toscho의 솔루션이 잘못되었습니다. '도서'의 보관 페이지에있을 때 (4 예제), 나는 이것을 원합니다 : '도서'. 도착하면 게시하겠습니다.
eMarine

1
불행히도 그렇게 간단하지는 않지만 단지 $posttype = get_query_var('post_type');...
majick 2016

나는 이것이 전체 이야기를 다루는 대답이라고 생각하지 않습니다. Woocommerce 상점 페이지와 같은 많은 필터가 변경하는 동안 설치 재 작성 규칙을 확인해야합니다. 대신 Worpdress 고유의 메커니즘을 사용하십시오 . 아래의 어딘가에서 내 대답을 참조하십시오.
Jonas Lundman

6

나는 어떤 사용자 정의 포스트 아카이브를 얻기 위해 archive.php 템플릿의 루프 외부에서 이것을 사용하고 있습니다.

@toscho와 @Rarst가 권장하는 메소드의 조합입니다.

$post_type = get_queried_object();
echo $post_type->rewrite['slug'];

업데이트 : @majick은 CPT에 다시 쓰기 슬러그를 설정 한 경우에만 작동한다고 지적했습니다. CPT를 등록 할 때 재 작성 슬러그는 선택 사항이며 설정되지 않은 경우 기본값은 post_type입니다.


내가 이것을 시도했을 때 나는Notice: Undefined property: stdClass::$rewrite in ***\wp-content\themes\marks-remarks\archive.php on line 4
patrickzdb

이 옵션은 등록 된 CPT에 대해 다시 쓰기 슬러그가 설정되어있는 경우에만 작동합니다 (선택 사항이며 기본값은 post_type
majick

@majick을 잡아 주셔서 감사합니다! 귀하의 정보를 반영하도록 게시물을 업데이트했습니다.
Jerry

밝혀이 중 파트 :-) 내 새로운 대답을 확인 ... 빙산의 일각이었다
majick

3

대답이 혼란스러워집니다. 그리고 아마도 Im이지만 헤드 라인 질문은 다음과 같습니다.

보관 페이지에 대한 사용자 정의 게시물 유형 슬러그 가져 오기

만약 당신이 평균 포스트 형 아카이브 랜딩 페이지, 때 is_post_type_archive()반환 true, 당신이 responing하는 슬러그하려면 현재 보기 아카이브 :

/* returns /products/ */

$responding_name = str_replace(get_home_url(), '', get_post_type_archive_link(get_query_var('post_type')));

/* continue to get 'products' without slug slashes */
$responding_name = str_replace('/', '', $responding_name);

-질문에 대한 답변의 끝-

설명:

등록 된 슬러그 에 의존 할 수 없습니다 . 워드 프레스도 아닙니다. 예를 들어 get_post_type_archive_link()Wordpress를 호출 할 때 설치에 대한 현재 다시 쓰기 규칙 을 확인합니다 .

내부 또는 외부 루프의 현재 보관소 또는 단일 게시물에 관계 없이 메커니즘을 되돌get_post_type_archive_link() 립니다. (퍼머 링크가 활성화되었습니다.)

고려 사항 :

여기에서 언급 한 것처럼 현재 쿼리 의 게시물 유형 은 일 수 있습니다 array. 원하는 게시물 유형을 필터링 하여 강도 를 더 높일 수 있습니다 . 예를 들면 다음과 같습니다.

$post_type = get_query_var('post_type'); 
if(is_array($post_type)) $post_type = reset($post_type);

또는

if(isset($post_types[0])) $post_type = $post_types[0];

다른 관점 :

Woocommerce 예제는 'products'포스트 유형 오브젝트에 등록되었지만 실제로는 다시 작성된 규칙 이름 (shop)을 사용합니다.

/* returns shop */
$responding_name = str_replace('/', '', str_replace(get_home_url(), '', get_post_type_archive_link('product')));

$responding_name목표는 다를 수 있으므로 Mark, Im 사용 중입니다. 게시물 아카이브는 존재하지 않으며 URL 만 있습니다.


감사합니다. 이 솔루션을 찾고있었습니다. 질문에서 "게시물 이름 만"을 찾지 못했다면, 이것은 답이 될 것입니다.
Jonas Lundman

1

t이 경우 주목해야한다 has_archive사용자 정의 포스트 유형을 등록하는 동안 true로 설정되어, 포스트 유형의 아카이브가 /cptslug/내부적으로 다시 작성됩니다 ?post_type=cptslug. 따라서 이것은 또한 is_post_type_archive()true를 반환 한다는 의미 입니다.

불행히도 등록 된 재 작성 슬러그가 게시물 유형과 다른 경우 실제로는 실제로을 얻는 것이 아닙니다 post_type. 예. 게시물 유형이었고 myplugin_cars다시 쓰기 슬러그가 cars있고 myplugin_cars이것을 가져와야하는 경우 (현재 쿼리 된 객체가 사용자 정의 게시물 유형 이 아닌 경우 오류를 방지하기 위해 ) 여전히 실패합니다.

$queryobject = get_queried_object();
if (has_property('rewrite',$queryobject)) {
    if (isset($queryobject->rewrite['slug'])) {
         $posttype = $queryobject->rewrite['slug'];
     }
 }

그러나 is_post_type_archive이것이 사실 이기 때문에 더 안정적입니다.

if (is_post_type_archive()) {
    $posttype = get_query_var('post_type');
    // which is basically the same as:
    // global $wp_query;
    // $posttype = $wp_query->query_vars['post_type'];
} 
else ($posttype = 'post';}

그러나 잠깐만 요, 더 많은 것이 있습니다 ... 약간의 테스트로 밝혀졌습니다. 실제로 그렇게 간단하지는 않습니다 ... 분류에 여러 게시물 유형이있는 분류 아카이브 페이지에 있다면 어떻게해야합니까? 또는 게시물 이외의 사용자 정의 게시물 유형에 게시물 태그를 할당 하시겠습니까? 아니면 저자 보관 페이지에 있습니까? 날짜 보관 페이지? ... 또는 복잡한이 tax_querymeta_query위해를 WP_Query?

가능한 모든 보관 사례를 테스트하지 않고 신뢰할 수있는 유일한 대답은 쿼리에서 실제 게시물을 반복하는 것입니다. 단일 및 보관 페이지 모두에서 작업하고 선택적으로 전달할 수있는 전체 기능은 다음과 같습니다. 맞춤 검색어 개체 (또는 단일 게시물의 게시물 개체 / 게시 ID) :

function get_current_post_types($object=null) {

    // if a numeric value passed, assume it is a post ID
    if ( ($object) && (is_numeric($object)) ) {$object = get_post($object);}
    // if an object is passed, assume to be a post object
    if ( ($object) && (is_object($object)) ) {return get_post_type($object);}

    // standard single post type checks
    if (is_404()) {return '';}
    // update: removed this check, handled by is_singular
    // if (is_single()) {return 'post';}
    if (is_page()) {return 'page';}
    if (is_attachment()) {return 'attachment';}
    if (is_singular()) {return get_post_type();}

    // if a custom query object was not passed, use $wp_query global
    if ( (!$object) || (!is_object($object)) ) {
        global $wp_query; $object = $wp_query;
    }
    if (!is_object($object)) {return '';} // should not fail

    // if the post_type query var has been explicitly set
    // (or implicitly set on the cpt via a has_archive redirect)
    // ie. this is true for is_post_type_archive at least
    // $vqueriedposttype = get_query_var('post_type'); // $wp_query only
    if (property_exists($object,'query_vars')) {
        $posttype = $object->query_vars['post_type'];
        if ($posttype) {return $posttype;}
    }

    // handle all other cases by looping posts in query object
    $posttypes = array();
    if (method_exists($object,'found_posts')) {
        if ($object->found_posts > 0) {
            $queriedposts = $object->posts;
            foreach ($queriedposts as $queriedpost) {
                $posttype = $queriedpost->post_type;
                if (!in_array($posttype,$posttypes)) {$posttypes[] = $posttype;}
            }
            if (count($posttypes == 1)) {return $posttypes[0];}
            else {return $posttypes;}
         }
     }
     return ''; // nothin to see here
}

이것은 확실하게 (내가 그렇게 말했습니까?) 하나 이상의 유형이있는 경우 게시물 유형의 배열을 반환하거나 하나의 유형이있는 경우 단일 게시물 유형의 문자열을 반환합니다. 당신이해야 할 일은 :

$posttypes = get_current_post_types();
// or pass a post ID 
$posttypes = get_current_post_types($postid);
// or pass a post object
$posttypes = get_current_post_types($post);
// or pass a custom query - that has been run
$posttypes = get_current_post_types($query);

사용법 예 (재미있게) :

add_filter('the_posts','myplugin_fading_thumbnails',10,2);
function myplugin_fading_thumbnails($posts,$query) {
    if (!is_archive()) {return $posts;}
    $cptslug = 'myplugin_slug'; $dosomethingcool = false;
    $posttypes = get_current_post_types($query);
    if ( (is_array($posttypes)) && (in_array($cptslug,$posttypes)) ) {$dosomethingcool = true;}
    elseif ($cptslug == $posttypes) {$dosomethingcool = true;}

    if ($dosomethingcool) {
        global $fadingthumbnails; $fadingthumbnails = $cptslug;
        if (!has_action('wp_footer','myplugin_cpt_script')) {
            add_action('wp_footer','myplugin_cpt_script');
        }
    }

    function myplugin_cpt_script() {
        global $fadingthumbnails;
        echo "<script>var thumbnailclass = 'img.thumbtype-".$fadingthumbnails."';
        function fadeoutthumbnails() {jQuery(thumbnailclass).fadeOut(3000,fadeinthumbnails);}
        function fadeinthumbnails() {jQuery(thumbnailclass).fadeIn(3000,fadeoutthumbnails);}
        jQuery(document).ready(function() {fadeoutthumbnails();});
        </script>";
    }

    return $posts;
 }

효과를 확인하려면 코드에서 사용자 정의 게시물 유형을로 변경하고 게시물 미리보기 이미지에 클래스 속성을 post추가 thumbtype-post하십시오.


0

이 코드를 사용할 수 있습니다 :

$queried_object = get_queried_object();
$posttype_slug = $queried_object->query_var;
echo $posttype_slug;

필요한 $ posttype_slug var를 사용하십시오.


이것이 $queried_object->query_var['post_type'];작동하려면 ...
majick

아니요. $ queried_object-> query_var에는 게시물 유형의 문자열 만 포함됩니다. 객체 또는 배열이 아닙니다. 이 이미지를보십시오 : prntscr.com/bd58e1
Guy Ytzhak

확인 만 조회 된 객체 인 경우에만 확실히 커스텀 포스트 타입의 객체가, 당신은 예를 들어 카테고리 / 세금 / 태그 / 저자 아카이브 페이지에 대해 다른 해당 객체 따라서 빈 값을 얻을 것이다. 심지어 ?post_type=post비워도. 비교get_query_var('post_type');
majick

0

이 코드를 사용할 수 있으며이 코드는 저에게 효과적입니다.

 $ t_slug = get_query_var ( 'term');

-3
if( get_post_type( get_the_ID() ) == 'projects' )
{
  //enter code for this post type
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.