Làm cách nào để đặt loại bài đăng tùy chỉnh để có các bài đăng trong tương lai có thể xem được


9

Tôi đã thiết lập CPT để hoạt động giống như các bài đăng nhưng được sử dụng để đăng chi tiết sự kiện.

Điều đó là một số bài viết trong tương lai và như vậy có một ngày trong tương lai được đặt trên chúng. Vấn đề là người dùng bình thường không thể nhìn thấy những bài viết này.

Vì thế:

  • Làm cách nào để thay đổi archive-event.php để liệt kê các bài đăng trong tương lai? Hiển thị bài viết tương lai xa đầu tiên và bài viết cũ nhất cuối cùng trong khi duy trì phân trang.
  • Làm cách nào để tôi làm cho nó để khi người dùng nhấp vào bài đăng trong tương lai, họ sẽ không nhận được trang 404 vì bài đăng chưa được xuất bản về mặt kỹ thuật?

4
Có thể sử dụng các trường tùy chỉnh cho ngày thay vì sử dụng các chức năng wordpress mặc định như bạn nói về cơ bản các bài đăng có ngày trong tương lai không thực sự được xuất bản theo quan điểm của WP.
Vince Pettit

Mặc dù nói rằng có vẻ như đó là một cấp độ truy cập của người dùng, do đó bạn có thể thêm một cái gì đó vào tệp tin.php để cấp cho tất cả người dùng khả năng xem các bài đăng trong tương lai
Vince Pettit

Câu trả lời:


5

Tôi đã có thể tự giải quyết điều này. Toàn bộ mã của tôi để đăng ký CPT:

<?php
add_action( 'init', 'events_post_type_register' );
function events_post_type_register() {

    $post_type = "events";

    $labels = array(
        'name' => _x('Events', 'post type general name', 'project_X'),
        'singular_name' => _x('Event', 'post type singular name', 'project_X'),
        'add_new' => _x('Add New', 'event', 'project_X'),
        'add_new_item' => __('Add New Event', 'project_X'),
        'edit_item' => __('Edit Event', 'project_X'),
        'new_item' => __('New Event', 'project_X'),
        'all_items' => __('All Events', 'project_X'),
        'view_item' => __('View Event', 'project_X'),
        'search_items' => __('Search Events', 'project_X'),
        'not_found' =>  __('No events found', 'project_X'),
        'not_found_in_trash' => __('No events found in trash', 'project_X'),
        'parent_item_colon' => '',
        'menu_name' => 'Events'
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'hierarchical' => false,
        'has_archive' => true,
        'rewrite' => array(
            'with_front' => false,
            'slug' => "news/{$post_type}"
        ),
        'supports' => array( 'title', 'editor', 'thumbnail' )
    );
    register_post_type($post_type, $args);

    remove_action("future_{$post_type}", '_future_post_hook');
    add_action("future_{$post_type}", 'sc_ps_publish_future_events_now', 2, 10);
}

function sc_ps_publish_future_events_now($depreciated, $post) {
    wp_publish_post($post);
}

add_filter('posts_where', 'sc_ps_show_future_events_where', 2, 10);
function sc_ps_show_future_events_where($where, $that) {
    global $wpdb;
    if("events" == $that->query_vars['post_type'] && is_archive())
        $where = str_replace( "{$wpdb->posts}.post_status = 'publish'", "{$wpdb->posts}.post_status = 'publish' OR $wpdb->posts.post_status = 'future'", $where);
    return $where;
}
?>

Vì vậy, để cho phép các bài đăng có thể nhìn thấy được cho tất cả người dùng ngay cả khi chúng được đặt trong tương lai, bạn cần thực hiện các thao tác sau:

remove_action("future_{$post_type}", '_future_post_hook');
add_action("future_{$post_type}", 'sc_ps_publish_future_events_now', 2, 10);

Chúng tôi xóa hành động liên quan đến việc đăng bài sau đó và áp dụng hành động của chính chúng tôi để buộc nó được xuất bản mặc dù nó có một ngày trong tương lai với:

wp_publish_post($post);

Sau đó, tất cả những gì chúng ta cần làm là hiển thị các bài đăng trong tương lai trên trang lưu trữ bằng cách lọc posts_where:

function sc_ps_show_future_events_where($where, $that) {
    global $wpdb;
    if("events" == $that->query_vars['post_type'] && is_archive())
        $where = str_replace( "{$wpdb->posts}.post_status = 'publish'", "{$wpdb->posts}.post_status = 'publish' OR $wpdb->posts.post_status = 'future'", $where);
    return $where;
}

2
Thêm một miền văn bản vào các __()cuộc gọi của bạn hoặc không sử dụng chức năng.
fuxia

3
-1 cho cách tiếp cận. :) Theo cuộc thảo luận trong trò chuyện, sẽ đáng tin cậy hơn để theo dõi ngày sự kiện một cách riêng biệt trong trường tùy chỉnh thay vì cơ chế nội bộ để sử dụng ngày của bài đăng.
Rarst

1
+1 cho cách tiếp cận thay thế :) Tôi hoàn toàn đồng ý với @Rarst nhưng tôi cũng thấy cách tiếp cận này thú vị và tôi sẽ rất vui khi được ghi lại tốt ở đây trên WPSE.
Michal Mau

2

Brady, tôi không thể cảm ơn bạn đủ vì đã dẫn tôi đến giải pháp này. Khách hàng của tôi đã đặt tất cả các ngày sự kiện mà không có trường tùy chỉnh và tôi sẽ không quay lại và thay đổi mọi thứ. Mã của bạn ban đầu đã gặp lỗi khi cố gắng đăng, nhưng nó đã hoạt động với các sửa đổi nhỏ sau đây (được thực hiện để phù hợp với định dạng được sử dụng trong wp-gộp / post.php):

remove_action( 'future_' . $post_type, '_future_post_hook', 5, 2 );
add_action( 'future_' . $post_type, 'my_future_post_hook', 5, 2);

function my_future_post_hook( $deprecated = '', $post ) {
    wp_publish_post( $post->ID );
}

Tôi đã dành một lúc cố gắng để tìm ra điều này. Hy vọng nó sẽ giúp người khác!


0

Không thay đổi trạng thái bài đăng, bạn cũng có thể hiển thị các bài đăng trong tương lai và lưu trữ với pre_get_posts:

add_action( 'pre_get_posts', 'joesz_include_future_posts' );
function joesz_include_future_posts( $query ) {

    if ( $query->is_main_query() && 
           ( $query->query_vars['post_type'] == 'your-post-type' || // for single
         is_post_type_archive( 'your-post-type' ) ) ) {         // for archive

        $query->set( 'post_status', array( 'future', 'publish' ) );

    }

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