WordPress Paginazione $wpdb->get_results
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>
';
}

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' => __('«'),
'next_text' => __('»'),
'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:
- Il numero totale di elementi
- Il numero della pagina corrente, basato su 1
- 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' => __('«'),
'next_text' => __('»'),
'total' => ceil($total / $items_per_page),
'current' => $page
));
Riferimenti:
- Questa risposta sull'impaginazione.
- Questa risposta su StackOverflow sul conteggio nelle unioni MySQL.

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

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

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?

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

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

// 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' => __('«'),
'next_text' => __('»'),
'total' => ceil($total / $post_per_page),
'current' => $page,
'type' => 'list'
));
echo '</div>';
?>
