En raison d'une configuration multisite complexe, j'ai une requête qui combine les articles de deux blogs et je voudrais paginer les résultats . Je suis reconnaissant pour toute aide. J'ai posté ma requête.
$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.'">Continue Reading</a>
</div>
';
}
J'ai testé cela et cela fonctionne sur mon site. Quelques choses:
$query
par le vôtreglobal $wpdb
(selon votre commentaire concernant les variables globales) car il est hors de portée!get_results()
retourne un objet quand on ne le dit pas autrement (le second paramètre est le type de retour)functions.php
.Voici la fonction:
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.'">Continue Reading</a>
</div>
';
}
echo paginate_links( array(
'base' => add_query_arg( 'cpage', '%#%' ),
'format' => '',
'prev_text' => __('«'),
'next_text' => __('»'),
'total' => ceil($total / $items_per_page),
'current' => $page
));
}
La fonction paginate_links est indépendante de votre requête. À partir de quelques paramètres, tels que le nombre total d’éléments et la page en cours, il peut fournir la pagination que vous recherchez. Donc, vous devez calculer:
Je pensais à quelque chose comme ça (non testé, désolé!):
$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) {
// Your code here ...
}
echo paginate_links( array(
'base' => add_query_arg( 'cpage', '%#%' ),
'format' => '',
'prev_text' => __('«'),
'next_text' => __('»'),
'total' => ceil($total / $items_per_page),
'current' => $page
));
Références:
// This worked great for me so much thanks! I just adapted for what I needed. Right in template file, Sweet!
global $wpdb;
// QUERY HERE TO COUNT TOTAL RECORDS FOR PAGINATION $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 HERE TO GET OUR RESULTS $results = $wpdb->get_results
// PHP FOR EACH LOOP HERE TO DISPLAY OUR RESULTS
// END OUR FOR EACH LOOP
// PAGINATION HERE IN Nice BOOTSTRAP STYLES
<?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>';
?>