WordPress Paginar $wpdb->get_results
Debido a una configuración compleja de multisitio, tengo una consulta que combina las entradas de dos blogs y me gustaría paginar los resultados. Agradezco cualquier ayuda. He publicado mi consulta.
$latestposts = $wpdb->get_results(
"
(SELECT * FROM net_5_posts
INNER JOIN net_5_term_relationships ON net_5_posts.ID=net_5_term_relationships.object_id
WHERE post_type = 'post'
AND post_status = 'publish'
AND term_taxonomy_id = '151'
)
UNION ALL
(SELECT * FROM net_7_posts
INNER JOIN net_7_term_relationships ON net_7_posts.ID=net_7_term_relationships.object_id
WHERE post_type = 'post'
AND post_status = 'publish'
AND term_taxonomy_id = '20'
)
ORDER BY post_date
DESC LIMIT 5",'ARRAY_A');
// Recorre los últimos posts
foreach ($latestposts as $latestpost) {
$da_id = $latestpost['ID'];
$da_title = $latestpost['post_title'];
$da_content = strip_tags($latestpost['post_content']);
$da_content = limit_words($da_content,55);
$da_link = $latestpost['guid'];
$da_date = $latestpost['post_date'];
$da_date = date('F j, Y', strtotime($da_date));
// Imprime la estructura HTML para cada post
echo '
<div class="ldapost">
<h2 class="lheader"><a href="'.$da_link.'">'.$da_title.'</a></h2>
<span class="ldate">'.$da_date.'</span>
<span class="lcontent">'.$da_content.'…</span><br>
<a class="button btnright" href="'.$da_link.'">Continuar Leyendo</a>
</div>
';
}

Actualización
He probado esto y funciona en mi sitio. Algunos puntos importantes:
- Reemplaza mi
$query
con el tuyo global $wpdb
(según tu comentario sobre variables globales) ya que está fuera del alcanceget_results()
devuelve un objeto cuando no se especifica lo contrario (el segundo parámetro es el tipo de retorno)- Coloqué esto en un plugin, pero podrías extraer el código y colocarlo en tu tema o simplemente ponerlo en
functions.php
.
Aquí está la función:
function test_function() {
global $wpdb;
$query = "
(SELECT * FROM wp_18_posts
INNER JOIN wp_18_term_relationships ON wp_18_posts.ID=wp_18_term_relationships.object_id
WHERE post_type = 'post'
AND post_status = 'publish'
AND term_taxonomy_id = '2')
UNION ALL
(SELECT * FROM wp_17_posts
INNER JOIN wp_17_term_relationships ON wp_17_posts.ID=wp_17_term_relationships.object_id
WHERE post_type = 'post'
AND post_status = 'publish'
AND term_taxonomy_id = '2')";
$total_query = "SELECT COUNT(1) FROM (${query}) AS combined_table";
$total = $wpdb->get_var( $total_query );
$items_per_page = 1;
$page = isset( $_GET['cpage'] ) ? abs( (int) $_GET['cpage'] ) : 1;
$offset = ( $page * $items_per_page ) - $items_per_page;
$latestposts = $wpdb->get_results( $query . " ORDER BY post_date LIMIT ${offset}, ${items_per_page}" );
foreach ($latestposts as $latestpost) {
$da_id = $latestpost->ID;
$da_title = $latestpost->post_title;
$da_content = strip_tags($latestpost->post_content);
$da_content = wp_trim_words($da_content, 55);
$da_link = $latestpost->guid;
$da_date = $latestpost->post_date;
$da_date = date('F j, Y', strtotime($da_date));
echo '
<div class="ldapost">
<h2 class="lheader"><a href="'.$da_link.'">'.$da_title.'</a></h2>
<span class="ldate">'.$da_date.'</span>
<span class="lcontent">'.$da_content.'…</span><br>
<a class="button btnright" href="'.$da_link.'">Continuar leyendo</a>
</div>
';
}
echo paginate_links( array(
'base' => add_query_arg( 'cpage', '%#%' ),
'format' => '',
'prev_text' => __('«'),
'next_text' => __('»'),
'total' => ceil($total / $items_per_page),
'current' => $page
));
}
Publicación Original
La función paginate_links es independiente de tu consulta. Dados algunos parámetros, como el número total de elementos y la página actual, puede proporcionar la paginación que buscas. Así que necesitas calcular:
- El número total de elementos
- El número de página actual, basado en 1
- El desplazamiento (offset) para la sentencia LIMIT de MySQL
Estaba pensando en algo como esto (no probado, ¡lo siento!):
$query = "
(SELECT * FROM net_5_posts
INNER JOIN net_5_term_relationships ON net_5_posts.ID=net_5_term_relationships.object_id
WHERE post_type = 'post'
AND post_status = 'publish'
AND term_taxonomy_id = '151'
)
UNION ALL
(SELECT * FROM net_7_posts
INNER JOIN net_7_term_relationships ON net_7_posts.ID=net_7_term_relationships.object_id
WHERE post_type = 'post'
AND post_status = 'publish'
AND term_taxonomy_id = '20'
)";
$total = $wpdb->get_var( "SELECT COUNT(1) FROM (${query}) AS combined_table" );
$items_per_page = 5;
$page = isset( $_GET['cpage'] ) ? abs( (int) $_GET['cpage'] ) : 1;
$offset = ( $page * $items_per_page ) - $items_per_page;
$latestposts = $wpdb->get_results( $query . " ORDER BY post_date LIMIT ${offset}, ${items_per_page}" );
foreach ($latestposts as $latestpost) {
// Tu código aquí ...
}
echo paginate_links( array(
'base' => add_query_arg( 'cpage', '%#%' ),
'format' => '',
'prev_text' => __('«'),
'next_text' => __('»'),
'total' => ceil($total / $items_per_page),
'current' => $page
));
Referencias:
- Esta respuesta sobre paginación.
- Esta respuesta en StackOverflow sobre conteo en uniones de MySQL.

gracias, hmmm no pude hacer que funcionara con mi consulta, quizás me esté faltando algo.

He actualizado mi respuesta para que sea más clara, con algo de pseudocódigo. ¡Espero que esto funcione! Si no, ¡por favor comenta! :)

