WordPress разбивка на страницы результатов $wpdb->get_results

24 мая 2012 г., 21:46:23
Просмотры: 24.7K
Голосов: 8

Из-за сложной конфигурации multisite, у меня есть запрос, который объединяет записи из двух блогов, и я хотел бы разбить результаты на страницы. Буду благодарен за любую помощь. Ниже мой текущий запрос.

            $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.'">Читать далее</a>
            </div>
            ';

            }
0
Все ответы на вопрос 2
6
14

Обновление

Я протестировал этот код, и он работает на моем сайте. Несколько замечаний:

  • Замените мой $query на ваш
  • Добавьте global $wpdb (как вы упомянули в комментарии про глобальные переменные), так как он вне области видимости!
  • get_results() возвращает объект, если не указано иное (второй параметр определяет тип возвращаемого значения)
  • Я разместил этот код в плагине, но вы можете извлечь его и поместить в свою тему или просто добавить в functions.php.

Вот функция:

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.'">Читать далее</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
    ));
}

Исходный пост

Функция paginate_links не зависит от вашего запроса. Имея несколько параметров, таких как общее количество элементов и текущая страница, она может предоставить нужную вам пагинацию. Поэтому вам нужно рассчитать:

  1. Общее количество элементов
  2. Номер текущей страницы (начиная с 1)
  3. Смещение для оператора LIMIT в MySQL.

Я думал о чем-то подобном (не тестировал, извините!):

$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) {
    // Ваш код здесь ...
}

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

Ссылки:

24 мая 2012 г. 21:52:09
Комментарии

спасибо, хм, у меня не совсем получилось заставить это работать с моим запросом, возможно, я что-то упускаю.

uknowit2 uknowit2
24 мая 2012 г. 22:23:45

Я обновил свой ответ, чтобы он был понятнее, с псевдокодом. Надеюсь, это сработает! Если нет, пожалуйста, напишите! :)

getWeberForStackExchange getWeberForStackExchange
25 мая 2012 г. 00:27:59

Привет Weberwithoneb, спасибо, что остаётесь со мной в этом вопросе. Я попробовал обновлённый запрос, но он возвращает пустоту — нет ошибок, просто нет результатов. Могу подтвердить, что запрос в моём вопросе работает. Нужно ли добавить какие-либо глобальные переменные?

uknowit2 uknowit2
25 мая 2012 г. 11:25:16

Хорошо, я обновил свой ответ с проверенным кодом. Пожалуйста, задавайте вопросы в комментариях!

getWeberForStackExchange getWeberForStackExchange
25 мая 2012 г. 19:57:21

Вау!! Ты ГЕНИЙ, и я хочу сказать ОГРОМНОЕ СПАСИБО!! Работает просто отлично!! Ещё раз спасибо.

uknowit2 uknowit2
25 мая 2012 г. 23:37:10

Рад это слышать!!

getWeberForStackExchange getWeberForStackExchange
26 мая 2012 г. 01:45:39
Показать остальные 1 комментариев
0
// Этот код отлично сработал для меня, большое спасибо! Я просто адаптировал его под свои нужды. Прямо в файле шаблона, отлично!
global $wpdb;
// ЗДЕСЬ ЗАПРОС ДЛЯ ПОДСЧЕТА ОБЩЕГО КОЛИЧЕСТВА ЗАПИСЕЙ ДЛЯ ПАГИНАЦИИ $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;

// ЗДЕСЬ ЗАПРОС ДЛЯ ПОЛУЧЕНИЯ НАШИХ РЕЗУЛЬТАТОВ $results = $wpdb->get_results

// PHP ЦИКЛ FOREACH ДЛЯ ВЫВОДА НАШИХ РЕЗУЛЬТАТОВ
// КОНЕЦ НАШЕГО ЦИКЛА FOREACH

// ПАГИНАЦИЯ ЗДЕСЬ В СТИЛЕ BOOTSTRAP
<?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 авг. 2014 г. 23:42:17