Pagination dengan query SQL khusus

9

Saya memiliki string SQL saya sendiri untuk memilih posting Jenis Posting Kustom dengan klausa WHERE tertentu. Saya telah menggunakan offset dan batas untuk mengembalikan posting yang sesuai tergantung pada halaman yang ditampilkan. Itu bekerja dengan baik.

Sekarang, saya ingin membuat previous_posts_link()dan next_posts_link()fungsi berfungsi. Mereka berdua dipanggil dari get_posts_nav_linkyang menggunakan global $wp_query.

Apakah ada cara saya dapat menetapkan ulang global $wp_querydengan string SQL saya atau $wpdb->get_resultshasil atau yang lainnya? Jadi fungsi asli previous_posts_link()dan next_posts_link()WP akan berfungsi.

Jika tidak, bagaimana saya bisa mereproduksi fungsi tautan postingan dan post selanjutnya?

Saya akan sangat menghargai bantuan dan saran! Saya benar-benar terjebak dengan ini.
Terima kasih :)

CATATAN: Saya baru saja memperhatikan bahwa previous_posts_link()berfungsi dengan benar di semua halaman, tetapi no idea whydan dalam hal ini, mengapa next_posts_linktidak berfungsi: S

Ini kodenya:

$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>
}
dashaluna
sumber

Jawaban:

16

Ok, saya sampai di sana pada akhirnya. Saya tidak dapat menggunakan WP_Querykelas karena saya benar-benar perlu memiliki SQL saya sendiri yang cukup besar dan kompleks. Inilah yang akhirnya saya miliki:

Di functions.phpSaya punya SQL kustom dan logika untuk menghitung nilai yang diperlukan untuk logika pagination 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;
}

Kemudian dalam file template saya, saya harus:

<?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>

Caranya adalah dalam memasok previous_posts_link()dan next_posts_linkyang $max_num_pagesnilai dan jelas dalam menghitung dengan benar.

Ini bekerja dengan sangat baik. Semoga ini bisa membantu seseorang :)

Dasha

dashaluna
sumber
+1 kerja bagus. Saya menemukan ini (dan meminjam banyak, terima kasih) ketika meneliti jawaban saya untuk stackoverflow.com/questions/16057059/… . Saya bertanya-tanya apakah Anda tahu cara menggunakan pernyataan SQL khusus seperti ini, tetapi dalam tindakan pre_get_posts () sesuai codex.wordpress.org/… ? Saya menemukan solusi ini rentan terhadap 404 pada masalah halaman terakhir, seperti pada wordpress.org/support/topic/… . Bagaimana Anda mengatasi ini?
Sepster
1

Lihatlah Permintaan Khusus - yang memungkinkan Anda untuk memodifikasi panggilan wp_query dalam banyak cara yang menarik dan berguna, dan mendorong hasilnya kembali ke objek permintaan global Anda.

anu
sumber
1

Memperluas jawaban Anu. Alih-alih mengandalkan kueri sql khusus Anda, Anda bisa menggunakan kelas WP_Query dan membiarkan WordPress menangani semua pengangkatan SQL yang berat. Ini pasti akan menyelesaikan masalah navigasi Anda.

Contoh kueri untuk jenis posting film di dalam meta_key _expiry_date Anda:

$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>
Chris_O
sumber
terima kasih atas jawabannya, namun, saya tidak bisa mengandalkan WP_Querykelas karena saya perlu membuat SQL sendiri. Saya sampai di sana pada akhirnya, lihat balasan saya jika tertarik :)
dashaluna
-2
<?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 );

?> 

Templat:

<h1lá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(); ?>
Iceoverr
sumber
2
Silakan tambahkan penjelasan ke kode Anda, juga, mengapa Anda menjalankan dua pertanyaan, satu dengan query_postsdan satu denganWP_Query
Pieter Goosen