Làm thế nào để bạn sử dụng CPT làm trang chủ mặc định?


20

Tôi có một khách hàng trang web của họ sẽ sử dụng nhiều loại bài đăng tùy chỉnh để định cấu hình trang web của họ. Nhưng tôi đang ở giữa một tảng đá và một nơi khó khăn cho trang chủ được yêu cầu của họ.

Trong thực tế, trang chủ sẽ là một chồng các "trang" cụ thể trong WordPress. Về cơ bản, sẽ có các trang dành cho: Giới thiệu , Blog , Giới thiệu , Danh mục đầu tưLiên hệ với chúng tôi . Tất cả chúng sẽ được xếp chồng lên nhau để bạn có thể cuộn từ trang này sang trang khác.

Bản năng đầu tiên của tôi là chỉ sử dụng một trang (được gọi là Trang chủ ) và nhúng một mã ngắn chấp nhận sên trang và đưa ra thứ tự thích hợp (nghĩa là [pageOrder]intro, blog, about-us, portfolio, contact-us[/pageOrder]). Trang sẽ sử dụng một mẫu trang tùy chỉnh để sắp xếp mọi thứ, kiểm soát vòng lặp và thêm điều hướng vào bên trái của trang. Nhưng tất cả dường như klunky.

Giải pháp lý tưởng của tôi sẽ là tạo một loại bài đăng tùy chỉnh (được gọi là Stack ) cho phép người dùng cuối định vị các trang bằng cách kéo thả và để CPT đảm nhiệm bố cục và điều hướng, v.v.

Vấn đề với giải pháp lý tưởng của tôi là cài đặt. WordPress cho phép bạn chọn một trang cho trang chủ mặc định của trang web. Nhưng nó được gắn với một loại bài đăng của trang và tôi không chắc chắn nên nối vào đâu để sửa đổi để người dùng cũng có thể chọn Stack làm trang chủ mặc định.

Vì vậy, tôi phải kết nối ở đâu để thêm CPT vào danh sách thả xuống của các trang có sẵn cho trang chủ mặc định?

Câu trả lời:


11

Cảm ơn @toscho về câu trả lời hữu ích, nhưng tôi cảm thấy hơi khó chịu, vì vậy tôi đã chọc ngoáy một chút và nhận ra rằng tôi có thể thêm bộ lọc thay thế:

function wpa18013_add_pages_to_dropdown( $pages, $r ){
    if('page_on_front' == $r['name']){
        $args = array(
            'post_type' => 'stack'
        );
        $stacks = get_posts($args);
        $pages = array_merge($pages, $stacks);
    }

    return $pages;
}
add_filter( 'get_pages', 'wpa18013_add_pages_to_dropdown', 10, 2 );

Cập nhật

Sau khi thêm mã ở trên, tôi thực sự có thể sử dụng loại bài đăng tùy chỉnh làm trang chủ, nhưng WordPress sẽ chuyển hướng permalinks vì đây không phải là loại bài đăng "trang". Vì vậy, http://localhost/testsẽ chuyển hướng đến http://localhost/test/stacks/home-stack, đó không phải là những gì tôi muốn.

Tuy nhiên, việc thêm hành động này đã sửa lỗi đó và truy vấn loại bài đăng tùy chỉnh của tôi cùng với các trang cho trang chủ:

function enable_front_page_stacks( $query ){
    if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
        $query->query_vars['post_type'] = array( 'page', 'stack' );
}
add_action( 'pre_get_posts', 'enable_front_page_stacks' );

Tôi cũng đã chơi với một bộ lọc như vậy, nhưng nó phải được giới hạn trong truy vấn trang trước. Và sau đó tôi đã bị đánh bại bởi một số hành vi / lỗi kỳ lạ: Tôi chỉ có 404s. Dù sao +1. :)
fuxia

Nắm bắt tốt. Điều kiện bổ sung bên trong chức năng (đảm bảo post_typechưa được đặt và page_idkhông phải là 0) ngăn tất cả các 404. Bây giờ tôi có thể chạy truy vấn cho tất cả các bài đăng tùy chỉnh của mình, tất cả các bài đăng của tôi và tất cả các trang của tôi mà không có bất kỳ sự can thiệp nào.
EAMann

