it-swarm-id.com

Menambahkan Filter Taksonomi ke Daftar Admin untuk Jenis Pos Kustom?

Saya telah membuat Jenis Posting Kustom yang disebut 'listing' dan menambahkan Taksonomi Kustom yang disebut 'businesses'. Saya ingin menambahkan daftar dropdown Bisnis ke daftar admin untuk Cantuman.

Berikut tampilan fungsionalitas ini dalam daftar admin untuk Posting (Saya ingin yang sama untuk Jenis Posting Kustom saya):

Categories Dropdown in Posts

Ini kode saya saat ini ( Dan ini kode yang sama pada Gist. ):

<?php
/*
Plugin Name: Listing Content Item
Plugin URI:
Description: 
Author: 
Version: 1.0
Author URI: 
*/

class Listing {
  var $meta_fields = array("list-address1","list-address2","list-country","list-province","list-city","list-postcode","list-firstname","list-lastname","list-website","list-mobile","list-phone","list-fax","list-email", "list-profile", "list-distributionrange", "list-distributionarea");

  public function loadStyleScripts() {
    $eventsURL = trailingslashit( WP_PLUGIN_URL ) . trailingslashit( plugin_basename( dirname( __FILE__ ) ) ) . 'css/';
    wp_enqueue_style('listing-style', $eventsURL.'listing.css');
  }

  function Listing() {
    // Register custom post types
    register_post_type('listing', array(
      'labels' => array(
        'name' => __('Listings'), 'singular_name' => __( 'Listing' ),
        'add_new' => __( 'Add Listing' ),
        'add_new_item' => __( 'Add New Listing' ),
        'edit' => __( 'Edit' ),
        'edit_item' => __( 'Edit Listing' ),
        'new_item' => __( 'New Listing' ),
        'view' => __( 'View Listing' ),
        'view_item' => __( 'View Listing' ),
        'search_items' => __( 'Search Listings' ),
        'not_found' => __( 'No listings found' ),
        'not_found_in_trash' => __( 'No listings found in Trash' ),
        'parent' => __( 'Parent Listing' ),
      ),
      'singular_label' => __('Listing'),
      'public' => true,
      'show_ui' => true, // UI in admin panel
      '_builtin' => false, // It's a custom post type, not built in
      '_edit_link' => 'post.php?post=%d',
      'capability_type' => 'post',
      'hierarchical' => false,
      'rewrite' => array("slug" => "listings"), // Permalinks
      'query_var' => "listings", // This goes to the WP_Query schema
      'supports' => array('title','editor')
    ));

    add_filter("manage_edit-listing_columns", array(&$this, "edit_columns"));
    add_action("manage_posts_custom_column", array(&$this, "custom_columns"));

    // Register custom taxonomy

    #Businesses
    register_taxonomy("businesses", array("listing"), array(
      "hierarchical" => true, 
      "label" => "Listing Categories", 
      "singular_label" => "Listing Categorie", 
      "rewrite" => true,
    ));

    # Region
    register_taxonomy("regions", array("listing"), array(
      'labels' => array(
        'search_items' =>  __( 'Search Regions' ),
        'popular_items' => __( 'Popular Regions' ),
        'all_items' => __( 'All Regions' ),
        'parent_item' => null,
        'parent_item_colon' => null,
        'edit_item' => __( 'Edit Region' ), 
        'update_item' => __( 'Update Region' ),
        'add_new_item' => __( 'Add New Region' ),
        'new_item_name' => __( 'New Region Name' ),
        'separate_items_with_commas' => __( 'Separate regions with commas' ),
        'add_or_remove_items' => __( 'Add or remove regions' ),
        'choose_from_most_used' => __( 'Choose from the most used regions' ),
      ),
      "hierarchical" => false, 
      "label" => "Listing Regions", 
      "singular_label" => "Listing Region", 
      "rewrite" => true,
    ));

    # Member Organizations
    register_taxonomy("organizations", array("listing"), array(
      'labels' => array(
        'search_items' =>  __( 'Search Member Organizations' ),
        'popular_items' => __( 'Popular Member Organizations' ),
        'all_items' => __( 'All Member Organizations' ),
        'parent_item' => null,
        'parent_item_colon' => null,
        'edit_item' => __( 'Edit Member Organization' ), 
        'update_item' => __( 'Update Member Organization' ),
        'add_new_item' => __( 'Add New Member Organization' ),
        'new_item_name' => __( 'New Member Organization Name' ),
        'separate_items_with_commas' => __( 'Separate member organizations with commas' ),
        'add_or_remove_items' => __( 'Add or remove member organizations' ),
        'choose_from_most_used' => __( 'Choose from the most used member organizations' ),
      ),
      "hierarchical" => false, 
      "label" => "Member Organizations", 
      "singular_label" => "Member Organization", 
      "rewrite" => true,
    ));

    # Retail Products
    register_taxonomy("retails", array("listing"), array(
      'labels' => array(
        'search_items' =>  __( 'Search Retail Products' ),
        'popular_items' => __( 'Popular Retail Products' ),
        'all_items' => __( 'All Retail Products' ),
        'parent_item' => null,
        'parent_item_colon' => null,
        'edit_item' => __( 'Edit Retail Product' ), 
        'update_item' => __( 'Update Retail Product' ),
        'add_new_item' => __( 'Add New Retail Product' ),
        'new_item_name' => __( 'New Retail Product Name' ),
        'separate_items_with_commas' => __( 'Separate retail products with commas' ),
        'add_or_remove_items' => __( 'Add or remove retail products' ),
        'choose_from_most_used' => __( 'Choose from the most used retail products' ),
      ),
      "hierarchical" => false, 
      "label" => "Retail Products", 
      "singular_label" => "Retail Product", 
      "rewrite" => true,
    ));

    # Farming Practices
    register_taxonomy("practices", array("listing"), array(
      'labels' => array(
        'search_items' =>  __( 'Search Farming Practices' ),
        'popular_items' => __( 'Popular Farming Practices' ),
        'all_items' => __( 'All Farming Practices' ),
        'parent_item' => null,
        'parent_item_colon' => null,
        'edit_item' => __( 'Edit Farming Practice' ), 
        'update_item' => __( 'Update Farming Practice' ),
        'add_new_item' => __( 'Add New Farming Practice' ),
        'new_item_name' => __( 'New Farming Practice Name' ),
        'separate_items_with_commas' => __( 'Separate farming practices with commas' ),
        'add_or_remove_items' => __( 'Add or remove farming practices' ),
        'choose_from_most_used' => __( 'Choose from the most used farming practices' ),
      ),
      "hierarchical" => false, 
      "label" => "Farming Practices", 
      "singular_label" => "Farming Practice", 
      "rewrite" => true,
     ));

    # Products 
    register_taxonomy("products", array("listing"), array(
      'labels' => array(
        'search_items' =>  __( 'Search Products' ),
        'popular_items' => __( 'Popular Products' ),
        'all_items' => __( 'All Products' ),
        'parent_item' => null,
        'parent_item_colon' => null,
        'edit_item' => __( 'Edit Product' ), 
        'update_item' => __( 'Update Product' ),
        'add_new_item' => __( 'Add New Product' ),
        'new_item_name' => __( 'New Product Name' ),
        'separate_items_with_commas' => __( 'Separate products with commas' ),
        'add_or_remove_items' => __( 'Add or remove products' ),
        'choose_from_most_used' => __( 'Choose from the most used products' ),
      ),
      "hierarchical" => false, 
      "label" => "Products", 
      "singular_label" => "Product", 
      "rewrite" => true,
    ));


    // Admin interface init
    add_action("admin_init", array(&$this, "admin_init"));
    add_action("template_redirect", array(&$this, 'template_redirect'));

    // Insert post hook
    add_action("wp_insert_post", array(&$this, "wp_insert_post"), 10, 2);
  }

