it-swarm-es.com

Marcando publicación con fecha futura como publicada

Caso de uso:

Tengo un tipo de publicación que se relaciona con un espectáculo de música. El 'show time' se toma a través de la fecha de publicación posterior que se establece en algún momento en el futuro. He encontrado una función que toma las publicaciones de blog con fecha futura y deja la fecha, pero marca la publicación como publicada en guardar, pero no he podido imaginar cómo personalizarla para un tipo de publicación personalizada.

La función está abajo.

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

Increíble combinando las respuestas de Mike y Jan, se me ocurrió esto, que funciona solo en el tipo de publicación en cuestión. No necesitamos el condicional de show porque el gancho 'future_show' solo toma el tipo de publicación del show y lo actualiza.

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

No puedo asegurarlo ya que no tengo su sitio para probar, pero creo que solo necesita eliminar 'show' de las llamadas remove_action() y add_action() La función wp_publish_post() es agnóstica con respecto a los tipos de publicaciones, al menos eso es lo que aparece al leer el código. Así que prueba esto:

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

Por supuesto, si desea limitarse a solo hacer shows, es posible que desee hacer algo como esto (aunque la lógica será más complicada si necesita trabajar con otros tipos de publicaciones):

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

¿Espero que esto ayude?

6
MikeSchinkel

Creo que esta acción es llamada por wp_transition_post_status . El código es:

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

Por lo tanto, para publicaciones futuras normales, el último enlace será future_post, pero para su tipo será future_show o cualquiera que sea su tipo slug.

3
Jan Fabry

Si todo lo que desea hacer es agregar una fecha adicional para 'show times', puede ser más fácil agregar un meta box que haga exactamente eso: usar la fecha de publicación para falsificarla podría ser potencialmente problemático, ya que WordPress lo configurará como estado "futuro" siempre que se actualice con una fecha de publicación futura (creo), por lo que tendrá que estar enganchado cada vez que se actualice una publicación para restablecerla. Además, de esa manera usted podría reservar "Fecha de publicación" para lo que está destinado.

Probablemente solo usaría un meta_key, y un meta box personalizado. Aunque depende de qué tan complejas sean sus consultas que muestren las publicaciones.

Si configura el meta_valor como una marca de tiempo, puede ordenar la fecha de la fecha de la presentación, o seleccionar antes/después de una fecha determinada:

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

Obtendría todos los "eventos" con un show no más tarde de una semana a partir de la fecha actual. Nota: Lo anterior no está probado, pero debería trabajar :)

1
Joe Hoyle

WP Dev Nacin utiliza una función simple de anulación:

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;
}
0
Adam David