메타 가치를 기준으로 정렬하지만없는 게시물은 포함


37

pre_get_posts필터를 사용하여 내장 WP 검색을 수정하여 사용자가 게시물 (다중 사용자 정의 게시물 유형 포함)을 다른 필드로 정렬 할 수 있습니다.

내가 겪고있는 문제는 WP에 메타 값으로 정렬하도록 지시 할 때 해당 메타 값이 설정되지 않은 모든 게시물을 제외한다는 것입니다. "게시물"에 "가격"이 설정되어 있지 않지만 "항목"이 있기 때문에 정렬을 "가격"에서 "날짜"로 변경하면 결과 수가 변경됩니다.

이것은 내가 원하는 것이 아니므로 모든 게시물을 포함시킬 수있는 방법이 있는지 알고 싶습니다. 내가 정렬하는 메타 값이없는 게시물조차도 마지막에 값이없는 게시물을 넣습니다.

둘 이상의 필드를 정렬하는 방법을 알고 있지만 도움이되지 않습니다.

감사

이 질문을 가진 유일한 사람은 아닌 것 같습니다 : wp_query에 대한 인수에 특정 meta_key가 있거나없는 게시물을 포함시키는 방법은 무엇입니까? 그러나 거기에는 해결책이 없습니다.

최신 정보

나는 대답을 시도했지만 올바르게 이해했는지 확실하지 않으면 다음과 같이하십시오.

<?php
function my_stuff ($qry) {
    $qry->set('meta_query', array(array(
        'key' => 'item_price', 
        'value' => '', 
        'compare' => 'NOT EXISTS'
    )));

    $qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
    $qry->set('order', 'ASC DESC');
    $qry->set('meta_key', 'item_price');
}

메타 값은 숫자입니다 (이름에서 알 수 있듯이 가격을 저장하는 데 사용됨)

업데이트 2

나는 주문 물건을 주석 처리했으며 지금 가지고있는 것은 이것입니다 :

<?php
$qry->set('meta_query', array(array(
    'key' => 'item_price', 
    'value' => '', 
    'compare' => 'NOT EXISTS'
)));

이 코드를 사용하면 쿼리에 item_price키 가없고 게시물이없는 게시물이 모두 반환되는 것 같습니다 . IE는 이제 문제가 취소되었습니다.

주문 코드를 추가하면 결과가 0이됩니다.

편집 : ... 3 년 후 ... : PI 에이 문제가 다시 발생했습니다. 나는 주어진 모든 대답을 시도했지만 아무 효과가 없습니다. 왜 어떤 사람들은 그들이 일한다고 생각하는 것 같지만 적어도 나를 위해 일하지는 않습니다.

내가 끝낸 해결책은 save_post필터를 사용하는 것입니다. 모든 게시물에 정렬하려는 사용자 정의 필드가 있는지 확인하십시오. 내가 해야하는 것은 약간 성가신 일이지만, 일찍 시작하는 한 문제가 없을 것입니다.

이 경우 게시물에 "보기 카운터"를 구축하고 사용자가 가장 많이 읽은 게시물을 정렬 할 수 있기를 원했습니다. 다시 한 번 보지 않은 게시물 (보기는 쉽지 않지만 여전히 그렇습니다)은 조회수를 정렬 할 때 사라졌습니다. 모든 게시물의 조회수를 확인하기 위해이 코드를 추가했습니다.

add_action('save_post', function ($postId) {
    add_post_meta($postId, '_sleek_view_count', 0, true);
});

코드를 알려주십시오. 대답하기가 더 쉬워집니다.
kaiser 2016 년

첫째 meta_querytax_query있습니다 항상array( array() ) 가 여러 배열을 결합한다. 두 번째-내 대답에서 언급했듯이 meta_value_num숫자 에 사용해야 합니다. 실제로 정의해야 할 수도 있습니다 meta_value_num( WP_Query-Codex 페이지 항목 참조 ). 마지막으로, 그것은 이해가되지 않습니다 order에서 ASC DESC 방향. 그건 불가능하다. 공백 구분 기호는 작동 orderby하며 첫 번째 ASC와 두 번째를 정렬하도록 지시 할 수 없습니다 DESC. 이것이 바로 posts_clauses필터입니다.
kaiser

