Come ordinare per nome meta postale in wp admin?


9

Sto cercando di ordinare in base al nome meta che ho aggiunto per posta. Il post meta è "_merchant_id" e so come ordinare per merchan_id ma non so come ordinare per nome del commerciante.

Sto ordinando per ID commerciante in questo modo:

public function column_orderby( $vars ) {
        if ( isset( $vars['orderby'] ) && is_admin() ) {
            switch ( $vars['orderby'] ) {
case 'merchant':
 $vars = array_merge( $vars, array(
     'meta_key' => '_merchant_id',
     'orderby' => 'meta_value_num'
 ) );

break;
...

Il commerciante è un altro tipo di post ("commerciante"). Come posso ordinare per nome del commerciante?

AGGIORNAMENTO (spiegazione migliorata per screenshot):

inserisci qui la descrizione dell'immagine


Hai letto questo ? Era simile, forse anche più difficile. :)
fuxia

@toscho - Provato. Ma ricevo post predefiniti, non il mio tipo di post personalizzato "Deals"
iWizard il

@toscho - Funziona. Non conosco le regole qui su StackOverflow, quindi non sono sicuro di poter copiare questa risposta in modo da poterti assegnare "generosità"? Ho risolto questo problema in modo che gli altri utenti in futuro possano trovarlo utile.
iWizard,

2
Aggiungi la tua soluzione specifica come risposta. Probabilmente non è esattamente la stessa della risposta collegata. La generosità andrà persa.
fuxia

Risposte:


3

Suppongo che il nome del commerciante sia un altro meta campo e non il titolo per quel tipo di post? In tal caso, ecco un modo per organizzare l'area edit.php dell'amministratore

// Add a column in admin edit.php to display the Merchant post type data you want shown
add_filter('manage_merchant_posts_columns', 'admin_merchant_columns');
function admin_merchant_columns( $posts_columns ) {
    $posts_columns = array(
        'cb' => '<input type="checkbox" />', // the checkbox to select the line item
        'title' => __( 'Name' ), // post title
        'merchant_name' => __( 'Merchant Name' ), // where merchant_name is your meta key for that field
        '_merchant_id' => __( 'Merchant ID' ) // merchant id meta key
    );

    return $posts_columns;
}

// Fill the column with the appropriate items
add_action( 'manage_merchant_posts_custom_column', 'manage_merchant_columns', 10, 2 );
function manage_merchant_columns( $column, $post_id ) {
    global $post;
    switch( $column ) {
        case 'merchant_name' :
            $merchant_name = get_post_meta( $post_id, 'merchant_name'); 
            if ( empty( $merchant_name ) )
                echo ( '' );
            else
                print join( $merchant_name, ', ' );

            break;
        case '_merchant_id' :
            $_merchant_id = get_post_meta( $post_id, '_merchant_id'); 
            if ( empty( $_merchant_id ) )
                echo ( '' );
            else
                print join( $_merchant_id, ', ' );

            break;

        default :
            break;
    }
}

// add ability to sort by merchant name
add_filter( 'manage_edit-merchant_sortable_columns', 'sort_by_merchant_name' );
function sort_by_merchant_name( $columns ) {
    $columns['merchant_name'] = 'merchant_name';
    return $columns;
}

add_action( 'load-edit.php', 'sort_by_merchant_name_load' );
function sort_by_merchant_name_load() {
    add_filter( 'request', 'sort_merchant' ); // where "merchant" is your custom post type slug
}

function sort_merchants( $vars ) {
    if ( isset( $vars['post_type'] ) && 'merchant' == $vars['post_type'] ) { // where "merchant" is your custom post type slug
        if ( isset( $vars['orderby'] ) && 'merchant_name' == $vars['orderby'] ) {
            $vars = array_merge(
                $vars,
                array(
                    'meta_key' => 'merchant_name',
                    'orderby' => 'meta_value'
                )
            );
        }
    }
    return $vars;
}

Kristina, ho aggiornato la spiegazione aggiungendo screenshot. Per favore, dai un'occhiata.
iWizard,

I titoli dei post dovrebbero essere ordinabili per impostazione predefinita ... non dovresti fare nulla di speciale per farlo funzionare. Vuoi pubblicare il tuo codice di registrazione cpt / tassonomia?
Kristina Childs,

Non ho codice perché questo è in alcuni plugin implementati. Ho delle offerte (tipo di posta) che hanno salvato in postmeta il loro ID commerciante e poi su quell'ID merhcant mi collego al commerciante (tipo di posta). Come posso fare in wp admin deal stampa ordinamento pagine (DESC / ASC) in base al nome del commerciante?
iWizard,

1
I nomi di callback e funzioni non corrispondono nei primi due hook ...
brasofilo,

1
O c'è quello. Spiacente, ho modificato da uno dei miei siti di wordpress esistenti e devo averlo perso. Grazie @brasofilo. @CroiOS, prova di nuovo il codice ora che ho corretto quel refuso. (usando post_title) invece di merchant_type)
kristina childs,

3

I meta valori e i nomi non sono utilizzabili nell'area di amministrazione per impostazione predefinita.

Ma puoi migliorare la query per usarla nel ciclo, la query come nell'esempio nella tua domanda. Per aggiungere i meta valori utilizzare il seguente piccolo frammento nel plugin.

add_filter( 'query_vars', 'fb_query_vars_admin' );
/**
 * If needed: Allow meta queries in the admin
 */
function fb_query_vars_admin( $query_vars ) {

    // break off, if not in admin area
    if ( ! is_admin() )
        return $query_vars;

    $query_vars[] = 'meta_key'; // my key of custom field
    $query_vars[] = 'meta_value'; // my value of custom field

    return $query_vars;
}

Un'altra alternativa è agganciare la query e modificare direttamente la query.

add_filter( 'parse_query', 'fb_custom_post_sort' );
function fb_custom_post_sort($query) {

    if ( ! is_admin() )
        return $query;

    global $current_screen;
    if ( isset( $current_screen ) && 'post' === $current_screen->post_type ) {
        $query->query_vars['orderby']  = 'meta_value';
        $query->query_vars['meta_key'] = '_merchant_id';
        $query->query_vars['order']    = 'ASC';
    }
}

1
Il nome del commerciante (il bit che desidera ordinare) non è una meta chiave, è il titolo del post. È strano che il plugin che usa disabiliterebbe quella funzione.
Kristina Childs,

0

Spero che la mia soluzione sia utile a qualcuno.

 public function column_orderby( $vars ) {


        if ( isset( $vars['orderby'] ) && is_admin() ) {
            switch ( $vars['orderby'] ) {

            ...

            case 'merchant':


                GLOBAL $wpdb, $query;


                $vars = array_merge( 
                    $vars, array(
                    'meta_key' => '_merchant_id',
                    'orderby' => 'meta_value_num'
                    ) 
                );

                add_filter('posts_clauses', 'e_order_by_mechant_name',10,2);


                break;

            ...
        }

        return $vars;
}


function e_order_by_mechant_name( $clauses, $query ) {
    global $wpdb;
    if ( ! $query->is_main_query()
        || ! is_admin()

    ){
        return $clauses;
    }

    //Get sort order
    $order_dir = $query->get('order');
    $order_dir = ('asc' == $order_dir ? 'ASC' : 'DESC');

    //Join user table onto the postmeta table
    $clauses['join'] .= " LEFT JOIN {$wpdb->prefix}posts merchants ON {$wpdb->prefix}postmeta.meta_value = merchants.ID";

    //Replace orderby
    $clauses['orderby']  = " merchants.post_title $order_dir";

    return $clauses;
}
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.