• ResueltoModerador almendron

    (@almendron)


    He creado la taxonomía «Series de artículos» con la finalidad de mostrar todos los artículos correspondientes a una determinada serie.

    El resultado lo podéis ver en https://www.almendron.com/tribuna/series-de-articulos/

    Ahora bien, me gustaría añadir la frase: Esta serie se publicó entre el X y el Y día del mes de Z del año W.

    Para ello, necesito una función que devuelva la fecha de publicación del post más antiguo y del más reciente.

    O dicho de otro modo: necesito una función que devuelva en un array los posts asignados a una taxonomía concreta.

    Edito y actualizo. Dejo el código que estoy usando:

    $terms = get_terms( array( 'taxonomy' => 'series', 'orderby' => 'slug' ) );
    foreach ($terms as $term) {
    	echo '<h5>' .  '<a href="'  . esc_attr(get_term_link($term, 'series')) . '" title="' . sprintf( __( "Ver todos las entradas de %s" ), $term->name ) . '" ' . '>' . $term->name.'</a>: ' . $term->count . ' artículos' . '</h5>' . "\n";
    	echo '<p style="margin-bottom:3em;">' . $term->description . '</p>' . "\n";
    }

    Vuelvo a editar: lo de coger el primer y el último valor no hay problema.

    El array me devuelve el nombre de las series. Lo que no se como seguir. Lo pongo en modo esquemático:

    1. El array va pasando serie a serie.
    2. Por cada serie va poniendo el título, el número de artículos y la descripción.
    3. Ahora quiero coger esa serie, consultar los artículos y comprobar cuando se publicó el primero y cuando el último.

    Este último paso es el que no se hacer.

    • Este debate fue modificado hace 4 años por almendron.
    • Este debate fue modificado hace 4 años por almendron.
    • Este debate fue modificado hace 4 años por almendron.
    • Este debate fue modificado hace 4 años por almendron.
    • Este debate fue modificado hace 3 años, 12 meses por almendron.

    La página con la que necesito ayuda: [accede para ver el enlace]