meta_value_num입력 한 내용이 실수 인지 확인하십시오 . 누군가가 숫자라고 말하지만 실제로 데이터베이스에 문자열로 저장하는 경우가 너무 많습니다.
kaiser

도와 주셔서 감사합니다. 다시 시도해 보겠습니다. 그 이유는 ASC DESC가에 정렬이 너무 meta_value에서 ASCdate에서 DESC나는 그것이 작동 말할 수까지.
powerbuoy 2016 년

1
@Howdy_McGee 맞습니다. 내 맞춤 게시물 유형 중 일부에이 값이 설정되어 있습니다. 일부는 그렇지 않습니다. 그리고 POST 및 PAGE와 같은 내장 게시물 유형은 그렇지 않습니다. 따라서 해당 사용자 정의 필드를 정렬하려고 할 때마다 사용자 정의 필드가있는 게시물 만 표시됩니다.
powerbuoy

답변:


4

이에 대한 두 가지 가능한 솔루션이 있습니다.

1. 모든 게시물에 메타가 있습니다

내가 찾은 가장 좋은 해결책은 나머지 게시물 / 제품에 0의 항목 가격을 제공하는 것입니다. 수동으로 수행하거나 모든 게시물을 반복하고 가격이 비어 있으면 업데이트하십시오.

미래에 이것을 관리 가능하게 만들기 위해 save_post처음 추가 될 때 가치를 부여 할 수 있습니다 (공백 인 경우에만).

2. 여러 쿼리

첫 번째 쿼리를 실행하면서 반환 된 게시물의 ID를 저장할 수 있습니다. 그런 다음 첫 번째 쿼리에서 반환 된 ID를 제외 하고 모든 게시물과 주문 날짜별로 다른 쿼리를 실행할 수 있습니다.

그런 다음 두 가지 결과를 별도로 주문하여 인쇄하면 원하는 결과를 얻을 수 있습니다.


1
3 년 후 다시 같은 문제가 발생했습니다 .P save_post방법 을 사용해야했습니다 (내가 사용한 코드로 질문을 업데이트했습니다).
powerbuoy

10

2018 년에 테스트 한 Easy Peasy는 현재 프로덕션 환경에서 사용하고 있습니다.

$query->set( 'meta_query', array(
    'relation' => 'OR',
    array(
        'key' => 'custom_meta_key', 
        'compare' => 'EXISTS'
    ),
    array(
        'key' => 'custom_meta_key', 
        'compare' => 'NOT EXISTS'
    )
) );
$query->set( 'orderby', 'meta_value title' ); 

메타 키가 있거나없는 모든 항목을 값을 지정하지 않고 확인합니다. 메타 쿼리는 순서대로 키를 안정적으로 제공합니다. 테스트되었습니다. 그러나 메타 쿼리가 여러 키를 사용할 때 어떻게 작동하는지 잘 모르겠습니다.

실제 예

/**
 * Modifies query before retrieving posts. Sets the 
 * `meta_query` and `orderby` param when no `orderby` 
 * param is set, (default ordering).
 * 
 * @param   WP_Query  $query  The full `WP_Query` object.
 * @return  void
 */
