무작위로 정렬 된 게시물을 올바르게 페이지 매김 할 수 있습니까?


30

Wordpress Support에서이 문제를 발견했으며 불행히도 주제가 닫혔습니다. 나는이 같은 문제가있다 ... (아래 읽기)


우리는 회원들이 좋아하는 책, 영화, 노래 등을 추천 할 수있는 사이트를 만들었습니다.이 문제를 위해 영화 페이지를 예로 사용하겠습니다.

"영화"페이지는 궁극적으로 "영화"(카테고리 31) 범주가 지정된 모든 게시물의 임의의 목록을 표시하도록 워드 프레스에 요청하는 사용자 정의 페이지 템플리트입니다. 아래 코드를 사용하여이 영화의 제목을 임의 순서로 표시합니다.

<?php 
$rand = new WP_Query("cat=31&showposts=-1&orderby=rand"); 
while($rand->have_posts()) : $rand->the_post();
?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?>
<?php endwhile; ?>

문제는 목록이 다소 길어지고 있으며 각각 약 10 편의 영화를 두 페이지 이상으로 나누고 싶습니다. 이를 달성하기 위해 아래 코드를 사용했습니다.

<?php 
$page = (get_query_var('paged')) ? get_query_var('paged') : 1; 
query_posts("cat=31&orderby=rand&showposts=10&paged=$page"); 
while ( have_posts() ) : the_post() 
?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?>
<?php endwhile; ?>

그러나 데이터가 각각 10 개의 게시물 (페이지 매김)로 분할되지만 2 페이지에 10 개의 새로운 게시물이 포함되지 않기 때문에 문제가 있습니다. 다시 말해, 임의의 순서로 물건을 나열하기 때문에 10 개의 랜덤 게시물 (이 경우 영화 제목)을 가져옵니다. 결과적으로 2 페이지의 새로운 10 개의 무작위 영화 제목 대신 반복되는 영화 제목 게시물이 있습니다.

내 질문은-이 코드에 무엇을 추가하여 1 페이지에 포함 된 임의의 10 개의 게시물을 "기억"하기 위해 워드 프레스를 얻는 다음 2, 3 등의 페이지에 넣을 새 게시물 10 개를 얻습니다. 모든 게시물이 표시됩니다. 10 세트로 무작위로 정렬 할 때 페이지 당 하나의 게시물이 발생하고 싶습니다.

답변:


38

필터를 사용하여 WP_query의 ORDER BY 문을 수정할 수 있습니다.

이렇게하면 ORDER BY RAND ($ seed)를 사용하도록 쿼리를 수동으로 설정할 수 있습니다.

Mysql RAND ()는 시드를 선택적 인수로 허용합니다. 시드를 사용하면 매번 동일한 무작위 결과 집합이 반환됩니다.

따라서 첫 번째 페이지로드에서 난수를 생성 한 다음 SESSION 변수에 저장하고 추가 페이지 매김 요청의 $ seed로 사용할 수 있습니다.

예를 들어 메인 루프에서 이것을 달성하려는 경우 functions.php 파일에 다음을 추가 할 수 있습니다.

session_start();

add_filter('posts_orderby', 'edit_posts_orderby');

function edit_posts_orderby($orderby_statement) {

    $seed = $_SESSION['seed'];
    if (empty($seed)) {
      $seed = rand();
      $_SESSION['seed'] = $seed;
    }

    $orderby_statement = 'RAND('.$seed.')';
    return $orderby_statement;
}

완벽한 솔루션. 너무 감사합니다
파이살 람잔

4

워드 프레스의 마지막 버전부터, orderby매개 변수의 값에 시드를 추가 할 수 있습니다 WP_Query:

$query = new WP_Query([
    'orderby' => 'RAND($seed)',
    ...
]);

$seed난수입니다. PHP 세션 변수로 저장해야합니다. 당신을 호출 session_start()하여 WordPress에서 PHP 세션을 활성화하는 것을 잊지 마십시오 functions.php:

if (!session_id()) {
    session_start();
}

이 구문을 사용하면 posts_orderby필터 를 사용할 필요가 없습니다 . 또한 필터가 대상 WP_Query에만 적용되도록 할 필요는 없습니다.

자세한 내용 은 WordPress Core 에서이 티켓 을 읽으십시오 .


대답은 기술적으로 정확할 수 있지만 짜증납니다. RTFM으로 사람들을 보내지 말고 그 이유를 편집하고 설명하십시오
Mark Kaplun

이 특정 경우에 필터를 사용하는 대신 왜 더 나은 선택이 될 수 있는지 설명하기 위해 답변을 편집했습니다.
Guicara

늦은 +1이지만 세션 대신 쿠키를 사용해야합니다. 기본적으로 세션은 모든 종류의 방식으로 문제가 많으므로 절대 사용해서는 안됩니다.
Mark Kaplun

많은 도움이 .. 감사
파이살 람잔
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.