Marcarea postărilor cu dată viitoare ca publicate

12 aug. 2010, 06:33:45
Vizualizări: 14.2K
Voturi: 14

Caz de utilizare:

Am un tip de postare care este legat de un spectacol muzical. 'Ora spectacolului' este preluată din data de publicare a postării, care este setată la o dată viitoare. Am găsit o funcție care preia postările de blog cu dată viitoare și păstrează data, dar le marchează ca publicate la salvare, dar nu am reușit să o personalizez pentru un tip de postare personalizat.

Funcția este prezentată mai jos.

<?php
    function setup_future_hook() {
        // Înlocuiește funcția native future_post cu una personalizată
        remove_action('future_post','show', '_future_post_hook');
        add_action('future_post', 'show', 'publish_future_post_now');
    }

    function publish_future_post_now($id) {
        // Setează starea postării noi la "publish" în loc de "future"
        wp_publish_post($id);
    }

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

Este posibil să aveți o eroare în apelurile remove_action și add_action? Al doilea parametru este 'show', dar nu ar trebui să fie funcția pe care o adăugați sau eliminați?

Jan Fabry Jan Fabry
12 aug. 2010 15:36:02
Toate răspunsurile la întrebare 5
0

Superb combinând ambele răspunsuri de la Mike și Jan, am ajuns la această soluție care funcționează doar pentru tipul de postare în cauză. Nu avem nevoie de condiția show deoarece hook-ul 'future_show' preia doar tipul de postare show și îl actualizează.

<?php
    function setup_future_hook() {
        // Înlocuiește funcția nativă future_post cu una personalizată
        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');
?>
13 aug. 2010 01:05:15
3

Nu pot spune cu siguranță deoarece nu am site-ul tău pentru a testa, dar cred că trebuie doar să elimini 'show' din apelurile remove_action() și add_action(). Funcția wp_publish_post() este agnostică în ceea ce privește tipurile de postări, cel puțin așa pare din citirea codului. Așa că încearcă asta:

<?php
    function setup_future_hook() {
        // Înlocuiește funcția nativă future_post cu una personalizată
        remove_action('future_post', '_future_post_hook');
        add_action('future_post', 'publish_future_post_now');
    }

    function publish_future_post_now($id) {
        // Setează post_status-ul noii postări la "publish" în loc de "future"
        wp_publish_post($id);
    }

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

Desigur, dacă vrei să limitezi acest lucru doar la postările de tip show, ai putea face ceva de genul acesta (deși logica va fi mai complicată dacă trebuie să funcționeze și cu alte tipuri de postări):

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

Sper că te ajută?

12 aug. 2010 20:02:13
Comentarii

Da, primul fragment de cod este cu ce am început și funcționează pe postările normale WordPress, dar dacă adaugi condiția 'show', nu funcționează pe nimic. Chiar și fără condiție, nu funcționează pe un tip de postare personalizat.

curtismchale curtismchale
13 aug. 2010 00:47:57

Am citit de mai multe ori întrebarea ta, dar încă nu este clar pentru mine exact ce încerci să realizezi dacă ignorăm codul sugerat care nu funcționează. Poți să clarifici exact ce încerci să obții? Vrei să publici postarea la data/ora care este în post_date, sau altceva? Sau ai rezolvat deja?

MikeSchinkel MikeSchinkel
13 aug. 2010 01:16:44

Este deja rezolvatat (am furnizat codul mai jos). Voiam doar să public postarea de tip custom chiar dacă era programată pentru viitor.

curtismchale curtismchale
13 aug. 2010 05:45:20
0

Cred că această acțiune este apelată de wp_transition_post_status. Codul este:

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

Deci pentru postările normale programate, ultimul hook va fi future_post, dar pentru tipul tău va fi future_show sau orice alt slug ai pentru tipul tău.

12 aug. 2010 15:36:45
3

Dacă tot ce doriți să faceți este să adăugați o dată suplimentară pentru 'orarul spectacolelor', poate fi mai ușor să adăugați o meta casetă care face exact asta - utilizarea datei de publicare pentru a o falsifica ar putea fi potențial problematică, deoarece WordPress o va seta la statusul "viitor" ori de câte ori este actualizată cu o dată de publicare viitoare (cred), așa că va trebui să conectați de fiecare dată când un articol este actualizat pentru a o seta înapoi. De asemenea, în acest fel puteți rezerva "Data de publicare" pentru ceea ce este destinată.

Aș folosi probabil doar un meta_key și o meta casetă personalizată. Deși depinde cât de complexe sunt interogările dumneavoastră care afișează articolele.

Dacă setați meta_value ca un timestamp, puteți ordona în continuare după data spectacolului sau selecta înainte / după o anumită dată:

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

Ar obține toate "evenimentele" cu un orar de spectacol nu mai târziu de o săptămână de la data curentă. Notă: Cele de mai sus nu au fost testate, dar ar trebui să funcționeze :)

12 aug. 2010 18:36:35
Comentarii

Sunt de acord 100% - este mult mai bine să folosești o cutie meta decât să folosești data publicării ca o soluție improvizată pentru data evenimentului.

Travis Northcutt Travis Northcutt
12 aug. 2010 18:53:25

Da, o cutie meta ar funcționa, dar am găsit dificil să adaug un selector frumos de dată și oră cu jQuery. Cel din WP era mult mai bun decât orice aș fi putut realiza eu.

curtismchale curtismchale
13 aug. 2010 01:06:24

Plugin-ul WP Easy Post Types oferă un câmp personalizat pentru dată și un selector simplu de date, l-am folosit și eu pentru o funcție de listare a evenimentelor.

Rick Curran Rick Curran
17 aug. 2010 00:47:06
1

WP Dev Nacin folosește o simplă suprascriere a funcției:

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;
}
3 feb. 2014 11:58:32
Comentarii

Te rog adaugă o explicație despre cum funcționează acest lucru.

Nicolai Grossherr Nicolai Grossherr
3 feb. 2014 12:20:43