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.