ordinamento meta_query per 2 chiavi


8

Devo ordinare i post (personalizzati) in base a 2 valori di campo personalizzati ...

nome campo personalizzato 1: is_sponsored[il valore può essere 1o 0]

nome campo personalizzato 2: sfp_date[ timestampaka data corrente del post in secondi]

I post il cui " is_sponsored" valore è 1 devono essere in primo piano, ordinati per " sfp_date" in DESCordine finale. Tutti gli altri post il cui " is_sponsored" valore è 0 dovrebbero essere elencati di seguito - anche in ordine decrescente (per " sfp_date").

Ho qualcosa come:

$sfp_query_args = array(
    'tax_query'   => array( 
        array( 
            'taxonomy' => 'sfp_posts',
            'terms'    => array( 1, 5, 8 )
        )
    ),
    'post_type'   => 'sfpposts',
    'post_status' => 'publish',
    'showposts'   => 15,
    'paged'       => $paged,
    'meta_key'    => 'sfp_date', 
    'orderby'     => 'meta_value_num', 
    'order'       => 'DESC', 
    'meta_query'  => array(
        'key'          => 'is_sponsored',
        'value'        => 2,
        'type'         => 'NUMERIC',
        'compare'      => '<='
    )
);
$wp_q = new WP_Query( $sfp_query_args );

... ma non funziona. Qualche idea?


Nota dell'editore: si tratta di un piccolo plug-in che dovrebbe mostrare l'aspetto della query, poiché probabilmente non abbiamo alcun set di dati disponibile per testarlo.

<?php
/** Plugin Name: (#67600) Dump Query parts */
function wpse67600_dump_query_parts( $pieces )
{
    echo '<pre>'.var_export( $pieces, true ).'</pre>';
    return $pieces;
}
add_filter( 'posts_clauses', 'wpse67600_dump_query_parts' );

OP PER FAVORE AGGIUNGI USCITA DEL PLUGIN QUI - usa il link "modifica" .

EDIT di Dameer

OK, dopo aver rintracciato la richiesta e numerose soluzioni alternative, ho escogitato il seguente ...

Se semplifico un po '"$ sfp_query_args" il risultato è vicino a ciò che è richiesto, tuttavia, l'impossibilità di ordinare i post rimane così com'è. Ecco qui:

$sfp_query_args1 = array(
    'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ),
    'post_type' => 'sfpposts',
    'post_status' => 'publish',
    'showposts' => (int)$per_page,
    'paged' => $paged,
    'meta_key' => 'is_sponsored', 
    'orderby' => 'meta_value date'
);
  • * orderby accetta due attributi: meta_value e date *

Quindi $ wpdb-> request con gli argomenti sopra nella query appare così:

SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID 
FROM $wpdb->posts 
INNER JOIN $wpdb->term_relationships 
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
INNER JOIN $wpdb->postmeta 
ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) 
WHERE 1=1 
AND $wpdb->posts.post_type = 'sfpposts' 
AND ($wpdb->posts.post_status = 'publish') 
AND ($wpdb->postmeta.meta_key = 'is_sponsored' ) 
GROUP BY $wpdb->posts.ID 
ORDER BY $wpdb->postmeta.meta_value, $wpdb->posts.post_date DESC 
LIMIT 0, $per_page

E infine, per poter ordinare anche per meta_value, la query dovrebbe essere impostata con una sola differenza minore:

SELECT SQL_CALC_FOUND_ROWS $wpdb->posts.ID 
FROM $wpdb->posts 
INNER JOIN $wpdb->term_relationships 
ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
INNER JOIN $wpdb->postmeta 
ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) 
WHERE 1=1 
AND $wpdb->posts.post_type = 'sfpposts' 
AND ($wpdb->posts.post_status = 'publish') 
AND ($wpdb->postmeta.meta_key = 'is_sponsored' ) 
GROUP BY $wpdb->posts.ID 
ORDER BY $wpdb->postmeta.meta_value [!ORDER MISSING!], $wpdb->posts.post_date DESC 
LIMIT 0, $per_page

