SINGLE POST 페이지에 있는지 감지하는 가장 좋은 방법


9

그래서 이것은 꽤 정신 나간 것 같지만 여기를 따라 오십시오.

pre_get_posts동작을 통해 논리를 추가하려고합니다 . 이것은 나에게 주어진 전체 WP_Query 객체입니다. (끝 참조)

내가 사용하려고 생각한 것 :

  • is_single() - 너무 넓은.
  • is_singular()- get_queried_object()아직 설정되지 않았으므로 이것을 사용하기에는 너무 이릅니다 .
  • $query->single 재산-다시 너무 넓습니다.
  • $query->get('post_type')- name속성을 사용하고 있으므로 설정되지 않았습니다 .

입니다 name만 표시등이 여기 정말?

WP_Query Object
(
    [query] => Array
        (
            [page] => 
            [name] => abcs-of-mental-health
        )

    [query_vars] => Array
        (
            [page] => 
            [name] => abcs-of-mental-health
            [error] => 
            [m] => 0
            [p] => 0
            [post_parent] => 
            [subpost] => 
            [subpost_id] => 
            [attachment] => 
            [attachment_id] => 0
            [static] => 
            [pagename] => 
            [page_id] => 0
            [second] => 
            [minute] => 
            [hour] => 
            [day] => 0
            [monthnum] => 0
            [year] => 0
            [w] => 0
            [category_name] => 
            [tag] => 
            [cat] => 
            [tag_id] => 
            [author_name] => 
            [feed] => 
            [tb] => 
            [paged] => 0
            [comments_popup] => 
            [meta_key] => 
            [meta_value] => 
            [preview] => 
            [s] => 
            [sentence] => 
            [fields] => 
            [menu_order] => 
            [category__in] => Array
                (
                )

            [category__not_in] => Array
                (
                )

            [category__and] => Array
                (
                )

            [post__in] => Array
                (
                )

            [post__not_in] => Array
                (
                )

            [tag__in] => Array
                (
                )

            [tag__not_in] => Array
                (
                )

            [tag__and] => Array
                (
                )

            [tag_slug__in] => Array
                (
                )

            [tag_slug__and] => Array
                (
                )

            [post_parent__in] => Array
                (
                )

            [post_parent__not_in] => Array
                (
                )

        )

    [tax_query] => 
    [meta_query] => 
    [queried_object] => 
    [queried_object_id] => 0
    [post_count] => 0
    [current_post] => -1
    [in_the_loop] => 
    [comment_count] => 0
    [current_comment] => -1
    [found_posts] => 0
    [max_num_pages] => 0
    [max_num_comment_pages] => 0
    [is_single] => 1
    [is_preview] => 
    [is_page] => 
    [is_archive] => 
    [is_date] => 
    [is_year] => 
    [is_month] => 
    [is_day] => 
    [is_time] => 
    [is_author] => 
    [is_category] => 
    [is_tag] => 
    [is_tax] => 
    [is_search] => 
    [is_feed] => 
    [is_comment_feed] => 
    [is_trackback] => 
    [is_home] => 
    [is_404] => 
    [is_comments_popup] => 
    [is_paged] => 
    [is_admin] => 
    [is_attachment] => 
    [is_singular] => 1
    [is_robots] => 
    [is_posts_page] => 
    [is_post_type_archive] => 
    [query_vars_hash] => f473ebf7f725c2627dc5fd9a1429f626
    [query_vars_changed] => 
    [thumbnails_cached] => 
)

답변:


10

나는 내 자신의 목적을 위해 이것을 정리하려고 노력했다. 내가 말할 수있는 한 ...

  • post_type실제로 post게시물 유형에 대해 설정되지 않았습니다 .
  • 를 들어 page포스트 타입 난 단지에서 포스트 타입의 키를 참조하십시오 queried_object.
  • CPT 유형의 경우 및 post_type키가 query_vars있습니다 query.
  • Nav 메뉴는 이와 관련하여 다른 CPT처럼 작동하는 것으로 보입니다.

데이터가 매우 일치하지 않지만 페이지와 CPT를 제거하면 post유형을 가정 할 수 있다고 생각합니다 .

편집 : @EricHolmes의 작업 코드 :

add_action( 'pre_get_posts', 'something_for_single_posts_only' ) ; 
function something_for_single_posts_only( $query ) { 
  if( $query->is_main_query() 
    && $query->is_singular() 
    && ! $query->get( 'post_type' ) 
    && ! $query->is_page() 
    && ! $query->is_attachment() 
  ) { 
      // do something for single posts only. 
  } 
} 

우리는 is_singular, 아니 포스트 유형 (CPTS 가지고 확인 post_typequery_vars)가 아닌 페이지 또는 첨부.


그리고 pre_get_posts쿼리 실행 전에 내부에서 작동 합니까?
gmazzap

레벨 is_page()이 설정되어 있는지 궁금합니다 pre_get_posts. 그렇다면 post_typequery_vars에 설정되어 있지 않은지 확인할 수 있다면 얻을 수있는 것 같아요? 너무 부러졌다.
Eric Holmes

1
is_page설정 한 것 같습니다.
s_ha_dum

@s_ha_dum CPT에서 작동하지 않는 것 같아서 주석을 제거했습니다 ...
gmazzap

