Как заказать по почте мета-имя в wp admin?

9

Я пытаюсь сделать заказ по мета-имени поста, который я добавил для поста. Мета публикации - "_merchant_id", и я знаю, как сортировать по merchan_id, но я не знаю, как сортировать по имени продавца.

Я сортирую по идентификатору продавца, как это:

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

Торговец - другой тип почты ("торговец"). Как я могу сортировать по имени продавца?

ОБНОВЛЕНИЕ (улучшенное объяснение на скриншоте):

введите описание изображения здесь

iWizard
источник
Вы читали это ? Это было похоже, может быть, даже сложнее. :)
fuxia
@toscho - попробовал. Но я получаю сообщения по умолчанию, а не мой пользовательский тип сообщения "Сделки"
iWizard
@toscho - это работает. Я не знаю правил здесь в stackoverflow, поэтому я не уверен, смогу ли я скопировать этот ответ, чтобы я мог наградить вас "щедростью"? Я решил эту проблему, чтобы другие пользователи в будущем могли найти это полезным.
iWizard
2
Добавьте свое конкретное решение в качестве ответа. Вероятно, это не совсем то же самое, что связанный ответ. Щедрость будет потеряна.
fuxia

Ответы:

3

Я предполагаю, что имя продавца - это другое метаполе, а не название для этого типа сообщения? Если так, вот способ организовать вашу область 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;
}
Кристина Чайлдс
источник
Кристина, я обновил объяснение, добавив скриншот. Пожалуйста, посмотрите на это.
iWizard
По умолчанию заголовки сообщений сортируются ... вам не нужно делать ничего особенного, чтобы сделать эту работу. Не могли бы вы опубликовать свой код регистрации cpt / taxonomy?
Кристина Чайлдс
У меня нет кода, потому что это в какой-то плагин реализован. У меня есть предложения (тип записи), которые сохранили в postmeta их идентификатор продавца, а затем поверх этого идентификатора продавца я подключаюсь к продавцу (тип сообщения). Как я могу в wp admin распечатать страницу сортировки (DESC / ASC) по имени продавца?
iWizard
1
Имена обратных вызовов и функций не совпадают в первых двух
хуках
1
Или есть это. Извините, я изменил с одного из моих существующих сайтов WordPress и, должно быть, пропустил это. Спасибо @brasofilo. @CroiOS, попробуйте код еще раз, когда я исправил эту опечатку. (используя post_title) вместо merchant_type)
Кристина Чайлдс
3

По умолчанию мета-значения и имена не используются в административной области.

Но вы можете включить запрос, чтобы использовать его в цикле, запрос, подобный примеру в вашем вопросе. Чтобы добавить мета значения используйте следующий небольшой фрагмент в плагине.

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

Другая альтернатива - подключить запрос и изменить запрос напрямую.

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
источник
1
Имя продавца (бит, который он хочет отсортировать) - это не мета-ключ, а название поста. Странно, что используемый им плагин отключил бы эту функцию.
Кристина Чайлдс
0

Надеюсь, что мое решение кому-нибудь пригодится.

 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
источник