Нестандартный sql-запрос и пагинация (wordpress)

323
12 января 2017, 07:57

[оригинал вопроса ниже]

Sql-запрос принял следующий вид (спасибо, @Mike):

global $wpdb;
$myquery = "SELECT wp_posts.ID, wp_posts.post_author, wp_posts.post_date, wp_posts.post_date_gmt, wp_posts.post_content, wp_posts.post_title, wp_posts.post_excerpt, wp_posts.post_status, wp_posts.comment_status, wp_posts.ping_status, wp_posts.post_password, wp_posts.post_name, wp_posts.to_ping, wp_posts.pinged, wp_posts.post_modified, wp_posts.post_modified_gmt, wp_posts.post_content_filtered, wp_posts.post_parent, wp_posts.guid, wp_posts.menu_order, wp_posts.post_type, wp_posts.post_mime_type, wp_posts.comment_count, coalesce(MAX(wp_comments.comment_date),wp_posts.post_date) AS com_date
FROM wp_posts LEFT OUTER JOIN wp_comments
ON wp_posts.ID = wp_comments.comment_post_id
WHERE post_status = 'publish' AND post_type = 'post'
GROUP BY ID
ORDER BY com_date DESC";

Таким образом, вся сортировка происходит только в нём. Затем я подсчитываю общее количество постов, количество постов на одной странице, текущую страницу и стартовый номер записи на странице.

$total_query = "SELECT COUNT(1) FROM (${myquery}) AS combined_table";
$totalposts = $wpdb->get_var( $total_query );
$items_per_page = 2;
$currentpage = isset( $_GET['cpage'] ) ? abs( (int) $_GET['cpage'] ) : 1;
$offset = ( $page * $items_per_page ) - $items_per_page;

И добавляю в запрос LIMIT для пагинации:

$myresult = $wpdb->get_results( $myquery . " LIMIT ${offset}, ${items_per_page}");

Далее я использую paginate_links(), и она работает! Но не отображаются комментарии на всех страницах, кроме первой. В чём ошибка?

// всё вышеописанное...
// пагинация
echo paginate_links( array(
    'base' => add_query_arg( 'cpage', '%#%' ),
    'format' => '',
    'prev_text' => __('«'),
    'next_text' => __('»'),
    'total' => ceil($totalposts / $items_per_page),
    'current' => $currentpage
));
// вывод постов
if($myresult) {
    foreach ($myresult as $post) {
        setup_postdata($post);
        // моя сортировка по категориям (думаю, так делать нехорошо)
        $cats = get_the_category();
        if($cats) {
            foreach ($cats as $cat) { 
                if ($cat->cat_ID == 1) {
                    // ... заголовки, контент и др. информация о постах
                    break;
                }
            }
        }
    }
wp_reset_postdata();
}

Оригинал вопроса.

Имеется sql-запрос на вывод постов (Wordpress):

global $wpdb;
$myquery = "SELECT wp_posts.ID, wp_posts.post_author, wp_posts.post_date, wp_posts.post_date_gmt, wp_posts.post_content, wp_posts.post_title, wp_posts.post_excerpt, wp_posts.post_status, wp_posts.comment_status, wp_posts.ping_status, wp_posts.post_password, wp_posts.post_name, wp_posts.to_ping, wp_posts.pinged, wp_posts.post_modified, wp_posts.post_modified_gmt, wp_posts.post_content_filtered, wp_posts.post_parent, wp_posts.guid, wp_posts.menu_order, wp_posts.post_type, wp_posts.post_mime_type, wp_posts.comment_count, MAX(wp_comments.comment_date) AS com_date
FROM wp_posts LEFT OUTER JOIN wp_comments
ON wp_posts.ID = wp_comments.comment_post_id
WHERE post_status = 'publish' AND post_type = 'post'
GROUP BY ID";
$myresult = $wpdb->get_results($myquery);

Полученный результат (массив) которого потом немного редактируется, а именно:

  1. Если у поста нет комментариев, то в столбец 'дата последнего комментария' дублируется дата этого поста.
  2. Весь массив сортируется по дате последнего комментария.

p.s. Может быть последние 2 действия можно было организовать в одном sql-запросе (знаний не хватает)

// 1.
if ($myresult) {
    foreach ($myresult as $str) {
        if ($str->com_date) {
        } else {
            $str->com_date = $str->post_date;
        }
    }
}   
// 2.
function cmp($a, $b) {
    return strcmp($b->com_date, $a->com_date);
}
usort($myresult,"cmp");

Далее идёт вывод постов:

if($myresult) {
    foreach ($myresult as $post) {
        setup_postdata($post);
        the_author();
        the_title();
        // ... другая информация
        // а здесь нужно организовать пагинацию (!)

Далее нужно организовать пагинацию. При этом сортировка по последнему комментарию не должна слететь. Как мне это сделать?

p.s. Пробовал опираться на следующее решение http://wordpress.stackexchange.com/questions/53194/wordpress-paginate-wpdb-get-results/#53195 Но тогда не отображаются комментарии на страницах пагинации (отображаются только на главной) и сбивается сортировка постов (получается в обратном порядке).

READ ALSO
Ловля исключений php 7.1

Ловля исключений php 7.1

Есть класс исключения, унаследованный от Exception:

310
Превью в виде картинки из файла MS Word

Превью в виде картинки из файла MS Word

Здравствуйте, понадобилось сделать превью вордовского файла в виде картинки, что б еще сохранялось форматирование текста

264
Неверно задаю массив в php запросе

Неверно задаю массив в php запросе

Здравствуйте, уважаемые пользователи стакаОшибка состоит с вытягиванием категорий с БД

295