2
답변에 작동 솔루션 추가
Eric Holmes

0

이것이 유용한 지 모르겠습니다.

function hwl_home_pagesize( $query ) {
    global $wp_query;
    if (is_main_query() && count($wp_query->posts) < 2) {

    }

}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

게시물 유형을 확인하려면 $ wp_query-> posts (배열)를 사용하십시오.


아직. 사전 게시물은 $wp_query->posts변수가 실제로 채워 지기 전에 발생합니다 . 그래도 고마워!
Eric Holmes

0

일부 테스트 후 안타깝게도 게시물 유형의 cpt를 pre_get_posts후크 에 넣기가 불가능하다는 것을 알았습니다 . 만 is_page작동하지만 표준 포스트 유형도 CPT는이 검색 할 수 있습니다.

당신 만 페이지와 포스트 (NO CPT) 체크가있는 경우 is_single()true응답 수단으로이 페이지에 대해 false를 반환하기 때문에 포스트 타입, 포스트입니다.

CPT도 있는 경우 추가 쿼리를 수행해야합니다 . 내가 생각할 수있는 가장 간단한 것은 post_type게시물 상태가 게시되고 post_name이 필요한 열을 얻는 것입니다 (수정 개정).

function test( $q ) {
  if ( is_single() ) {
    global $wpdb;
    $type = $wpdb->get_var( $wpdb->prepare(
      "SELECT post_type FROM $wpdb->posts WHERE post_name = %s AND post_status = 'publish' AND post_type <> 'revision'",
      $q->query['name']
    ) );
    var_dump($type);
  }
}
add_action( 'pre_get_posts', 'test', 1); 

특정 게시물 유형을 확인하려면 주어진 post_type과 이름으로 행을 계산하는 사용자 정의 조건부 태그를 작성할 수 있습니다.

function is_single_post_type( $type = 'post' ) {
  if ( is_single() ) {
    global $wpdb, $wp_query;
    $is = $wpdb->get_var( $wpdb->prepare(
      "SELECT count(ID) FROM $wpdb->posts WHERE post_name = %s AND post_status = 'publish' AND post_type = %s",
      $wp_query->query['name'], $type
    ) );
    return $is > 0;
  }
  return false;
}

물론 이것은 pre_get_post나중에 필요할 때 사용할 수 있습니다 get_post_type()...


1
이것은 확실히 작동하지만 허용되는 답변을 보면 데이터베이스에 대한 추가 쿼리없이 훨씬 덜 복잡한 조건부입니다. :)
Eric Holmes 12

예. 게재중인 게시물 유형을 정확히 알고 싶었습니다. 단일 게시물보기 인 경우에만 해당되지 않습니다. @EricHolmes
gmazzap

-1

이것이 내가 사용하는 것이지만 내 디렉토리 구조에 특화되어 있습니다.

/**
 * Function to list all templates used in a page
 * @author Imperative Ideas with thanks to Rarst
 * @uri http://wordpress.stackexchange.com/a/89005
 */

function thelist() {
    $included_files = get_included_files();
    $stylesheet_dir = str_replace( '\\', '/', get_stylesheet_directory() );
    $template_dir   = str_replace( '\\', '/', get_template_directory() );
    echo '<h3 class="debugtitle">Theme file templates used in this page</h3>';
    foreach ( $included_files as $key => $path ) {

        $path   = str_replace( '\\', '/', $path );

        if ( false === strpos( $path, $stylesheet_dir ) && false === strpos( $path, $template_dir ) )
            unset( $included_files[$key] );

        if(!strpos($path, '/wp-content/themes/') === false) { // Files IN this directory
            if(strpos($path, '/library/') === false) { // Ignore this subdir
                if(strpos($path, '/hybrid-core/') === false) { // Ignore this subdir
                    echo $key." = ". $path."</br>"; // Finally, output the list
                }
            }
        }
    }
}

마일리지가 다를 수 있습니다. 파일이 한 디렉토리에 있지만 다른 디렉토리에는 없는지 확인하는 strpos 비트는 빌드를 위해 수정해야하며 더 효율적으로 리팩터링 될 수 있습니다. 특정 디렉토리 구조 위와 아래에서 결과를 잘라 내기 위해 존재합니다.

바닥 글에서 list ()를 실행하면 현재보기를 컴파일하는 데 사용되는 모든 .php 템플릿 파일의 번호가 매겨진 목록이 제공됩니다. 미스터리 구성 요소를 렌더링하는 하위 테마를 처리 할 때 특히 유용합니다.


과도한 것으로 보입니다. 멋진 아이디어?
Eric Holmes

페이지를 구동하는 템플릿을 파싱하는 것 외에 어떤 템플릿을 결정하는 좋은 방법은 많지 않습니다. 단일 대 페이지만큼 간단한 것을 찾고 있다면 과잉입니다. 그래도 여분의 무시 조건을 빼고 함수를 잠시 실행하면 왜 이것을 사용하는지 알 수 있습니다. WP 페이지를 구동하는 데는 많은 파일이 있으며, 모두가 무엇인지 아는 것이 정말 유용 할 수 있습니다. 그럼에도 불구하고 이것은 후크 기능을 식별하지 못합니다.
명령적인 아이디어
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.