Como encomendar por meta nome no wp admin?


9

Estou tentando ordenar por meta nome da postagem que eu adicionei para a postagem. A meta de postagem é "_merchant_id" e sei como classificar por merchan_id, mas não sei como classificar por nome do comerciante.

Estou classificando por ID do comerciante assim:

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

Comerciante é outro tipo de postagem ("comerciante"). Como posso classificar por nome de comerciante?

UPDATE (explicação melhorada pela captura de tela):

insira a descrição da imagem aqui


Você leu isso ? Era semelhante, talvez até mais difícil. :)
— fuxia

@toscho - Tentei. Mas eu recebo postagens padrão, não meu tipo de post personalizado "Deals"
— iWizard 18/12/12

@toscho - Isso funciona. Eu não conheço as regras aqui no stackoverflow, então não tenho certeza se posso copiar esta resposta para poder premiá-lo com "recompensa"? Resolvi esse problema para que outros usuários no futuro possam achar isso útil.
— IWizard

2
Adicione sua solução específica como resposta. Provavelmente não é exatamente o mesmo que a resposta vinculada. A recompensa será perdida.
— fuxia

Respostas:


3

Presumo que o nome do comerciante seja outro campo meta e não o título para esse tipo de postagem? Nesse caso, aqui está uma maneira de organizar sua área de administração 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, atualizei as explicações adicionando uma captura de tela. Por favor, de uma olhada nisso.
— IWizard

Os títulos das postagens devem ser classificados por padrão ... você não precisa fazer nada de especial para fazer esse trabalho. Importa-se de postar seu código de registro cpt / taxonomia?
— Kristina childs

Eu não tenho código, porque isso está em algum plugin implementado. Tenho ofertas (tipo de postagem) que salvaram no pós-meta seu ID de comerciante e, em seguida, sobre esse ID comercial, eu me conecto ao comerciante (tipo de postagem). Como posso, na administração wp, negociar a classificação da página de impressão (DESC / ASC) pelo nome do comerciante?
— IWizard

1
Os nomes dos retornos de chamada e das funções não coincidem nos dois primeiros ganchos ...
— brasofilo 17/12/12

1
Ou tem isso. Desculpe, eu modifiquei de um dos meus sites wordpress existentes e deve ter perdido isso. Obrigado @brasofilo. @ Croos, tente o código novamente agora que corrigi esse erro de digitação. (usando post_title) em vez de merchant_type)
— kristina childs

3

Os meta valores e nomes não são utilizáveis ​​na área de administração por padrão.

Mas você pode aprimorar a consulta para usá-la no loop, a consulta como o exemplo da sua pergunta. Para adicionar os meta-valores, use o pequeno fragmento a seguir no plug-in.

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

Uma outra alternativa é conectar a consulta e alterá-la diretamente.

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
O nome do comerciante (a parte que ele deseja classificar) não é uma meta-chave, é o título da postagem. É estranho que o plug-in que ele usa desabilite essa função.
— Kristina childs

0

Espero que minha solução seja útil para alguém.

 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;
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.