WordPress Paginar $wpdb->get_results

24 may 2012, 21:46:23
Vistas: 24.7K
Votos: 8

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>
            ';

            }
0
Todas las respuestas a la pregunta 2
6
14

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 alcance
  • get_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' => __('&laquo;'),
        'next_text' => __('&raquo;'),
        '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:

  1. El número total de elementos
  2. El número de página actual, basado en 1
  3. 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' => __('&laquo;'),
    'next_text' => __('&raquo;'),
    'total' => ceil($total / $items_per_page),
    'current' => $page
));

Referencias:

24 may 2012 21:52:09
Comentarios

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

uknowit2 uknowit2
24 may 2012 22:23:45

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

getWeberForStackExchange getWeberForStackExchange
25 may 2012 00:27:59

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?

uknowit2 uknowit2
25 may 2012 11:25:16

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

getWeberForStackExchange getWeberForStackExchange
25 may 2012 19:57:21

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

uknowit2 uknowit2
25 may 2012 23:37:10

¡Me alegra escucharlo!

getWeberForStackExchange getWeberForStackExchange
26 may 2012 01:45:39
Mostrar los 1 comentarios restantes
0
// ¡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' => __('&laquo;'),
'next_text' => __('&raquo;'),
'total' => ceil($total / $post_per_page),
'current' => $page,
'type' => 'list'
));
echo '</div>';
?>
8 ago 2014 23:42:17