Contrassegnare post futuri come pubblicati


13

Caso d'uso:

Ho un tipo di post relativo a uno spettacolo musicale. Il "tempo di spettacolo" viene acquisito attraverso la data di pubblicazione del post, che è impostata su un certo periodo in futuro. Ho trovato una funzione che accetta post di blog datati futuri e lascia la data ma contrassegna il post come pubblicato sul salvataggio ma non sono riuscito a capire come personalizzarlo per un tipo di post personalizzato.

La funzione è sotto.

<?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
È possibile che tu abbia un errore nel tuo remove_actione add_actionchiamare? Il tuo secondo parametro è 'show', ma non dovrebbe essere la funzione che stai aggiungendo o rimuovendo?
Jan Fabry,

Risposte:


7

Incredibile combinazione di entrambe le risposte di Mike e Jan, mi è venuta questa idea che funziona solo sul tipo di post in questione. Non abbiamo bisogno del condizionale di show perché l'hook 'future_show' prende solo il tipo di post di show e lo aggiorna.

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

Non posso dire con certezza dal momento che non ho il tuo sito per test con, ma credo che solo bisogno di rimuovere 'show'da remove_action()e add_action()chiamate. La wp_publish_post()funzione è agnostica rispetto ai tipi di post, almeno questo è ciò che appare dalla lettura del codice. Quindi prova questo:

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

Ovviamente se vuoi limitarti a fare solo spettacoli potresti voler fare qualcosa del genere (anche se la logica sarà più complicata se ne avrai bisogno per funzionare anche con altri tipi di post):

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

Spero che sia di aiuto?


Sì, il primo bit di codice è quello con cui ho iniziato e funziona sui normali post di WordPress ma se aggiungi il condizionale di "show" non funziona su nulla. Anche senza il condizionale non funziona su un tipo di post personalizzato.
curtismchale,

Ho letto la tua domanda più volte ma non mi è ancora chiaro esattamente cosa stai cercando di realizzare se ignoriamo il codice suggerito che non funziona. Puoi chiarire che cosa stai esattamente cercando di realizzare? Vuoi pubblicare il post nella data / ora che si trova nel post_date o qualcos'altro? O l'hai già risolto?
MikeSchinkel,

È già risolto (ho fornito il codice di seguito). Volevo solo pubblicare il tipo di post personalizzato anche se programmato per il futuro.
curtismchale,

4

Penso che questa azione venga chiamata da wp_transition_post_status. Il codice è:

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

Quindi per i normali messaggi futuri sarà l'ultimo hook future_post, ma per il tuo tipo sarà future_showo qualunque sia il tuo tipo di lumaca.


1

Se tutto ciò che vuoi fare è aggiungere una data in più per "orari spettacolo", potrebbe essere più semplice aggiungere una meta-box che fa esattamente questo - usare la data di pubblicazione per falsificare potrebbe essere potenzialmente problematico, poiché WordPress lo imposterà su stato "futuro" ogni volta che viene aggiornato con una data di pubblicazione futura (credo), quindi dovrai collegarti ogni volta che un post viene aggiornato per ripristinarlo nuovamente. Inoltre, in questo modo potresti riservare "Data di pubblicazione" per quello che è destinato.

Probabilmente userei solo una meta_keye una meta box personalizzata. Tuttavia, dipende dalla complessità delle tue query che mostrano i post.

Se si imposta meta_value come data / ora, è possibile ordinare entro la data di inizio dello spettacolo o selezionare prima / dopo una determinata data:

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

Otterrebbe tutti gli "eventi" con uno spettacolo entro e non oltre una settimana dalla data corrente. Nota: quanto sopra non è testato, ma dovrebbe funzionare :)


Sono d'accordo con questo 100% - molto meglio usare una meta-box piuttosto che usare la data di pubblicazione come hack per la data dell'evento.
Travis Northcutt,

Sì, un meta_box funzionerebbe, ma ho trovato difficile aggiungere un bel selettore di data e ora di jQuery. Il WP di serie era molto più bello di qualsiasi cosa mi venisse in mente.
curtismchale,

Il plugin WP Easy Post Tipi fornisce un campo data personalizzato e fornisce un semplice selettore di date, l'ho usato per una funzione di elenco degli eventi.
Rick Curran,

0

WP Dev Nacin utilizza una semplice funzione di override:

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

Si prega di aggiungere alcune spiegazioni su come funziona.
Nicolai,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.