Как заказать по почте мета-имя в 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;
...

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

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

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


Вы читали это ? Это было похоже, может быть, даже сложнее. :)
— 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';
    }
}

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;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.