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.