Individua il segnaposto [! ORDER MISSING!]. Immagino che quanto sopra dovrebbe spiegare dove si verifica esattamente il problema.


Non credo che tu possa farlo con la classe WP_Query predefinita. Anche nei documenti dice "Sai come ordinare la query se il meta_value è un array? Scrivilo qui". Probabilmente dovrai scrivere la tua query SQL per questo.
— Miha Rekar,

Sì, lo so che non è stato ancora risolto ma ho pensato che questo fosse il posto giusto per risolverlo :)
— Dameer,

Ho aggiunto un piccolo plug-in alla tua domanda, così puoi mostrarci le parti finali della query SQL. Modifica la tua domanda con tali informazioni. Grazie.
— Kaiser

Oh, ecco alcune informazioni da una domanda correlata su come funziona l' ordinamento in generale.
— Kaiser

Risposte:


2

OK, la soluzione finale sarebbe quella di dividere la query:

$sfp_query_args = array(
    'tax_query' => array( array( 'taxonomy' => 'sfp_post_category', 'terms' => $cat_id_arr ) ),
    'meta_key' => 'is_sponsored',
    'post_type' => 'sfpposts',
    'post_status' => 'publish',
    'showposts' => (int)$per_page,
    'paged' => $paged
);

... e usa il filtro "posts_orderby" per modificare la parte ORDER:

add_filter( 'posts_orderby', 'sfp_modify_orderby' );
function sfp_modify_orderby( $orderby ) {
    if( !is_admin() && is_tax( 'sfp_post_category' ) ) {
        global $wpdb;
        $orderby = " $wpdb->postmeta.meta_value DESC, $wpdb->posts.post_date DESC ";
    }
    return $orderby;
}

Molto probabilmente dovrai rimuovere il filtro dopo il ciclo sulla pagina per evitare che "posts_orderby" influisca su qualsiasi altra query (barra laterale o piè di pagina). Quindi ecco un'altra funzione da inserire in "Functions.php":

function sfp_remove_orderby_filter() {
    remove_filter( 'posts_orderby', 'sfp_modify_orderby' );
}

... e sulla pagina usando il nostro filtro di eliminazione delle query:

if( have_posts() ) : while( have_posts() ) : the_post();
    // code
endwhile;
else :
    // code
endif;

sfp_remove_orderby_filter();

Speriamo abbia senso!


-1

Sto scrivendo la tua domanda modificando leggermente. Spero possa essere d'aiuto.

$sfp_query_args = array(
    'tax_query' => array( array( 'taxonomy' => 'sfp_posts', 'terms' => array( 1, 5, 8) ) ),
    'post_type' => 'sfpposts',
    'post_status' => 'publish',
    'showposts' => 15,
    'paged' => $paged, 
    'meta_key'=>'sfp_date', 
    'meta_query' => array(
    array(
        'key' => 'sfp_date',
            'type' => 'NUMERIC',
    ),
    array(
        'key' => 'is_sponsored',
        'value' => '2',
        'compare' => '<='
    )       
    ),
    'orderby' => 'meta_value_num', 
    'order' => 'DESC',
);
$wp_q = new WP_Query( $sfp_query_args );

Per favore fatemi sapere se funziona o meno :-)


2
Questo ordinamento predefinito (per data), dal momento che non si fornisce 'meta_key'.
— Miha Rekar,

Grazie @MihaRekar, è stato un errore, grazie per la tua correzione
— Md Toufiqul Islam

Temo che non funzioni, continua a ordinare i post per data senza mettere in primo piano quelli che hanno il valore "is_sponsored" di 1.
— Dameer,

Sto cercando di trovare una soluzione a questo. Forse @MihaRekar ha ragione. Potrebbe essere necessario scrivere una query sql personalizzata per questo
— Md Toufiqul Islam

Esiste un modo per fornire un esempio di query mySQL "normale"?
— Dameer,
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.