dashaluna
  • 0
Учитель

Разбиение на страницы с пользовательским SQL-запросом

  • 0

У меня есть собственная строка SQL для выбора сообщений пользовательского типа сообщения с определенным предложением WHERE. Я использовал смещение и ограничение, чтобы возвращать соответствующие сообщения в зависимости от отображаемой страницы. Это работает нормально.

Теперь я хотел бы, чтобы previous_posts_link() и next_posts_link() функции работали. Они оба вызываются из get_posts_nav_link того, что использует global $wp_query .

Есть ли способ, которым я могу переназначить global $wp_query свою строку SQL $wpdb->get_results, результаты или что-то еще? Так бы родные previous_posts_link() и next_posts_link() WP функции работали.

Если нет, как я могу воспроизвести функции ссылок на предыдущую и следующую публикацию?

Буду очень признателен за любую помощь и совет! Я полностью застрял с этим.

Спасибо 🙂

ПРИМЕЧАНИЕ. Я только что заметил, что previous_posts_link() это работает правильно на всех страницах, но no idea why в этом случае почему next_posts_link не работает :S

Вот код:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$post_per_page = intval(get_query_var('posts_per_page'));
$offset = ($paged - 1)*$post_per_page;

$sql = "
SELECT SQL_CALC_FOUND_ROWS  wp_posts.*, wp_postmeta.* 
FROM wp_posts 
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
WHERE 1=1  
    AND wp_posts.post_type = 'movie' 
    AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') 
    AND ((wp_postmeta.meta_key = '_expiry_date' AND CAST(wp_postmeta.meta_value AS DATE) >= '".$current_date."') 
        OR (mt1.meta_key = '_expiry_date' AND CAST(mt1.meta_value AS CHAR) = ''))
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date DESC
LIMIT ".$offset.", ".$post_per_page;

$movies_all_current = $wpdb->get_results( $sql, OBJECT);

if($movies_all_current) {
global $post;

//loop
foreach( $movies_all_current as $key=>$post ) {
    setup_postdata($post);
    //display each post
    //...
} //end foreach ?>

    //navigation
<div class="navigation">
    <div class="previous panel"><?php previous_posts_link('&laquo; newer') ?></div>
    <div class="next panel"><?php next_posts_link('older &raquo;') ?></div>
</div>
}
Share
  1. Хорошо, я добрался до конца. Я не мог использовать WP_Query класс, так как мне действительно нужно было иметь свой собственный довольно большой и сложный SQL. Вот что у меня в итоге получилось:

    У functions.php меня есть собственный SQL и логика для подсчета значений, необходимых для логики разбивки на страницы WP:

    function vacancies_current( ){
        global $wpdb, $paged, $max_num_pages, $current_date;
    
        $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
        $post_per_page = intval(get_query_var('posts_per_page'));
        $offset = ($paged - 1)*$post_per_page;
    
        /* Custom sql here. I left out the important bits and deleted the body 
         as it will be specific when you have your own. */
        $sql = "
            SELECT SQL_CALC_FOUND_ROWS  {$wpdb->posts}.*
            FROM {$wpdb->posts}
            ....
            GROUP BY {$wpdb->posts}.ID 
            ORDER BY {$wpdb->posts}.post_date DESC
            LIMIT ".$offset.", ".$post_per_page."; ";   
    
        $sql_result = $wpdb->get_results( $sql, OBJECT);
    
        /* Determine the total of results found to calculate the max_num_pages
         for next_posts_link navigation */
        $sql_posts_total = $wpdb->get_var( "SELECT FOUND_ROWS();" );
        $max_num_pages = ceil($sql_posts_total / $post_per_page);
    
        return $sql_result;
    }
    

    Тогда в моем файле шаблона у меня будет:

    <?php 
        $vacancies_current = vacancies_current();
        /*followed by a standart loop to display your results */ 
     ?>
    <div class="navigation">
        <div class="previous panel"><?php previous_posts_link('&laquo; previous vacancies',$max_num_pages) ?></div>
        <div class="next panel"><?php next_posts_link('more vacancies &raquo;',$max_num_pages) ?></div>
    </div>
    

    Хитрость заключалась в подаче previous_posts_link() и next_posts_link стоимости $max_num_pages и, очевидно, в правильном ее расчете.

    Это работает очень хорошо. Надеюсь, это поможет кому-то 🙂

    Даша

    • 0
  2. Взгляните на пользовательские запросы, которые позволяют вам изменять вызов wp_query многими интересными и полезными способами и отправлять результаты обратно в ваш глобальный объект запроса.

    • 0
  3. Расширение ответа Ану. Вместо того, чтобы полагаться на собственный SQL-запрос, вы можете использовать класс WP_Query и позволить WordPress выполнять всю тяжелую работу с SQL. Это, безусловно, решит вашу проблему с навигацией.

    Пример запроса для типа сообщения о фильме в мета-ключе _expiry_date:

    $today = getdate();
    $args = array(
        'post_type' => 'movie',
        'meta_query' => array(
                'meta_key' => '_expiry_date',
                'meta_value' => $today,
                'meta_compare' => '< '
                        ),
        'posts_per_page' => -1,
         'order'    => 'DESC'
        );
    
        $movie_query = new WP_Query( $args );
    
        while ( $movie_query->have_posts() ) : $movie_query->the_post(); 
        // Do stuff
       endwhile; ?>
    
     <div class="navigation">
    <div class="previous panel"><?php previous_posts_link('&laquo; newer') ?></div>
    <div class="next panel"><?php next_posts_link('older &raquo;') ?></div>
    </div>
    
    • 0
  4. <?php
    
    global $wpdb, $paged;
    query_posts($query_string . '&posts_per_page=9');
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $author = isset($_GET['author_name']) ? get_userdatabylogin($author_name) : get_userdata(intval($author));
    
    query_posts($query_string . '&posts_per_page=9');
    
    $args = array(
    'post_type' => 'post',
    'meta_query' => array(
            'meta_key' => 'autor',
        'post_status' => 'publish',
            'meta_value' => $author->id,
                ),
    'paged' => $paged,
    'posts_per_page' => 9,
    'order'    => 'DESC'
    );
    
    $postsQuery = new WP_Query( $args );
    
    ?> 
    

    Шаблон:

    <h1>Články od <?php echo $author->display_name; ?></h1>
            <ul class="thumbnails">
    
                <?php while ( $postsQuery->have_posts() ) : $postsQuery->the_post();  ?>
                    <li class="span3">
                    <div class="thumbnail">
                        <a href="<?php the_permalink(); ?>">
                        <?php the_post_thumbnail(array(260, 259)); ?>
                        </a>
                        <?php
                        $class = '';
                        if (in_category('fashion')) {
                        $class = "link-fashion";
                        } else if (in_category('beauty')) {
                        $class = "link-beauty";
                        } else if (in_category('gourmet')) {
                        $class = "link-gourmet";
                        } else if (in_category('lifestyle')) {
                        $class = "link-lifestyle";
                        } else if (in_category('about-us')) {
                        $class = "link-about";
                        }
                        ?>
                        <a href="<?php the_permalink(); ?>">
                        <h2 class="<?=  $class ?>">
                            <span></span>
                            <?php
                            // short_title('...', 25); 
                            echo get_the_title();
                            ?>
                        </h2>
                        </a>
                        <?php the_excerpt(); ?>
                        <hr>
                    </div>
                    </li>
                <?php endwhile; ?>
    
            </ul>
            <?php wp_pagenavi(); ?>
    
    • 0

Оставить ответ

You must login to add an answer.