Ordina per meta valore ma includi post che non ne hanno uno


37

Ho modificato la ricerca WP integrata utilizzando il pre_get_postsfiltro, consentendo all'utente di ordinare i post (incluso un gruppo di tipi di post personalizzati) in base a campi diversi.

Il problema che sto riscontrando è che quando dico a WP di ordinare in base a un meta-valore, escluderà tutti i post che non hanno quel meta-valore impostato. Questo fa sì che il numero di risultati cambi se cambi l'ordinamento da "Prezzo" a "Data" perché "Post" non ha "Prezzo" impostato ma "Articoli".

Questo non è quello che voglio, quindi vorrei sapere se c'è un modo per includere TUTTI i post - anche quelli che non hanno il meta valore su cui sto ordinando - e mettere quello senza il valore ultimo.

So come ordinare su più di un campo ma questo non aiuta.

Grazie

Sembra che non sia l'unico con questa domanda: modo di includere post con e senza certe meta_key in args per wp_query? ma non c'è soluzione lì.

Aggiornare

Ho provato la risposta ma non sono sicuro di aver capito bene, ecco cosa ho adesso:

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

Il meta valore è un numero (viene utilizzato per memorizzare un prezzo come suggerisce il nome)

Aggiornamento 2

Ho commentato le cose dell'ordine e tutto ciò che ho ora è questo:

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

Con questo codice la query sembra restituire tutti i post che non hanno la item_pricechiave e nessuno dei post che la hanno. Cioè il problema è ora invertito.

Se aggiungo anche il codice ordine ottengo 0 risultati.

Modifica: ... tre anni dopo ... : PI aveva di nuovo questo problema. Ho provato tutte le risposte fornite e nessuna funziona. Non sono sicuro del motivo per cui alcune persone sembrano pensare che funzionino ma almeno non funzionano per me.

La soluzione con cui ho finito è usare il save_postfiltro - assicurandomi che tutti i post abbiano il campo personalizzato su cui desidero ordinare. È un po 'fastidioso che io debba farlo, ma fintanto che lo fai presto non avrai probabilmente problemi.

In questo caso stavo costruendo un "contatore delle visualizzazioni" sui post e volevo che gli utenti potessero ordinare i post più letti. Ancora una volta, i post che non sono mai stati visualizzati (suppongo sia abbastanza improbabile - ma comunque) sono scomparsi durante l'ordinamento sul conteggio delle visualizzazioni. Ho aggiunto questo bit di codice per assicurarmi che tutti i post abbiano un conteggio visualizzazioni:

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

Per favore, mostraci il tuo codice. Rende più facile rispondere.
— Kaiser

Primo: meta_querye tax_querysono sempre un array( array() )dato che combinano più array. In secondo luogo, come indicato nella mia risposta, è necessario utilizzare meta_value_numper i numeri. Potrebbe anche essere necessario definire effettivamente meta_value_num(vedere la WP_Queryvoce di pagina -Codex). Ultimo, ma non ha senso di orderin ASC e DESC direzione. Non e possibile. Il delimitatore di spazio funziona solo per orderbye non puoi dirgli di ordinare il primo ASCe il secondo DESC. Ecco a cosa posts_clausesserve il filtro.
— Kaiser

E assicurati che le tue meta_value_numvoci siano numeri reali . Ho visto troppo spesso che qualcuno afferma che è un numero, ma in realtà lo salva come stringa nel database.
— Kaiser

Grazie per il tuo aiuto, proverò questo e ti risponderò. Il motivo ASC DESCè che si ordina meta_valuein ASCe datein DESC, per quanto posso dire che funziona.
— powerbuoy

1
@Howdy_McGee che è corretto. Alcuni dei miei tipi di post personalizzati HANNO questo set di valori. Alcuni no. E i tipi di post integrati (come POST e PAGE) no. Quindi ogni volta che provo a ordinare su quel campo personalizzato vengono visualizzati solo i messaggi CON il campo personalizzato.
— powerbuoy

Risposte:


4

Esistono due possibili soluzioni a questo:

1. Tutti i post hanno meta

