Saring menurut bidang khusus dalam jenis pos kustom di halaman admin


11

Saya telah menggunakan Bidang Kustom Lanjutan untuk membuat bidang khusus untuk nama Persaingan, jawaban, dll. Saya telah membuat jenis posting khusus untuk kompetisi seperti yang ditunjukkan pada gambar dan saya menggunakan fungsi Wordpress.php untuk membuat kolom dari nilai-nilai bidang khusus saya.

Saya mencoba untuk mendapatkan "Filter oleh" kotak-dropdown dengan kompetisi berbagai nama / label seperti yang ditunjukkan di bawah ini, tetapi saya hanya dapat menemukan solusi menggunakan taksonomi, yang saya lebih suka tidak menggunakan jika mungkin karena saya hanya menggunakan bidang khusus untuk yang lainnya.

Apakah mungkin untuk membuat dropdown "Filter menurut" kustom hanya menggunakan bidang khusus?

Filter Wordpress berdasarkan


Anda dapat menggunakan restrict_manage_postskait tindakan untuk menambahkan kotak dropdown tambahan. Jangan lupa bahwa Anda juga harus menambahkan beberapa logika untuk filter, karena WP tidak akan tahu apa yang harus dilakukan dengan itu di luar kotak (tidak seperti daftar dropdown taksonomi, yang dapat ditangani secara otomatis).
David Gard

Sebagai pemikiran tambahan - jika Anda mau, Anda dapat membuat Nama masuk untuk menautkan dalam Daftar Tabel Anda, yang berarti bahwa Anda dapat menyaring Kompetisi dengan mengklik namanya, daripada memiliki dropdown.
David Gard

Jawaban:


12

Dan untuk menampilkan hasil untuk Filter kemudian coba kode ini

add_filter( 'parse_query', 'prefix_parse_filter' );
function  prefix_parse_filter($query) {
   global $pagenow;
   $current_page = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';

   if ( is_admin() && 
     'competition' == $current_page &&
     'edit.php' == $pagenow && 
      isset( $_GET['competition-name'] ) && 
      $_GET['competition-name'] != '') {

    $competion_name = $_GET['competition-name'];
    $query->query_vars['meta_key'] = 'competition_name';
    $query->query_vars['meta_value'] = $competition_name;
    $query->query_vars['meta_compare'] = '=';
  }
}

Ubah kunci meta dan nilai meta sesuai kebutuhan. Saya telah menggunakan "nama kompetisi sebagai meta_key dan" nama-kompetisi "sebagai nama tarik turun pilih.


Bagus, saya merasa malas jadi disarankan dia mengajukan pertanyaan tambahan;)
David Gard

Sepertinya 2 jawaban itu adalah jawaban yang lengkap dan harus digabungkan.
RCNeil

10

Tindakan pembatasan_manage_posts memicu add_extra_tablenav()fungsi, yaitu bagaimana Anda menambahkan dropdown tambahan ke Daftar Tabel yang Anda inginkan.

Dalam contoh di bawah ini, pertama-tama kita memastikan bahwa Jenis Posting sudah benar, dan kemudian kita ambil semua nilai DB yang disimpan terhadap competition_namekunci dalam postmetatabel (Anda harus mengubah nama kunci seperti yang diperlukan). Permintaannya cukup mendasar dan hanya memeriksa untuk melihat apakah Kompetisi diterbitkan, hanya mengambil nilai unik (Anda tidak ingin duplikasi dalam dropdown) dan kemudian memesannya secara alfabet.

Selanjutnya kita periksa hasilnya (tidak ada gunanya mengeluarkan dropdown untuk apa-apa), dan kemudian membangun opsi (termasuk defualt untuk menampilkan semua). Akhirnya dropdown adalah output.

Seperti yang dinyatakan dalam komentar saya, ini bukan akhir dari cerita; Anda akan memerlukan beberapa logika untuk memberi tahu Daftar Tabel untuk hanya menampilkan hasil yang Anda inginkan ketika filter aktif, tetapi saya akan membiarkan Anda melihatnya dan kemudian memulai pertanyaan lain jika Anda memerlukan bantuan lebih lanjut. Petunjuk - lihat file tersebut /wp-admin/includes/class-wp-posts-list-table.php, dan itu adalah induknya.../wp-class-list-table.php

/**
 * Add extra dropdowns to the List Tables
 *
 * @param required string $post_type    The Post Type that is being displayed
 */
add_action('restrict_manage_posts', 'add_extra_tablenav');
function add_extra_tablenav($post_type){

    global $wpdb;

    /** Ensure this is the correct Post Type*/
    if($post_type !== 'competition')
        return;

    /** Grab the results from the DB */
    $query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value FROM %1$s pm
        LEFT JOIN %2$s p ON p.ID = pm.post_id
        WHERE pm.meta_key = "%3$s" 
        AND p.post_status = "%4$s" 
        AND p.post_type = "%5$s"
        ORDER BY "%3$s"',
        $wpdb->postmeta,
        $wpdb->posts,
        'competition_name', // Your meta key - change as required
        'publish',          // Post status - change as required
        $post_type
    );
    $results = $wpdb->get_col($query);

    /** Ensure there are options to show */
    if(empty($results))
        return;

    // get selected option if there is one selected
    if (isset( $_GET['competition-name'] ) && $_GET['competition-name'] != '') {
        $selectedName = $_GET['competition-name'];
    } else {
        $selectedName = -1;
    }

    /** Grab all of the options that should be shown */
    $options[] = sprintf('<option value="-1">%1$s</option>', __('All Competitions', 'your-text-domain'));
    foreach($results as $result) :
        if ($result == $selectedName) {
            $options[] = sprintf('<option value="%1$s" selected>%2$s</option>', esc_attr($result), $result);
        } else {
            $options[] = sprintf('<option value="%1$s">%2$s</option>', esc_attr($result), $result);
        }
    endforeach;

    /** Output the dropdown menu */
    echo '<select class="" id="competition-name" name="competition-name">';
    echo join("\n", $options);
    echo '</select>';

}

Saat menggunakan ini, saya mendapatkan kesalahanNotice: wpdb::prepare was called incorrectly. The query does not contain the correct number of placeholders (6) for the number of arguments passed (5). Please see Debugging in WordPress for more information. (This message was added in version 4.8.3.) in /[...]/wp-includes/functions.php on line 4773
rassoh

Saya juga mendapatkan kesalahan yang sama
Vasim Shaikh

0

Jika ini tidak berhasil untuk siapa pun, solusi saya perlu menambahkan Kolom yang saya coba filterkan ke daftar kolom Diurutkan untuk jenis posting kustom saya.

// Make Custom Post Type Custom Columns Sortable
function cpt_custom_columns_sortable( $columns ) {

    // Add our columns to $columns array
    $columns['item_number'] = 'item_number';
    $columns['coat_school'] = 'coat_school'; 

    return $columns;
} add_filter( 'manage_edit-your-custom-post-type-slug_sortable_columns', 'cpt_custom_columns_sortable' );

0

Ganti kueri di bawah ini untuk memperbaiki wpdb: persiapkan kesalahan:

$query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value FROM %1$s pm
        LEFT JOIN %2$s p ON p.ID = pm.post_id
        WHERE pm.meta_key = "%3$s" 
        AND p.post_status = "%4$s" 
        AND p.post_type = "%5$s"
        ORDER BY "%3$s"',
        $wpdb->postmeta,
        $wpdb->posts,
        'competition_name', // Your meta key - change as required
        'publish',          // Post status - change as required
        $post_type,
        'competition_name' //this is needed a second time to define "%3$s" in ORDER BY
  );
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.