Autonomía digital y tecnológica

Código e ideas para una internet distribuida

Cómo mostrar las entradas programadas en WordPress

Imago voragine.net
[actualizado el ]

Hace más de un año publicamos una entrada contando cómo crear un listado de entradas programadas, con la intención de hacer una agenda o similar. Para completar, contamos ahora cómo hacer que las entradas se vean una vez se ha accedido a ellas, cuando se usa el single.php.

Para conseguirlo basta incluir el siguiente código en el archivo functions.php o como plugin en el directorio plugins/.

/* Show all future posts */
add_filter('the_posts', 'show_all_future_posts');
function show_all_future_posts($posts) {
   global $wp_query, $wpdb;
   if ( is_single() && $wp_query->post_count == 0 ) {
      $posts = $wpdb->get_results($wp_query->request);
   }
   return $posts;
}

Entradas programadas usando el hook pre_get_posts

Para mostrar las entradas programadas en una plantilla en particular se puede modificar el loop correspondiente usando el hook pre_get_posts, como se explica en este otro tutorial.

Añadiendo el siguiente filtro al loop en el archivo functions.php añadiremos los posts programados al flujo de posts de la portada:

add_filter( 'pre_get_posts', 'prefix_get_future_posts' );
function prefix_get_future_posts( $query ) {
    if ( is_home() && $query->is_main_query() && false == $query->query_vars['suppress_filters'] ) {
        $query->set( 'post_status', array( 'publish', 'future' ) );
    }
    return $query;
}

El valor 'future' al argumento post_status añade los posts programados al loop. Si se quiere una lista únicamente con los posts programados, hay que quitar ‘publish’ del array. Para más opciones ver la página de WP_Query en el Codex.

La condición is_home() aplica el filtro únicamente a la portada del sitio. Para más opciones consultar la lista de condicionales de WordPress.

12 comentarios

    • Por after •

    Buenas,acabo de encontrar esto y lo he probado en septiembre de 2016, pero parece que no funciona. Tienes alguna alternativa? me es importante mostrar publicamente los eventos venideros. Graci.as

    1. Hola after,

      puedes hacerlo también usando el hook pre_get_posts, como explico en este otro tutorial, utilizando el argumento post_status y asignándole el valor 'future'.

        • Por Antonio

        Por favor Skotperez, podrías poner el código aquí escrito que deberiamos implementar y en que archivo de wordpress. Lo intento pero es posible que no esté entendiendo algo. Gracias

    • Por Antuan •

    Gracias por responder. Desconozco cómo agrupar y escribir exactamente lo que me propones, no soy programador, si no diseñador. Te estaría agradecido si lo viera como tienes el de arriba. Yo y muchos otros como yo…. :)

    1. He actualizado el post con una explicación y un snippet sobre cómo listar los posts programados usando el hook pre_get_posts.

    • Por Antuan •

    Hola de nuevo, gracias por el trabajo. He pegado el codigo tal cual en mi hoja del theme functions.php pero sigue sin hacer nada. Luego le he quitado Publish del Array por si acaso pero tampoco. Decirte que mi problema es el siguiente: tendría que aparecen los eventos futuros y actuales dentro de una categoría que se llama Próximos Eventos. Quizás en formato blog y sin categoría aparecerían, pero como digo, tendrían que aparecer en una pagina nueva al pulsar un menú con la categoría Próximos Eventos.

    Crees que es posible esto o es muy complicado de hacer? Me estoy volviendo loco con este tema, no se cómo WP no tiene esa opción de mostrar eventos venideros dentro de una categoria si el administrador lo desea.

    Te agradezco mucho el trabajo de veras.

    1. Hola Antuan,

      lo que quieres hacer es posible, pero si es muy complicado, quizás puedas usar un plugin de eventos. Hay varios disponibles en el repositorio de WordPress.

    2. Estoy pensado, Antuan, que quizás no te funciona porque te falta algún argumento para filtrar correctamente el loop. ¿Has añadido el post type, por ejemplo? Algo Así:

      $query->set('post_type'=>'el_slug_del_post_type');

    • Por Antonio

    Hola, intento implementar los ejemplos que mostráis pero debo estar haciendo algo mal. Tengo una shop online montada con woocommerce. Contiene un catálogo de cursos. Muchos de ellos tienen las fechas programadas para incluso dentro de unos meses. Pero claro, necesito que las personas vean todo el catálogo completo de los cursos e incluso poder verlo en el calendario. Pero no consigo hacerlo. Cuando muestro las páginas de las categorías de productos, los productos o el catálogo, las entradas o productos programados no aparecen. Por favor, alguien podría ayudarme. No consigo avanzar

    1. Hola Antonio,

      Woocommerce tiene un funcionamiento algo diferente. En principio viene preparado para mostrar productos que estarán disponibles a futuro.

      El código de este tutorial debería servirte si le añades el post type correspondiente como argumento al loop usando $query->set. Algo así:

      $query->set('post_type'=>'el_slug_del_post_type');

    • Por Antonio

    Buenos días Skotperez, gracias por tu ayuda. Es que no tengo muchos conocimientos de programación. Cual de los dos ejemplos es el que debo usar?. Por favor, sería mucho pedirte si podrías escribirme el código aquí completo tal cual tu lo insertarías y donde debo insertarlo. Es el en funcion.php o en simple.php?. Es que desde el mismo momento en que meto la fecha futura de un producto, en cuanto hago un filtrado de productos de una categoría o incluso en el mismo shop online, no aparecen los «programados». Te agradecería muchísimo tu ayuda. Un cordial saludo y buenos deseos

    1. Hola Antonio,

      puedes usar cualquiera de las dos soluciones. El que decidas usar debes colocarlo en el archivo functions.php. Si usas la última tienes que cambiar la condición de la sentencia condicional is_home() por la que necesites para aplicar el filtro en tu caso.

      Dentro de la sentencia condicional puedes añadir argumentos para aplicar al loop: en tu caso debes añadir al menos el tipo de custom post, como te decía en el comentario anterior.

Dejar un comentario

*
*

 

No hay trackbacks