วิธีใช้การเก็บถาวรชนิดโพสต์ที่กำหนดเองเป็นหน้าแรก


16

ฉันต้องการใช้การเก็บถาวรชนิดโพสต์ที่กำหนดเองเป็นหน้าแรกของเว็บไซต์ดังนั้น

 http://the_site.com/

เป็นไฟล์เก็บถาวรชนิดโพสต์แบบกำหนดเองที่แสดงตามarchive-{post-type}.phpไฟล์ของฉัน

นึกคิดฉันต้องการแก้ไขแบบสอบถามที่ใช้is_front_page()ในfunctions.phpไฟล์ของฉัน ฉันลองทำสิ่งต่อไปนี้โดยใช้หน้าชื่อ "บ้าน" เป็นหน้าแรกของฉัน:

 add_filter('pre_get_posts', 'my_get_posts');
 function my_get_posts($query){
     global $wp_the_query;
     if(is_front_page()&&$wp_the_query===$query){
        $query->set('post_type','album');
        $query->set('posts_per_page',-1);
     }
     return $query;
 }

แต่หน้าแรกกำลังส่งคืนเนื้อหาของ "หน้าแรก" และดูเหมือนว่าจะไม่สนใจข้อความค้นหาที่กำหนดเอง

ผมทำอะไรผิดหรือเปล่า? โดยทั่วไปแล้วจะมีวิธีที่ดีกว่านี้ไหม


is_front_page () จะไม่ทำงานกับ pre_get_posts
แบรดดัลตัน

คำตอบ:


27

หลังจากที่คุณตั้งค่าสแตติกเพจเป็นโฮมเพจของคุณคุณสามารถเพิ่มสิ่งนี้ลงในของคุณfunctions.phpและคุณก็พร้อมที่จะไป สิ่งนี้จะเรียกarchive-POSTTYPE.phpแม่แบบได้อย่างถูกต้องเช่นกัน

add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query){
    //Ensure this filter isn't applied to the admin area
    if(is_admin()) {
        return;
    }

    if($wp_query->get('page_id') == get_option('page_on_front')):

        $wp_query->set('post_type', 'CUSTOM POST TYPE NAME HERE');
        $wp_query->set('page_id', ''); //Empty

        //Set properties that describe the page to reflect that
        //we aren't really displaying a static page
        $wp_query->is_page = 0;
        $wp_query->is_singular = 0;
        $wp_query->is_post_type_archive = 1;
        $wp_query->is_archive = 1;

    endif;

}

ฟังก์ชั่นนี้ต้องการif(is_admin()) return;ตั้งแต่เริ่มต้นมิฉะนั้นมันจะยุ่งกับพื้นที่ของผู้ดูแลระบบ
brasofilo

1
ขณะนี้ใช้งานได้สำหรับฉันเมนูหลักและรองของฉันก็หายไป
super9

มันเกือบจะถูกต้องแล้ว รหัสนี้มีการเปลี่ยนแปลง wp_queries ทั้งหมดดังนั้นควรจะเป็น (is_home ()) แทนถ้า ($ wp_query-> รับ ..... )
Leo Caseiro

ฉันใช้สิ่งเดียวกัน แต่ในเทมเพลตหน้ากำหนดเองของฉันแทนที่จะเป็นหน้าแรกและจะไม่แสดงผลลัพธ์ (ราวกับไม่มีการเพิ่มโพสต์แบบกำหนดเอง) ความคิดใด ๆ
trainoasis

วิธีนี้ไม่รองรับการเพจ URL ใด ๆ / หน้า / 2 ยังคงแสดง 10 โพสต์แรก
rg89

6

ตั้งชื่อไฟล์เก็บถาวร CPT ของคุณเป็น home.php ใหม่

จากนั้นใช้ pre_get_posts เพื่อแก้ไขคิวรีโฮมเพจเพื่อแสดงเฉพาะ CPT

function wpsites_home_page_cpt_filter($query) {
if ( !is_admin() && $query->is_main_query() && is_home() ) {
$query->set('post_type', array( 'your-cpt' ) );
    }
  }