function example_post_ordering( $query ) {

    // if not in wp-admin, 
    // and the query is the main query, 
    // and the query is not a singular query, 
    // and the query does not have an orderby param set...
    // Note: check for post types, etc. here as desired.
    if ( ! is_admin() 
    && $query->is_main_query() 
    && ! $query->is_singular() 
    && empty( $query->get( 'orderby' ) ) ) {

        // Setting just `meta_key` is not sufficient, as this 
        // will ignore posts that do not yet, or never will have 
        // a value for the specified key. This meta query will 
        // register the `meta_key` for ordering, but will not 
        // ignore those posts without a value for this key.
        $query->set( 'meta_query', array(
            'relation' => 'OR',
            array(
                'key' => 'custom_meta_key', 
                'compare' => 'EXISTS'
            ),
            array(
                'key' => 'custom_meta_key', 
                'compare' => 'NOT EXISTS'
            )
        ) );

        // Order by the meta value, then by the title if multiple 
        // posts share the same value for the provided meta key.
        // Use `meta_value_num` if the meta values are numeric.
        $query->set( 'orderby', 'meta_value title' );
    }

}

add_action( 'pre_get_posts', 'example_post_ordering', 10 );

custom_meta_key기본적으로 게시물을 주문 하며 해당 키 값이없는 게시물은 무시하지 않습니다.


그냥 코드를 읽고, 할 것 같다 모든이가 게시물 수 있습니다 custom_meta_key할말을 테잎에 게시물 얻을 하지 않습니다 이를 custom_meta_key. 정렬과 함께 실제 작업 예제를 자유롭게 포함하십시오.
powerbuoy

1
당신이 옳습니다, 그게 전부입니다. 그러나 아래 줄은 (쿼리되는 메타 키의) meta_value로 정렬하는 책임이 있습니다. $query->set( 'orderby', 'meta_value title' );메타 값순으로 정렬 한 다음 여러 게시물의 메타 키 값이 동일한 경우 제목별로 정렬합니다. pre_get_posts전달 된 $query변수를 사용하여 후크 에서 수행해야 합니다. 메타 값으로 주문하는 방법과 메타 키 값이없는 게시물은 무시하지 않는 것이 문제였습니다.
noahmason

@powerbuoy 업데이트 된 실제 예보기
noahmason

다음에이 문제에 직면 할 때 가겠습니다.
powerbuoy

1
메타가 포함 된 get_posts()게시물을 _featured맨 위에 올린 다음 날짜순으로 주문하기 위해 맞춤 통화로 나를 위해 일했습니다. 감사!
natebeaty

8

이 메소드는 요청 meta_key이 있거나 없는 게시물을 포함하여 모든 게시물을 반환 하지만 주문시 이상한 일을합니다.

add_action('pre_get_posts', 'my_stuff');
function my_stuff ($qry) {
    $qry->set(
        'meta_query',
        array(
            'relation' => 'OR', # Matches to this meta_query should be added to those matching the 'meta_key' query
            array(
                'key' => 'item_price', 
                'value' => 'bug #23268', 
                'compare' => 'NOT EXISTS'
            )
        )
    );

    $qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
    $qry->set('order', 'ASC DESC');
    $qry->set('meta_key', 'item_price');
}

나는이 질문에 대한 모든 다른 대답을 다루고 시행 착오를 통해 생성 된 SQL 을 분석 하여 이것을 발견했습니다 . 메타 데이터가없는 게시물을 포함하려면 대신 array('meta_query' => array('relation' => 'OR'))출력 을 설정 하는 것이 필요합니다. 방지를 지정하면 절에서 메타 필드가없는 게시물을 필터링하지 못합니다. 이 경우 생성 된 SQL은 다음과 같습니다 (들여 쓰기 / 줄 바꿈 추가).LEFT JOININNER JOINNOT EXISTSWHEREWP_Query

SELECT SQL_CALC_FOUND_ROWS
    wp_posts.ID
    FROM wp_posts
    INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
    INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
    LEFT JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id AND mt1.meta_key = 'item_price')
    WHERE 1=1
    AND ( wp_term_relationships.term_taxonomy_id IN (2) )
    AND wp_posts.post_type = 'post'
    AND (wp_posts.post_status = 'publish'
        OR wp_posts.post_status = 'private')
    AND (wp_postmeta.meta_key = 'item_price'
        -- Oh look, here we give SQL permission to choose a random
        -- row from wp_postmeta when this particular post is missing
        -- 'item_price':
        OR  mt1.post_id IS NULL )
    GROUP BY wp_posts.ID
    ORDER BY wp_postmeta.meta_value,wp_posts.post_date DESC
    LIMIT 0, 10

