Gelecekteki tarihli yayını yayınlandı olarak işaretleme


13

Kullanım örneği:

Bir müzik şovuyla ilgili bir yazı türüm var. 'Gösteri zamanı' gelecekte yayınlanacak olan yayınlanma tarihi boyunca alınır. Gelecekteki tarihli blog yazılarını alan ve tarihi terk eden ancak yayını kaydetme tarihinde yayınlandığı gibi işaretleyen ancak özel bir yazı türü için nasıl özelleştirileceğini anlayamadığım bir işlev buldum.

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

1
Sizin remove_actionve add_actionaramanızda bir hata olması mümkün mü ? İkinci parametreniz 'show', ancak eklediğiniz veya kaldırdığınız işlev olmamalı mı?
Jan Fabry

Yanıtlar:


7

Mike ve Jan cevaplarını birleştirerek harika Ben sadece söz konusu yazı türü üzerinde çalışan bu ile geldi. Şov koşuluna ihtiyacımız yok çünkü 'future_show' kancası yalnızca gönderi türünü 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');
?>

7

Beraber Sitenize test olmadığı için ben kesin söyleyemem ama sadece kaldırmak gerekir inanıyoruz 'show'gelen remove_action()ve add_action()görüşmeleri. wp_publish_post()Fonksiyon en azından o kodu okumasını görünen budur, post tiplerine göre agnostik olduğunu. Bu yüzden şunu deneyin:

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

Elbette sadece şov yapmakla sınırlamak istiyorsanız, böyle bir şey yapmak isteyebilirsiniz (diğer yazı türleriyle de çalışmanız gerekiyorsa mantık daha karmaşık olacaktır):

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?


Evet, kodun ilk kısmı başladığım şeydir ve normal WordPress yayınlarında çalışır, ancak 'show' koşulunu eklerseniz hiçbir şey üzerinde çalışmaz. Koşullu olmasa bile özel bir gönderi türü üzerinde çalışmaz.
curtismchale

Sorunuzu birkaç kez okudum ama hala işe yaramazsa önerilen kodu görmezden gelirsek tam olarak ne yapmaya çalıştığınız belirsiz. Tam olarak neyi başarmaya çalıştığınızı açıklayabilir misiniz? Gönderiyi post_date tarih / saatinde veya başka bir şeyde yayınlamak istiyor musunuz? Yoksa daha önce çözdün mü?
MikeSchinkel

Zaten çözüldü (aşağıda kodu sağladım). Gelecek için planlanmış olsa bile özel yazı türü yayınını yayınlamak istedim.
curtismchale

4

Bence bu eylem çağrılıyor wp_transition_post_status. 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);
}

Bu nedenle, gelecekteki normal mesajlar için son kanca olacak future_post, ancak türünüz için future_showya da tipiniz ne olursa olsun.


1

Yapmak istediğiniz tek şey 'gösteri saatleri' için ek bir tarih eklemekse, bunu yapan bir meta kutu eklemek daha kolay olabilir - bunu yapmak için Yayınlama tarihini kullanmak, WordPress'in ayarlayacağı gibi potansiyel olarak sorunlu olabilir Gelecekteki bir yayınlanma tarihi ile güncellendiğinde "gelecekteki" durumu (bence), bu nedenle, bir gönderiyi tekrar ayarlamak için her güncellemede kanca yapmanız gerekir. Ayrıca, bu şekilde "Yayınlanma Tarihi" ne istendiği için ayırabilirsiniz.

Muhtemelen sadece a meta_keyve özel bir meta kutu kullanırdım. Rağmen bu mesajları gösteren sorgu ne kadar karmaşık bağlıdır.

Meta_değer'i bir zaman damgası olarak ayarlarsanız, hala 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' );

Geçerli tarihten bir hafta sonra bir gösteri zamanı ile tüm "olaylar" alacaktı. Not: yukarıdaki test edilmemiş, ama çalışması gerekir :)


Bu% 100 kabul ediyorum - bir meta kutu kullanmak, yayınlanma tarihini etkinlik tarihi için bir saldırı olarak kullanmaktan çok daha iyi.
Travis Northcutt

Evet bir meta_box işe yarayacaktı ama güzel bir jQuery tarih ve saat seçici eklemek zor buldum. Hisse senedi wp biri ile gelip bir şey daha güzel.
curtismchale

WP Kolay Mesaj Türleri eklentisi özel bir tarih alanı verir ve basit bir tarih seçici sağlar, kendimi bir Etkinlik listeleme işlevi için kullandım.
Rick Curran

0

WP Dev Nacin basit bir işlev 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;
}

Lütfen bunun nasıl çalıştığını açıklayın.
Nicolai
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.