Marcado de publicaciones futuras con fecha de publicación

13

Caso de uso:

Tengo un tipo de publicación que se relaciona con un programa de música. El "tiempo de presentación" se toma a través de la fecha de publicación de la publicación, que se establece en algún momento en el futuro. He encontrado una función que toma futuras publicaciones de blog con fecha y deja la fecha, pero marca la publicación como publicada en guardar, pero no he podido encontrar la forma de 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');
?>
curtismchale
fuente
1
¿Es posible que tenga un error en su remove_actiony add_actionllame? Su segundo parámetro es 'show', pero ¿no debería ser la función que está agregando o eliminando?
Jan Fabry

Respuestas:

7

Impresionante la combinación de las respuestas de Mike y Jan. Se me ocurrió esto, que solo funciona en el tipo de publicación en cuestión. No necesitamos el condicional de show porque el enlace 'future_show' solo toma el tipo de publicación de 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');
?>
curtismchale
fuente
7

No puedo decir con seguridad, ya que no tengo su sitio a prueba con, pero creo que sólo tiene que quitar 'show'de remove_action()y add_action()llamadas. La wp_publish_post()función es agnóstica con respecto a los tipos de publicación, al menos eso es lo que parece al leer el código. Entonces 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 hacer solo programas, es posible que desee hacer algo como esto (aunque la lógica será más complicada si necesita que funcione también 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?

MikeSchinkel
fuente
Sí, la primera parte del código es con lo que comencé y funciona en publicaciones normales de WordPress, pero si agrega el condicional de 'mostrar' no funciona en nada. Incluso sin el condicional, no funciona en un tipo de publicación personalizada.
curtismchale
He leído su pregunta varias veces, pero aún no me queda claro exactamente qué está tratando de lograr si ignoramos el código sugerido que no funciona. ¿Puedes aclarar qué es exactamente lo que estás tratando de lograr? ¿Desea publicar la publicación en la fecha / hora que está en post_date, o algo más? ¿O ya lo has resuelto?
MikeSchinkel
Ya está resuelto (proporcioné el código a continuación). Solo quería publicar la publicación de tipo de publicación personalizada incluso si estaba programada para el futuro.
curtismchale
4

Creo que se llama a esta acción wp_transition_post_status. El codigo 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);
}

Entonces, para publicaciones futuras normales, el último gancho será future_post, pero para su tipo será future_showo lo que sea su tipo de babosa.

Jan Fabry
fuente
1

Si todo lo que desea hacer es agregar una fecha adicional para 'mostrar horarios', puede ser más fácil agregar un cuadro de meta que hace exactamente eso: usar la fecha de publicación para falsificarlo podría ser potencialmente problemático, ya que WordPress lo configurará en estado "futuro" cada vez que se actualiza con una fecha de publicación futura (creo), por lo que tendrá que estar enganchando cada vez que se actualice una publicación para volver a configurarla. Además, de esa manera podría reservar "Fecha de publicación" para lo que está destinado.

Probablemente solo usaría un meta_keyy un meta cuadro personalizado. Aunque depende de cuán complejas sean sus consultas que muestren las publicaciones.

Si configura el meta_valor como una marca de tiempo, puede ordenar por 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 horario de exhibición a más tardar una semana después de la fecha actual. Nota: Lo anterior no se ha probado, pero debería funcionar :)

Joe Hoyle
fuente
Estoy de acuerdo con este 100%: es mucho mejor usar un meta cuadro que usar la fecha de publicación como un truco para la fecha del evento.
Travis Northcutt
Sí, un meta_box funcionaría, pero me resultó difícil agregar un buen selector de fecha y hora de jQuery. El stock WP one era mucho mejor que cualquier cosa que se me ocurriera.
curtismchale
El complemento WP Easy Post types proporciona un campo de fecha personalizado y proporciona un selector de fecha simple, lo he usado para una función de listado de eventos.
Rick Curran
0

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

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
fuente
Agregue alguna explicación de cómo funciona esto.
Nicolai