@EAmann Cảm ơn mã! Nó hoạt động như bình thường, mặc dù nó thay đổi tiêu đề của frontpage thành Title of Post | Tên trang chủ, điều này có thể được thay đổi thành tên Trang chủ, trong một ngày nào đó không?
INT

Điều này không hoạt động ở tất cả ... cảnh báo / lỗi máy chủ: Thiếu đối số 2 cho wpa18013_add_pages_to_dropdown ()biến không xác định: r
Dameer

8

Co le vậy? Phiên bản tinh chỉnh của giải pháp trước đây của tôi .

add_filter( 'wp_dropdown_pages', 'add_cpt_to_front_page_dropdown', 10, 1 );


/**
 * Adds CPTs to the list of available pages for a static front page.
 *
 * @param  string $select Existing select list.
 * @return string
 */
function add_cpt_to_front_page_dropdown( $select )
{
    if ( FALSE === strpos( $select, '<select name="page_on_front"' ) )
    {
        return $select;
    }

    $cpt_posts = get_posts(
        array(
            'post_type'      => 'YOUR_POST_TYPE'
        ,   'nopaging'       => TRUE
        ,   'numberposts'    => -1
        ,   'order'          => 'ASC'
        ,   'orderby'        => 'title'
        ,   'posts_per_page' => -1
        )
    );

    if ( ! $cpt_posts ) // no posts found.
    {
        return $select;
    }

    $current = get_option( 'page_on_front', 0 );

    $options = walk_page_dropdown_tree(
        $cpt_posts
    ,   0
    ,    array(
            'depth'                 => 0
         ,  'child_of'              => 0
         ,  'selected'              => $current
         ,  'echo'                  => 0
         ,  'name'                  => 'page_on_front'
         ,  'id'                    => ''
         ,  'show_option_none'      => ''
         ,  'show_option_no_change' => ''
         ,  'option_none_value'     => ''
        )
    );

    return str_replace( '</select>', $options . '</select>', $select );
}

Điều này chỉ để chọn loại bài đăng tùy chỉnh, nhưng điều đó không làm cho nó hiển thị loại bài đăng tùy chỉnh như trang trước? hoặc tôi đang thiếu một cái gì đó?
Hameedullah Khan

@Hameedullah - Khi bạn chọn nó, WordPress sẽ cập nhật tùy chọn đánh dấu trang nào được cho là sẽ được sử dụng cho trang trước. Sau đó, khi người dùng truy cập trang trước, WordPress sẽ đọc lại tùy chọn tương tự từ cơ sở dữ liệu.
EAMann

