Marcar una publicación con fecha futura como publicada
Caso de uso:
Tengo un tipo de publicación personalizada (custom post type) relacionado con un espectáculo musical. La 'hora del show' se obtiene a través de la fecha de publicación del post, que está configurada para algún momento en el futuro. Encontré una función que toma posts blog con fechas futuras, mantiene la fecha pero marca el post como publicado al guardar, pero no he podido personalizarla para un custom post type.
La función es la siguiente:
<?php
function setup_future_hook() {
// Reemplazar la función nativa future_post con nuestra versión modificada
remove_action('future_post','show', '_future_post_hook');
add_action('future_post', 'show', 'publish_future_post_now');
}
function publish_future_post_now($id) {
// Cambiar el post_status del nuevo post a "publish" en lugar de "future"
wp_publish_post($id);
}
add_action('init', 'setup_future_hook');
?>

Increíble al combinar ambas respuestas de Mike y Jan, llegué a esto que funciona solo en el tipo de publicación en cuestión. No necesitamos el condicional "show" porque el hook 'future_show' solo captura el tipo de publicación "show" y lo actualiza.
<?php
function setup_future_hook() {
// Reemplazar la función nativa future_post con nuestro reemplazo
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');
?>

No puedo asegurarlo ya que no tengo tu sitio para probar, pero creo que solo necesitas 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 publicación, al menos eso parece al leer el código. Así que prueba esto:
<?php
function setup_future_hook() {
// Reemplazar la función future_post nativa con un reemplazo
remove_action('future_post', '_future_post_hook');
add_action('future_post', 'publish_future_post_now');
}
function publish_future_post_now($id) {
// Establecer el post_status de la nueva publicación como "publish" en lugar de "future"
wp_publish_post($id);
}
add_action('init', 'setup_future_hook');
?>
Por supuesto, si deseas limitarlo solo a shows, podrías hacer algo como esto (aunque la lógica será más complicada si necesitas que funcione con otros tipos de publicación también):
function publish_future_post_now($id) {
$post = get_post($id);
if ('show' == $post->post_type)
wp_publish_post($id);
}
¿Espero que esto ayude?

Sí, el primer fragmento de código es con lo que comencé y funciona en publicaciones normales de WordPress, pero si agregas la condición de 'mostrar', no funciona en nada. Incluso sin la condición, no funciona en un tipo de publicación personalizada.

He leído tu pregunta varias veces pero aún no me queda claro exactamente lo que estás tratando de lograr si ignoramos el código sugerido que no funciona. ¿Puedes aclarar qué es exactamente lo que intentas hacer? ¿Quieres publicar la publicación en la fecha/hora que está en post_date, o algo más? ¿O ya lo resolviste?

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);
}
Así que para posts futuros normales, el último hook será future_post
, pero para tu tipo personalizado será future_show
o cualquiera que sea el slug de tu tipo de contenido.

Si lo único que deseas es agregar una fecha adicional para los 'horarios de exhibición', puede ser más fácil añadir un meta box que haga exactamente eso - usar la fecha de publicación para simularlo podría ser potencialmente problemático, ya que WordPress lo establecerá como estado "futuro" cada vez que se actualice con una fecha de publicación futura (creo), por lo que tendrás que engancharte cada vez que se actualice una publicación para volver a establecerlo. Además, de esa manera podrías reservar la "Fecha de publicación" para lo que está destinada.
Probablemente solo usaría un meta_key
y un meta box personalizado. Aunque depende de cuán complejas sean tus consultas que muestran las publicaciones.
Si estableces el meta_value como una marca de tiempo, aún puedes ordenar por la fecha del horario de exhibición, o seleccionar antes/después de cierta fecha:
$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 no mayor a una semana desde la fecha actual. Nota: Lo anterior no está probado, pero debería funcionar :)

Estoy 100% de acuerdo - es mucho mejor usar un meta box que usar la fecha de publicación como un truco para la fecha del evento.

Sí, un meta_box funcionaría pero me resultó difícil añadir un bonito selector de fecha y hora con jQuery. El que trae WP por defecto era mucho mejor que cualquier cosa que pudiera implementar.

WP Dev Nacin utiliza una simple anulación de función:
// Elimina la acción que programa publicaciones futuras
remove_action('future_post', '_future_post_hook');
// Añade un filtro para modificar los datos de la publicación
add_filter( 'wp_insert_post_data', 'nacin_do_not_set_posts_to_future' );
// Función que evita que las publicaciones se establezcan como futuras
function nacin_do_not_set_posts_to_future( $data ) {
// Si el estado es 'future' y el tipo es 'post', cambia a 'publish'
if ( $data['post_status'] == 'future' && $data['post_type'] == 'post' )
$data['post_status'] = 'publish';
return $data;
}
