내부 이해
인접한 (다음 / 이전) 게시물의 "정렬"순서는 실제로 "순서"가 아닙니다. 각 요청 / 페이지에 대한 별도의 쿼리 이지만post_date
현재 표시된 개체로 계층 적 게시물이있는 경우-또는 게시물 부모 별로 쿼리를 정렬 합니다.
의 내부를 살펴보면 next_post_link()
기본적으로의 API 래퍼임을 알 수 있습니다 adjacent_post_link()
. 이후 함수 get_adjacent_post()
는 $previous
인수 / 플래그를 내부적으로 호출 bool(true|false)
하여 다음 또는 이전 게시물 링크를 가져옵니다.
무엇을 필터링합니까?
자세히 살펴보면 get_adjacent_post()
소스 링크에 출력에 대한 멋진 필터가 있습니다 (일명 쿼리 결과). (필터 이름 / 인수)
"get_{$adjacent}_post_join"
$join
// Only if `$in_same_cat`
// or: ! empty( $excluded_categories`
// and then:
// " INNER JOIN $wpdb->term_relationships AS tr
// ON p.ID = tr.object_id
// INNER JOIN $wpdb->term_taxonomy tt
// ON tr.term_taxonomy_id = tt.term_taxonomy_id";
// and if $in_same_cat then it APPENDS:
// " AND tt.taxonomy = 'category'
// AND tt.term_id IN (" . implode(',', $cat_array) . ")";
$in_same_cat
$excluded_categories
"get_{$adjacent}_post_where"
$wpdb->prepare(
// $op = $previous ? '<' : '>'; | $current_post_date
"WHERE p.post_date $op %s "
// $post->post_type
."AND p.post_type = %s "
// $posts_in_ex_cats_sql = " AND tt.taxonomy = 'category'
// AND tt.term_id NOT IN (" . implode($excluded_categories, ',') . ')';
// OR empty string if $in_same_cat || ! empty( $excluded_categories
."AND p.post_status = 'publish' $posts_in_ex_cats_sql "
",
$current_post_date,
$post->post_type
)
$in_same_cat
$excluded_categories
"get_{$adjacent}_post_sort"
"ORDER BY p.post_date $order LIMIT 1"`
그래서 당신은 그것으로 많이 할 수 있습니다 . ed 테이블과 명령문 WHERE
뿐만 아니라 절 필터링으로 시작 합니다.JOIN
ORDER BY
결과는 현재 요청에 대해 메모리에 캐시되므로 단일 페이지에서 해당 함수를 여러 번 호출해도 추가 쿼리가 추가되지 않습니다.
자동 쿼리 작성
으로 @StephenHarris이 코멘트에 지적, SQL 쿼리를 만들 때 유용하게 사용할 수있는 핵심 기능이있다 : get_meta_sql()
- 예 분과에서 . 기본적 으로이 함수는에서 사용되는 메타 SQL 문을 작성하는 데 사용 WP_Query
되지만이 경우 또는 다른 경우에도 사용할 수 있습니다. 당신이 그것에 던지는 인수는 배열 WP_Query
입니다.
$meta_sql = get_meta_sql(
$meta_query,
'post',
$wpdb->posts,
'ID'
);
반환 값은 배열입니다 :
$sql => (array) 'join' => array(),
(array) 'where' => array()
그래서 당신은 사용할 수 있습니다 $sql['join']
및 $sql['where']
콜백한다.
명심해야 할 종속성
귀하의 경우 가장 쉬운 방법은 작은 (mu) 플러그인 또는 테마 functions.php 파일에서 가로 채서 $adjacent = $previous ? 'previous' : 'next';
변수와 변수 에 따라 변경하는 것입니다 $order = $previous ? 'DESC' : 'ASC';
.
실제 필터 이름
필터 이름은 다음과 같습니다.
get_previous_post_join
, get_next_post_join
get_previous_post_where
, get_next_post_where
get_previous_post_sort
, get_next_post_sort
플러그인으로 마무리
... 그리고 필터 콜백은 (예를 들어) 다음과 같습니다.
<?php
/** Plugin Name: (#73190) Alter adjacent post link sort order */
function wpse73190_adjacent_post_sort( $orderby )
{
return "ORDER BY p.menu_order DESC LIMIT 1";
}
add_filter( 'get_previous_post_sort', 'wpse73190_adjacent_post_sort' );
add_filter( 'get_next_post_sort', 'wpse73190_adjacent_post_sort' );