Cara mengatur jenis posting khusus agar posting selanjutnya dapat dilihat

9

Saya telah menyiapkan CPT untuk bertindak dengan cara yang sama seperti posting tetapi digunakan untuk memposting detail acara.

Masalahnya adalah bahwa beberapa posting di masa depan dan memiliki tanggal di masa depan yang ditetapkan pada mereka. Masalahnya adalah bahwa pengguna normal tidak dapat melihat posting ini.

Begitu:

  • Bagaimana cara saya mengubah archive-events.php ke daftar posting selanjutnya juga? Menampilkan posting yang jauh di masa depan adalah yang pertama dan yang terlama, bertahan dengan pagination.
  • Bagaimana saya membuatnya sehingga ketika pengguna mengklik posting di masa depan mereka tidak mendapatkan halaman 404 tidak ditemukan karena posting belum dipublikasikan secara teknis?
Scott
sumber
4
Apakah mungkin untuk menggunakan bidang khusus untuk tanggal daripada menggunakan fungsi wordpress default seperti yang Anda katakan pada dasarnya posting dengan tanggal di masa mendatang sebenarnya tidak diterbitkan dalam tampilan WP.
Vince Pettit
Meskipun mengatakan bahwa itu akan terlihat seperti hal tingkat akses pengguna sehingga Anda dapat menambahkan sesuatu ke file functions.php untuk memberikan semua pengguna kemampuan untuk melihat posting di masa depan
Vince Pettit

Jawaban:

5

Saya sudah bisa menyelesaikan ini sendiri. Seluruh kode saya untuk mendaftarkan 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;
}
?>

Jadi, agar posting dapat dilihat oleh semua pengguna, bahkan jika diatur di masa mendatang, Anda harus melakukan hal berikut:

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

Kami menghapus tindakan yang berhubungan dengan memposting di lain waktu dan menerapkan tindakan kami sendiri untuk memaksanya agar dipublikasikan meskipun memiliki masa depan dengan:

wp_publish_post($post);

Maka yang perlu kita lakukan sekarang hanyalah menampilkan posting di halaman arsip dengan memfilter 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;
}
Scott
sumber
2
Tambahkan domain teks ke __()panggilan Anda atau jangan gunakan fungsi.
fuxia
3
-1 untuk pendekatan. :) Sesuai diskusi dalam obrolan, akan lebih andal untuk melacak tanggal acara secara terpisah di bidang khusus sambil membengkokkan mekanisme internal untuk memanfaatkan tanggal posting.
Rarst
1
+1 untuk pendekatan alternatif :) Saya sepenuhnya setuju dengan @Rarst tapi saya juga menemukan pendekatan ini menarik dan saya akan senang memilikinya didokumentasikan dengan baik di sini di WPSE.
Michal Mau
2

Brady, saya tidak bisa cukup berterima kasih karena telah mengarahkan saya ke solusi ini. Klien saya telah menetapkan semua tanggal acara tanpa bidang khusus, dan saya tidak akan kembali dan mengubah segalanya. Awalnya kode Anda membuat kesalahan ketika mencoba memposting, tetapi ia bekerja dengan sedikit modifikasi berikut (dibuat agar sesuai dengan format yang digunakan dalam wp-include / post.php):

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

dan

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

Saya menghabiskan beberapa waktu untuk mencari tahu hal ini. Semoga ini bisa membantu orang lain!

Zade
sumber
0

Tanpa mengubah status posting Anda dapat menampilkan posting masa depan tunggal dan arsip dengan pre_get_posts juga:

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' ) );

    }

}
Joe
sumber