사용자 지정 SQL 쿼리를 사용한 페이지 매김


9

특정 WHERE 절이있는 사용자 정의 게시물 유형 게시물을 선택하는 자체 SQL 문자열이 있습니다. 표시되는 페이지에 따라 오프셋과 제한을 사용하여 적절한 게시물을 반환했습니다. 잘 작동합니다.

지금, 나는하고 싶습니다 previous_posts_link()next_posts_link()기능 작동합니다. 둘 다 get_posts_nav_link사용하여 호출됩니다 global $wp_query.

global $wp_querySQL 문자열 또는 $wpdb->get_results결과 또는 다른 항목으로 재 지정할 수있는 방법 이 있습니까? 따라서 기본 previous_posts_link()next_posts_link()WP 기능이 작동합니다.

그렇지 않은 경우 이전 및 다음 사후 링크 기능을 어떻게 재현 할 수 있습니까?

도움과 조언을 부탁드립니다. 나는 이것에 완전히 붙어 있습니다.
감사 :)

참고 : 방금 previous_posts_link()모든 페이지에서 올바르게 작동하는 것을 알았지 만이 no idea why경우 왜 next_posts_link작동하지 않습니다.

코드는 다음과 같습니다.

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

답변:


16

좋아, 나는 끝에 도착했다. WP_Query꽤 크고 복잡한 SQL이 필요했기 때문에 클래스를 사용할 수 없었습니다 . 내가 가진 결과는 다음과 같습니다.

에서 functions.php나는 WP 페이지 매김 로직에 필요한 값을 계산에 대한 내 사용자 지정 SQL과 논리를 가지고 :

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

이것은 매우 잘 작동합니다. 그것이 누군가를 도울 수 있기를 바랍니다 :)

다샤


좋은 일 +1. stackoverflow.com/questions/16057059/…에 대한 답변을 조사하는 동안이 문제를 발견했습니다 (심히 감사했습니다) . codex.wordpress.org / ... 에 따라 pre_get_posts () 액션에서 이와 같은 사용자 지정 SQL 문을 사용하는 방법을 알고 있는지 궁금합니다 . 이 솔루션이 wordpress.org/support/topic/… 에 따라 마지막 페이지 문제에서 404에 취약하다는 것을 알았습니다 . 이것을 어떻게 극복 했습니까?
Sepster

1

많은 흥미롭고 유용한 방법으로 wp_query 호출을 수정하고 결과를 전역 쿼리 객체로 푸시 할 수 있는 사용자 정의 쿼리를 살펴보십시오 .


1

Anu의 답변 확대. 사용자 지정 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>

그러나 답변에 감사드립니다. 그러나 나는 WP_Query자신의 사용자 정의 SQL을 구성해야하기 때문에 수업에 의존 할 수 없습니다 . 나는 끝에 도착했다, 관심이 있다면 내 답장을 참조하십시오 :)
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 );

?> 

주형:

<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
왜 두 개의 쿼리, 하나 실행하고, 또한, 코드에 대한 설명을 추가하십시오 query_posts와 한WP_Query
피터 구센
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.