Viendo 9 respuestas - de la 1 a la 9 (de un total de 9)
  • Moderador LGrusin

    (@lgrusin)

    No se me ocurre como hacerlo en una misma consulta.

    Igual esto te puede dar una idea de dos consultas para obtener el primero y último
    https://gist.github.com/gbyat/8708197

    Moderador almendron

    (@almendron)

    El problema no es acceder al primero o al último ya que hay funciones para ello («reset» y «end»).

    A ver si lo explico de forma más sencilla:

    1) Accede a https://www.almendron.com/tribuna/series-de-articulos/

    2) Clic en la primera serie, China rules: https://www.almendron.com/tribuna/series/china-rules/

    y te salen todos las artículos de la serie «China rules».

    Pues eso es lo que quiero obtener pero en «memoria», es decir, sin mostrar en pantalla.

    Moderador almendron

    (@almendron)

    Lo explico de otra forma:

    «get_terms» devuelve los elementos de una taxonomía y lo hace en forma de array.

    Lo que necesito es la misma función pero para los posts que hay dentro de cada taxonomía.

    Moderador kallookoo

    (@kallookoo)

    Hola @almendron
    Veamos, quieres tener un array con todos los posts de x series.
    Entonce diria que necesitas esto:

    
    $term_id = 1; // term id para filtar los posts 
    $posts_in_term = get_posts(
    	[
    		'post_type' => 'post_type_name', // El Post Type que sea, post or custom post type
    		'nopaging'  => false, // Con esto te devolvera todos.
    		'order'     => 'DESC', // Tambien podria se ASC 
    		'tax_query' => [ 
    			[
    				'taxonomy' => 'series',
    				'terms'    => $term_id, 
    				'field'    => 'term_id',
    			]
    		],
    	]
    );
    

    En el ejemplo uso la id del termino, pero se puede usar el slug, name o term_taxonomy_id. Aunque tambien se debe modificar el field.

    Saludos

    Moderador almendron

    (@almendron)

    Eso es !!!!!!!!!

    He cambiado «order» a «ASC» y he añadido a la «tax_query» una condición más para asegurarme que lo ordena por fecha: 'orderby' => 'date'

    PREGUNTA: ¿está bien añadido «orderby» dentro de la tax_query o debo ponerlo en el primer array?

    Después he recuperado la fecha de publicación del primer y del último artículo:

    foreach ( $posts_in_term as $post ) :
    	if ($post === end($posts_in_term)) {
    		$fechaultimo = get_the_date();
    	}
    	if ($post === reset($posts_in_term)) {
    		$fechaprimero = get_the_date();
    	}
    
    endforeach;
    
    echo '<p style="margin-bottom:3em;">Esta serie se publicó entre el ' . $fechaprimero . ' y el ' . $fechaultimo . '</p>';

    PREGUNTA: ¿se pueden recuperar esos valores sin necesidad de hacer un foreach?

    Moderador kallookoo

    (@kallookoo)

    Hola @almendron

    Por defecto ya se ordena por fecha, mirate las posibilidades aqui; https://developer.wordpress.org/reference/classes/wp_query/parse_query/

    Con lo que no seria necesario, el orderby dentro de la tax_query no funciona, mira los valores aqui; https://developer.wordpress.org/reference/classes/wp_tax_query/__construct/

    Dicho esto, si sabes o crees que algun plugin modifica la query si quieres asegurarte de que no la modifica añade en el array de la function get_posts, esto:
    'suppress_filters' => true,

    Sobre extraer el primero y ultimo prueba asi:

    
    $first_post = reset( $posts_in_term );
    $last_post  = array_pop( $posts_in_term );
    if ( ( $first_post instanceof \WP_Post ) && ( $last_post instanceof \WP_Post ) ) {
    	$first_post_date = get_the_date( '', $first_post );
    	$last_post_data  = get_the_date( '', $last_post );
    	/** Lo que sea */
    }
    

    El primer argumento de get_the_date es para especificar un formato de fecha diferente al que tengas configurado, en Ajustes Generales – Formato de fecha.

    Otra opcion forma seria esta, que fue la que te comente por el slack.
    Pienso que es mejor ya que realmente no necesitas todos los posts.

    
    $first_post = get_posts(
    	[
    		'post_type' => 'post_type_name', // El Post Type que sea, post or custom post type
    		'posts_per_page'  => 1, // Con esto te devolvera solo uno.
    		'order'     => 'ASC',
    		'tax_query' => [
    			[
    				'taxonomy' => 'series',
    				'terms'    => $term_id,
    				'field'    => 'term_id',
    			]
    		],
    	]
    );
    $last_post = get_posts(
    	[
    		'post_type' => 'post_type_name', // El Post Type que sea, post or custom post type
    		'posts_per_page'  => 1, // Con esto te devolvera solo uno.
    		'order'     => 'DESC',
    		'tax_query' => [
    			[
    				'taxonomy' => 'series',
    				'terms'    => $term_id,
    				'field'    => 'term_id',
    			]
    		],
    	]
    );
    
    if ( 
    	isset( $first_post[0], $last_post[0] ) && 
    	( $first_post[0] instanceof \WP_Post ) && ( $last_post[0] instanceof \WP_Post ) 
    ) {
    	$first_post_date = get_the_date( '', $first_post[0] );
    	$last_post_data  = get_the_date( '', $last_post[0] );
    	/** Lo que sea */
    }
    
    • Esta respuesta fue modificada hace 3 años, 12 meses por kallookoo.
    Moderador almendron

    (@almendron)

    No acaba de funcionar.

    A ver si lo explico bien: no importa qué método utilice porque parece que solo coge los primeros 5 artículos o los 5 últimos dependiendo si pones ASC O DESC. El caso es que solo coge 5.

    He puesto para comprobar:

    $first_post = reset( $posts_in_term );
    $first_post_date = get_the_date( '', $first_post );
    $last_post = end( $posts_in_term );
    $last_post_date = get_the_date( '', $last_post );

    Y funciona pero en el array solo hay 5 post, y por tanto lo hace mal siempre que la serie tenga más de dicho número.
    De hecho, hay una serie que tiene 5 artículos y lo hace bien.

    Moderador kallookoo

    (@kallookoo)

    Hola, cambia el posts_per_page por numberposts

    Moderador almendron

    (@almendron)

    Eso te iba a de decir 🙂

    Ya he puesto lo de 'numberposts' => -1, y así funciona cualquiera de los dos métodos.

    He dejado el que recupera todos los posts por si el día de mañana quisiera poner, por ejemplo, un listado de cada serie.

    Al final ha quedad así:

    Primero un «get_terms» para obtener un array con todas las series de artículos.

    Después usando foreach, para cada serie de artículos pongo el título, el número de artículos y la descripción. Finalmente, la frase de marras donde indico cuando se publicó el primer y el último artículo de la serie.

    Así queda el código:

    $terms = get_terms( array( 'taxonomy' => 'series', 'orderby' => 'slug' ) );
    foreach ($terms as $term) {
    	echo '<h6>' .  '<a href="'  . esc_attr(get_term_link($term, 'series')) . '" title="' . sprintf( __( "Ver todos las entradas de %s" ), $term->name ) . '" ' . '>' . $term->name.'</a>: ' . $term->count . ' artículos' . '</h6>' . "\n";
    	echo '<p>' . $term->description . '</p>' . "\n";
    
    	$term_id = $term->term_id;
    
    	$posts_in_term = get_posts(
    		[
    			'post_type' => 'post',
    			'numberposts' => -1,
    			'orderby'   => 'date',
    			'order'     => 'ASC',
    			'tax_query' => [ 
    				[
    				'taxonomy' => 'series',
    				'terms'    => $term_id, 
    				'field'    => 'term_id',
    				]
    			],
    		]
    
    	);
    
    	$first_post = reset( $posts_in_term );
    	$first_post_date = get_the_date( '', $first_post );
    
    	$last_post = end( $posts_in_term );
    	$last_post_date = get_the_date( '', $last_post );
    
    	echo '<p style="margin-bottom:3em;">Esta serie se publicó entre el ' . $first_post_date . ' y el ' . $last_post_date . '</p>';
    
    }

    Como siempre, una gran suerte contar con tu ayuda.

    Muchas gracias !!!!!!!!!!!!!!!!

Viendo 9 respuestas - de la 1 a la 9 (de un total de 9)
  • El debate ‘Serie de artículos’ está cerrado a nuevas respuestas.