  function edit_columns($columns) {
    $columns = array(
      "cb" => "<input type=\"checkbox\" />",
      "title" => "Business Name",
      "description" => "Description",
      "list-personal" => "Personal Information",
      "list-location" => "Location",
      "list-categorie" => "Categorie",
    );

    return $columns;
  }

  function custom_columns($column) {
    global $post;
    switch ($column) {
      case "description":
        the_excerpt();
        break;
      case "list-personal":
        $custom = get_post_custom();
        if(isset($custom["list-firstname"][0])) echo $custom["list-firstname"][0]."<br />";
        if(isset($custom["list-lastname"][0])) echo $custom["list-lastname"][0]."<br />";
        if(isset($custom["list-email"][0])) echo $custom["list-email"][0]."<br />";
        if(isset($custom["list-website"][0])) echo $custom["list-website"][0]."<br />";
        if(isset($custom["list-phone"][0])) echo $custom["list-phone"][0]."<br />";
        if(isset($custom["list-mobile"][0])) echo $custom["list-mobile"][0]."<br />";
        if(isset($custom["list-fax"][0])) echo $custom["list-fax"][0];
        break;
      case "list-location":
        $custom = get_post_custom();
        if(isset($custom["list-address1"][0])) echo $custom["list-address1"][0]."<br />";
        if(isset($custom["list-address2"][0])) echo $custom["list-address2"][0]."<br />";
        if(isset($custom["list-city"][0])) echo $custom["list-city"][0]."<br />";
        if(isset($custom["list-province"][0])) echo $custom["list-province"][0]."<br />";
        if(isset($custom["list-postcode"][0])) echo $custom["list-postcode"][0]."<br />";
        if(isset($custom["list-country"][0])) echo $custom["list-country"][0]."<br />";
        if(isset($custom["list-profile"][0])) echo $custom["list-profile"][0]."<br />";
        if(isset($custom["list-distributionrange"][0])) echo $custom["list-distributionrange"][0]."<br />";
        if(isset($custom["list-distributionarea"][0])) echo $custom["list-distributionarea"][0];
        break;
      case "list-categorie":
        $speakers = get_the_terms(0, "businesses");
        $speakers_html = array();
        if(is_array($speakers)) {
          foreach ($speakers as $speaker)
          array_Push($speakers_html, '<a href="' . get_term_link($speaker->slug, 'businesses') . '">' . $speaker->name . '</a>');
          echo implode($speakers_html, ", ");
        }
        break;
    }
  }

  // Template selection
  function template_redirect() {
    global $wp;
    if (isset($wp->query_vars["post_type"]) && ($wp->query_vars["post_type"] == "listing")) {
      include(STYLESHEETPATH . "/listing.php");
      die();
    }
  }

  // When a post is inserted or updated
  function wp_insert_post($post_id, $post = null) {
    if ($post->post_type == "listing") {
      // Loop through the POST data
      foreach ($this->meta_fields as $key) {
        $value = @$_POST[$key];
        if (empty($value)) {
          delete_post_meta($post_id, $key);
          continue;
        }

        // If value is a string it should be unique
        if (!is_array($value)) {
          // Update meta
          if (!update_post_meta($post_id, $key, $value)) {
            // Or add the meta data
            add_post_meta($post_id, $key, $value);
          }
        }
        else
        {
          // If passed along is an array, we should remove all previous data
          delete_post_meta($post_id, $key);

          // Loop through the array adding new values to the post meta as different entries with the same name
          foreach ($value as $entry)
            add_post_meta($post_id, $key, $entry);
        }
      }
    }
  }

  function admin_init() {
    // Custom meta boxes for the edit listing screen
    add_meta_box("list-pers-meta", "Personal Information", array(&$this, "meta_personal"), "listing", "normal", "low");
    add_meta_box("list-meta", "Location", array(&$this, "meta_location"), "listing", "normal", "low");
  }

  function meta_personal() {
    global $post;
    $custom = get_post_custom($post->ID);
    if(isset($custom["list-firstname"][0])) $first_name = $custom["list-firstname"][0];else $first_name = '';
    if(isset($custom["list-lastname"][0])) $last_name = $custom["list-lastname"][0];else $last_name = '';
    if(isset($custom["list-website"][0])) $website = $custom["list-website"][0];else $website = '';
    if(isset($custom["list-phone"][0])) $phone = $custom["list-phone"][0];else $phone = '';
    if(isset($custom["list-mobile"][0])) $mobile = $custom["list-mobile"][0];else $mobile = '';
    if(isset($custom["list-fax"][0])) $fax = $custom["list-fax"][0];else $fax = '';
    if(isset($custom["list-email"][0])) $email = $custom["list-email"][0];else $email = '';
?>
<div class="personal">
<table border="0" id="personal">
<tr><td class="personal_field"><label>Firstname:</label></td><td class="personal_input"><input name="list-firstname" value="<?php echo $first_name; ?>" /></td></tr>
<tr><td class="personal_field"><label>Lastname:</label></td><td class="personal_input"><input name="list-lastname" value="<?php echo $last_name; ?>" /></td></tr>
<tr><td class="personal_field"><label>Email:</label></td><td class="personal_input"><input name="list-email" value="<?php echo $email; ?>" size="40"/></td></tr>
<tr><td class="personal_field"><label>Website:</label></td><td class="personal_input"><input name="list-website" value="<?php echo $website; ?>" size="40"/></td></tr>
<tr><td class="personal_field"><label>Phone:</label></td><td class="personal_input"><input name="list-phone" value="<?php echo $phone; ?>" /></td></tr>
<tr><td class="personal_field"><label>Mobile:</label></td><td class="personal_input"><input name="list-mobile" value="<?php echo $mobile; ?>" /></td></tr>
<tr><td class="personal_field"><label>Fax:</label></td><td class="personal_input"><input name="list-fax" value="<?php echo $fax; ?>" /></td></tr>
</table>
</div>
     <?php
  }

  // Admin post meta contents
  function meta_location() {
    global $post;
    $custom = get_post_custom($post->ID);
    if(isset($custom["list-address1"])) $address1 = $custom["list-address1"][0];else $address1 = '';
    if(isset($custom["list-address2"])) $address2 = $custom["list-address2"][0];else $address2 = '';
    if(isset($custom["list-country"])) $country = $custom["list-country"][0];else $country = '';
    if(isset($custom["list-province"])) $province = $custom["list-province"][0];else $province = '';
    if(isset($custom["list-city"])) $city = $custom["list-city"][0];else $city = '';
    if(isset($custom["list-postcode"])) $post_code = $custom["list-postcode"][0];else $post_code = '';
    if(isset($custom["list-profile"])) $profile = $custom["list-profile"][0];else $profile = '';
    if(isset($custom["list-distributionrange"])) $distribution_range = $custom["list-distributionrange"][0];else $distribution_range = '';
    if(isset($custom["list-distributionarea"])) $distribution_area = $custom["list-distributionarea"][0];else $ddistribution_area = '';
  ?>
<div class="location">
<table border="0" id="location">
<tr><td class="location_field"><label>Address 1:</label></td><td class="location_input"><input name="list-address1" value="<?php echo $address1; ?>" size="60" /></td></tr>
<tr><td class="location_field"><label>Address 2:</label></td><td class="location_input"><input name="list-address2" value="<?php echo $address2; ?>" size="60" /></td></tr>
<tr><td class="location_field"><label>City:</label></td><td class="location_input"><input name="list-city" value="<?php echo $city; ?>" /></td></tr>
<tr><td class="location_field"><label>Province:</label></td><td class="location_input"><input name="list-province" value="Ontario" readonly /></td></tr>
<tr><td class="location_field"><label>Postal Code:</label></td><td class="location_input"><input name="list-postcode" value="<?php echo $post_code; ?>" /></td></tr>
<tr><td class="location_field"><label>Country:</label></td><td class="location_input"><input name="list-country" value="Canada" readonly /></td></tr>
<tr><td class="location_field"><label>Profile:</label></td><td class="location_input"><input name="list-profile" value="<?php echo $profile; ?>" size="60" /></td></tr>
<tr><td class="location_field"><label>Distribution Range:</label></td><td class="location_input"><input name="list-distributionrange" value="<?php echo $distribution_range; ?>" size="60" /></td></tr>
<tr><td class="location_field"><label>Distribution Area:</label></td><td class="location_input"><input name="list-distributionarea" value="<?php echo $distribution_area; ?>" size="60" /></td></tr>
</table>
</div>
   <?php
  }
}