add_action('pre_get_posts','wpsites_home_page_cpt_filter');

แทนที่ -cpt ด้วยชื่อประเภทโพสต์ที่คุณกำหนดเอง


2
ในที่สุดคำอธิบายที่ชัดเจนและใช้การได้!
แจ็ค

1

ขอบคุณสำหรับคำตอบ ljaas - ฉันกำลังมองหาที่จะแก้ปัญหาที่แน่นอนนี้ ในการรับเท็มเพลตการเก็บถาวรชนิดโพสต์แบบกำหนดเองที่เรียกว่าฉันต้องเพิ่มเงื่อนไขต่อไปนี้:

$wp_query->is_post_type_archive = 1;
$wp_query->is_archive = 1;

2
สวัสดีอีไลยินดีต้อนรับสู่ WPSE "คำตอบ" มีไว้เพื่อตอบคำถามเริ่มต้น (ไซต์ stackexchange ไม่ใช่ฟอรัมการสนทนาที่มีเธรด ) นี้จะเป็นแบบที่ดีมากสำหรับการแสดงความคิดเห็น
Johannes Pille

ขอบคุณสำหรับคำชี้แจงโจฮัน นั่นคือสิ่งที่ฉันคิด แต่ฉันไม่สามารถหาวิธีแสดงความคิดเห็นในคำตอบได้เนื่องจากไม่มีคุณลักษณะ 'เพิ่มความคิดเห็น' นี่เป็นคุณสมบัติที่คำนึงถึงเวลาหรือเป็นคนตาบอดหรือไม่?
Eli

0

วิธีนี้ใช้ได้ผลดีกว่าสำหรับฉันที่จะลบล้างทั้งโพสต์บล็อกและหน้าสแตติกในการตั้งค่า> การอ่าน> หน้าแรกจะแสดง:

<?php
/**
 * Set custom post type archive as front page.
 *
 * @since 1.0.0
 */
function ql_set_as_front_page( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }
    if ( ql_is_front_page( $query ) ) {
        $query->set( 'page_id', '' );
        $query->is_page = false;
        $query->is_singular = false;
        $query->set( 'post_type', 'MYCPT' );
        $query->is_archive = true;
        $query->is_post_type_archive = true;
    }
}
add_action( 'pre_get_posts', 'ql_set_as_front_page' );

/**
 * Taken from WP_Query::is_front_page and adapted to compare page_on_front with current page ID.
 * 
 * @since 1.0.0
 * 
 * @param object $query The main WP Query.
 */
function ql_is_front_page( $query ) {
    if ( 'posts' == get_option( 'show_on_front') && $query->is_home() )
        return true;
    elseif ( 'page' == get_option( 'show_on_front') && get_option( 'page_on_front' ) && $query->get('page_id') == get_option( 'page_on_front' ) )
        return true;
    else
        return false;
}

ฉันใช้มันร่วมกับการแทนที่แม่แบบโดยใช้ตัวกรองfront_page_templateและhome_templateเพื่อส่งคืนแม่แบบที่กำหนดเอง


0

สำหรับฉันมันแบ่งหน้า: ทั้งคุณเลือกดัชนีหรือหน้าคงที่เป็นหน้าแรกลิงค์เลขหน้าจะปรากฏขึ้น แต่เมื่อคลิกที่หน้า 2 ฉันได้รับ:

  • ในกรณีของหน้าดัชนี (ค่าเริ่มต้น): หน้า 404
  • ในกรณีของหน้าสแตติก: ผลลัพธ์เดียวกันกับหน้า 1: อาร์กิวเมนต์ "เพจจิ้ง" จะถูกแปลความเพื่อแสดงการแบ่งหน้าประเภทของหน้าไม่ใช่การแบ่งหน้ารายการโพสต์

ฉันคิดว่ามันจำเป็นต้องมีกฎการเขียนซ้ำเพื่อให้ได้รับการโต้แย้งหน้าและส่งผ่านอย่างถูกต้อง

อย่างไรก็ตามหน้าเทมเพลตที่กำหนดเองควรเป็นโซลูชันที่มีกฎการเขียนซ้ำเพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.