@Hameedullah Khan Bạn nói đúng. Điều này hoạt động trước 3.1, bây giờ tôi được chuyển hướng đến permalink của bài đăng - và tôi nhận được 404. Lạ. Tôi ước tôi có thời gian cho việc này. :(
fuxia

5

Tại sao không chỉ tạo front-page.phptệp mẫu, sử dụng truy vấn / Vòng lặp thông thường hoặc (nếu tùy chọn Chủ đề tùy chỉnh được đặt để hiển thị CPT trên Trang trước), xuất ra truy vấn / Vòng lặp tùy chỉnh, dựa trên CPT?

Vấn đề ở đây là bạn sẽ phải tạo một tùy chọn Chủ đề riêng để kiểm soát đầu ra Trang trước, đồng thời hướng dẫn người dùng đặt Trang trước thành trang tĩnh.

Để làm cho mọi việc dễ dàng hơn, bạn có thể nối tùy chọn Chủ đề của mình vào cài đặt - đọc, sử dụng nhóm tùy chọn "Đọc" trong cuộc gọi của bạn register_settingthông qua API Cài đặt, để nó hiển thị với các tùy chọn Trang trước hiện có.


Tôi thích các giải pháp đơn giản và Chip Tôi nghĩ rằng bạn là tốt nhất. Wordpress cho phép các mẫu tùy chỉnh cho trang đầu codex.wordpress.org/Template_HVELy#Home_Page_display và sau đó người ta có thể làm bất cứ điều gì mình thích bên trong đó.
anmari

Đây là giải pháp dễ bảo trì và đơn giản nhất. Cái front-page.phpđược chọn tự động vì là một phần của hệ thống phân cấp mẫu wordpress. Không cần phải nhớ tại sao điều này xảy ra (hoặc cần đánh dấu nó xuống cho người tiếp theo).
Odys

2

Tôi nghĩ rằng một cái gì đó có thể đã thay đổi kể từ khi EAMann viết bản cập nhật của anh ấy vào năm 2011 và hàm wpa18013_add_pages_to_dropdown () mà anh ấy cung cấp không còn hoạt động nữa. Như được đề cập trong một nhận xét của Dameer, chức năng này hiện tại (tháng 12 năm 2013) đưa ra lỗi "Thiếu đối số 2 cho wpa18013_add_pages_to_dropdown ()"

Giải pháp, đối với tôi dù sao, là viết lại hàm mà không có tham số thứ hai đó, hoặc kiểm tra nội dung của nó. Khối mã đầy đủ sau đó trở thành:

function add_unbox_tabs_to_dropdown( $pages ){
    $args = array(
        'post_type' => 'unbox_tabs'
    );
    $items = get_posts($args);
    $pages = array_merge($pages, $items);

    return $pages;
}
add_filter( 'get_pages', 'add_unbox_tabs_to_dropdown' );

function enable_front_page_unbox_tabs( $query ){
    if('' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'])
        $query->query_vars['post_type'] = array( 'page', 'unbox_tabs' );
}
add_action( 'pre_get_posts', 'enable_front_page_unbox_tabs' );

Xin lưu ý rằng trong ví dụ trên, loại bài đăng tùy chỉnh mà tôi thêm là "unbox_tabs" thay vì "stack".


1

Tôi đang sử dụng kỹ thuật này để bao gồm một mẫu từ một plugin. Vì vậy, giải pháp của @ ChipBennett không áp dụng.

Để thêm CPT's ( ) từ plugin trong danh sách Trang tĩnh, tôi đã sửa đổi giải pháp của @ EAMann như sau: 'hierarchical' => 'false'

add_action( 'admin_head-options-reading.php', 'wpse_18013_modify_front_pages_dropdown' );
add_action( 'pre_get_posts', 'wpse_18013_enable_front_page_stacks' );

function wpse_18013_modify_front_pages_dropdown()
{
    // Filtering /wp-includes/post-templates.php#L780
    add_filter( 'get_pages', 'wpse_18013_add_cpt_to_pages_on_front' );
}

function wpse_18013_add_cpt_to_pages_on_front( $r )
{
    $args = array(
        'post_type' => 'stack'
    );
    $stacks = get_posts( $args );
    $r = array_merge( $r, $stacks );

    return $r;
}

function wpse_18013_enable_front_page_stacks( $query )
{
    if( '' == $query->query_vars['post_type'] && 0 != $query->query_vars['page_id'] )
        $query->query_vars['post_type'] = array( 'page', 'stack' );
}

Tham chiếu cốt lõi v3.4.2:
sự khác biệt nhỏ của số dòng trong 3.5 RC3, nhưng mã vẫn giữ nguyên

/**
 * wp-admin/options-reading.php#L96
 * Happens inside a <li><label>-</label></li>
 */
    wp_dropdown_pages( array( 
                'name' => 'page_on_front'
            ,   'echo' => 0
            ,   'show_option_none' => __( '&mdash; Select &mdash;' )
            ,   'option_none_value' => '0'
            ,   'selected' => get_option( 'page_on_front' ) 
        ) 
    )

/**
  * wp-includes/post-template.php#L768
  */
function wp_dropdown_pages($args = '') {
    $defaults = array( /* defaults array */ );    
    $r = wp_parse_args( $args, $defaults );
    extract( $r, EXTR_SKIP );  
    $pages = get_pages( $r );
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.