Menandai posting tanggal mendatang sebagai dipublikasikan

13

Gunakan kasus:

Saya memiliki jenis posting yang berhubungan dengan pertunjukan musik. 'Waktu tayang' direbut melalui tanggal publikasi pos yang diatur untuk beberapa waktu di masa mendatang. Saya telah menemukan fungsi yang mengambil posting blog tanggal mendatang dan meninggalkan tanggal tetapi menandai posting sebagai dipublikasikan di save tetapi belum dapat menemukan cara untuk menyesuaikannya untuk jenis posting kustom.

Fungsinya di bawah.

<?php
    function setup_future_hook() {
        // Replace native future_post function with replacement
        remove_action('future_post','show', '_future_post_hook');
        add_action('future_post', 'show', 'publish_future_post_now');
    }

    function publish_future_post_now($id) {
        // Set new post's post_status to "publish" rather than "future."
        wp_publish_post($id);
    }

    add_action('init', 'setup_future_hook');
?>
curtismchale
sumber
1
Mungkinkah Anda memiliki kesalahan dalam remove_actiondan add_actionmenelepon? Parameter kedua Anda 'show', tetapi bukankah seharusnya itu fungsi yang Anda tambahkan atau hapus?
Jan Fabry

Jawaban:

7

Luar biasa menggabungkan kedua jawaban dari Mike dan Jan saya datang dengan ini yang hanya bekerja pada jenis posting yang dimaksud. Kami tidak memerlukan persyaratan acara karena pengait 'future_show' hanya meraih jenis kiriman pertunjukan dan memperbarui itu.

<?php
    function setup_future_hook() {
        // Replace native future_post function with replacement
        remove_action('future_show','_future_post_hook');
        add_action('future_show','publish_future_post_now');
    }

    function publish_future_post_now($id) {
        wp_publish_post($id);
    }

    add_action('init', 'setup_future_hook');
?>
curtismchale
sumber
7

Saya tidak bisa mengatakan dengan pasti karena saya tidak memiliki situs Anda untuk menguji dengan tetapi saya percaya Anda hanya perlu untuk menghapus 'show'dari remove_action()dan add_action()panggilan. The wp_publish_post()fungsi agnostik sehubungan dengan jenis posting, setidaknya itulah yang tampak dari membaca kode. Jadi coba ini:

<?php
    function setup_future_hook() {
        // Replace native future_post function with replacement
        remove_action('future_post', '_future_post_hook');
        add_action('future_post', 'publish_future_post_now');
    }

    function publish_future_post_now($id) {
        // Set new post's post_status to "publish" rather than "future."
        wp_publish_post($id);
    }

    add_action('init', 'setup_future_hook');
?>

Tentu saja jika Anda ingin membatasi hanya melakukan pertunjukan, Anda mungkin ingin melakukan sesuatu seperti ini (walaupun logikanya akan lebih rumit jika Anda memerlukannya untuk bekerja dengan jenis posting lain juga):

function publish_future_post_now($id) {
    $post = get_post($id);
    if ('show' == $post->post_type)
        wp_publish_post($id);
}

Semoga ini membantu?

MikeSchinkel
sumber
Ya sedikit kode pertama adalah apa yang saya mulai dengan dan bekerja pada posting WordPress normal tetapi jika Anda menambahkan syarat 'show' tidak bekerja pada apa pun. Bahkan tanpa syarat itu tidak bekerja pada jenis posting khusus.
curtismchale
Saya telah membaca pertanyaan Anda beberapa kali tetapi masih belum jelas bagi saya apa yang ingin Anda capai jika kami mengabaikan kode yang disarankan yang tidak berfungsi. Bisakah Anda mengklarifikasi apa yang sebenarnya ingin Anda capai? Apakah Anda ingin mempublikasikan posting pada tanggal / waktu yang ada di post_date, atau yang lain? Atau sudahkah Anda menyelesaikannya?
MikeSchinkel
Sudah dipecahkan (saya berikan kode di bawah). Saya hanya ingin mempublikasikan jenis posting kustom bahkan jika dijadwalkan untuk masa depan.
curtismchale
4

Saya pikir tindakan ini dipanggil oleh wp_transition_post_status. Kode tersebut adalah:

function wp_transition_post_status($new_status, $old_status, $post) {
    do_action('transition_post_status', $new_status, $old_status, $post);
    do_action("${old_status}_to_$new_status", $post);
    do_action("${new_status}_$post->post_type", $post->ID, $post);
}

Jadi untuk posting normal di masa depan kait terakhir akan future_post, tetapi untuk tipe Anda akan future_showatau apa pun tipe slug Anda.

Jan Fabry
sumber
1

Jika yang ingin Anda lakukan adalah menambahkan tanggal tambahan untuk 'waktu tayang', mungkin lebih mudah untuk menambahkan kotak meta yang melakukan hal itu - menggunakan tanggal Publikasikan untuk menipu itu bisa berpotensi bermasalah, karena WordPress akan mengaturnya untuk Status "masa depan" setiap kali diperbarui dengan tanggal publikasi yang akan datang (saya pikir), jadi Anda harus mengaitkan setiap kali posting diperbarui untuk mengaturnya kembali. Juga, dengan begitu Anda dapat memesan "Tanggal Penerbitan" untuk apa yang dimaksudkan.

Saya mungkin hanya akan menggunakan meta_key, dan kotak meta khusus. Meskipun itu tergantung seberapa kompleks kueri Anda yang menunjukkan pos.

Jika Anda menetapkan meta_value sebagai timestamp, Anda dapat memesan berdasarkan tanggal waktu acara tetap, atau memilih sebelum / setelah tanggal tertentu:

$events = get_posts( 'post_type=events&meta_key=show_time&meta_value=' . strtotime( '+1 week' ) . '&meta_compare=<&orderby=meta_value' );

Akan mendapatkan semua "acara" dengan waktu tayang paling lambat seminggu dari tanggal saat ini. Catatan: Di atas tidak teruji, tetapi harus bekerja :)

Joe Hoyle
sumber
Saya setuju dengan ini 100% - jauh lebih baik menggunakan kotak meta daripada menggunakan tanggal publikasi sebagai peretasan untuk tanggal acara.
Travis Northcutt
Ya, meta_box akan berfungsi tetapi saya merasa sulit untuk menambahkan pemilih tanggal dan waktu jQuery yang bagus. Saham WP satu jauh lebih bagus daripada apa pun yang bisa saya buat.
curtismchale
Plugin WP Easy Post Types memberikan bidang tanggal khusus dan menyediakan pemilih tanggal yang sederhana, saya telah menggunakannya untuk fungsi daftar Acara sendiri.
Rick Curran
0

WP Dev Nacin menggunakan fungsi sederhana menimpa:

remove_action('future_post', '_future_post_hook');
add_filter( 'wp_insert_post_data', 'nacin_do_not_set_posts_to_future' );

function nacin_do_not_set_posts_to_future( $data ) {
    if ( $data['post_status'] == 'future' && $data['post_type'] == 'post' )
        $data['post_status'] = 'publish';
    return $data;
}
Adam David
sumber
Silakan tambahkan beberapa penjelasan bagaimana ini bekerja.
Nicolai