Özel SQL sorgusu ile sayfalama


9

Belirli WHERE yan tümcesi ile Özel Yazı Türü gönderileri seçmek için kendi SQL dizem var. Görüntülenen bir sayfaya bağlı olarak uygun yazıları döndürmek için ofseti ve sınırı kullandım. Bu iyi çalışıyor.

Şimdi yapmak istiyorum previous_posts_link()ve next_posts_link()işlevler çalışır. Her ikisi de get_posts_nav_linkhangi kullanımlardan çağrılır global $wp_query.

global $wp_querySQL dizimle veya $wpdb->get_resultssonuçlarıyla veya başka bir şeyle yeniden atayabileceğim bir yol var mı ? Böylece yerel previous_posts_link()ve next_posts_link()WP işlevleri çalışır.

Değilse, önceki ve sonraki yazı bağlantı işlevlerini nasıl çoğaltabilirim?

Gerçekten herhangi bir yardım ve tavsiye için teşekkür ederiz! Buna tamamen takılıp kaldım.
Teşekkürler :)

NOT:previous_posts_link() Tüm sayfalarda doğru çalıştığını fark ettim , ancak no idea whybu durumda neden next_posts_linkçalışmıyor: S

İşte kod:

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

Yanıtlar:


16

Tamam, sonunda oraya vardım. WP_QueryKendi oldukça büyük ve karmaşık SQL'im olması gerektiğinden sınıfı kullanamadım . İşte sahip olduğum şey:

In functions.phpBen WP sayfalama mantığı için gerekli değerleri saymak için benim özel SQL ve mantık vardır:

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;
}

Sonra şablon dosyamda olurdu:

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

Hüner tedarikinde oldu previous_posts_link()ve doğru bir şekilde hesaplanmasında açıkçası değer ve.next_posts_link$max_num_pages

Bu çok iyi çalışıyor. Birisine yardımcı olacağını umuyoruz :)

Dasha


+1 iyi iş. Stackoverflow.com/questions/16057059/… için cevabımı araştırırken bununla karşılaştım (ve çok borç aldım, teşekkürler) . Böyle özel bir SQL deyimi kullanmak için bir yol biliyor musunuz, ama code_.wordpress.org/… göre bir pre_get_posts () eylem merak ediyordum ? Bu çözümün, wordpress.org/support/topic/… 'a göre , son sayfa sayısındaki 404'e duyarlı olduğunu düşünüyorum . Bunu nasıl aştınız?
Sepster

1

Wp_query çağrısını birçok ilginç ve kullanışlı şekilde değiştirmenize izin veren Özel Sorgulara bir göz atın ve sonuçları genel sorgu nesnenize geri itin.


1

Anu'nun cevabına genişleyen. Özel sql sorgunuza güvenmek yerine WP_Query sınıfını kullanabilir ve WordPress'in tüm ağır SQL kaldırma işlemlerini gerçekleştirmesine izin verebilirsiniz . Bu kesinlikle navigasyon sorununuzu çözecektir.

_Expiry_date meta_key'inizdeki film yayını türü için örnek sorgu:

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

Cevabınız için teşekkür ederim, ancak WP_Querykendi özel SQL oluşturmak için sınıfa güvenemiyorum . Ben orada sonunda var, ilgimi varsa cevabımı görmek :)
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 );

?> 

Şablon:

<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(); ?>

2
Lütfen kodunuza bir açıklama ekleyin, ayrıca neden biriyle query_postsve biriyle iki sorgu çalıştırıyorsunuz?WP_Query
Pieter Goosen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.