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):
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?
plugins
custom-post-types
wp-admin
Taras Mankovski
sumber
sumber
Jawaban:
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:
(sumber: mikeschinkel.com )
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_posts
Kait tindakan.Hal pertama yang perlu Anda lakukan adalah untuk mengaitkan
restrict_manage_posts
tindakan 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.Kita mulai dengan memeriksa
$typenow
variabel untuk memastikan kami sebenarnya padapost_type
darilisting
. 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 memanggilwp_dropdown_categories()
dengan semua argumen yang sesuai dalam$args
array untuk menghasilkan drop downTapi 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 memilikicategories
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 menentukan nilai yang digunakan WordPress untukname
atribut 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 pembelianname
persyaratan dalam taksonomi, yaitu nama bisnis dalam kasus ini.selected
- Argumen ini diperlukan agar drop down dapat menunjukkan filter saat ini di drop down. Itu harusterm_id
dari istilah taksonomi yang dipilih. Dalam kasus kami, ini mungkin berasalterm_id
dari "Bisnis # 2" . Di mana kita mendapatkan nilai ini? Dari variabel global WordPress$wp_query
; ia memiliki propertiquery
yang berisi larik semua parameter URL dan nilainya (kecuali beberapa plugin yang nakal telah memodifikasinya, tentu saja.) Mengingat bagaimana WordPress memproses hal-hal akan adaterm
parameter 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 agartrue
Anda 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 denganhierarchical
argumen untuk menentukan berapa level fungsi yang harus dilalui dalam menampilkan anak.show_count
- Jikatrue
argumen 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 initrue
akan menghilangkan mereka agar tidak dimasukkan dalam drop down.(sumber: mikeschinkel.com )
Langkah # 2:
parse_query
Kait saringan.Selanjutnya kita memanggil perhatian kita ke
parse_query
hook 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_query
termasuk hal-hal seperti$wp_query->is_home
dan$wp_query->is_author
, dll.Setelah
parse_query
hook filter berjalan, WordPress akan memanggilget_posts()
dan memuat daftar posting berdasarkan apa yang ditentukan dalam aktif saat ini$wp_query
. Jadiparse_query
seringkali 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;
category
apakah itu sendiri taksonomi pada rekan denganbusiness
kecuali yangcategory
dibangun di WordPress danbusiness
custom. 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
'squery_vars
sehingga lebih nyaman untuk bekerja dengan, seperti cara yang dilakukan dalam WordPress sendiriparse_query()
fungsi. Tidak seperti$wp_query->query
yang digunakan untuk mencerminkan parameter yang dikirimkan pada URL,$wp_query->query_vars
array 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!)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 keduanyabusiness
sebagaitaxonomy
elemen danterm
elemen juga. (Catattaxonomy
danterm
merupakan 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
business
muncul dalamtaxonomy
elemenquery_vars
array. Apa yang kami tulis diparse_query
kail kami memicu keajaiban internal WordPress yang diletakkan menunggu ketika Anda mendaftarkanbusiness
taksonomi dengan menetapkanquery_var
menjadi benar (register_taxonomy()
menyalin nama taksonomi sebagai miliknyaquery_var
; Anda dapat mengubahnya tentu saja, kecuali jika Anda memiliki konflik lebih baik tetap dengan yang sama):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:
Bukan ini:
Menarik dan sayangnya drop-down yang dihasilkan dengan
wp_dropdown_categories()
mengatur atribut<option>
'svalue
ke istilah (/ bisnis')term_id
, bukan istilahslug
. Jadi kita perlu mengonversi$wp_query->query_vars['term']
dari numerikterm_id
ke string ituslug
seperti 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!) :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_columns
Kait saringan.Untuk menambahkan kolom ke daftar posting diperlukan pemanggilan dua (2) kait lainnya. Yang pertama adalah
manage_posts_columns
atau versi jenis tulisan khususmanage_listing_posts_columns
yang 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):manage_posts_columns
Fungsi 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'
, adalahcheckbox
kolom dan keduanya'title'
dan'date'
merujuk kepost_title
danpost_date
dariwp_posts
tabel, masing-masing.'author'
tentu saja adalahpost_author
bidang setelah nama penulis diambil dariwp_users
tabel.(sumber: mikeschinkel.com )
Untuk
manage_posts_columns
hook, kami hanya ingin memasukkan kolom kamibusinesses
ke dalam$posts_columns
array sebelumnya'author'
, dengan asumsi beberapa plugin lain belum dihapusauthor
dari daftar!( 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_column
Kait tindakanHal 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_column
kait tindakan. Pengait ini menerima dua (2) parameter (column_id
danpost_id
) dan juga dipanggil dari/wp-admin/includes/template.php
(dalam v3.0.1 bahwa panggilan ada pada saluran 1459.):Hook ini dipanggil untuk setiap kolom untuk setiap baris posting (/ bisnis). Kami pertama-tama memverifikasi bahwa kami memang hanya bekerja dengan
listing
jenis posting khusus dan kemudian kami menggunakanswitch
pernyataan untuk mengujicolumn_id
. Saya memilihswitch
karena 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: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: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:
restrict_manage_posts
Kait tindakan.parse_query
Kait saringan.manage_posts_columns
Kait saringan.manage_posts_custom_column
Kait tindakanTempat 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 untuk
register_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?
(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.
sumber
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 pengaitparse_query
sama sekali:Dengan hanya memasukkan taksonomi yang diinginkan ke dalam
$filters
array, 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 .sumber
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!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.
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.
sumber
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.
Dan kemudian Anda hanya perlu kelas Walker yang disesuaikan.
sumber
$this->setup_vars();
pada awalpublic function setup()
untuk"manage_taxonomies_for_{$this->post_type}_columns"
bekerjaadd_action( 'init', array( 'WCM_Admin_PT_List_Tax_Filter', 'init' ) );
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:
Jadi untuk menambahkan kolom baru, hook add_filter harus seperti ini:
Ini dia sebuah contoh:
Sekarang, untuk baris posting. Ini adalah kode yang menangani data kolom pada cantuman:
Untuk mengambil data posting kami, kami harus menambahkan hook tindakan seperti ini:
Contoh (contoh ini menggunakan taksonomi, tetapi Anda dapat menanyakan hal lain):
sumber
BEKERJA DI WP 3.2!
custom_post_type: books custom_taxonomy: genre
Hanya modifikasi yang dikatakan: // ubah DI SINI
sumber
__("Show All {$info_taxonomy->label}")
merupakan cara yang salah untuk menggunakan string yang dapat diterjemahkan.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.
Satu catatan - saya mencoba membatasi kedalaman karena beberapa taksonomi hierarkis saya cukup besar tetapi tidak berfungsi - bisa jadi bug dalam fungsi wp_dropdown_categories?
sumber
Ini tidak dikenal, saya kira, tetapi pada wordpress 3.5, Anda dapat beralih
'show_admin_column' => true
keregister_taxonomy
. Ini melakukan 2 hal: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).
sumber
Versi hierarki jawaban @ somatic, seperti yang diminta oleh @kevin:
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!
sumber
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 ):
sumber
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
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 fungsirestrict_listings_by_business()
dan jugaif ($pagenow=='edit.php' && ... }
dalamconvert_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!
sumber
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
sumber