¿Cómo ordenar por meta nombre de publicación en wp admin?

9

Estoy tratando de ordenar por meta nombre de la publicación que agregué para la publicación. La meta de publicación es "_merchant_id" y sé cómo ordenar por merchan_id pero no sé cómo ordenar por nombre de comerciante.

Estoy ordenando por identificación de comerciante como esta:

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

El comerciante es otro tipo de publicación ("comerciante"). ¿Cómo puedo ordenar por nombre de comerciante?

ACTUALIZACIÓN (explicación mejorada por captura de pantalla):

ingrese la descripción de la imagen aquí

iWizard
fuente
¿Leíste esto ? Fue similar, quizás incluso más difícil. :)
fuxia
@toscho - Probado. Pero recibo publicaciones predeterminadas, no mi tipo de publicación personalizada "Ofertas"
iWizard
@toscho: esto funciona. No conozco las reglas aquí en stackoverflow, así que no estoy seguro de si puedo copiar esta respuesta para poder premiarlo con "recompensa". Resolví este problema para que otros usuarios en el futuro puedan encontrarlo útil.
iWizard
2
Agregue su solución específica como respuesta. Probablemente no sea exactamente lo mismo que la respuesta vinculada. La recompensa se perderá.
fuxia

Respuestas:

3

¿Asumo que el nombre del comerciante es otro metacampo y no el título para ese tipo de publicación? Si es así, aquí hay una manera de organizar su área admin edit.php

// 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 childs
fuente
Kristina, he actualizado la explicación agregando captura de pantalla. Por favor échale un vistazo.
iWizard
Se supone que los títulos de las publicaciones se pueden ordenar de forma predeterminada ... no debería tener que hacer nada especial para que eso funcione. ¿Le importaría publicar su código de registro de cpt / taxonomía?
Kristina Childs
No tengo código porque esto está en algún complemento implementado. Tengo ofertas (tipo de publicación) que han guardado en postmeta su identificación de comerciante y luego sobre esa identificación de merhcant me conecto al comerciante (tipo de publicación). ¿Cómo puedo en wp admin deal imprimir página ordenar (DESC / ASC) por nombre del comerciante?
iWizard
1
Los callbacks y los nombres de funciones no coinciden en los dos primeros ganchos ...
brasofilo
1
O hay eso. Lo sentimos, modifiqué uno de mis sitios existentes de WordPress y debí haberlo perdido. Gracias @brasofilo. @CroiOS, intente el código nuevamente ahora que he arreglado ese error tipográfico. (usando post_title) en lugar de merchant_type)
kristina childs
3

Los meta valores y los nombres no se pueden usar en el área de administración por defecto.

Pero puede potenciar la consulta para usarla en el bucle, la consulta como el ejemplo en su pregunta. Para agregar los meta valores, use el siguiente fragmento de código pequeño en el complemento.

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

Otra alternativa es conectar la consulta y cambiar la consulta directamente.

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';
    }
}
bueltge
fuente
1
El nombre del comerciante (el bit que quiere ordenar) no es una meta clave, es el título de la publicación. Es extraño que el complemento que usa deshabilite esa función.
Kristina Childs
0

Espero que mi solución sea útil para alguien.

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