Marcarea postărilor cu dată viitoare ca publicate
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');
?>

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

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ă?

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.

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?

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.

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 :)

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.

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.

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