Làm thế nào để đặt hàng bằng cách đăng tên meta trong quản trị wp?


9

Tôi đang cố gắng đặt hàng theo tên meta mà tôi đã thêm cho bài viết. Bài đăng meta là "_merchant_id" và tôi biết cách sắp xếp theo merchan_id nhưng tôi không biết cách sắp xếp theo tên người bán.

Tôi sắp xếp theo id thương gia như thế này:

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

Merchant là một loại bài đăng khác ("thương gia"). Làm thế nào tôi có thể sắp xếp theo tên thương gia?

CẬP NHẬT (giải thích cải thiện bằng ảnh chụp màn hình):

nhập mô tả hình ảnh ở đây


Bạn đã đọc ? Nó tương tự, thậm chí có thể khó khăn hơn. :)
fuxia

@toscho - Đã thử. Nhưng tôi nhận được các bài đăng mặc định, không phải loại "Ưu đãi" tùy chỉnh của tôi
iWizard

@toscho - Cái này hoạt động. Tôi không biết các quy tắc ở đây tại stackoverflow vì vậy tôi không chắc mình có thể sao chép câu trả lời này để tôi có thể thưởng cho bạn "tiền thưởng" không? Tôi đã giải quyết vấn đề này để những người dùng khác trong tương lai có thể thấy điều này hữu ích.
iWizard

2
Thêm giải pháp cụ thể của bạn như là một câu trả lời. Nó có thể không chính xác giống như câu trả lời được liên kết. Tiền thưởng sẽ bị mất.
fuxia

Câu trả lời:


3

Tôi giả sử tên thương gia là một trường meta khác và không phải là tiêu đề cho loại bài đăng đó? Nếu vậy, đây là một cách để tổ chức khu vực chỉnh sửa admin.php của bạn

// 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, tôi đã cập nhật lời giải thích bằng cách thêm màn hình. Hãy nhìn vào nó.
iWizard

Tiêu đề bài viết được cho là có thể sắp xếp theo mặc định ... bạn không cần phải làm gì đặc biệt để làm cho công việc đó. Tâm đăng mã đăng ký cpt / taxonomy của bạn?
trẻ em kristina

Tôi không có mã bởi vì đây là một số plugin được triển khai. Tôi có giao dịch (loại bài đăng) đã được lưu trong postmeta id người bán của họ và sau đó qua id thương nhân mà tôi kết nối với người bán (loại bài đăng). Làm cách nào tôi có thể sắp xếp trang in thỏa thuận quản trị wp (DESC / ASC) theo tên của người bán?
iWizard

1
Các tên gọi lại và tên hàm không khớp trong hai móc đầu tiên ...
brasofilo

1
Hoặc là có. Xin lỗi, tôi đã sửa đổi từ một trong những trang wordpress hiện có của tôi và phải bỏ lỡ điều đó. Cảm ơn @brasofilo. @CroiOS, hãy thử lại mã ngay bây giờ khi tôi đã sửa lỗi chính tả đó. (sử dụng post_title) thay vì merchant_type)
trẻ em kristina

3

Các giá trị meta và tên không thể sử dụng trong khu vực quản trị theo mặc định.

Nhưng bạn có thể liệt kê truy vấn để sử dụng nó trong vòng lặp, truy vấn giống như ví dụ trong câu hỏi của bạn. Để thêm các giá trị meta, hãy sử dụng đoạn trích nhỏ trong plugin.

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

Một cách khác là móc vào truy vấn và thay đổi truy vấn trực tiếp.

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
Tên người bán (bit anh ta muốn sắp xếp) không phải là một khóa meta, đó là tiêu đề bài viết. Thật kỳ lạ khi plugin anh sử dụng sẽ vô hiệu hóa chức năng đó.
trẻ em kristina

0

Tôi hy vọng rằng giải pháp của tôi sẽ hữu ích cho ai đó.

 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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.