it-swarm.asia

Gelecekteki tarihli yayını yayınlandığı gibi işaretleme

Kullanım durumda:

Bir müzik şovuyla ilgili bir yazı tipim var. 'Şov zamanı', gelecekte bir süre için ayarlanmış olan yayın sonrası tarihe dahil edilir. Gelecekte tarihli blog yayınlarını alan ve tarihi terk eden, ancak yayını kaydetme sırasında yayınlanmış olarak işaretleyen, ancak özel bir yazı türü için nasıl özelleştireceğinizi belirleyemeyen bir işlev buldum.

İşlev aşağıdadır.

<?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');
?>
12
curtismchale

Hem Mike hem de Jan'ın cevaplarını birleştirerek, yalnızca söz konusu olan yazı tipinde işe yarar. Şovun şartlarına ihtiyacımız yok çünkü 'future_show' kancası sadece şovun yazı tipini alıyor ve bunu güncelliyor.

<?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');
?>
6
curtismchale

Sitenizi test edemediğimden emin olamıyorum ama 'show'remove_action() ve add_action() çağrılarından kaldırmanız gerektiğine inanıyorum. wp_publish_post() işlevi, yazı türlerine göre agnostiktir, en azından kodu okumuş gibi görünüyor. Öyleyse şunu dene:

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

Tabii ki sadece şov yapmakla sınırlandırmak istiyorsanız, bunun gibi bir şey yapmak isteyebilirsiniz (bununla birlikte diğer yazı tipleriyle de çalışmanız gerekirse mantık daha karmaşık olsa da):

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

Bu yardımcı olur umarım?

6
MikeSchinkel

Bence bu harekete wp_transition_post_status denir. Kod:

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

Normal gelecekteki postalar için son kanca future_post olacaktır, ancak türünüz için future_show ya da yazı tipiniz ne olursa olsun olacaktır.

3
Jan Fabry

Yapmak istediğiniz tek şey, 'gösteri süreleri' için fazladan bir tarih eklemekse, tam olarak bunu yapan bir meta kutusu eklemek daha kolay olabilir - parolayı yayınlamak için Yayımlanma tarihini kullanmak, WordPress'in belirleyeceği gibi, sorunlu olabilir. Gelecekteki bir yayınlanma tarihi ile ne zaman güncellendiğinde "gelecek" durumu (bence), bu nedenle bir yayını tekrar güncellemek için her güncellendiğinde kanca takmanız gerekecek. Ayrıca, bu şekilde amaçlandığı için "Yayın Tarihi" ni de ayırabilirsiniz.

Muhtemelen sadece bir meta_key ve özel bir meta kutusu kullanırdım. Sorgularınızın ne kadar karmaşık olduğuna bağlı olarak mesajları gösterir.

Meta_değerini bir zaman damgası olarak ayarlarsanız, gösteri zaman tarihine göre sipariş verebilir veya belirli bir tarihten önce/sonra seçebilirsiniz:

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

Tüm "olayları" şov saatiyle, en geç bir saat sonra geçerli tarihten alırdım. Not: Yukarıdaki test edilmemiştir, ancak should work :)

1
Joe Hoyle

WP Dev Nacin basit bir fonksiyon geçersiz kılma kullanır:

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;
}
0
Adam David