Paginate WordPress $ wpdb Query?

У меня есть этот запрос:

<?php $query= "SELECT wposts.* FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta WHERE wposts.ID = wpostmeta.post_id AND wpostmeta.meta_key = 'votes' AND wposts.post_status = 'publish' AND wposts.post_type = 'post' ORDER BY CAST(wpostmeta.meta_value AS SIGNED) DESC LIMIT 10"; $posts = $wpdb->get_results($query, OBJECT); if ($posts ) : foreach ($posts as $post): setup_postdata($post); ?> // Post here <?php endforeach; endif; ?> <div class="pagination"> <?php wp_pagenavi(); ?> </div> 

Я использую это, потому что WordPress не может правильно заказать meta_values, который использует числа, так или иначе … все работает отлично, но я не знаю, как это сделать с помощью wp_pagenavi.

Есть идеи?

Хотя я бы не рекомендовал его, вы можете попробовать изменить свойства глобального объекта $wp_query .

 global $wp_query; // shouldn't be required $query = "SELECT wposts.* FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta WHERE wposts.ID = wpostmeta.post_id AND wpostmeta.meta_key = 'votes' AND wposts.post_status = 'publish' AND wposts.post_type = 'post' ORDER BY CAST(wpostmeta.meta_value AS SIGNED) DESC LIMIT 10"; $posts = $wpdb->get_results($query, OBJECT); $wp_query->posts = $posts; $wp_query->is_paged = true; $wp_query->current_post = -1; // etc etc 

Вы можете найти определение класса WP_Query или выполнить var_dump () или print_r () в объекте $ wp_query после вызова query_posts.

Удачи!

Спасибо @jaziel matoso,

Ниже приведен код:

  global $wp_query; $query = "SELECT wposts.* FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta WHERE wposts.ID = wpostmeta.post_id AND wpostmeta.meta_key = 'votes' AND wposts.post_status = 'publish' AND wposts.post_type = 'post' ORDER BY CAST(wpostmeta.meta_value AS SIGNED) DESC"; $total_record = count($wpdb->get_results($query, ARRAY_A)); $paged = get_query_var('paged') ? get_query_var('paged') : 1; $post_per_page = get_option('posts_per_page'); $offset = ($paged - 1)*$post_per_page; $max_num_pages = ceil($total_record/ $post_per_page); $wp_query->found_posts = $total_record; // number of pages $wp_query->max_num_pages = $max_num_pages; $limit_query = " LIMIT ".$post_per_page." OFFSET ".$offset; $result = $wpdb->get_results($query.$limit_query,OBJECT);// return OBJECT if($result): foreach ($result as $post): setup_postdata($post); ?> <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3> <p><?php the_content(); ?></p> <?php endforeach; ?> <div class="navigation"><?php wp_pagenavi(); ?></div> <?php endif; 

Готово!

 global $wp_query; // per page $ppp = $limit; // full found posts , query without limit $wp_query->found_posts = count($total); // number of pages $wp_query->max_num_pages = ceil($wp_query->found_posts / $ppp); 

Оно работает!

 <?php global $wpdb, $wp_query, $paged; $author = isset($_GET['author_name']) ? get_userdatabylogin($author_name) : get_userdata(intval($author)); $post_per_page = intval(get_query_var('posts_per_page')); query_posts($query_string . '&posts_per_page=' . $post_per_page); $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $offset = ($paged - 1) * $post_per_page; $query = "SELECT `wp_postmeta`.*, `wp_posts`.* "; $query .= "FROM `wp_postmeta` "; $query .= "LEFT JOIN `wp_posts` ON wp_posts.id = wp_postmeta.post_id "; $query .= "WHERE `meta_key` = 'autor' AND `post_status` = 'publish' AND `meta_value` = '%s' "; $postsQuery = $query . "LIMIT $offset, " . $post_per_page; $numRowsQuery = $wpdb->prepare( $query, $author->id ); $allPosts = $wpdb->get_results($numRowsQuery); $wp_query->found_posts = $wpdb->num_rows; $wp_query->max_num_pages = ceil($wp_query->found_posts / $post_per_page); $dataQuery = $wpdb->prepare( $postsQuery, $author->id ); $posts = $wpdb->get_results($dataQuery); ?> <?php if ($posts) : ?> <?php foreach ($posts as $post): ?> <a href="<?php the_permalink(); ?>"><?php echo get_the_title(); ?></a> <?php endforeach; ?> <?php endif; ?> <?php wp_pagenavi(); ?>