// Initiate the plugin
add_action("init", "ListingInit");
function ListingInit() { 
  global $listing;
  $listing = new Listing();
  $add_css = $listing->loadStyleScripts();
}

Bagaimana saya bisa menambahkan daftar dropdown Bisnis ke daftar admin untuk Cantuman?

128
Taras Mankovski

PEMBARUAN: Saya telah menyertakan jawaban lengkap baru tetapi meskipun begitu saya meninggalkan jawaban asli saya di bagian bawah yang menjadi referensi beberapa komentar pertama.


Hai @tarasm :

Meskipun saya katakan itu tidak sulit, tapi sedikit terlibat. Tetapi sebelum kita Menggali kode ...

Screenshot:

... mari kita lihat beberapa tangkapan layar untuk produk jadi:

Halaman daftar listing dengan Tidak Memfilter:

 Listings list page with No Filtering 
(sumber: mikeschinkel.com )

Halaman daftar listing Dengan Memfilter:

 Listings list page With Filtering 
(sumber: mikeschinkel.com )

Kode

Jadi di sini kita mulai ... ( Catatan: Saya menggunakan bentuk tunggal untuk nama taksonomi business; Saya harap itu cocok dengan Anda. Dari banyak pengalaman dengan WordPress dan pengembangan basis data di masa lalu saya percaya yang terbaik adalah melakukannya dengan cara ini.)

Langkah # 1: Kait tindakan restrict_manage_posts.

Hal pertama yang perlu Anda lakukan adalah mengaitkan tindakan restrict_manage_posts yang tidak memiliki parameter dan dipanggil dari /wp-admin/edit.php (dalam v3.0.1 panggilan itu ada di saluran 378.) Ini akan memungkinkan Anda untuk menghasilkan pilih turun bawah di lokasi yang sesuai di atas daftar posting Listing.

<?php
add_action('restrict_manage_posts','restrict_listings_by_business');
function restrict_listings_by_business() {
    global $typenow;
    global $wp_query;
    if ($typenow=='listing') {
        $taxonomy = 'business';
        $business_taxonomy = get_taxonomy($taxonomy);
        wp_dropdown_categories(array(
            'show_option_all' =>  __("Show All {$business_taxonomy->label}"),
            'taxonomy'        =>  $taxonomy,
            'name'            =>  'business',
            'orderby'         =>  'name',
            'selected'        =>  $wp_query->query['term'],
            'hierarchical'    =>  true,
            'depth'           =>  3,
            'show_count'      =>  true, // Show # listings in parens
            'hide_empty'      =>  true, // Don't show businesses w/o listings
        ));
    }
}

Kita mulai dengan memeriksa variabel $typenow untuk memastikan bahwa kita sebenarnya berada pada post_type dari listing. Jika tidak, Anda akan mendapatkan drop down ini untuk semua jenis posting yang dalam beberapa kasus adalah apa yang Anda inginkan, tetapi tidak untuk kasus ini.

Selanjutnya kita memuat informasi tentang taksonomi bisnis menggunakan get_taxonomy(). Kita memerlukannya untuk mengambil label untuk taksonomi (yaitu "Bisnis"; kita bisa memiliki hard-kode, tapi itu tidak terlalu baik jika Anda perlu menginternasionalkan nanti.) Kemudian kita memanggil wp_dropdown_categories() dengan semua yang sesuai argumen dalam array $args untuk menghasilkan drop down

<?php
return wp_dropdown_categories(array(
    'show_option_all' =>  __("Show All {$business_taxonomy->label}"),
    'taxonomy'        =>  $taxonomy,
    'name'            =>  'business',
    'orderby'         =>  'name',
    'selected'        =>  $wp_query->query['term'],
    'hierarchical'    =>  true,
    'depth'           =>  3,
    'show_count'      =>  true, // Show # listings in parens
    'hide_empty'      =>  true, // Don't show businesses w/o listings
));

Tapi apa argumen yang tepat? Mari kita lihat satu per satu:

  • show_optional_all- Cukup mudah, itulah yang ditampilkan di drop-down pada awalnya dan ketika belum ada penyaringan yang diterapkan. Dalam kasus kami, jadi "Tampilkan Semua Bisnis" tapi kami bisa menyebutnya "Daftar untuk Semua Bisnis" atau apa pun yang Anda suka.

  • taxonomy- Argumen ini memberitahu fungsi dari mana taksonomi untuk menarik istilah dari meskipun fungsi memiliki categories dalam namanya. Di v2.8 dan sebelumnya WordPress tidak memiliki taksonomi khusus tetapi ketika ditambahkan, tim memutuskan akan lebih mudah untuk menambahkan argumen taksonomi ke fungsi ini daripada membuat fungsi lain dengan nama lain.

  • name- Argumen ini memungkinkan Anda untuk menentukan nilai yang WordPress gunakan untuk atribut name dari elemen <select> yang dihasilkan untuk drop down. Kalau-kalau tidak jelas ini juga merupakan nilai yang akan digunakan dalam URL saat penyaringan.

  • orderby- Argumen ini memberi tahu WordPress cara memesan hasil sesuai abjad. Dalam kasus kami, kami menentukan untuk membeli name syarat dalam taksonomi, yaitu nama bisnis dalam kasus ini.

  • selected- Argumen ini diperlukan agar drop-down dapat menampilkan filter saat ini di drop-down. Itu harus term_id dari istilah taksonomi yang dipilih. Dalam kasus kami, itu mungkin term_id dari "Business # 2". Di mana kita mendapatkan nilai ini? Dari variabel global WordPress $wp_query; ia memiliki properti query yang berisi larik semua parameter URL dan nilainya (kecuali beberapa plugin yang nakal telah memodifikasinya, tentu saja.) Mengingat bagaimana WordPress memproses hal-hal akan ada parameter URL term yang diteruskan pada URL ketika pengguna mengklik tombol filter jika pengguna memilih istilah yang valid (yaitu salah satu bisnis yang terdaftar).

  • hierarchical- Dengan mengatur ini ke true Anda memberi tahu fungsi untuk menghormati sifat hierarki taksonomi dan menampilkannya dalam tampilan pohon jika istilah (bisnis) pada kenyataannya memiliki anak. Untuk tangkapan layar untuk melihat seperti apa ini, lihat di bawah.

  • depth- Argumen ini berkolaborasi dengan argumen hierarchical untuk menentukan berapa level fungsi yang harus dilalui dalam menampilkan anak-anak.

  • show_count- Jika true argumen ini akan menampilkan pos penghitungan di dalam tanda kurung di sebelah kiri nama istilah di dalam drop down. Dalam hal ini akan menampilkan jumlah listing yang terkait dengan bisnis. Untuk tangkapan layar untuk melihat seperti apa ini, lihat di bawah.

  • hide_empty- Akhirnya, jika ada istilah dalam taksonomi yang tidak terkait dengan sebuah pos (yaitu bisnis yang tidak terkait dengan daftar) maka pengaturan ini ke true akan menghilangkannya agar tidak disertakan. di drop down.

 Taxonomy Drop Down should hierarchy and counts 