결과는 meta_value가있는 게시물과 item_price누락 된 게시물의 목록입니다 item_price. 와 게시물은 모두 item_price서로에 대하여 올바르게 정렬되지만 게시물이 없습니다 item_price어떤 임의의 사용 다른 메타 값 (예를 들어, _edit_last것처럼 보인다 1는 내 데이터베이스 또는 완전히 임의 다른 내부 워드 프레스 메타 데이터에 매우 자주) wp_postmeta.meta_value에서 ORDER BY절. 따라서이 방법은 가깝고 특정 데이터에서 작동하는 것처럼 보일 수 있지만 손상되었습니다. 따라서 내가 말할 수있는 것은 item_priceMySQL이 누락 된 게시물에 대해 선택한 임의의 메타 필드와 충돌하지 않으면 값이 item_price잘 작동 한다는 것 입니다. 당신이 필요로하는 모든 게시물을 보장합니다item_price다른 게시물의 순서에 관계없이 서로에 대해 올바르게 정렬되어 있으면 괜찮을 수 있습니다. 그러나 나는 이것이 워드 프레스의 단점이라고 생각합니다. 저를 정정하십시오, 내가 틀렸기를 바랍니다.이 문제를 해결할 수있는 방법이 있습니다 ;-).

에 대해 INNER JOIN wp_postmetaMySQL은 주어진 게시물에서 누락 된 postmeta게시물과 관련된 여러 행 중에서 무작위 행을 선택하는 것으로 보입니다 meta_key. SQL 관점에서 워드 프레스에 output을 지시하는 방법을 알아 내야합니다 ORDER BY mt1.meta_value. 이 열 은와 달리 NULL요청한 내용 meta_key이없는 경우 올바르게 표시 됩니다 wp_postmeta.meta_value. 우리가 그렇게 할 수 있다면, SQL은 NULL다른 값보다 먼저 이들을 (누락 된 항목) 정렬 하여 잘 정의 된 순서를 제공합니다. 먼저 특정 postmeta 필드가 누락 된 모든 게시물을 가져오고 두 번째는 필드가있는 게시물을 가져옵니다. :하지만 그 모든 문제는 'orderby' => 'meta_value'단지 참조 할 수 'meta_key' => 'item_price' unaliased은 wp_postmeta항상입니다 INNER JOIN대신 적 LEFT JOIN의미 wp_postmeta.meta_valuewp_postmeta.meta_key결코 수 없습니다 NULL.

따라서 WP_Query현재 문서화 되어 있으므로 wordpress의 내장 기능으로 는 이것이 불가능하다고 말해야합니다 (wordpress-3.9.1). 귀찮음. 따라서 실제로 올바르게 작동하려면이 작업을 다른 곳에서 wordpress에 연결하고 생성 된 SQL을 직접 수정해야합니다 .


매우 유망 해 보인다! 다음에이 문제가 있으면 시도해 보겠습니다. 지금 답변을 드리고 싶지만, 그것이 먼저 저에게 효과가 있는지 확인하고 싶습니다.
powerbuoy

이것은 모든 것이 나를 위해 나타나지 않도록했습니다. 이것을 구현 한 후에는 아무것도 보이지 않았습니다.
Jake

@Jake Yea 여기도 마찬가지입니다. 오늘이 문제가 다시 있었고 이것을 시도했습니다. 0 개의 결과를 반환합니다.
powerbuoy 2018 년

어떤 버전의 워드 프레스를 사용하고 있습니까? 이 게시물은 워드 프레스에서 지원하지 않는 문서화되지 않은 내부 API를 사용하는 방법을 설명하므로 워드 프레스-3.9.1 또는 그 이후 버전이 아닌 경우에만 작동합니다.
binki

2

나는 해결책이 있다고 생각한다.

