Bagaimana cara memesan dengan memposting nama meta di admin wp?


9

Saya mencoba memesan dengan nama meta pos yang saya tambahkan untuk posting. Meta pos adalah "_merchant_id" dan saya tahu cara mengurutkan berdasarkan merchan_id, tetapi saya tidak tahu cara mengurutkan berdasarkan nama pedagang.

Saya mengurutkan berdasarkan id pedagang seperti ini:

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

Pedagang adalah jenis pos lain ("pedagang"). Bagaimana saya bisa mengurutkan berdasarkan nama pedagang?

UPDATE (penjelasan yang ditingkatkan berdasarkan tangkapan layar):

masukkan deskripsi gambar di sini


Apakah kamu membaca ini ? Itu mirip, bahkan mungkin lebih sulit. :)
fuxia

@toscho - Mencoba. Tapi saya mendapatkan posting default, bukan tipe posting saya "Penawaran"
iWizard

@toscho - Ini berfungsi. Saya tidak tahu aturan di sini di stackoverflow jadi saya tidak yakin apakah saya bisa menyalin jawaban ini sehingga saya bisa memberi Anda "hadiah"? Saya memecahkan masalah ini sehingga pengguna lain di masa depan mungkin merasa terbantu.
iWizard

2
Tambahkan solusi spesifik Anda sebagai jawaban. Mungkin tidak persis sama dengan jawaban yang ditautkan. Hadiah itu akan hilang.
fuxia

Jawaban:


3

Saya menganggap nama pedagang adalah bidang meta lain dan bukan judul untuk jenis posting itu? Jika demikian, berikut adalah cara untuk mengatur area admin edit.php Anda

// 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, saya telah memperbarui penjelasan dengan menambahkan screenshoot. Silakan lihat.
iWizard

Judul posting seharusnya dapat diurutkan secara default ... Anda tidak perlu melakukan sesuatu yang istimewa untuk membuatnya bekerja. Pikiran memposting kode registrasi cpt / taksonomi Anda?
kristina childs

Saya belum kode karena ini dalam beberapa plugin diimplementasikan. Saya memiliki penawaran (tipe posting) yang telah menyimpan dalam postmeta id merchant mereka dan kemudian pada id merhcant itu saya terhubung ke merchant (tipe posting). Bagaimana saya bisa mengurutkan halaman pencetakan (DESC / ASC) admin dengan nama pedagang?
iWizard

1
Callback dan nama fungsi tidak cocok dengan dua kait pertama ...
brasofilo

1
Atau ada itu. Maaf, saya memodifikasi dari salah satu situs wordpress saya yang ada dan pasti melewatkannya. Terima kasih @brasofilo. @CroiOS, coba kode lagi sekarang setelah saya memperbaiki kesalahan ketik itu. (menggunakan post_title) alih-alih merchant_type)
kristina childs

3

Nilai dan nama meta tidak bisa digunakan di area admin secara default.

Tetapi Anda dapat meningkatkan kueri untuk menggunakannya dalam loop, kueri seperti contoh dalam pertanyaan Anda. Untuk menambahkan nilai meta gunakan ikuti potongan kecil di 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;
}

Alternatif lain adalah mengaitkan kueri dan mengubah kueri secara langsung.

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
Nama pedagang (bit yang ingin disortir) bukan kunci meta, melainkan judul posting. Aneh bahwa plugin yang digunakannya akan menonaktifkan fungsi itu.
kristina childs

0

Saya berharap solusi saya akan bermanfaat bagi seseorang.

 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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.