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

У меня есть своя собственная строка 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>
}
9
30.06.2011, 18:07
3 ответа

Хорошо, я добрался там в конце. Я не мог использовать 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 значение и очевидно в вычислении его правильно.

Это работает очень хорошо. Надежда это поможет кому-то :)

Dasha

16
19.02.2020, 22:01
  • 1
    +1 хорошая работа. Я столкнулся с этим (и влез в долги, спасибо) при исследовании моего ответа на stackoverflow.com/questions/16057059 / …. Я задавался вопросом, знаете ли Вы о способе использовать пользовательский SQL-оператор как это, но в pre_get_posts () действие согласно codex.wordpress.org / …? Я нахожу, что это решение восприимчиво к 404 по последней проблеме страницы согласно wordpress.org/support/topic / …. Как Вы преодолевали это? –  Sepster 23.04.2013, 17:34

Смотрите на Пользовательские запросы - которые позволяют Вам изменять вызов wp_query многими интересными и полезными способами и продвигать результаты назад в Ваш объект глобального запроса.

1
19.02.2020, 22:01

Подробно останавливаясь на ответе Anu. Вместо того, чтобы полагаться на Ваш пользовательский запрос SQL Вы могли использовать класс WP_Query и позволить WordPress обработать весь тяжелый подъем SQL. Это, конечно, решило бы Вашу проблему навигации.

Запрос в качестве примера для фильма отправляет тип в Вашем _expiry_date meta_key:

$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>
1
19.02.2020, 22:01
  • 1
    за ответ, однако, я не могу полагаться WP_Query класс, поскольку я должен создать свой собственный SQL. Я добрался там в конце, посмотрите мой ответ, если заинтересованный :) –  dashaluna 16.09.2011, 17:50

Теги

Похожие вопросы