La migliore soluzione che ho trovato qui è quella di dare al resto dei post / prodotti un prezzo dell'articolo pari a 0. Puoi farlo manualmente o scorrere tutti i post e se il prezzo è vuoto, aggiornalo.

Per renderlo gestibile in futuro, puoi collegarti save_poste dare loro un valore quando vengono aggiunti per la prima volta (solo se è vuoto).

2. Query multiple

È possibile eseguire la prima query mentre si sta eseguendo e archiviare gli ID dei post restituiti. È quindi possibile eseguire un'altra query per tutti i post e la data dell'ordine, escludendo gli ID restituiti dalla prima query.

È quindi possibile stampare i due risultati separatamente e ottenere i risultati desiderati.


1
Tre anni dopo e ho avuto di nuovo lo stesso problema: P Ho dovuto usare il save_postmetodo (ho aggiornato la mia domanda con il codice che ho usato).
— powerbuoy

10

Easy Peasy, appena testato nel 2018, attualmente in produzione.

$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' ); 

Controlla tutti gli elementi con e senza la meta chiave, senza alcun valore specificato. la meta query fornisce la chiave per l'ordine in modo affidabile. È stato testato Non sono sicuro, tuttavia, come funzionerà quando la meta query utilizza più chiavi.

Esempio pratico