Hola Weberwithoneb, gracias por seguir conmigo en este tema. He intentado la consulta actualizada pero aparece en blanco, sin errores, simplemente sin resultados. Puedo confirmar que la consulta de mi pregunta sí funciona. ¿Necesito agregar algún global?

He actualizado mi respuesta con el código probado. ¡Por favor comenta si tienes preguntas!

¡¡Guau!! Eres un GENIO y quiero darte un ¡¡GRAN AGRADECIMIENTO!! Funciona de maravilla. ¡Gracias de nuevo!

// ¡Esto funcionó genial para mí, muchas gracias! Solo lo adapté para lo que necesitaba. Directo en el archivo de plantilla, ¡perfecto!
global $wpdb;
// CONSULTA AQUÍ PARA CONTAR EL TOTAL DE REGISTROS PARA LA PAGINACIÓN $total = $wpdb->get_var("SELECT COUNT(*)
$post_per_page = 10;
$page = isset( $_GET['cpage'] ) ? abs( (int) $_GET['cpage'] ) : 1;
$offset = ( $page * $post_per_page ) - $post_per_page;
// CONSULTA AQUÍ PARA OBTENER NUESTROS RESULTADOS $results = $wpdb->get_results
// BUCLE PHP FOREACH AQUÍ PARA MOSTRAR NUESTROS RESULTADOS
// FIN DE NUESTRO BUCLE FOREACH
// PAGINACIÓN AQUÍ CON ESTILOS BOOTSTRAP BONITOS
<?php
echo '<div class="pagination">';
echo paginate_links( array(
'base' => add_query_arg( 'cpage', '%#%' ),
'format' => '',
'prev_text' => __('«'),
'next_text' => __('»'),
'total' => ceil($total / $post_per_page),
'current' => $page,
'type' => 'list'
));
echo '</div>';
?>
