Come query_posts utilizzando meta_query per ordinare da meta_key E avere un ordinamento secondario per data?


8

Ho risolto un problema negli ultimi giorni e continuo ad andare in cerchio. Potrei davvero usare un nuovo paio di occhi per aiutarmi a rispondere a questa domanda ...

Quindi sto lavorando con un sito wordpress in cui i post hanno alcuni campi personalizzati relativi alla query che devo eseguire: "post-scaduto" e "il mio ordinamento". Quando eseguo query_posts voglio che i risultati siano post in cui il "post-scaduto" NON è "sì" (questa parte funziona nel mio codice). Voglio anche i risultati ordinati in base al valore del numero DESC di "il mio ordinamento" (funziona anche) E se c'è un legame con "il mio ordinamento", vorrei un ordinamento secondario per data con i post più recenti primo.

L'ordinamento secondario per data è dove ho problemi.

Ecco il codice che ho in questo momento:

<?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 );
?>

Utilizzando il codice sopra ottengo correttamente i post non scaduti e vengono ordinati in base al mio ordinamento decrescente (ovvero 100 visualizzati prima del 99, ecc.). Ma se entrambi i post hanno lo stesso valore di ordinamento, sta accadendo un tipo di ordinamento secondario che non riesco a controllare (e non riesco a capire su cosa venga effettivamente ordinato).

La mia prima idea per risolvere questo problema era quella di aggiungere valori a "il mio ordinamento" se volevo impostare un ordinamento specifico per quel post. Ho pensato che se il valore di questo campo fosse lasciato vuoto per il resto dei post, sarebbero semplicemente restituiti nell'ordinamento predefinito per data DESC (dopo i post con un ordinamento impostato). Tuttavia, ciò che è effettivamente accaduto sono stati i post che non avevano un set di valori di ordinamento NON restituiti affatto ...

Successivamente, ho provato ad aggiungere più valori nel campo orderby in questo modo:

('orderby'=>'meta_value_num date')

Ciò ha fatto esplodere completamente entrambi gli ordinamenti che stavo cercando e ha restituito i messaggi in modo inaspettato. Avevo l'impressione che fossero consentiti più valori di ordine, ma per qualche motivo non funziona qui.

A questo punto non sono sicuro di come far funzionare una di queste potenziali soluzioni. Qualcuno sa come posso 1) Ordinare prima i post dal campo "my-sort-order", quindi i post rimanenti senza valore in quel campo vengono restituiti con l'ordinamento data predefinito; oppure 2) Capire come controllare l'ordinamento secondario in modo che tutti i post che hanno un legame con "il mio ordinamento" vengano ordinati per data (prima i più recenti)?

Risposte:


2

Spero che tu l'abbia capito ormai, ma se non l'hai fatto dovresti essere in grado di usare il filtro "posts_orderby" per comporre un ordine specifico per la tua query. Non ho intenzione di fornire una soluzione completa qui, ma puoi fare riferimento a questo post per ulteriori informazioni : http://mitcho.com/blog/how-to/external-orders-in-wordpress-queries/

MODIFICARE:

Ecco la documentazione: in pratica puoi semplicemente sostituire la clausola ORDER BY dell'SQL: http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_orderby

Ed ecco il codice di esempio dai documenti:

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

Sì, il filtro posts_orderby è ciò che stai cercando.
Modificherò
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.