/**
 * 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 );

Questo ordinerà i post per custom_meta_keyimpostazione predefinita e non ignorerà i post senza un valore per quella chiave.


Solo leggendo il codice, tutto ciò che sembra fare è ottenere post che hanno custom_meta_keye ottenere post che non hanno custom_meta_key. Sentiti libero di includere un esempio di lavoro reale con l'ordinamento.
— powerbuoy

1
Hai ragione, questo è tutto ciò che sta facendo, ma la riga seguente è responsabile per l'ordinamento per meta_value (della meta-chiave da interrogare). $query->set( 'orderby', 'meta_value title' );(Ordina per meta valore, quindi per titolo quando più post hanno lo stesso valore per la meta chiave). Questo dovrebbe essere fatto nel pre_get_postshook, usando la $queryvariabile passata . Tieni presente che la domanda posta era come ordinare in base al meta valore, senza ignorare i post che non hanno un valore per quella meta chiave.
— Noahmason,

@powerbuoy Vedi esempio pratico aggiornato
— noahmason,

Bene, ci proverò la prossima volta che dovrò affrontare questo problema.
— powerbuoy

1
Ha funzionato per me in una get_posts()chiamata personalizzata per spostare i post con _featuredmeta verso l'alto, quindi ordinare per data successiva. Grazie!
— natebeaty

8

Questo metodo restituirà tutti i post, inclusi quelli con e senza quelli richiesti meta_key, ma farà cose strane al momento dell'ordine.

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

Ho trovato questo armeggiando con tutte le diverse risposte a questa domanda e analizzando l'SQL generato attraverso tentativi ed errori. Sembra che l'impostazione sia array('meta_query' => array('relation' => 'OR'))un output appropriato LEFT JOINanziché INNER JOINnecessario per includere post in cui mancano i metadati. La specifica di NOT EXISTSimpedisce alla WHEREclausola di filtrare i post privi del meta campo. Per questo particolare WP_Query, l'SQL generato è (rientro / nuove righe aggiunte):

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

Il risultato è un elenco di tutti i post con meta_value item_pricee quelli mancanti item_price. Tutti i post con item_priceverranno ordinati correttamente l'uno rispetto all'altro, ma i post mancanti item_priceutilizzeranno qualche altro meta valore casuale (diciamo, _edit_lastche sembra essere 1abbastanza spesso nel mio database o alcuni altri metadati di wordpress interni che sono completamente arbitrari) per il suo wp_postmeta.meta_valuein la ORDER BYclausola. Quindi, sebbene questo metodo sia vicino e possa sembrare funzionare per alcuni dati, è rotto. Quindi, tutto quello che posso dire è che se i tuoi item_pricevalori non entrano in conflitto con i metacampi casuali che MySQL sceglie per i post mancanti item_price, questo potrebbe funzionare bene per te. Se tutto ciò che serve è una garanzia con i tuoi postitem_pricesono correttamente ordinati l'uno rispetto all'altro, indipendentemente dall'ordinamento di altri messaggi, potrebbe essere OK. Ma penso che questo sia solo un difetto di WordPress. Per favore, correggimi, spero di sbagliarmi e c'è un modo per affrontarlo ;-).

Sembra che per INNER JOIN wp_postmetaMySQL stia scegliendo una riga casuale tra più postmetarighe associate al post quando meta_keymanca il post specificato. Dal punto di vista SQL, dobbiamo capire come dire wordpress all'output ORDER BY mt1.meta_value. Questa colonna è corretta NULLquando meta_keymanca la nostra richiesta , a differenza wp_postmeta.meta_value. Se potessimo farlo, SQL ordinerebbe questi NULL(voci mancanti) prima di qualsiasi altro valore, dandoci un ordine ben definito: prima arrivano tutti i post che mancano del particolare campo postmeta, poi arrivano i post che hanno il campo. Ma questo è l'intero problema: 'orderby' => 'meta_value'può solo riferirsi 'meta_key' => 'item_price' e il non-polarizzato wp_postmetaè sempre un INNER JOINinvece che mai un LEFT JOIN, significato wp_postmeta.meta_valuee wp_postmeta.meta_keypossibilemai essere NULL.

Quindi suppongo di dover dire che questo non è possibile con il wordpress integrato WP_Querycome è ora documentato (in wordpress-3.9.1). Bother. Quindi, se in realtà hai bisogno che funzioni correttamente, probabilmente dovrai collegarti a wordpress altrove e modificare direttamente l'SQL generato .


Sembra molto promettente! Ci proverò la prossima volta che avrò questo problema. Vorrei darti la risposta in questo momento, ma preferirei confermare che funzioni per me prima.
— powerbuoy,

Questo mi ha impedito di presentarmi. Nulla ha mostrato dopo aver implementato questo.
— Jake,

@Jake Yea stesso qui. Ho avuto di nuovo questo problema oggi e l'ho provato. Restituisce 0 risultati.
— powerbuoy

Quale versione di wordpress state usando? Penso che questo post descriva come usare un'API interna, non documentata, che non è supportata da wordpress e quindi probabilmente funziona solo se sei su wordpress-3.9.1 o non ci sono troppe versioni oltre.
— binki,

2

Penso di avere una soluzione.

Puoi usare due meta_keys, uno di tutti i post (like "_thumbnail_id")e quello meta_keyche desideri utilizzare come filtro.

Quindi i tuoi argomenti:

$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
Il problema qui è il confronto delle stringhe vuote, rimuovilo e funziona 'value' => '', anche il secondo confronto dovrebbe essere NOT EXISTSe l'ultima istruzione impostata non è richiesta
— annuisce

2

Il problema che tutti qui hanno a che fare ha a che fare con l'ordine delle meta-query. Per ordinare correttamente, è necessario inserire la query "NON ESISTE" prima della query "ESISTI".

Il motivo è perché WordPress utilizza il meta_valore dell'ultima istruzione "LEFT JOIN" nella clausola "ORDER BY".

Per esempio:

$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

Se adatto, puoi aggiungere un meta valore predefinito ogni volta che un post viene salvato o aggiornato, se il meta valore non esiste.

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

Se stai utilizzando un tipo di post personalizzato, sostituisci add_action('save_post', 'addDefaultMetaValue');con add_action('save_post_{post_type}', 'addDefaultMetaValue');esadd_action('save_post_product', 'addDefaultMetaValue');


1

Ho avuto il problema da solo per i meta valori numerici e ho sottolineato che anche l'ordine della query è importante. Per me la NOT EXISTSdomanda deve essere la prima.

Esempio:

$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',
    ],
] );

Altrettanto importante per ottenere la giusta direzione per i valori numerici è il generale ’orderby’da impostare ’meta_value_num’. Altrimenti si ottengono strani risultati per valori numerici, ad esempio:

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

Invece di:

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


1

Ho riscontrato anche un problema simile e la seguente soluzione mi ha aiutato:

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

Ho trovato una descrizione su WordPress Codex con il titolo " 'orderby' con più 'meta_key's ": https://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters inserisci qui la descrizione dell'immagine


0

C'è un possibile orderbyvalore meta_valueper quello.

$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',
    ) )
) );

Se hai valori numerici, basta usare meta_value_numinvece.

Disclaimer: questo non è testato, ma dovrebbe funzionare. Il punto è che devi specificare i tuoi valori meta_keye key. Altrimenti non puoi confrontare con valori inesistenti, il che dovrebbe consentire di interrogare entrambi i tipi di post. È una specie di hack-ish, ma finché funziona ...


Grazie per la tua risposta, controlla la mia domanda aggiornata, non sono sicuro di averti capito correttamente.
— powerbuoy,

Non ho ancora fatto questo lavoro, quindi se hai una soluzione mi piacerebbe sapere cosa sto facendo di sbagliato. Inoltre, ho impostato una taglia sulla Quindi, se si vuole rivendicare: stackoverflow.com/questions/17016770/...
— PowerBuoy

1
Due cose. 'your_keys_name'e 'your_meta_key'dovrebbe essere la stessa stringa anziché distinta, altrimenti sembra che tu abbia frainteso la domanda. In secondo luogo, l'ho testato sulla mia configurazione locale ed esclude tutti i post in cui esiste la chiave (tramite il meta_query) ed esclude tutti i post in cui manca la chiave (attraverso meta_key) senza che vengano visualizzati post. Tuttavia, questa risposta è un passo verso qualcosa che almeno le parole ;-).
— binki,

1
Oh, è interessante notare che questa risposta funziona se aggiungi semplicemente 'relation' => 'OR'a meta_query. Roba stravagante o_o.
— binki,

@binki Basta presentare una modifica alla mia domanda e cambiare i bit che pensi debbano essere cambiati. Questo è un sito guidato dalla comunità :)
— kaiser

0

Penso che quello che @kaiser stava cercando di fare fosse dire alla query di restituire tutti i post che hanno quella meta chiave applicando una sorta di manichino dove condizione di non filtrare nessuno di quei post. Quindi se conosci tutti i valori che i tuoi campi personalizzati possono assumere sono x, y, z potresti dire "DOVE meta_key IN (x, y, z) " ma l'idea è che puoi evitare quel problema tutti insieme dicendo ! = (' ') :

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

Inoltre non testato ma sembra che valga la pena provare :-).


1
Non posso davvero provarlo in questo momento, ma abbastanza sicuro che restituirà solo i post in cui item_price è impostato e non è ''.
— powerbuoy

0

Ho finito per aggirare questo con un po 'di un trucco (IMHO), ma nel mio caso ha fatto il lavoro per me.

Puoi agganciare i filtri posts_join_paged e posts_orderby per aggiornare le stringhe di join e ordine. Ciò ti consentirà di ordinare in base a ciò che desideri purché ti iscrivi prima anziché WP_Query supponendo che il campo debba esistere per quel particolare post. È quindi possibile rimuovere la meta_key, orderbye `ordine dai vostri args WP_Query.

Di seguito è riportato un esempio. Nella parte superiore di ogni funzione ho dovuto scappare per alcuni casi poiché aggiungerà questo a tutto ciò che utilizza WP_Query. Potrebbe essere necessario modificarlo in base alle proprie esigenze specifiche.

Purtroppo manca la documentazione su questi due filtri, quindi ... buona fortuna! :)

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

Il codice funziona. Ma il meta_value viene gestito come una stringa. Quindi 6 ha un punteggio superiore a 50. Qualche modifica possibile per trattarli come numeri?
— Drivingralle,

@Drivingralle cast(my_custom_meta_key.meta_value as unsigned) DESCdovrebbe fare il trucco ...
— martedì

1
Grazie @tfrommen. $orderby_statement = "cast(my_custom_meta_key.meta_value as unsigned) DESC";funziona alla grande.
— Drivingralle,

0

Questa soluzione ha funzionato per me:

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;

    }

}

Tuttavia, questa soluzione mostra innanzitutto i record con meta_valore nullo. Quest'altra soluzione mostra l'ordine ASC e i null alla fine:

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