당신이 사용할 수 meta_key의 모든 게시물 가지고 일을 (like "_thumbnail_id")하고는 meta_key당신은 필터로 사용하기를 바랍니다.

그래서 당신의 주장은 :

$qry->set(
    'meta_query',
    array(
        'relation' => 'OR',
        array(
            'key' => 'item_price', 
            'value' => '', 
            'compare' => 'EXISTS'
        ),
        array(
            'key' => 'item_price', 
            'value' => '', 
            'compare' => 'EXISTS'
        )
    )
);

$qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both
$qry->set('order', 'ASC DESC');
$qry->set('meta_key', 'item_price');

1
여기서 문제는 빈 문자열 비교입니다. 제거하고 'value' => '', 두 번째 비교도 수행해야하며 NOT EXISTS마지막 설정 명령이 필요하지 않습니다.
nodws

2

여기있는 모든 사람이 메타 쿼리 순서와 관련이있는 문제. 올바르게 정렬하려면 "EXISTS"쿼리 앞에 "NOT EXISTS"쿼리를 넣어야합니다 .

그 이유는 WordPress가 "ORDER BY"절에서 마지막 "LEFT JOIN"문의 meta_value를 사용하기 때문입니다.

예를 들면 다음과 같습니다.

$pageQuery = new WP_Query([
    'meta_query' => [
        'relation' => 'OR',
        ['key' => 'item_price', 'compare' => 'NOT EXISTS'], // this comes first!
        ['key' => 'item_price', 'compare' => 'EXISTS'],
    ],
    'order' => 'DESC',
    'orderby' => 'meta_value_num',
    'post_status' => 'publish',
    'post_type' => 'page',
    'posts_per_page' => 10,
]);

1

적절한 경우 메타 값이없는 경우 게시물을 저장하거나 업데이트 할 때마다 기본 메타 값을 추가 할 수 있습니다.

function addDefaultMetaValue($post_id) {
    add_post_meta($post_id, 'item_price', 0, true);
}
add_action('save_post', 'addDefaultMetaValue');

사용자 정의 포스트 유형을 사용하는 경우, 교체 add_action('save_post', 'addDefaultMetaValue');에 의해 add_action('save_post_{post_type}', 'addDefaultMetaValue');add_action('save_post_product', 'addDefaultMetaValue');


1

나는 숫자 메타 값에 대해 스스로 문제가 있었고 쿼리 순서도 중요하다는 것을 지적했습니다. 나를 위해 NOT EXISTS쿼리는 첫 번째 질문이어야합니다.

예:

$query->set( 'orderby', 'meta_value_num' );
$query->set( 'meta_query', [
    'relation' => 'OR',
    [ 'key' => 'your_meta_name', 'compare' => 'NOT EXISTS' ],
    [
        'key' => 'your_meta_name',
        'compare' => 'EXISTS',
    ],
] );

숫자 값의 올바른 방향을 얻으려면 일반 ’orderby’을로 설정해야 ’meta_value_num’합니다. 그렇지 않으면 숫자 값에 이상한 결과가 나타납니다. 예 :

1, 2, 20, 21, 3, 4, 5…

대신에:

1, 2, 3, 4, 5… 20, 21


1

나는 비슷한 문제가 발생하여 다음 해결책이 도움이되었습니다.

$args = array(
'post_type' => 'kosh_products',
'posts_per_page' => -1,
'meta_query' => array(
    'relation' => 'OR',
    'category_sort_order' => array(
        'key' => '_sort_order',
        'compare' => 'EXISTS'
    ),
    'category_sort_order_not_exists' => array(
        'key' => '_sort_order',
        'compare' => 'NOT EXISTS'
    ), 
),
'orderby' => array( 
    'category_sort_order' => 'ASC',
    'date' => 'ASC'
));
$query = new WP_Query( $args );

여러 개의 'meta_key 's'와 함께 제목이 ' 'orderby '인 WordPress Codex에 대한 설명을 찾았습니다 . https://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters 여기에 이미지 설명을 입력하십시오


