WordPress Paginazione $wpdb->get_results

24 mag 2012, 21:46:23
Visualizzazioni: 24.7K
Voti: 8

A causa di una configurazione multisite complessa, ho una query che combina i post da due blog e vorrei paginare i risultati. Apprezzo qualsiasi aiuto. Ho pubblicato la mia query.

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

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

            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.'">Continua a Leggere</a>
            </div>
            ';

            }
0
Tutte le risposte alla domanda 2
6
14

Aggiornamento

Ho testato questo codice e funziona sul mio sito. Alcune cose da notare:

  • Sostituisci la mia $query con la tua
  • global $wpdb (come da tuo commento riguardo alle variabili globali) poiché è fuori dallo scope!
  • get_results() restituisce un oggetto se non specificato diversamente (il secondo parametro è il tipo di ritorno)
  • Ho inserito questo codice in un plugin, ma potresti estrarlo e posizionarlo nel tuo tema o semplicemente metterlo in functions.php.

Ecco la funzione:

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.'">Continua a leggere</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
    ));
}

Post Originale

La funzione paginate_links è indipendente dalla tua query. Dati alcuni parametri, come il numero totale di elementi e la pagina corrente, può fornire l'impaginazione che stai cercando. Quindi devi calcolare:

  1. Il numero totale di elementi
  2. Il numero della pagina corrente, basato su 1
  3. L'offset per la clausola LIMIT di MySQL.

Stavo pensando a qualcosa del genere (non testato, scusate!):

$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) {
    // Il tuo codice qui ...
}

echo paginate_links( array(
    'base' => add_query_arg( 'cpage', '%#%' ),
    'format' => '',
    'prev_text' => __('&laquo;'),
    'next_text' => __('&raquo;'),
    'total' => ceil($total / $items_per_page),
    'current' => $page
));

Riferimenti:

24 mag 2012 21:52:09
Commenti

grazie, hmmm non sono riuscito a farlo funzionare con la mia query, forse mi sfugge qualcosa.

uknowit2 uknowit2
24 mag 2012 22:23:45

Ho aggiornato la mia risposta per renderla più chiara, con un po' di pseudocodice. Spero che funzioni! Altrimenti, per favore commenta! :)

getWeberForStackExchange getWeberForStackExchange
25 mag 2012 00:27:59

Ciao Weberwithoneb grazie per avermi seguito su questa questione. Ho provato la query aggiornata ma restituisce vuoto, nessun errore, semplicemente nessun risultato. Posso confermare che la query nella mia domanda funziona. Devo aggiungere qualche global?

uknowit2 uknowit2
25 mag 2012 11:25:16

Ok ho aggiornato la mia risposta con il codice testato. Commenta pure se hai domande!

getWeberForStackExchange getWeberForStackExchange
25 mag 2012 19:57:21

Wow!! Sei un GENIO e voglio dirti un GRAZIE ENORME!! Funziona alla perfezione!! Grazie ancora.

uknowit2 uknowit2
25 mag 2012 23:37:10

Felice di sentirlo!!

getWeberForStackExchange getWeberForStackExchange
26 mag 2012 01:45:39
Mostra i restanti 1 commenti
0
// Questo ha funzionato benissimo per me, grazie mille! Ho solo adattato per ciò di cui avevo bisogno. Direttamente nel file del template, Fantastico!
global $wpdb;
// QUERY QUI PER CONTARE I RECORD TOTALI PER LA PAGINAZIONE $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;

// QUERY QUI PER OTTENERE I NOSTRI RISULTATI $results = $wpdb->get_results

// CICLO PHP FOREACH QUI PER VISUALIZZARE I NOSTRI RISULTATI
// FINE DEL NOSTRO CICLO FOREACH

// PAGINAZIONE QUI CON STILE BOOTSTRAP ACCATTIVANTE
<?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