Marcando o post datado como publicado

13

Caso de uso:

Eu tenho um tipo de post relacionado a um programa de música. O 'horário do show' é marcado pela data de publicação posterior, que será definida em algum momento no futuro. Encontrei uma função que pega futuras postagens de blog datadas e deixa a data, mas marca a postagem como publicada em save, mas não foi capaz de descobrir como personalizá-la 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');
?>
curtismchale
fonte
1
É possível que você tenha um erro na sua chamada remove_actione add_action? Seu segundo parâmetro é 'show', mas não deveria ser a função que você está adicionando ou removendo?
Jan Fabry

Respostas:

7

Incrível, combinando as respostas de Mike e Jan, criei isso que funciona apenas no tipo de post em questão. Não precisamos da condição condicional do show, porque o gancho 'future_show' pega apenas o tipo de post do show e o atualiza.

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

Eu não posso dizer com certeza já que não têm o seu site para teste com mas eu acredito que você só precisa remover 'show'a partir remove_action()e add_action()chamadas. A wp_publish_post()função é independente em relação aos tipos de postagem, pelo menos é o que parece ao ler o código. Então tente o seguinte:

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

Obviamente, se você deseja limitar apenas a fazer shows, pode fazer algo assim (embora a lógica seja mais complicada se você precisar trabalhar com outros tipos de postagem também):

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

Espero que isto ajude?

MikeSchinkel
fonte
Sim, o primeiro pedaço de código é o que eu comecei e funciona em postagens normais do WordPress, mas se você adicionar o condicional de 'show', não funcionará em nada. Mesmo sem o condicional, ele não funciona em um tipo de postagem personalizado.
Curtismchale
Eu li sua pergunta várias vezes, mas ainda não está claro para mim exatamente o que você está tentando realizar se ignorarmos o código sugerido que não funciona. Você pode esclarecer o que exatamente você está tentando realizar? Deseja publicar a postagem na data / hora que está no post_date ou em alguma outra coisa? Ou você já resolveu?
MikeSchinkel
Já está resolvido (forneci o código abaixo). Eu só queria publicar a postagem do tipo de postagem personalizada, mesmo que agendada para o futuro.
Curtismchale 13/08/10
4

Eu acho que essa ação é convocada 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);
}

Portanto, para postagens futuras normais, o último gancho será future_post, mas, para o seu tipo, será future_showou seja qual for o seu tipo de lesma.

Jan Fabry
fonte
1

Se tudo o que você deseja fazer é adicionar uma data extra para 'horários do show', pode ser mais fácil adicionar uma caixa meta que faça exatamente isso - usar a data de publicação para falsificá-la pode ser potencialmente problemático, pois o WordPress a definirá como status "futuro" sempre que for atualizado com uma data de publicação futura (eu acho), então você precisará estar conectado sempre que uma postagem for atualizada para restaurá-la novamente. Além disso, você pode reservar "Data de publicação" para o que se destina.

Eu provavelmente usaria apenas uma meta_keye uma meta box personalizada. Embora dependa da complexidade das suas consultas que mostram as postagens.

Se você definir o meta_value como um carimbo de data / hora, poderá solicitar ainda 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 o mais tardar uma semana a partir da data atual. Nota: O acima não foi testado, mas deve funcionar :)

Joe Hoyle
fonte
Eu concordo com isso 100% - é muito melhor usar uma caixa meta do que usar a data de publicação como um hack para a data do evento.
Travis Northcutt
Sim, uma meta_box funcionaria, mas achei difícil adicionar um bom seletor de data e hora do jQuery. O WP estoque era muito melhor do que qualquer coisa que eu pudesse criar.
Curtismchale 12/08/10
O plug-in WP Easy Post Types fornece um campo de data personalizado e fornece um seletor de datas simples, eu mesmo o usei para uma função de listagem de Eventos.
Rick Curran
0

O WP Dev Nacin usa uma substituição simples 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;
}
Adam David
fonte
Por favor, adicione algumas explicações sobre como isso funciona.
Nicolai