Menambahkan Filter Taksonomi ke Daftar Admin untuk Jenis Pos Kustom?

129

Saya telah membuat Jenis Pos 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):

Kategori Dropdown di Posting

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?

Taras Mankovski
sumber
8
Terima kasih atas tangkapan layarnya, sangat membantu untuk memilikinya.
MikeSchinkel
Ada plugin Filter Taksonomi Admin yang dapat melakukan pekerjaan yang tepat.
Anh Tran

Jawaban:

140

UPDATE: Saya sudah memasukkan 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 ke dalam kode ...

Screenshot:

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

Daftar halaman daftar dengan No Filtering:

Halaman daftar listing tanpa Penyaringan
(sumber: mikeschinkel.com )

Halaman daftar listing Dengan Penyaringan:

Halaman daftar listing Dengan Penyaringan
(sumber: mikeschinkel.com )

Kode

Jadi begini ... ( Catatan: Saya menggunakan bentuk tunggal untuk nama taksonomi business; Saya harap 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: restrict_manage_postsKait tindakan.

Hal pertama yang perlu Anda lakukan adalah untuk mengaitkan restrict_manage_poststindakan yang tidak memiliki parameter dan dipanggil dari /wp-admin/edit.php(di v3.0.1 bahwa panggilan ada di saluran 378.) Ini akan memungkinkan Anda untuk menghasilkan pilih turun ke bawah di lokasi yang sesuai di atas daftar Cantumkan pos.

<?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 $typenowvariabel untuk memastikan kami sebenarnya pada post_typedari 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 penggunaan taksonomi bisnis 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 argumen yang sesuai dalam $argsarray 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 pemfilteran yang diterapkan. Dalam kasus kami itu akan jadi "Tampilkan Semua Bisnis " tetapi kami bisa menyebutnya "Daftar untuk Semua Bisnis" atau apa pun yang Anda suka.

  • taxonomy- Argumen ini memberi tahu fungsi dari mana taksonomi untuk menarik istilah dari meskipun fungsi memiliki categoriesnamanya. 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 menentukan nilai yang digunakan WordPress untuk nameatribut elemen <select> yang dihasilkan untuk drop down. Kalau-kalau tidak jelas ini juga nilai yang akan digunakan dalam URL saat pemfilteran.

  • orderby- Argumen ini memberi tahu WordPress cara memesan hasil sesuai abjad. Dalam kasus kami, kami menetapkan untuk memesan pembelian namepersyaratan dalam taksonomi, yaitu nama bisnis dalam kasus ini.

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

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

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

  • show_count- Jika trueargumen ini akan menampilkan hitungan posting di dalam tanda kurung di sebelah kiri nama istilah 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 pos (yaitu bisnis yang tidak terkait dengan daftar) maka pengaturan ini trueakan menghilangkan mereka agar tidak dimasukkan dalam drop down.

Drop Down Taksonomi harus hierarki dan diperhitungkan
(sumber: mikeschinkel.com )

Langkah # 2: parse_queryKait saringan.

Selanjutnya kita memanggil perhatian kita ke parse_queryhook filter yang memiliki satu parameter ( $query) dan dipanggil dari /wp-includes/query.php(di v3.0.1 panggilan itu on line 1549.) Disebut ketika WordPress telah selesai memeriksa URL dan menetapkan semua nilai yang sesuai di saat ini aktif $wp_querytermasuk hal-hal seperti $wp_query->is_homedan $wp_query->is_author, dll.

Setelah parse_queryhook filter berjalan, WordPress akan memanggil get_posts()dan memuat daftar posting berdasarkan apa yang ditentukan dalam aktif saat ini $wp_query. Jadi parse_queryseringkali 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 untuk menampilkan hanya Daftar yang telah dikaitkan dengan bisnis yang dipilih (saya akan mengatakan "... hanya Daftar yang telah " dikategorikan " oleh bisnis yang dipilih" tetapi itu tidak benar secara teknis; categoryapakah itu sendiri taksonomi pada rekan dengan businesskecuali yang categorydibangun di WordPress dan businesscustom. Tetapi bagi mereka yang akrab dengan mengkategorikan posting ini dapat membantu Anda memahami karena mereka bekerja hampir identik. Tapi saya ngelantur ...)

Aktif ke kode. Hal pertama yang kita lakukan adalah ambil referensi ke sedang aktif $wp_query's query_varssehingga lebih nyaman untuk bekerja dengan, seperti cara yang dilakukan dalam WordPress sendiri parse_query()fungsi. Tidak seperti $wp_query->queryyang digunakan untuk mencerminkan parameter yang dikirimkan pada URL, $wp_query->query_varsarray digunakan untuk mengontrol kueri yang dijalankan WordPress dan diharapkan akan dimodifikasi. Jadi, jika Anda perlu memodifikasi satu, itu akan menjadi satu (setidaknya saya pikir itu berbeda antara keduanya; jika ada yang tahu, tolong beri tahu saya agar saya dapat memperbarui 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 $pagenowuntuk 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 businesssebagai taxonomyelemen dan termelemen juga. (Catat taxonomydan termmerupakan pasangan; keduanya digunakan bersama untuk memungkinkan kueri istilah taksonomi; harus memiliki keduanya atau WordPress tidak tahu taksonomi mana yang harus diperiksa.)

Anda mungkin bertanya-tanya bagaimana businessmuncul dalam taxonomyelemen query_varsarray. Apa yang kami tulis di parse_querykail kami memicu keajaiban internal WordPress yang diletakkan menunggu ketika Anda mendaftarkan businesstaksonomi dengan menetapkan query_varmenjadi benar ( register_taxonomy()menyalin nama taksonomi sebagai miliknya query_var; Anda dapat mengubahnya tentu saja, kecuali jika 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 butuhkan untuk membuat kueri pemfilteran berfungsi adalah:

taxonomy: bisnis

term: business-1 (yaitu slug)

Bukan ini:

taxonomy: bisnis

term: 27 (yaitu term_id)

Menarik dan sayangnya drop-down yang dihasilkan dengan wp_dropdown_categories()mengatur atribut <option>'s valueke istilah (/ bisnis') term_id, bukan istilah slug. Jadi kita perlu mengonversi $wp_query->query_vars['term']dari numerik term_idke string itu slugseperti mengikuti potongan snagged dari atas (Catatan ini bukan cara paling berkinerja untuk query database tetapi sampai WordPress menambahkan dukungan untuk term_ids ke dalam kueri itu yang terbaik yang bisa kita lakukan!) :

<?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 Listing 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" di cuplikan layar sebelumnya di atas.

Langkah # 3: manage_posts_columnsKait saringan.

Untuk menambahkan kolom ke daftar posting diperlukan pemanggilan dua (2) kait lainnya. Yang pertama adalah manage_posts_columnsatau versi jenis tulisan khusus manage_listing_posts_columnsyang saya panggil sebagai gantinya. Ia menerima satu parameter ( posts_columns) dan dipanggil dari /wp-admin/includes/template.php(di v3.0.1 panggilan itu ada di jalur 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;
}

manage_posts_columnsFungsi hook Anda melewati array kolom di mana nilainya adalah tajuk kolom yang ditampilkan dan kuncinya adalah pengidentifikasi kolom internal. Standard kolom pengidentifikasi dapat mencakup ini dan lebih: 'cb', 'title' 'author', ``' date'`, dll

'cb', adalah checkboxkolom dan keduanya 'title'dan 'date'merujuk ke post_titledan post_datedari wp_poststabel, masing-masing. 'author'tentu saja adalah post_authorbidang setelah nama penulis diambil dari wp_userstabel.

Cuplikan layar kolom posting 'cb' sebagai kotak centang.
(sumber: mikeschinkel.com )

Untuk manage_posts_columnshook, kami hanya ingin memasukkan kolom kami businesseske dalam $posts_columnsarray sebelumnya 'author', dengan asumsi beberapa plugin lain belum dihapus authordari daftar!

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

( Catatan ketika saya menulis add_businesses_column_to_listing_list(), terpikir oleh saya bahwa PHP harus 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 jadi saya pergi dengan apa yang berhasil. Jika ada yang menyarankan alternatif saya akan semua telinga dan menghargai di muka!)

Yang akhirnya membawa kita ke ...

Langkah # 4: manage_posts_custom_columnKait tindakan

Hal kedua dari dua (2) yang perlu kita lakukan untuk membuat bisnis kita ditampilkan di kolom adalah untuk benar-benar menampilkan nama masing-masing bisnis terkait menggunakan manage_posts_custom_columnkait tindakan. Pengait ini menerima dua (2) parameter ( column_iddan post_id) dan juga dipanggil dari /wp-admin/includes/template.php(dalam v3.0.1 bahwa panggilan ada pada 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 hanya bekerja dengan listingjenis posting khusus dan kemudian kami menggunakan switchpernyataan untuk menguji column_id. Saya memilih switchkarena pengait ini sering digunakan untuk menghasilkan keluaran untuk banyak kolom berbeda, terutama jika kita menggunakan satu fungsi untuk berbagai jenis posting 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 get_the_terms()fungsi 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 daftar posting yang terkait dengan istilah tetapi tentu saja bisa berbeda tergantung pada tema dan / atau plugin yang diinstal.

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 pengguna / 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);
}

SEKARANG akhirnya 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: restrict_manage_postsKait tindakan.
  • Langkah # 2: parse_queryKait saringan.
  • Langkah # 3: manage_posts_columnsKait saringan.
  • Langkah # 4: manage_posts_custom_columnKait tindakan

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 baik. Jadi begini ya:

CATATAN untuk @tarasm : Saya menyertakan kait untukregister_post_type()danregister_taxonomy()agar orang lain dapat mencobanya 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 bagian atas seperti layar ini atau Anda mencari satu drop-down per record post dan jika demikian bagaimana Anda berharap yang terakhir bekerja?

Cara Membuat fungsi Urut Berdasar untuk Jenis Posting Kustom di Admin WordPress
(sumber: mikeschinkel.com )

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

MikeSchinkel
sumber
Saya mencari 1 dropdown di bagian atas yang akan menampilkan filter Kategori. Saya mengembara jika ada cara standar untuk melakukan ini tanpa harus menulis kode khusus.
Taras Mankovski
Pada awalnya blush on saya tidak berpikir Anda bisa melakukan w / o kode kustom tetapi kemudian saya tidak berpikir kode kustom akan signifikan. Saya punya panggilan klien untuk mempersiapkan sehingga harus hari ini nanti.
MikeSchinkel
2
Sebenarnya kedua solusi (somatic dan MikeSchinkel) tidak berfungsi saat Anda mencoba memfilter 2 taksonomi berbeda dalam filter yang sama: - / Selalu memfilter taksonomi terbaru saat mencoba memfilter 2+ secara bersamaan.
Ünsal Korkmaz
1
@ Ünsal Versi WordPress saat ini (3.0) tidak mendukung beberapa pertanyaan taksonomi tetapi dari apa yang saya dengar akan berubah dengan versi 3.1. Untuk membuat contoh ini berfungsi dengan banyak taksonomi, Anda harus menambahkan beberapa gabungan dan daftar ke kueri melalui kait filter Posts_join dan posts_where.
Manny Fleurmond
1
Di WP 3.1+, langkah satu dan dua lebih baik di @ drew-gourley jawaban (sebenarnya, langkah 2 Anda tidak berhasil untuk saya, saya pikir ada perubahan dalam penyaringan ini di WordPress baru).
Tomasz Struczyński
44

Hanya ingin berbagi implementasi alternatif. Saya tidak memiliki tutorial Mike yang luar biasa ketika saya mencari tahu ini, jadi solusi saya sedikit berbeda. Secara khusus, 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, alih-alih slug. Belum lagi kesulitan memodifikasi kode itu untuk menangani skenario lain, seperti beberapa filter taksonomi ..

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

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 $filtersarray, 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 .

somatik
sumber
4
@somatis - Pembaruan yang bagus! Ya, menggunakan wp_dropdown_categories()memang membutuhkan banyak solusi. Saya mencoba untuk tetap menggunakan fungsi inti jika memungkinkan, tetapi seperti yang Anda tunjukkan kadang-kadang dibutuhkan lebih banyak pekerjaan seperti itu. Hanya untuk membuktikan bahwa dengan WordPress sering ada lebih dari satu cara yang baik untuk menyelesaikan masalah. Kerja bagus!
MikeSchinkel
Baru saja berhenti bekerja untuk saya di WordPress 3.1. Mencoba mencari tahu apa yang sebenarnya berubah. Sepertinya masih harus bekerja: taksonomi dan istilah siput muncul sebagai nilai GET di url, tetapi semua hasilnya adalah hasil 0
Manny Fleurmond
Saya sudah mencoba untuk mendapatkan ini berfungsi tetapi satu-satunya cara saya bisa adalah dengan menggunakan parse_query hook, periksa var permintaan taksonomi dan mengatur taksonomi dan istilah permintaan vars berdasarkan itu. Menggunakan WP 3.1. Haruskah taksonomi & istilah muncul di URL saat filter dikirimkan?
sanchothefat
2
Bekerja seperti pesona bagiku! Solusi yang sangat elegan. Saya berutang bir kepada Anda :)
Michal Mau
@somatis Ini berfungsi dengan baik tetapi apakah ada cara agar $ term-> hitung hanya menghitung persyaratan untuk jenis kiriman itu? Misalnya, jika saya memiliki taksonomi ubahsuaian untuk foto dan video, itu akan menunjukkan kepada saya ketika melihat video kiriman khusus, ketik jumlah total posting untuk istilah tersebut dari kedua jenis kiriman khusus, bukan hanya jumlah total kiriman video yang menggunakan itu istilah.
Greenhoe
13

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.

Drew Gourley
sumber
memang sangat seksi. saya mendapatkan pemberitahuan kesalahan, jadi saya mengubah if (isset ($ var)) menjadi if (isset ($ var) && $ var> 0) untuk menghindari mencoba menemukan istilah yang terkait dengan nilai 0 Lihat semua. oh, dan saya harus mengembalikan $ query dalam fungsi
todo_convert_restrict
11

Jawaban terlambat

Sunting

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 solusi yang sangat sederhana sebagai plugin atau plugin-mu.

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})"
                : ''
        );
    }
}
kaisar
sumber
Memberi pusaran ini, tetapi metode get_select () tampaknya tidak ada.
Dave Romsey
@ goto10 Kamu benar. Diperbarui. Btw: Lebih mudah hanya mengambil plugin yang ditautkan. Ini akan tersedia di repositori plugin dalam satu atau dua minggu. (Sudah dikonfirmasi).
kaiser
Saya harus menggunakan $this->setup_vars();pada awal public function setup()untuk "manage_taxonomies_for_{$this->post_type}_columns"bekerja
Christian
Tetapi bisa jadi karena saya menggunakannya dalam function.php Tema denganadd_action( 'init', array( 'WCM_Admin_PT_List_Tax_Filter', 'init' ) );
Christian
@Christian Ini bukan materi tema. Ini milik sebuah plugin dan kode di atas saat ini berdiri itu dimuat jauh sebelum Tema dimuat.
kaiser
7

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

BEKERJA DI WP 3.2!

custom_post_type: books custom_taxonomy: genre

Hanya modifikasi yang 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');
lacroixca
sumber
Itu solusi yang bagus dan mudah untuk WP 3.2+.
petermolnar
ini berfungsi tetapi __("Show All {$info_taxonomy->label}")merupakan cara yang salah untuk menggunakan string yang dapat diterjemahkan.
Mark Kaplun
2

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?

Brad Trivers
sumber
2

Ini tidak dikenal, saya kira, tetapi pada wordpress 3.5, Anda dapat beralih 'show_admin_column' => trueke 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).

Luca Reghellin
sumber
1

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!

Manny Fleurmond
sumber
1

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?replies=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";
    }
}
rinogo
sumber
0

Permintaan maaf karena fakta bahwa, sebagai pengguna baru, saya tidak dapat memposting komentar tetapi saya dapat memposting 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 anak taksonomi apa pun 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.


sumber
Untuk beberapa alasan, versi somatic tidak berfungsi baik untuk 3.1
Manny Fleurmond
0

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 hierarkis , yang sangat membantu. Tetapi untuk menampilkan dua dropdown saya harus menduplikasi if ($typenow=='produtos') {...}pernyataan dalam fungsi restrict_listings_by_business()dan juga if ($pagenow=='edit.php' && ... }dalam convert_business_id_to_taxonomy_term_in_query($query)fungsi 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: bisakah saya mendapatkan pendekatan somatik dan juga memiliki opsi hierarkis ?

Terima kasih banyak untuk tutorial ini, banyak membantu!

kevin
sumber
Se jawaban saya untuk solusi hierarkis
Manny Fleurmond
0

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_querydan 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

eddiemoya
sumber