Làm thế nào để sử dụng một kho lưu trữ loại bài tùy chỉnh như trang trước?


16

Tôi muốn sử dụng kho lưu trữ loại bài đăng tùy chỉnh làm trang đầu của trang web, để

 http://the_site.com/

là một kho lưu trữ loại bài tùy chỉnh được hiển thị theo archive-{post-type}.phptập tin của tôi .

Lý tưởng nhất là tôi muốn thay đổi truy vấn bằng cách sử dụng is_front_page()trong functions.phptập tin của tôi . Tôi đã thử như sau, với một trang gọi là "Trang chủ" làm trang đầu của tôi:

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

nhưng trang đầu đang trả về nội dung của "Trang chủ" và dường như đang bỏ qua truy vấn tùy chỉnh.

Tôi đang làm gì sai? Có cách nào tốt hơn, nói chung, về việc này?


is_front_page () sẽ không hoạt động với pre_get_posts
Brad Dalton

Câu trả lời:


27

Sau khi bạn đã đặt một trang tĩnh làm trang chủ của mình, bạn có thể thêm trang này vào trang của mình functions.phpvà bạn sẽ thấy ổn. Điều này sẽ gọi archive-POSTTYPE.phpmẫu chính xác là tốt.

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;

}

Chức năng này cần if(is_admin()) return;ngay từ đầu, nếu không thì nó gây rối với khu vực quản trị.
brasofilo

1
Trong khi điều này làm việc cho tôi, kết quả là các menu chính và phụ của tôi biến mất.
super9

Nó gần như chính xác. Mã này đang thay đổi tất cả wp_queries, vì vậy nó phải là if (is_home ()) thay vì if ($ wp_query-> get .....)
Leo Caseiro

Tôi đang sử dụng tương tự nhưng trên mẫu trang tùy chỉnh của tôi thay vì frontpage và nó không hiển thị kết quả (như thể không có bài đăng tùy chỉnh nào được thêm vào). Có suy nghĩ gì không?
đào tạo

Giải pháp này không hỗ trợ phân trang. Bất kỳ / page / 2 URL vẫn hiển thị 10 bài viết đầu tiên.
rg89

6

Đặt tên lại cho kho lưu trữ CPT của bạn về home.php

Sau đó, sử dụng pre_get_posts để thay đổi truy vấn trang chủ để chỉ hiển thị của 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');

Thay thế-cpt của bạn bằng tên của loại bài đăng tùy chỉnh của bạn.


2
cuối cùng, một lời giải thích rõ ràng, khả thi!
Jack

1

Cảm ơn câu trả lời của tôi, tôi đã tìm cách giải quyết vấn đề chính xác này. Để có được mẫu lưu trữ loại bài đăng tùy chỉnh được gọi, tôi đã phải thêm các điều kiện sau:

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

2
Xin chào Eli, chào mừng bạn đến với WPSE. "Câu trả lời" có nghĩa là để trả lời câu hỏi ban đầu (các trang web stackexchange không phảicác diễn đàn thảo luận theo chuỗi ). Điều này sẽ phù hợp hơn nhiều cho một bình luận .
Julian Pille

Cảm ơn đã làm rõ. Đó là những gì tôi nghĩ, mặc dù tôi không thể tìm ra cách nhận xét về câu trả lời vì không có tính năng 'thêm bình luận'. Đây có phải là một tính năng nhạy cảm với thời gian, hay tôi bị mù?
Eli

0

Điều này hoạt động tốt hơn đối với tôi ghi đè cả bài đăng trên blog và trang tĩnh trong Cài đặt> Đọc> Hiển thị trang trước:

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

Tôi đang sử dụng kết hợp với ghi đè mẫu bằng các bộ lọc front_page_templatehome_templateđể trả về mẫu tùy chỉnh.


0

Đối với tôi, nó phá vỡ phân trang: hoặc bạn chọn chỉ mục hoặc trang tĩnh làm trang chủ, các liên kết phân trang sẽ hiển thị nhưng khi nhấp vào trang 2 tôi nhận được:

  • trong trường hợp trang chỉ mục (mặc định): trang 404
  • trong trường hợp trang tĩnh: kết quả tương tự như trang 1: đối số "phân trang" sau đó được diễn giải để hiển thị phân trang loại trang, không phải phân trang danh sách loại bài đăng.

Tôi nghĩ rằng nó cần một số quy tắc viết lại để nắm bắt đối số phân trang và vượt qua nó một cách chính xác.

Dù sao, một trang mẫu tùy chỉnh phải là giải pháp với một số quy tắc viết lại bổ sung.

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.