วิธีที่ดีที่สุดในการตรวจสอบว่าคุณอยู่ในหน้าโพสต์เดียว


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_typeในquery_vars) ไม่ได้เป็นหน้าหรืออายัด


และทำงานภายในpre_get_posts(ก่อนเรียกใช้แบบสอบถาม)
gmazzap

ฉันสงสัยว่าis_page()ตั้งไว้ที่pre_get_postsระดับหรือไม่ ถ้าเป็นและฉันสามารถตรวจสอบpost_typeว่าไม่ได้ถูกตั้งค่าใน query_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-> โพสต์ (อาร์เรย์) เพื่อตรวจสอบประเภทโพสต์


ยัง. การโพสต์ก่อนรับเกิดขึ้นก่อนที่$wp_query->postsตัวแปรจะถูกเติมจริง ขอบคุณนะ!
Eric Holmes

0

หลังจากการทดสอบบางอย่างฉันเห็นว่าน่าเสียดายที่เป็นไปไม่ได้ที่จะได้ประเภทของ cpt ในpre_get_postshook ใช้is_pageงานได้ แต่ไม่สามารถดึงประเภทโพสต์มาตรฐานหรือ cpt ได้

หากคุณมีเพียงหน้าและโพสต์ (ไม่มี cpt) การตรวจสอบis_single()ด้วยtrueเป็นคำตอบหมายความว่าโพสต์ประเภทนั้นเป็นโพสต์เพราะมันกลับเท็จสำหรับหน้า

หากคุณยังมี CPTs ฉันกลัวคุณต้องดำเนินการสอบถามเพิ่มเติม สิ่งที่ง่ายที่สุดที่ฉันคิดได้คือเพิ่งได้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

ใช่. ฉันเข้าใจว่าคุณต้องการทราบอย่างชัดเจนว่าคุณโพสต์ประเภทใด ไม่เฉพาะถ้าคุณอยู่ในมุมมองโพสต์เดียว @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 bits ที่ฉันตรวจสอบว่าไฟล์อยู่ในไดเรกทอรีเดียว แต่ไม่ใช่อีกอันที่ต้องได้รับการแก้ไขสำหรับงานสร้างของคุณ มีอยู่เพื่อตัดผลลัพธ์ด้านบนและด้านล่างโครงสร้างไดเรกทอรีที่แน่นอน

การรัน thelist () ในส่วนท้ายจะให้รายการหมายเลขของไฟล์เทมเพลต. php ทุกไฟล์ที่ใช้ในการรวบรวมมุมมองปัจจุบัน มันมีประโยชน์อย่างยิ่งเมื่อต้องจัดการกับธีมลูกที่แสดงองค์ประกอบลึกลับ


ดูเหมือน overkill คิดว่าเจ๋ง?
Eric Holmes

ไม่มีวิธีที่ดีมากมายในการพิจารณาว่าเทมเพลตใดบ้างที่กำลังขับหน้านอกเหนือจากการแยกวิเคราะห์ ฉันเดาว่าคุณกำลังมองหาบางอย่างที่เรียบง่ายเทียบกับหน้าเดี่ยวใช่มันเกินความจริง ลองใช้ฟังก์ชั่นสักครู่ลบเงื่อนไขการละเว้นพิเศษและคุณจะเห็นว่าทำไมฉันถึงใช้มัน มีไฟล์เป็นตันที่ผลักดันให้เกิดการขับเคลื่อนหน้า WP และมันจะมีประโยชน์มากที่จะรู้ว่ามันคืออะไร แม้จะไม่ระบุฟังก์ชั่นติดยาเสพติดแม้ว่า
ไอเดียที่จำเป็น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.