(sumber: mikeschinkel.com )

Langkah # 2: Kait filter parse_query.

Selanjutnya kita memanggil perhatian kita ke hook filter parse_query yang memiliki satu parameter ($query) dan dipanggil dari /wp-includes/query.php (dalam v3.0.1 panggilan itu ada di jalur 1549.) Disebut ketika WordPress telah selesai memeriksa URL dan mengatur semua nilai yang sesuai di $wp_query yang sedang aktif termasuk hal-hal seperti $wp_query->is_home dan $wp_query->is_author, dll.

Setelah parse_query filter hook berjalan, WordPress akan memanggil get_posts() dan memuat daftar posting berdasarkan apa yang ditentukan dalam $wp_query yang saat ini aktif. Jadi parse_query sering merupakan tempat yang bagus untuk membuat WordPress berubah pikiran tentang posting mana yang akan dimuat.

Dalam kasus penggunaan Anda, kami ingin menyaring WordPress berdasarkan bisnis yang dipilih; yaitu hanya menampilkan Cantuman yang telah dikaitkan dengan bisnis yang dipilih (saya katakan "... hanya cantuman yang telah" dikategorikan "oleh bisnis yang dipilih" tapi itu tidak benar secara teknis; category itu sendiri taksonomi pada peer dengan business kecuali bahwa category dibangun ke WordPress dan business adalah kebiasaan. Tetapi bagi mereka yang akrab dengan kategorisasi posting ini dapat membantu Anda memahami karena mereka bekerja hampir identik. Tapi saya ngelantur .. .)

Aktif ke kode. Hal pertama yang kami lakukan adalah mengambil referensi ke $wp_query's query_vars yang saat ini aktif sehingga lebih nyaman untuk digunakan, seperti halnya yang dilakukan dalam fungsi parse_query() WordPress sendiri. Tidak seperti $wp_query->query yang digunakan untuk mencerminkan parameter yang dikirimkan pada URL, array $wp_query->query_vars digunakan untuk mengontrol permintaan yang dijalankan WordPress dan diharapkan akan dimodifikasi. Jadi jika Anda perlu memodifikasi satu, itu akan menjadi satu (setidaknya saya berpikir yang berbeda antara keduanya; jika ada yang tahu sebaliknya tolong beri tahu saya agar saya bisa perbarui ini!)

<?php
add_filter('parse_query','convert_business_id_to_taxonomy_term_in_query');
function convert_business_id_to_taxonomy_term_in_query($query) {
    global $pagenow;
    $qv = &$query->query_vars;
    if ($pagenow=='edit.php' &&
            isset($qv['taxonomy']) && $qv['taxonomy']=='business' &&
            isset($qv['term']) && is_numeric($qv['term'])) {
        $term = get_term_by('id',$qv['term'],'business');
        $qv['term'] = $term->slug;
    }
}

Selanjutnya kami menguji $pagenow untuk memastikan bahwa kami memang memuat WordPress dari jalur URL /wp-admin/edit.php. Kami melakukan ini untuk menjaga agar tidak secara tidak sengaja mengacaukan pertanyaan di halaman lain. Kami juga memeriksa untuk memastikan bahwa kami memiliki keduanya business sebagai elemen taxonomy dan elemen term juga. (Catatan taxonomy dan term adalah pasangan; keduanya digunakan bersama untuk memungkinkan permintaan istilah taksonomi; harus memiliki keduanya atau WordPress tidak tahu taksonomi mana yang harus diperiksa.)

Anda mungkin bertanya-tanya bagaimana business muncul di elemen taxonomy dari array query_vars. Apa yang kami tulis di kait parse_query kami memicu keajaiban internal WordPress yang diletakkan menunggu ketika Anda mendaftarkan taksonomi "business" dengan menetapkan query_var menjadi benar (register_taxonomy() menyalin nama taksonomi sebagai query_var; Anda dapat mengubahnya tentu saja tetapi kecuali Anda memiliki konflik, lebih baik tetap dengan yang sama):

<?php
add_action('init','register_business_taxonomy');
    function register_business_taxonomy() {
        register_taxonomy('business',array('listing'),array(
        'label' => 'Businesses',
        'public'=>true,
        'hierarchical'=>true,
        'show_ui'=>true,
        'query_var'=>true
    ));
}

Sekarang WordPress '$ wp_query ditulis untuk menggunakan siput untuk kueri taksonomi yang difilter standar, bukan ID istilah taksonomi. Untuk kasus penggunaan ini, apa yang benar-benar kita perlukan untuk membuat kueri pemfilteran berfungsi sebagai berikut:

taxonomy: bisnis

term: bisnis-1 (yaitu slug)

Bukan ini:

taxonomy: bisnis

term: 27 (yaitu term_id)

Menarik dan sayangnya drop-down yang dihasilkan oleh wp_dropdown_categories() mengatur atribut <option>'s value ke istilah (/ bisnis ') term_id, not istilah slug. Jadi kita perlu mengonversi $wp_query->query_vars['term'] dari numerik term_id menjadi string slug sebagai berikut dalam snaget yang diambil dari atas (Catatan ini bukan cara yang paling berkinerja untuk meminta database tetapi sampai WordPress menambahkan dukungan untuk term_ids ke dalam kueri yang terbaik yang kami bisa. melakukan!):

<?php
$term = get_term_by('id',$qv['term'],'business');
$qv['term'] = $term->slug;

Dan itu dia! Dengan dua fungsi tersebut Anda mendapatkan pemfilteran yang Anda inginkan.

TAPI TUNGGU, ADA LEBIH BANYAK! :-)

Saya melanjutkan dan menambahkan kolom "Bisnis" ke daftar Daftar Anda karena, yah, saya tahu itu akan menjadi pertanyaan Anda berikutnya. Tanpa memiliki kolom untuk apa yang Anda filter itu bisa sangat membingungkan bagi pengguna akhir. (Saya berjuang sendiri, dan saya adalah pembuat kode!) Anda tentu saja sudah dapat melihat kolom "Bisnis" pada cuplikan layar sebelumnya di atas.

Langkah # 3: Kait filter manage_posts_columns.

Untuk menambahkan kolom ke daftar posting diperlukan pemanggilan dua (2) kait lainnya. Yang pertama adalah manage_posts_columns atau versi khusus tipe posting manage_listing_posts_columns yang saya panggil. Ia menerima satu parameter (posts_columns) dan dipanggil dari /wp-admin/includes/template.php (dalam v3.0.1 panggilan itu ada di saluran 623):