0

그것에 대한 가능한 orderby가치 meta_value가 있습니다.

$query = new WP_Query( array ( 
    'meta_key'   => 'your_keys_name',
    'orderby'    => 'meta_value',
    'order'      => 'DESC',
    'meta_query' => array( array(
         'key'     => 'your_meta_key',
         'value'   => '',
         'compare' => 'NOT EXISTS',
         // 'type'    => 'CHAR',
    ) )
) );

숫자 값이 있으면 meta_value_num대신 사용하십시오.

면책 조항 : 이 테스트되지 않지만이 있어야 작동합니다. 요점은 meta_keykey값 을 지정해야한다는 것 입니다. 그렇지 않으면 존재하지 않는 값과 비교할 수 없으므로 두 종류의 게시물을 모두 쿼리 할 수 ​​있습니다. 그것은 일종의 해킹이지만 작동하는 한 ...


답변 해 주셔서 감사합니다. 업데이트 된 질문을 확인하십시오. 잘 이해하고 있는지 잘 모르겠습니다.
powerbuoy 2016 년

나는 여전히이 일을하지 않았으므로 해결책이 있다면 내가 뭘 잘못하고 있는지 알고 싶습니다. 당신이 그것을 주장 할 경우 또한, 나는 SO에 현상금을 설정 stackoverflow.com/questions/17016770/...
powerbuoy

1
두가지. 'your_keys_name'그리고 'your_meta_key'둘 다 구별되지 않고 동일한 문자열이어야합니다. 그렇지 않으면 질문을 오해 한 것처럼 보입니다. 둘째, 로컬 설정에서 이것을 테스트했으며 키가있는 게시물 (을 통해 meta_query)을 제외하고 키가 누락 된 (를 통해 meta_key) 게시물을 제외하여 게시물이 표시되지 않습니다. 그러나이 답변은 적어도 ;-) 라는 단어 를 향한 단계 입니다.
binki

1
흥미롭게도이 답변은에 추가 'relation' => 'OR'하면 효과가 meta_query있습니다. 엉뚱한 물건 o_o.
binki

@ binki 내 질문에 수정 사항 을 제출 하고 변경해야한다고 생각되는 비트를 변경하십시오. 이것은 커뮤니티 주도 사이트입니다 :)
kaiser

0

나는 @kaiser이해야 할 노력했다하는 더미 일종의 적용하여 해당 메타 키가 모든 게시물을 반환하는 쿼리를 말할 생각 조건이 할 수 없는 그 게시물의 필터를. 따라서 사용자 정의 필드가 취할 수있는 모든 값 을 알면 x, y, z "WHERE meta_key IN (x, y, z) " 라고 말할 수 있지만, 아이디어는 ! = ( ' ') :

$query = new WP_Query( array ( 
    'orderby'    => 'meta_value_num',
    'order'      => 'DESC',
    'meta_query' => array( array(
         'key'     => 'item_price',
         'value'   => '',
         'compare' => '!=',
    ) )
) );

또한 테스트되지 않았지만 시도해 볼만한 가치가 있다고 생각합니다 :-).


1
실제로 이것을 테스트 할 수는 없지만 item_price가 설정되어 있고 ''이 아닌 게시물 만 반환합니다.
powerbuoy

0

나는 약간의 해킹 (IMHO) 으로이 문제를 해결했지만 내 경우에는 나를 위해 일했습니다.

