Marcação de postagem datada futura conforme publicada

12

Caso de uso:

Eu tenho um tipo de postagem relacionado a um programa de música. O "horário do show" é obtido através da data de publicação do post, que é definida para algum momento no futuro. Eu encontrei uma função que leva posts do blog datado futuro e deixa a data, mas marca o post como publicado em salvar, mas não consegui descobrir como personalizá-lo para um tipo de postagem personalizada.

A função está abaixo.

<?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');
?>
    
por curtismchale 12.08.2010 / 05:33

5 respostas

6

Incrível combinando as respostas de Mike e Jan I, surgiu com isso que funciona apenas no tipo de post em questão. Nós não precisamos do condicional de show porque o gancho 'future_show' só pega o tipo de post de show e atualiza isso.

<?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');
?>
    
por curtismchale 13.08.2010 / 00:05
6

Não sei ao certo, pois não tenho o seu site para testar, mas acredito que você só precisa remover 'show' das chamadas remove_action() e add_action() . A função wp_publish_post() é agnóstica em relação aos tipos de postagem, pelo menos é o que aparece lendo o código. Então tente isto:

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

É claro que se você quiser limitar-se apenas a fazer shows, talvez queira fazer algo assim (embora a lógica seja mais complicada se você precisar trabalhar com outros tipos de postagens também):

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

Espero que isso ajude?

    
por MikeSchinkel 12.08.2010 / 19:02
3

Acho que essa ação é chamada por wp_transition_post_status . O código é:

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

Assim, para postagens futuras normais, o último gancho será future_post , mas, para o seu tipo, será future_show ou qualquer tipo de slug.

    
por Jan Fabry 12.08.2010 / 14:36
1

Se tudo o que você quer fazer é adicionar uma data extra para 'show times', pode ser mais fácil adicionar uma meta box que faça exatamente isso - usar a data de Publicação para falsificar isso pode ser potencialmente problemático, já que o WordPress configure-o para o status "futuro" sempre que ele for atualizado com uma data de publicação futura (eu acho), então você terá que ficar enganchando toda vez que um post for atualizado para configurá-lo novamente. Além disso, dessa forma, você poderia reservar "Data de Publicação" para o que é pretendido.

Eu provavelmente usaria apenas um meta_key e uma meta box personalizada. No entanto, depende de quão complexas são as suas consultas que mostram as postagens.

Se você definir meta_value como um registro de data e hora, poderá ordenar até a data da hora do show ou selecionar antes / depois de uma determinada data:

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

Receberia todos os "eventos" com um horário de exibição não depois de uma semana a partir da data atual. Nota: O acima não foi testado, mas deve funcionar:)

    
por Joe Hoyle 12.08.2010 / 17:36
0

WP Dev Nacin usa uma simples substituição de função:

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;
}
    
por Adam David 03.02.2014 / 10:58