Como consultar_posts usando meta_query para ordenar por meta_key E ter uma classificação secundária por data?

8

Tenho solucionado um problema nos últimos dias e continuo em círculos. Poderia realmente usar um par de olhos novo para me ajudar a responder a esta pergunta ...

Então, eu estou trabalhando com um site wordpress onde as postagens têm alguns campos personalizados relevantes para a consulta que eu preciso executar: "pós-expirado" e "minha ordem de classificação". Quando executo meus query_posts, quero que os resultados sejam postagens em que "pós-expirado" NÃO é "sim" (esta parte funciona no meu código). Também quero que os resultados sejam classificados pelo valor do número DESC de "minha ordem de classificação" (funciona também) E se houver um empate na "minha ordem de classificação", eu gostaria de uma classificação secundária por data com as postagens mais recentes primeiro.

A classificação secundária por data é onde estou tendo problemas.

Aqui está o código que tenho agora:

<?php               
$args = array(
    'paged' => $paged,
    'meta_query'=> array(
        array(
            'key'=>'post-expired',
            'value'=> 'yes',
            'compare' => '!='
        )
    ),
    'meta_key'=>'my-sort-order',
    'orderby'=>'meta_value_num', 
    'order'=>'DESC'
);

$args = array_merge( $args , $wp_query->query );

query_posts( $args );
?>

Usando o código acima, recebo corretamente as postagens não expiradas e elas são classificadas por ordem decrescente da minha ordem (ou seja, 100 aparece antes de 99, etc.). Mas se as duas postagens tiverem o mesmo valor de ordem de classificação, ocorrerá algum tipo de classificação secundária, que não consigo controlar (e não consigo descobrir em que ordem está sendo classificada).

Minha primeira idéia para resolver isso foi adicionar apenas valores à "minha ordem de classificação" se eu quisesse definir uma ordem de classificação específica para essa publicação. Eu pensei que se o valor desse campo fosse deixado em branco para o restante das postagens, elas simplesmente seriam retornadas na classificação padrão pela data DESC (após as postagens com uma ordem de classificação definida). No entanto, o que realmente aconteceu foi que as postagens que não tinham um valor de ordem de classificação NÃO foram retornadas ...

Em seguida, tentei adicionar vários valores no campo orderby como este:

('orderby'=>'meta_value_num date')

Isso explodiu completamente as duas ordens de classificação que eu estava pedindo e retornou as postagens de uma maneira inesperada. Fiquei com a impressão de que vários valores de pedidos por ordem eram permitidos, mas, por algum motivo, não está funcionando aqui.

Neste ponto, não tenho certeza de como fazer com que essas soluções possíveis funcionem. Alguém sabe como eu posso 1) Classificar postagens primeiro pelo campo "minha ordem de classificação" e, em seguida, retornar as postagens restantes sem valor nesse campo com a classificação de data padrão; ou 2) Descobrir como controlar a ordem secundária por classificação, para que todas as postagens que tenham um empate na "minha ordem de classificação" sejam classificadas por data (a mais nova primeiro)?

Dana
fonte

Respostas:

2

Espero que você já tenha entendido isso até agora, mas se não o tiver, poderá usar o filtro "posts_orderby" para discar em uma ordem específica para sua consulta. Não vou dar uma solução completa aqui, mas você pode consultar este post para mais: http://mitcho.com/blog/how-to/external-orders-in-wordpress-queries/

EDITAR:

Aqui está a documentação - basicamente, você pode substituir a cláusula ORDER BY do SQL: http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_orderby

E aqui está o código de exemplo dos documentos:

add_filter('posts_orderby', 'edit_posts_orderby');
add_filter('posts_join_paged','edit_posts_join_paged');

function edit_posts_join_paged($join_paged_statement) {
$join_paged_statement = "LEFT JOIN wp_gdsr_data_article gdsra ON gdsra.post_id = wp_posts.ID";
return $join_paged_statement;   
}

function edit_posts_orderby($orderby_statement) {
$orderby_statement = "(gdsra.user_votes_total_sum/gdsra.user_votes_count) DESC";
return $orderby_statement;
}
tollmanz
fonte
Sim, o filtro posts_orderby é o que você está procurando. Vou editar a resposta com o código no link que ...
mltsy