posts_join_pagedposts_orderby 필터에 연결 하여 결합 및 순서 문자열을 업데이트 할 수 있습니다 . 이를 통해 특정 게시물에 대해 필드가 존재한다고 가정하고 WP_Query 대신 처음 가입하는 한 원하는 순서대로 주문할 수 있습니다. 그런 다음 제거 할 수 있습니다 meta_key, orderby당신의 WP_Query의 인수에서와`순서를.

아래는 예입니다. 각 함수의 맨 위에는 WP_Query를 사용하는 모든 것에 이것을 추가하기 때문에 특정 경우를 피해야했습니다. 특정 요구 사항에 맞게 수정해야 할 수도 있습니다.

이 두 필터에 대한 문서는 슬프게도 부족합니다. 행운을 빕니다! :)

add_filter('posts_join_paged', 'edit_join', 999, 2);
add_filter('posts_orderby', 'edit_orderby', 999, 2);

/**
 * Edit join
 *
 * @param string $join_paged_statement
 * @param WP_Query $wp_query
 * @return string
 */
function edit_join($join_paged_statement, $wp_query)
{
    global $wpdb;
    if (
        !isset($wp_query->query)
        || $wp_query->is_page
        || $wp_query->is_admin
        || (isset($wp_query->query['post_type']) && $wp_query->query['post_type'] != 'my_custom_post_type')
    ) {
        return $join_paged_statement;
    }

    $join_to_add = "
        LEFT JOIN {$wpdb->prefix}postmeta AS my_custom_meta_key
            ON ({$wpdb->prefix}posts.ID = my_custom_meta_key.post_id
                AND my_custom_meta_key.meta_key = 'my_custom_meta_key')
    ";

    // Only add if it's not already in there
    if (strpos($join_paged_statement, $join_to_add) === false) {
        $join_paged_statement = $join_paged_statement . $join_to_add;
    }

    return $join_paged_statement;
}

/** 
 * Edit orderby
 *
 * @param string $orderby_statement
 * @param WP_Query $wp_query
 * @return string
 */
function edit_orderby($orderby_statement, $wp_query)
{
    if (
        !isset($wp_query->query)
        || $wp_query->is_page
        || $wp_query->is_admin
        || (isset($wp_query->query['post_type']) && $wp_query->query['post_type'] != 'my_custom_post_type')
    ) {
        return $orderby_statement;
    }

    $orderby_statement = "my_custom_meta_key.meta_value DESC";

    return $orderby_statement;
}

코드가 작동합니다. 그러나 meta_value는 문자열로 처리됩니다. 6은 50으로 평가됩니다
Drivingralle

@Drivingralle cast(my_custom_meta_key.meta_value as unsigned) DESC는 트릭을해야합니다 ...
tfrommen

1
감사합니다 @tfrommen. $orderby_statement = "cast(my_custom_meta_key.meta_value as unsigned) DESC";잘 작동합니다.
Drivingralle

0

이 솔루션은 저에게 효과적이었습니다.

add_action( 'pre_get_posts', 'orden_portfolio' );
function orden_portfolio( $query ) {

    if( ! is_admin() ) {

        $query->set( 'orderby', 'meta_value_num' );
        $query->set( 'order', 'ASC' );
        $query->set( 'meta_query', [
            'relation' => 'OR',
            [ 
                'key' => 'ce_orden', 
                'compare' => 'NOT EXISTS' ],
            [
                'key' => 'ce_orden',
                'compare' => 'EXISTS',
            ],
        ] );

        return $query;

    }

}

그러나이 솔루션은 먼저 널 meta_value가있는 레코드를 표시합니다. 이 다른 솔루션은 ASC 순서를 보여주고 끝에 null을 표시합니다.

function custom_join($join) {
    global $wpdb;

    if( ! is_admin() ) {
        $join .= $wpdb->prepare(
        ' LEFT JOIN ' . $wpdb->postmeta . ' cpm ON cpm.post_id = ' . $wpdb->posts . '.ID AND cpm.meta_key = %s'
        , 'ce_orden' );
    }

    return $join;
}

add_filter('posts_join','custom_join');

function custom_orderby($orderby_statement){
    global $wpdb;

    if ( ! is_admin() ) {
        $orderby_statement = "CAST( COALESCE(cpm.meta_value,99999) as SIGNED INTEGER) ASC";
    }

    return $orderby_statement;
}

add_filter('posts_orderby','custom_orderby', 10, 2 ); 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.