Cách tốt nhất để phát hiện nếu bạn đang ở trong trang SINGLE POST


9

Vì vậy, điều này có vẻ như là một điều khá nguy hiểm, nhưng theo tôi ở đây.

Tôi đang cố gắng thêm một số logic thông qua pre_get_postshành động. Đây là toàn bộ đối tượng WP_Query được cung cấp cho tôi. (xem phần cuối)

Những điều tôi đã xem xét sử dụng:

  • is_single() - quá rộng.
  • is_singular()- quá sớm để sử dụng điều này, như get_queried_object()chưa được thiết lập.
  • $query->single tài sản - lại quá rộng.
  • $query->get('post_type')- không được đặt, vì nó đang sử dụng thuộc nametính.

namethực sự là chỉ số duy nhất ở đây?

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] => 
)

Câu trả lời:


10

Tôi đã cố gắng sắp xếp điều này trước đây cho mục đích riêng của tôi. Theo như tôi có thể nói ...

  • post_typekhông thực sự được đặt ở bất cứ đâu cho postloại bài đăng.
  • Đối với pageloại bài đăng tôi chỉ thấy khóa loại bài đăng queried_object.
  • Đối với các loại CPT, có một post_typekhóa trong query_varsvà cả trong query.
  • Các menu Nav dường như hoạt động giống như các CPT khác về mặt này.

Dữ liệu rất không nhất quán nhưng nếu bạn loại bỏ các trang và CPT thì tôi tin rằng bạn có thể giả sử postloại này.

Chỉnh sửa: Mã làm việc từ @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. 
  } 
} 

Chúng tôi kiểm tra is_singular, không có loại bài đăng (CPT có post_typetrong query_vars), không phải trang hoặc tệp đính kèm.


Và nó hoạt động bên trong pre_get_posts(trước khi chạy truy vấn)?
gmazzap

Tôi tự hỏi nếu is_page()được thiết lập ở pre_get_postscấp độ. Nếu có, và tôi có thể kiểm tra xem post_typekhông được đặt trong truy vấn, tôi đoán nó có tốt như nó không? Bị hỏng.
Eric Holmes

1
is_pagedường như được thiết lập.
s_ha_dum

@s_ha_dum Tôi đã xóa nhận xét vì có vẻ như nó không hoạt động cho CPT ...
gmazzap

2
Thêm giải pháp làm việc cho câu trả lời của bạn.
Eric Holmes

0

Tôi không biết nếu điều này sẽ hữu ích:

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

Sử dụng $ wp_query-> bài viết (mảng) để kiểm tra loại bài đăng.


Chưa. Bài viết trước nhận được xảy ra trước khi $wp_query->postsbiến thực sự được điền. Cảm ơn mặc dù!
Eric Holmes

0

Sau một số thử nghiệm tôi thấy rằng thật không may là không thể có được loại bài đăng của cpt bên trong pre_get_postshook. Chỉ is_pagehoạt động nhưng không phải loại bài viết tiêu chuẩn cũng như cpt có thể được lấy ở đó.

Nếu bạn chỉ có trang và bài đăng (không có cpt), hãy kiểm tra is_single()với truephản hồi có nghĩa là loại bài đăng đó là bài đăng, bởi vì nó trả về sai cho các trang.

Nếu bạn cũng có CPT, tôi e rằng bạn phải thực hiện một truy vấn bổ sung . Đơn giản nhất tôi có thể nghĩ là chỉ cần lấy post_typecột trong đó trạng thái bài đăng được xuất bản và post_name là điều bắt buộc (bỏ qua các sửa đổi):

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

Nếu bạn muốn kiểm tra một loại bài đăng cụ thể, bạn có thể viết một thẻ điều kiện tùy chỉnh chỉ cần đếm các hàng với một post_type đã cho và tên đã cho:

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

Tất nhiên điều này là cần thiết pre_get_post, trong bất kỳ hook nào sau này bạn có thể sử dụng get_post_type()...


1
Điều này chắc chắn sẽ hoạt động, nhưng hãy tìm trong câu trả lời được chấp nhận, đó là một điều kiện ít phức tạp hơn nhiều, không có truy vấn bổ sung vào cơ sở dữ liệu. :)
Eric Holmes

Đúng. Tôi hiểu rằng bạn muốn biết chính xác loại bài đăng nào bạn đang hiển thị. Không chỉ nếu bạn đang ở trong một lượt xem bài viết. @EricHolmes
gmazzap

-1

Đây là những gì tôi đang sử dụng, mặc dù nó chuyên dùng cho cấu trúc thư mục của riêng tôi.

/**
 * 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
                }
            }
        }
    }
}

Số dặm có thể thay đổi. Các bit strpose nơi tôi kiểm tra các tệp nằm trong một thư mục nhưng không phải là một tệp khác cần được sửa đổi cho bản dựng của bạn và có thể được tái hiện hiệu quả hơn. Chúng tồn tại để cắt ra các kết quả trên và dưới một cấu trúc thư mục nhất định.

Chạy thelist () trong phần chân trang sẽ cung cấp cho bạn một danh sách được đánh số của mỗi tệp mẫu .php được sử dụng để biên dịch chế độ xem hiện tại. Nó đặc biệt hữu ích khi xử lý một chủ đề con đang hiển thị một thành phần bí ẩn.


Có vẻ quá mức cần thiết. Ý tưởng tuyệt vời mặc dù?
Eric Holmes

Không có nhiều cách hay để xác định mẫu nào đang điều khiển một trang, ngoài việc phân tích cú pháp chúng. Tôi đoán nếu bạn đang tìm kiếm một cái gì đó đơn giản như một trang so với trang, vâng, nó quá mức cần thiết. Tuy nhiên, hãy thử chạy chức năng này, trừ đi các điều kiện bỏ qua thêm và bạn sẽ thấy lý do tại sao tôi sử dụng chức năng này. Có một TẤN các tệp đi vào việc điều khiển một trang WP và nó có thể thực sự hữu ích để biết tất cả chúng là gì. Ngay cả điều này sẽ không xác định các chức năng hooked mặc dù.
Ý tưởng bắt buộc
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.