<?php
add_action('manage_listing_posts_columns', 'add_businesses_column_to_listing_list');
function add_businesses_column_to_listing_list( $posts_columns ) {
    if (!isset($posts_columns['author'])) {
        $new_posts_columns = $posts_columns;
    } else {
        $new_posts_columns = array();
        $index = 0;
        foreach($posts_columns as $key => $posts_column) {
            if ($key=='author')
                $new_posts_columns['businesses'] = null;
            $new_posts_columns[$key] = $posts_column;
        }
    }
    $new_posts_columns['businesses'] = 'Businesses';
    return $new_posts_columns;
}

Fungsi kait manage_posts_columns Anda akan melewati array kolom di mana nilainya adalah tajuk kolom yang ditampilkan dan kuncinya adalah pengidentifikasi kolom internal. Pengidentifikasi kolom standar dapat mencakup ini dan lainnya: 'cb', 'title ', 'author', ``' date'`, dll.

'cb', adalah kolom checkbox dan 'title' dan 'date' masing-masing merujuk ke post_title dan post_date dari tabel wp_posts. 'author' tentu saja adalah bidang post_author setelah nama penulis diambil dari tabel wp_users.

 Screenshot of the 'cb' posts column as a checkbox. 
(sumber: mikeschinkel.com )

Untuk kait manage_posts_columns kami hanya ingin memasukkan kolom businesses kami ke dalam array $posts_columns sebelum 'author', dengan asumsi beberapa plugin lain belum menghapus author dari daftar!

$new_posts_columns['businesses'] = 'Businesses';

(Catatanketika saya menulis add_businesses_column_to_listing_list() terpikir oleh saya bahwa PHP must memiliki cara yang lebih mudah untuk memasukkan nilai ke dalam array asosiatif dalam urutan yang tepat?!? Atau setidaknya harus ada fungsi di inti WordPress untuk melakukannya? Tapi karena Google mengecewakan saya, maka saya pergi dengan apa yang berhasil. Jika ada yang menyarankan alternatif, saya akan mendengar dan menghargai di muka!)

Yang akhirnya membawa kita ke ...

Langkah # 4: Tindakan kait manage_posts_custom_column

Hal kedua dari dua (2) yang perlu kita lakukan untuk membuat bisnis kita ditampilkan di kolom adalah benar-benar menampilkan nama masing-masing bisnis terkait menggunakan kait tindakan manage_posts_custom_column. Hook ini menerima dua (2) parameter (column_id dan post_id) dan juga dipanggil dari /wp-admin/includes/template.php (dalam v3.0.1 panggilan itu ada di saluran 1459.):

<?php
add_action('manage_posts_custom_column', 'show_businesses_column_for_listing_list',10,2);
function show_businesses_column_for_listing_list( $column_id,$post_id ) {
    global $typenow;
    if ($typenow=='listing') {
        $taxonomy = 'business';
        switch ($column_name) {
        case 'businesses':
            $businesses = get_the_terms($post_id,$taxonomy);
            if (is_array($businesses)) {
                foreach($businesses as $key => $business) {
                    $edit_link = get_term_link($business,$taxonomy);
                    $businesses[$key] = '<a href="'.$edit_link.'">' . $business->name . '</a>';
                }
                //echo implode("<br/>",$businesses);
                echo implode(' | ',$businesses);
            }
            break;
        }
    }
}

Hook ini dipanggil untuk setiap kolom untuk setiap baris posting (/ bisnis). Kami pertama-tama memverifikasi bahwa kami memang bekerja hanya dengan tipe posting khusus listing dan kemudian kami menggunakan pernyataan switch untuk menguji terhadap column_id. Saya memilih switch karena pengait ini sering digunakan untuk menghasilkan keluaran untuk banyak kolom berbeda, terutama jika kita menggunakan satu fungsi untuk banyak jenis posting berbeda yang mungkin terlihat seperti ini:

<?php
add_action('manage_posts_custom_column', 'my_manage_posts_custom_column',10,2);
function my_manage_posts_custom_column( $column_id,$post_id ) {
    global $typenow;
    switch ("{$typenow}:{$column_id}") {
    case 'listing:business':
        echo '...whatever...';
        break;
    case 'listing:property':
        echo '...whatever...';
        break;
    case 'agent:listing':
        echo '...whatever...';
        break;
    }
}

Memeriksa kasus penggunaan kami sedikit lebih dekat, Anda melihat fungsi get_the_terms() yang hanya mengembalikan daftar istilah untuk taksonomi ini (yaitu bisnis untuk listing ini.) Di sini dapatkan permalink untuk halaman web front-end istilah yang biasanya mencantumkan posting yang terkait dengan istilah tersebut tetapi tentu saja mungkin berbeda tergantung pada tema dan/atau plugin yang dipasang.

Kami menggunakan permalink untuk hyperlink istilah hanya karena saya suka hyperlink hal. Kami kemudian menggabungkan semua istilah hyperlink (/ bisnis) bersama-sama dipisahkan dengan karakter pipa ('|') dan output ke buffer PHP yang mengirimkannya ke browser/klien HTTP:

<?php
$businesses = get_the_terms($post_id,$taxonomy);
if (is_array($businesses)) {
    foreach($businesses as $key => $business) {
        $edit_link = get_term_link($business,$taxonomy);
        $businesses[$key] = '<a href="'.$edit_link.'">' . $business->name . '</a>';
    }
    //echo implode("<br/>",$businesses);
    echo implode(' | ',$businesses);
}

NOWakhirnya kita selesai.

Ringkasan

Jadi, dalam ringkasan, Anda perlu menggunakan empat (4) kait berikut untuk mendapatkan filter dan kolom terkait di halaman daftar posting kustom (Oh, itu juga akan bekerja dengan Posting dan Halaman.) Mereka adalah:

  • Langkah # 1: Kait tindakan restrict_manage_posts.
  • Langkah # 2: Kait filter parse_query.
  • Langkah # 3: Kait filter manage_posts_columns.
  • Langkah # 4: Tindakan kait manage_posts_custom_column

Tempat mengunduh kode

Tetapi jika saya memaksa Anda untuk membaca semua hal di atas maka saya tentu tidak akan menjadi orang yang sangat baik jika saya juga membuat Anda menggali kode hanya untuk dapat mencobanya! Tetapi bertentangan dengan apa yang dikatakan beberapa orang, saya Nice. Jadi begini ya:

CATATAN untuk @tarasm: Saya menyertakan kait untuk register_post_type() dan register_taxonomy() sehingga orang lain dapat mencoba ini tanpa harus membuatnya kembali. Anda mungkin ingin menghapus kedua panggilan fungsi itu sebelum Anda menguji ini.

TAMAT


Tanggapan Asli:

Hai @tarasm :

Apakah Anda mencari satu drop-down di atas suka layar ini atau Anda mencari satu drop-down per catatan postingan dan jika demikian bagaimana Anda berharap yang terakhir berfungsi?

 How to Create Sort By functionality for a Custom Post Type in the WordPress Admin 
(sumber: mikeschinkel.com )

Jika yang pertama, lihat jawaban ini untuk pertanyaan Bagaimana cara mengurutkan area admin dari jenis posting kustom Wordpress oleh bidang kustom? Jika itu yang Anda butuhkan, saya bisa memberikan lebih spesifik terkait dengan taksonomi.

138
MikeSchinkel

Hanya ingin berbagi implementasi alternatif. Saya tidak memiliki tutorial Mike yang luar biasa ketika saya mencari tahu ini, jadi solusi saya sedikit berbeda. Khususnya, saya akan menyederhanakan langkah # 1 Mike dan menghilangkan langkah # 2 - langkah-langkah lain masih berlaku.

Dalam tutorial Mike, menggunakan wp_dropdown_categories() menyelamatkan kita dari pembuatan daftar manual, tetapi membutuhkan beberapa modifikasi permintaan bersyarat yang rumit ( langkah # 2 ) untuk menangani penggunaan ID bukan slug. Belum lagi kesulitan memodifikasi kode itu untuk menangani skenario lain, seperti beberapa filter taksonomi ..

Pendekatan lain adalah sama sekali tidak menggunakan wp_dropdown_categories() yang cacat sama sekali, tetapi sebaliknya untuk membangun daftar pilih dropdown kami sendiri dari awal. Ini tidak rumit, membutuhkan kurang dari 30 baris kode, dan sama sekali tidak memerlukan pengait parse_query:

add_action( 'restrict_manage_posts', 'my_restrict_manage_posts' );
function my_restrict_manage_posts() {

    // only display these taxonomy filters on desired custom post_type listings
    global $typenow;
    if ($typenow == 'photos' || $typenow == 'videos') {

        // create an array of taxonomy slugs you want to filter by - if you want to retrieve all taxonomies, could use get_taxonomies() to build the list
        $filters = array('plants', 'animals', 'insects');

        foreach ($filters as $tax_slug) {
            // retrieve the taxonomy object
            $tax_obj = get_taxonomy($tax_slug);
            $tax_name = $tax_obj->labels->name;
            // retrieve array of term objects per taxonomy
            $terms = get_terms($tax_slug);

            // output html for taxonomy dropdown filter
            echo "<select name='$tax_slug' id='$tax_slug' class='postform'>";
            echo "<option value=''>Show All $tax_name</option>";
            foreach ($terms as $term) {
                // output each select option line, check against the last $_GET to show the current option selected
                echo '<option value='. $term->slug, $_GET[$tax_slug] == $term->slug ? ' selected="selected"' : '','>' . $term->name .' (' . $term->count .')</option>';
            }
            echo "</select>";
        }
    }
}

Dengan hanya memasukkan taksonomi yang diinginkan ke dalam array $filters, Anda dapat dengan cepat menghasilkan beberapa filter taksonomi. Mereka muncul persis sama dengan yang ada di screenshot Mike. Kemudian Anda dapat melanjutkan dengan langkah # 3 dan # 4 .

44
somatic

Ini adalah versi ini yang secara otomatis membuat dan menerapkan filter dari semua taksonomi yang berlaku untuk semua jenis pos kustom yang menggunakannya. (sungguh seteguk) Lagipula, saya juga men-tweak sehingga berfungsi dengan wp_dropdown_categories () dan wordpress 3.1. Proyek yang sedang saya kerjakan disebut ToDo, Anda dapat mengubah nama fungsi menjadi sesuatu yang masuk akal bagi Anda, tetapi ini seharusnya cukup berfungsi untuk semuanya secara otomatis.

function todo_restrict_manage_posts() {
    global $typenow;
    $args=array( 'public' => true, '_builtin' => false ); 
    $post_types = get_post_types($args);
    if ( in_array($typenow, $post_types) ) {
    $filters = get_object_taxonomies($typenow);
        foreach ($filters as $tax_slug) {
            $tax_obj = get_taxonomy($tax_slug);
            wp_dropdown_categories(array(
                'show_option_all' => __('Show All '.$tax_obj->label ),
                'taxonomy' => $tax_slug,
                'name' => $tax_obj->name,
                'orderby' => 'term_order',
                'selected' => $_GET[$tax_obj->query_var],
                'hierarchical' => $tax_obj->hierarchical,
                'show_count' => false,
                'hide_empty' => true
            ));
        }
    }
}
function todo_convert_restrict($query) {
    global $pagenow;
    global $typenow;
    if ($pagenow=='edit.php') {
        $filters = get_object_taxonomies($typenow);
        foreach ($filters as $tax_slug) {
            $var = &$query->query_vars[$tax_slug];
            if ( isset($var) ) {
                $term = get_term_by('id',$var,$tax_slug);
                $var = $term->slug;
            }
        }
    }
    return $query;
}
add_action( 'restrict_manage_posts', 'todo_restrict_manage_posts' );
add_filter('parse_query','todo_convert_restrict');

Perhatikan bahwa saya menggunakan plugin yang menambahkan 'term_order' sebagai cara untuk memesan istilah, Anda harus mengubahnya, atau menghapus argumen itu untuk mundur ke default.

13
Drew Gourley

Jawaban terlambat

Edit

Saya telah menulis Filterama , sebuah plugin yang akan menambahkan fungsi ini dengan cara termudah yang mungkin.

Pembaruan untuk WordPress 3.5+

Sekarang semuanya menjadi lebih mudah, inilah sangat solusi sederhana sebagai plugin atau mu-plugin.

Ini menggunakan sumber daya sesedikit mungkin, memuat hanya pada layar yang dibutuhkan dan menambahkan Kolom + Filter untuk setiap taksonomi kustom.

add_action( 'plugins_loaded', array( 'WCM_Admin_PT_List_Tax_Filter', 'init' ) );
class WCM_Admin_PT_List_Tax_Filter
{
    private static $instance;

    public $post_type;

    public $taxonomies;

    static function init()
    {
        null === self::$instance AND self::$instance = new self;
        return self::$instance;
    }

    public function __construct()
    {
        add_action( 'load-edit.php', array( $this, 'setup' ) );
    }

    public function setup()
    {
        add_action( current_filter(), array( $this, 'setup_vars' ), 20 );

        add_action( 'restrict_manage_posts', array( $this, 'get_select' ) );

        add_filter( "manage_taxonomies_for_{$this->post_type}_columns", array( $this, 'add_columns' ) );
    }

    public function setup_vars()
    {
        $this->post_type  = get_current_screen()->post_type;
        $this->taxonomies = array_diff(
            get_object_taxonomies( $this->post_type ),
            get_taxonomies( array( 'show_admin_column' => 'false' ) )
        );
    }

    public function add_columns( $taxonomies )
    {
        return array_merge( taxonomies, $this->taxonomies );
    }


    public function get_select()
    {
        $walker = new WCMF_walker;
        foreach ( $this->taxonomies as $tax )
        {
            wp_dropdown_categories( array(
                'taxonomy'        => $tax,
                'hide_if_empty'   => true,
                'show_option_all' => sprintf(
                    get_taxonomy( $tax )->labels->all_items
                ),
                'hide_empty'      => true,
                'hierarchical'    => is_taxonomy_hierarchical( $tax ),
                'show_count'      => true,
                'orderby'         => 'name',
                'selected'        => '0' !== get_query_var( $tax )
                    ? get_query_var( $tax )
                    : false,
                'name'            => $tax,
                'id'              => $tax,
                'walker'          => $walker,
            ) );
        }

    }

}

Dan kemudian Anda hanya perlu kelas Walker yang disesuaikan.

class WCMF_walker extends Walker_CategoryDropdown
{
    public $tree_type = 'category';
    public $db_fields = array(
        'parent' => 'parent',
        'id'     => 'term_id',
    );
    public $tax_name;

    public function start_el( &$output, $term, $depth, $args, $id = 0 )
    {
        $pad = str_repeat( '&nbsp;', $depth * 3 );
        $cat_name = apply_filters( 'list_cats', $term->name, $term );
        $output .= sprintf(
            '<option class="level-%s" value="%s" %s>%s%s</option>',
            $depth,
            $term->slug,
            selected(
                $args['selected'],
                $term->slug,
                false
            ),
            $pad.$cat_name,
            $args['show_count']
                ? "&nbsp;&nbsp;({$term->count})"
                : ''
        );
    }
}
11
kaiser

Saya hanya ingin membuat catatan singkat. Pada versi WP yang lebih baru, cantuman pos di admin ditangani oleh kelas WP_Posts_List_Table. Kode apply_filters sekarang sebagai berikut:

if ( 'page' == $post_type )
        $posts_columns = apply_filters( 'manage_pages_columns', $posts_columns );
    else
        $posts_columns = apply_filters( 'manage_posts_columns', $posts_columns, $post_type );
    $posts_columns = apply_filters( "manage_{$post_type}_posts_columns", $posts_columns );

Jadi untuk menambahkan kolom baru, hook add_filter harus seperti ini:

add_filter( 'manage_posts_columns', 'my_add_columns', 10, 2);

Ini dia sebuah contoh:

function my_add_columns($posts_columns, $post_type)
{
  if ('myposttype' == $post_type) {
    $posts_columns = array(
      "cb"            => "<input type=\"checkbox\" />",
      "title"         => "Title",
      "anothercolumn" => "Bacon",
      "date"          => __( 'Date' )
    );
    return $posts_columns;
  }
} 

Sekarang, untuk baris posting. Ini adalah kode yang menangani data kolom pada cantuman:

default:
            ?>
            <td <?php echo $attributes ?>><?php
                if ( is_post_type_hierarchical( $post->post_type ) )
                    do_action( 'manage_pages_custom_column', $column_name, $post->ID );
                else
                    do_action( 'manage_posts_custom_column', $column_name, $post->ID );
                do_action( "manage_{$post->post_type}_posts_custom_column", $column_name, $post->ID );
            ?></td>
            <?php

Untuk mengambil data posting kami, kami harus menambahkan hook tindakan seperti ini:

add_action( "manage_(here_goes_your_post_type)_posts_custom_column", "my_posttype_add_column", 10, 2);

Contoh (contoh ini menggunakan taksonomi, tetapi Anda dapat menanyakan hal lain):

function my_posttype_add_column($column_name, $post_id)
{
  switch ($column_name) {
    case 'anothercolumn':
      $flavours = get_the_terms($post_id, 'flavour');
      if (is_array($flavours)) {
        foreach($flavours as $key => $flavour) {
          $edit_link = get_term_link($flavour, 'flavour');
          $flavours[$key] = '<a href="'.$edit_link.'">' . $flavour->name . '</a>';
        }
        echo implode(' | ',$flavours);
      }
      break;

    default:
      break;
  }
}
7
mines

BEKERJA DI WP 3.2!

custom_post_type: books custom_taxonomy: genre

Hanya memodifikasi jika dikatakan: // ubah DI SINI

function restrict_books_by_genre() {
    global $typenow;
    $post_type = 'books'; // change HERE
    $taxonomy = 'genre'; // change HERE
    if ($typenow == $post_type) {
        $selected = isset($_GET[$taxonomy]) ? $_GET[$taxonomy] : '';
        $info_taxonomy = get_taxonomy($taxonomy);
        wp_dropdown_categories(array(
            'show_option_all' => __("Show All {$info_taxonomy->label}"),
            'taxonomy' => $taxonomy,
            'name' => $taxonomy,
            'orderby' => 'name',
            'selected' => $selected,
            'show_count' => true,
            'hide_empty' => true,
        ));
    };
}

add_action('restrict_manage_posts', 'restrict_books_by_genre');


function convert_id_to_term_in_query($query) {
    global $pagenow;
    $post_type = 'books'; // change HERE
    $taxonomy = 'genre'; // change HERE
    $q_vars = &$query->query_vars;
    if ($pagenow == 'edit.php' && isset($q_vars['post_type']) && $q_vars['post_type'] == $post_type && isset($q_vars[$taxonomy]) && is_numeric($q_vars[$taxonomy]) && $q_vars[$taxonomy] != 0) {
        $term = get_term_by('id', $q_vars[$taxonomy], $taxonomy);
        $q_vars[$taxonomy] = $term->slug;
    }
}

add_filter('parse_query', 'convert_id_to_term_in_query');
7
lacroixca

Saya kira ini tidak dikenal, tetapi pada wordpress 3.5, Anda dapat meneruskan 'show_admin_column' => true ke register_taxonomy. Ini melakukan 2 hal:

  1. Menambahkan kolom taksonomi ke tampilan daftar jenis posting admin
  2. Dengan mengklik nama istilah pada kolom taksonomi, itu sebenarnya akan menyaring daftar ke istilah itu .

Jadi, tidak persis sama dengan memiliki pilih, tetapi fungsi yang hampir sama, lebar hanya satu baris kode.

https://make.wordpress.org/core/2012/12/11/wordpress-3-5-admin-columns-for-custom-taxonomies/

Juga, seperti yang dapat Anda baca, ada filter baru yang dirancang untuk menambahkan kolom taksonomi secara manual (jika Anda benar-benar perlu).

2
Luca Reghellin

Berikut cara untuk melakukannya menggunakan tindakan pembatasan_manage_posts. Tampaknya bekerja dengan baik untuk saya dan menambahkan kemampuan untuk memfilter berdasarkan taksonomi untuk semua jenis posting dan taksonomi yang terkait.

// registers each of the taxonomy filter drop downs
function sunrise_fbt_add_taxonomy_filters() {
    global $typenow;            // the current post type
    $taxonomies = get_taxonomies('','objects');
    foreach($taxonomies as $taxName => $tax) {
    if(in_array($typenow,$tax->object_type) && $taxName != 'category' && $taxName != 'tags') {
            $terms = get_terms($taxName);
            if(count($terms) > 0) {
              //Check if hierarchical - if so build hierarchical drop-down
              if($tax->hierarchical) {
                $args = array(
                      'show_option_all'    => 'All '.$tax->labels->name,
                      'show_option_none'   => 'Select '.$tax->labels->name,
                      'show_count'         => 1,
                      'hide_empty'         => 0, 
                      'echo'               => 1,
                      'hierarchical'       => 1,
                      'depth'              => 3, 
                      'name'               => $tax->rewrite['slug'],
                      'id'                 => $tax->rewrite['slug'],                      
                      'class'              => 'postform',
                      'depth'              => 0,
                      'tab_index'          => 0,
                      'taxonomy'           => $taxName,
                      'hide_if_empty'      => false);
            $args['walker'] = new Walker_FilterByTaxonomy;
                wp_dropdown_categories($args);
              } else {
                    echo "<select name='".$tax->rewrite['slug']."' id='".$tax->rewrite['slug']."' class='postform'>";
                    echo "<option value=''>Show All ".$tax->labels->name."</option>";
                    foreach ($terms as $term) { 
              echo '<option value="' . $term->slug . '"', $_GET[$taxName] == $term->slug ? ' selected="selected"' : '','>' . $term->name .' (' . $term->count .')</option>'; 
            }
                    echo "</select>";
                }
            }
    }
    }
}
add_action( 'restrict_manage_posts', 'sunrise_fbt_add_taxonomy_filters', 100 );

/**
 * Create HTML dropdown list of Categories.
 *
 * @package WordPress
 * @since 2.1.0
 * @uses Walker
 */
class Walker_FilterByTaxonomy extends Walker {
    var $tree_type = 'category';
    var $db_fields = array ('parent' => 'parent', 'id' => 'term_id');
    function start_el(&$output, $category, $depth, $args) {
      $args['selected'] = get_query_var( $args['taxonomy'] );
        $pad = str_repeat('&nbsp;', $depth * 3);

        $cat_name = apply_filters('list_cats', $category->name, $category);
        $output .= "\t<option class=\"level-$depth\" value=\"".$category->slug."\"";
        if ( $category->slug == $args['selected'] )
            $output .= ' selected="selected"';
        $output .= '>';
        $output .= $pad.$cat_name;
        if ( $args['show_count'] )
            $output .= '&nbsp;&nbsp;('. $category->count .')';
        if ( $args['show_last_update'] ) {
            $format = 'Y-m-d';
            $output .= '&nbsp;&nbsp;' . gmdate($format, $category->last_update_timestamp);
        }
        $output .= "</option>\n";
        }
} 

Satu catatan - saya mencoba membatasi kedalaman karena beberapa taksonomi hierarkis saya cukup besar tetapi tidak berfungsi - bisa jadi bug dalam fungsi wp_dropdown_categories?

2
Brad Trivers

Versi hierarki jawaban @ somatic, seperti yang diminta oleh @kevin:

<?php
add_action( 'restrict_manage_posts', 'my_restrict_manage_posts' );
function my_restrict_manage_posts() {

    // only display these taxonomy filters on desired custom post_type listings
    global $typenow;
    if ($typenow == 'photos' || $typenow == 'videos') {

        // create an array of taxonomy slugs you want to filter by - if you want to retrieve all taxonomies, could use get_taxonomies() to build the list
        $filters = array('plants', 'animals', 'insects');

        foreach ($filters as $tax_slug) {
            // retrieve the taxonomy object
            $tax_obj = get_taxonomy($tax_slug);
            $tax_name = $tax_obj->labels->name;

            // output html for taxonomy dropdown filter
            echo "<select name='$tax_slug' id='$tax_slug' class='postform'>";
            echo "<option value=''>Show All $tax_name</option>";
            generate_taxonomy_options($tax_slug,0,0);
            echo "</select>";
        }
    }
}

function generate_taxonomy_options($tax_slug, $parent = '', $level = 0) {
    $args = array('show_empty' => 1);
    if(!is_null($parent)) {
        $args = array('parent' => $parent);
    } 
    $terms = get_terms($tax_slug,$args);
    $tab='';
    for($i=0;$i<$level;$i++){
        $tab.='--';
    }
    foreach ($terms as $term) {
        // output each select option line, check against the last $_GET to show the current option selected
        echo '<option value='. $term->slug, $_GET[$tax_slug] == $term->slug ? ' selected="selected"' : '','>' .$tab. $term->name .' (' . $term->count .')</option>';
        generate_taxonomy_options($tax_slug, $term->term_id, $level+1);
    }

}
?>

Saya pada dasarnya menghapus kode yang menciptakan opsi dan memasukkannya ke dalam fungsinya sendiri. Fungsi 'menghasilkan_taxonomy_options', selain mengambil tax_slug, juga mengambil parameter induk dan level. Fungsi ini mengasumsikan bahwa opsi pembuatannya untuk induk 0, yang akan memilih semua istilah level root. Dalam loop fungsi akan memanggil dirinya sendiri secara berulang, menggunakan istilah saat ini sebagai orang tua dan meningkatkan level dengan satu. Secara otomatis menambahkan kutu ke sisi semakin dalam Anda turun pohon dan voila!

1
Manny Fleurmond

Pembaruan jawaban @Drew Gourley untuk WP 3.3.1 (dan memasukkan kode dari http://wordpress.org/support/topic/wp_dropdown_categories-generating-url-id-number-instead-of- slug? balasan = 6 # post-2529115 ):

add_action('restrict_manage_posts', 'xyz_restrict_manage_posts');
function xyz_restrict_manage_posts() {
    global $typenow;

    $args = array('public'=>true, '_builtin'=>false); 
    $post_types = get_post_types($args);

    if(in_array($typenow, $post_types)) {
        $filters = get_object_taxonomies($typenow);

        foreach ($filters as $tax_slug) {
            $tax_obj = get_taxonomy($tax_slug);
            $term = get_term_by('slug', $_GET[$tax_obj->query_var], $tax_slug);

            wp_dropdown_categories(array(
                'show_option_all' => __('Show All '.$tax_obj->label ),
                'taxonomy' => $tax_slug,
                'name' => $tax_obj->name,
                'orderby' => 'term_order',
                'selected' => $term->term_id,
                'hierarchical' => $tax_obj->hierarchical,
                'show_count' => false,
                // 'hide_empty' => true,
                'hide_empty' => false,
                'walker' => new DropdownSlugWalker()
            ));
        }
    }
}


//Dropdown filter class.  Used with wp_dropdown_categories() to cause the resulting dropdown to use term slugs instead of ids.
class DropdownSlugWalker extends Walker_CategoryDropdown {

    function start_el(&$output, $category, $depth, $args) {
        $pad = str_repeat('&nbsp;', $depth * 3);

        $cat_name = apply_filters('list_cats', $category->name, $category);
        $output .= "\t<option class=\"level-$depth\" value=\"".$category->slug."\"";

        if($category->term_id == $args['selected'])
            $output .= ' selected="selected"';

        $output .= '>';
        $output .= $pad.$cat_name;
        $output .= "</option>\n";
    }
}
1
rinogo

Hanya mencoba kedua kode, dari Mike dan somatic dan bertanya-tanya bagaimana cara mendapatkan satu hal dari setiap teknik:

Dengan kode Mike, ini menunjukkan daftar dropdown dengan opsi hirarkis , yang sangat membantu. Tetapi untuk menampilkan dua dropdown saya harus menduplikasi pernyataan if ($typenow=='produtos') {...} dalam fungsi restrict_listings_by_business() dan juga if ($pagenow=='edit.php' && ... } dalam fungsi convert_business_id_to_taxonomy_term_in_query($query) yang sekarang memberikan banyak kode.

Dengan kode somatic, saya hanya perlu menentukan taksonomi yang ingin saya lihat sebagai dropdown dan bam, berfungsi; $filters = array('taxo1', 'taxo2');

Pertanyaan: dapatkah saya mendapatkan pendekatan somatik dan juga memiliki opsi hierarkis ?

Terima kasih banyak untuk tutorial ini, banyak membantu!

0
kevin

Permintaan maaf karena fakta bahwa, sebagai pengguna baru, saya tidak dapat memposting komentar tetapi saya dapat mengirim jawaban ...

Pada WordPress 3.1 (RC 1) jawaban Mike (yang telah melayani saya dengan sangat baik selama beberapa bulan terakhir) tidak lagi berfungsi untuk saya; Pembatasan oleh setiap anak taksonomi memberikan hasil kosong. Saya mencoba pembaruan Somatic dan itu berhasil; bahkan lebih baik, ia bekerja dengan beberapa pertanyaan taksonomi yang telah dikerjakan dalam rilis ini.

0
rsigg

Tutorial Mike tentang ini luar biasa! Saya mungkin tidak akan repot menambahkan fungsi ini ke plugin Kategori Media saya jika saya harus mencari tahu sendiri.

Yang mengatakan, saya pikir menggunakan parse_query dan kemudian mendapatkan permintaan untuk istilah itu tidak perlu. Lebih bersih untuk membuat kelas custom walker Anda sendiri. Mungkin itu tidak mungkin ketika dia menulis posting - 3 tahun pada saat saya menulis ini.

Lihat cuplikan hebat ini di github. Bekerja seperti jimat, mengubah ID pada nilai dropdown menjadi siput, jadi itu hanya bekerja secara asli tanpa memodifikasi kueri.

https://Gist.github.com/stephenh1988/2902509

0
eddiemoya