Oznaczanie przyszłego postu jako opublikowanego

13

Przypadek użycia:

Mam typ postu odnoszący się do programu muzycznego. „Czas pokazu” jest określany na podstawie daty publikacji, która jest ustawiona na pewien czas w przyszłości. Znalazłem funkcję, która pobiera przyszłe wpisy na blogu i pozostawia datę, ale zaznacza post jako opublikowany podczas zapisywania, ale nie byłem w stanie dowiedzieć się, jak go dostosować do niestandardowego typu postu.

Funkcja znajduje się poniżej.

<?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
źródło
1
Czy to możliwe, że masz błąd remove_actioni add_actiondzwonisz? Twoim drugim parametrem jest 'show', ale czy nie powinna to być funkcja, którą dodajesz lub usuwasz?
Jan Fabry,

Odpowiedzi:

7

Niesamowite połączenie odpowiedzi Mike'a i Jana. Wymyśliłem to, co działa tylko na danym typie postów. Nie potrzebujemy warunku show, ponieważ hak „future_show” chwyta tylko typ postu show i aktualizuje go.

<?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
źródło
7

Nie mogę powiedzieć na pewno, ponieważ nie mam swoją witrynę do testu z ale wierzę, wystarczy wyjąć 'show'z remove_action()i add_action()połączeń. Ta wp_publish_post()funkcja jest agnostyczna w odniesieniu do typów postów, przynajmniej tak wygląda po przeczytaniu kodu. Spróbuj tego:

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

Oczywiście, jeśli chcesz ograniczyć się do robienia tylko programów, możesz chcieć zrobić coś takiego (chociaż logika będzie bardziej skomplikowana, jeśli będziesz potrzebować jej do pracy z innymi typami postów):

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

Mam nadzieję że to pomoże?

MikeSchinkel
źródło
Tak, pierwszy fragment kodu jest tym, co zacząłem i działa na normalnych postach WordPress, ale jeśli dodasz warunek „pokaż”, to na niczym nie działa. Nawet bez warunkowego nie działa na niestandardowym typie postu.
curtismchale
Przeczytałem twoje pytanie kilka razy, ale wciąż nie jest dla mnie jasne, co próbujesz osiągnąć, jeśli zignorujemy sugerowany kod, który nie działa. Czy możesz wyjaśnić, co dokładnie próbujesz osiągnąć? Czy chcesz opublikować post w dniu / godzinie podanej w post_date, czy może w innym miejscu? A może już to rozwiązałeś?
MikeSchinkel,
Jest już rozwiązany (poniżej podałem kod). Chciałem tylko opublikować niestandardowy typ posta, nawet jeśli jest to zaplanowane na przyszłość.
Curtismchale,
4

Myślę, że ta akcja zostanie wywołana przez wp_transition_post_status. Kod to:

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

Tak więc dla normalnych przyszłych postów będzie ostatnim hakiem future_post, ale dla twojego typu będzie to, future_showczy jakikolwiek typ ślimaka.

Jan Fabry
źródło
1

Jeśli wszystko, co chcesz zrobić, to dodać dodatkową datę dla „godzin pokazu”, może być łatwiej dodać meta-box, który robi dokładnie to samo - użycie opcji Opublikuj w celu sfałszowania może być potencjalnie problematyczne, ponieważ WordPress ustawi ją na „przyszły” status, ilekroć jest aktualizowany o przyszłą datę publikacji (tak myślę), więc będziesz musiał się zaczepiać za każdym razem, gdy post jest aktualizowany, aby ustawić go z powrotem. W ten sposób możesz zarezerwować „Data publikacji” zgodnie z przeznaczeniem.

Prawdopodobnie po prostu meta_keyużyłbym niestandardowego pola meta. Jednak zależy to od stopnia skomplikowania zapytań, które pokazują posty.

Jeśli ustawisz meta_value jako znacznik czasu, możesz nadal zamawiać według daty godziny pokazu lub wybrać przed / po określonej dacie:

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

Otrzymałbym wszystkie „wydarzenia” z czasem pokazowym nie później niż tydzień od bieżącej daty. Uwaga: powyższe nie zostało przetestowane, ale powinno działać :)

Joe Hoyle
źródło
Zgadzam się z tym w 100% - o wiele lepiej jest użyć meta-boxa niż wykorzystać datę publikacji jako hack na datę wydarzenia.
Travis Northcutt,
Tak, meta_box działałby, ale trudno mi było dodać ładny wybór daty i godziny jQuery. Standardowy WP był o wiele ładniejszy niż cokolwiek, co mogłem wymyślić.
Curtismchale,
Wtyczka WP Easy Post Types daje niestandardowe pole daty i zapewnia prosty wybór daty, sam użyłem go do funkcji listy zdarzeń.
Rick Curran
0

WP Dev Nacin używa prostego zastąpienia funkcji:

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
źródło
Dodaj wyjaśnienie, jak to działa.
Nicolai