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.