Добавление фильтра таксономии в список администратора для пользовательского типа сообщений?
Я создал тип пользовательской публикации, названный 'listing'
, и добавил пользовательскую таксономию под названием 'businesses'
. Я хотел бы добавить раскрывающийся список «Бизнес» в список администраторов для листинга.
Вот как выглядит эта функциональность в списке администраторов для Posts (я бы хотел, чтобы это было для моего настраиваемого типа сообщений):
Вот мой текущий код ( И вот тот же код в 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();
}
Как я могу добавить раскрывающийся список предприятий в список администраторов для листинга?
13 ответов
UPDATE: Я включил новый полный ответ, но даже в этом случае я оставил свой первоначальный ответ внизу, на который ссылаются первые несколько комментариев.
Привет @tarasm :
Хотя я сказал, что это не должно быть трудно, это немного связано. Но прежде чем мы вникнем в код ...
Скриншоты:
... давайте посмотрим некоторые снимки экрана для готового продукта:
Страница списка списков с Нет Фильтрация:
Страница списка списков С Фильтрация:
Код
Итак, вот мы идем ... ( Примечание: Я использовал единственную форму для названия таксономии business
; надеюсь, что это соответствует вашему. Из большого опыта с и WordPress, и развитие базы данных в прошлом, я считаю, что лучше всего сделать это таким образом.)
Шаг # 1: Ключ действия restrict_manage_posts
.
Первое, что вам нужно сделать, это связать действие restrict_manage_posts
, которое не имеет параметров и вызывается из /wp-admin/edit.php
(в версии 3.0.1 этот вызов находится в строке 378.) Это позволит вам сгенерировать выпадающий список в соответствующем месте над списком сообщений о листинге.
& л;? PHP
add_action ( 'restrict_manage_posts', 'restrict_listings_by_business');
function restrict_listings_by_business () {
global $ typenow;
глобальный $ wp_query;
if ($ typenow == 'listing') {
$ taxonomy = 'бизнес';
$ business_taxonomy = get_taxonomy ($ taxonomy);
wp_dropdown_categories (массив (
'show_option_all' => __ ("Показать все {$ business_taxonomy-> label}"),
'таксономия' => $ Систематики,
'name' => 'бизнес',
'orderby' => 'имя',
'selected' => $ Wp_query- > запрос [ 'термин'],
«Иерархический» => правда,
'depth' => 3,
'show_count' => true, //Показывать # списка в parens
'hide_empty' => true, //Не показывать предприятия без списков
));
}
}
Начнем с проверки переменной $ typenow
, чтобы убедиться, что мы действительно находимся в post_type
из listing
. Если вы этого не сделаете, вы получите этот снимок для всех типов сообщений, которые в некоторых случаях вам нужны, но не в этом случае.
Затем мы загружаем информацию о таксономии бизнеса, используя get_taxonomy ()
. Нам нужно это, чтобы получить метку для таксономии (например, Бизнес ", мы могли бы быть жестко закодированы, но это не очень хорошо, если вам нужно интернационализировать позже.) Затем мы вызываем wp_dropdown_categories ()
со всеми соответствующими аргументами в массиве $ args
для генерации раскрывающегося списка
& л;? PHP
return wp_dropdown_categories (массив (
'show_option_all' => __ ("Показать все {$ business_taxonomy-> label}"),
'таксономия' => $ Систематики,
'name' => 'бизнес',
'orderby' => 'имя',
'selected' => $ Wp_query- > запрос [ 'термин'],
«Иерархический» => правда,
'depth' => 3,
'show_count' => true, //Показывать # списка в parens
'hide_empty' => true, //Не показывать предприятия без списков
));
Но каковы соответствующие аргументы? Давайте рассмотрим каждый отдельно:
-
show_optional_all
. Довольно просто, это то, что отображается в раскрывающемся списке сначала и когда фильтрация не применяется. В нашем случае это будет «Показать все предприятия », но мы могли бы назвать его «Объявления для всех предприятий» или как вам нравится. -
таксономия
- эти аргументы указывают функции, из которой таксономия вытягивает термины, даже если функция имеетcategories
от его имени. В версиях v2.8 и более ранних версиях WordPress не имели пользовательских таксономий, но когда они были добавлены, команда решила, что просто добавить аргумент таксономии в эту функцию, чем создать другую функцию с другим именем. -
name
. Этот аргумент позволяет указать значение, которое WordPress использует для атрибутаname
для <select> ; элемент, сгенерированный для выпадающего списка. На всякий случай, это не очевидно, это также значение, которое будет использоваться в URL при фильтрации. -
orderby
. Этот аргумент сообщает WordPress, как упорядочить результаты в алфавитном порядке. В нашем случае мы указали, чтобы заказать имяname
терминов в таксономии, то есть имена компаний в этомслучай. -
selected
. Этот аргумент необходим, чтобы выпадающий список мог отображать текущий фильтр в раскрывающемся списке. Он должен бытьterm_id
из выбранного таксономии. В нашем случае это может бытьterm_id
из «Бизнес № 2» . Где мы получаем эту ценность? Из глобальной переменной WordPress$ wp_query
; он имеет свойствоquery
, которое содержит массив всех параметров URL и их значений (если только какой-то плавный путь не изменил его, конечно.) Учитывая, как WordPress обрабатывает вещи, будет существовать терминURL-адрес, переданный по URL-адресу, когда пользователь нажимает кнопку фильтра, если пользователь выбрал действительный термин (например, один из перечисленных предприятий).
-
иерархический
- указав это наtrue
, вы сообщите функции, чтобы они уважали иерархический характер таксономии и отображали их в древовидное представление, если на терминах (предприятиях) есть дети. Для экрана, чтобы увидеть, как это выглядит, см. Ниже. -
depth
. Этот аргумент взаимодействует с аргументомиерархический
, чтобы определить, сколько уровней должно пройти функция для отображения детей. -
show_count
- еслиtrue
, этот аргумент будет отображать столбцы в скобках слева от имени имени в кадре вниз. В этом случае будет отображаться количество списков, связанных с бизнесом. Для экрана, чтобы увидеть, как это выглядит, см. Ниже. -
hide_empty
. Наконец, если в таксономии есть термины not , связанные с сообщением (т.е. предприятия не связаны с листингом), тогда установка этого параметра наtrue
не будет включать их в раскрывающийся список.
Шаг # 2: Захват фильтра parse_query
.
Затем мы вызываем наше внимание на крючок фильтра parse_query
, который имеет один параметр ($ query
) и вызывается из /wp-includes/query.php
(в v3.0.1, вызов которого находится в строке 1549.) Он вызывается, когда WordPress завершил проверку URL-адреса и установил все соответствующие значения в текущем активном $ wp_query
, включая такие вещи, как $ wp_query-> is_home
и $ wp_query-> is_author
и т. д.
После того, как зацепит фильтр parse_query
, WordPress вызовет get_posts ()
и загрузит список сообщений на основе того, что указано в текущем активном $ wp_query
. Таким образом, parse_query
часто является отличным местом, чтобы заставить WordPress изменить свое мнение о том, какие сообщения он будет загружать.
В вашем прецеденте мы хотим, чтобы WordPress фильтровался на основе выбранных предприятий; т.е. отображать только те листинги, которые были связаны с выбранным бизнесом (я бы сказал, "... только те листинги, которые были " категоризированы " по выбранному бизнесу" но это не является техническим правилом; category
- это собственная таксономия на одноранговом узле с business
, за исключением того, что category
встроена в WordPress и business
является обычным, но для тех, кто знаком с категоризацией сообщений, это может помочь вам понять, поскольку они работают почти одинаково. Но я отвлекаюсь ...)
Ввод кода. Первое, что мы делаем, это захватить ссылку на текущий активный $ wp_query
'query_vars
, так что с ним удобнее работать, точно так же, как это делается в WordPress parse_query ()
. В отличие от $ wp_query-> query
, который используется для зеркалирования параметров, переданных по URL-адресу, массив $ wp_query-> query_vars
используется для управления запросом WordPress и как ожидается, будет изменен. Поэтому, если вам нужно изменить один, это будет один (по крайней мере, я думаю , который отличается от двух, если кто-то знает иначе please , дайте мне знать, так Я могу это обновить!)
& л;? PHP
add_filter ( 'parse_query', 'convert_business_id_to_taxonomy_term_in_query');
функция convert_business_id_to_taxonomy_term_in_query ($ query) {
глобальный $ 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;
}
}
Затем мы тестируем $ pagenow
, чтобы убедиться, что мы действительно загружаем WordPress из URL-адреса /wp-admin/edit.php
. Мы делаем это, чтобы не допустить случайных ошибок на других страницах. Мы также проверяем, чтобычто у нас есть business
как элемент <таксономия и элемент
term
. (Примечание таксономия
и term
) - это пара, которые используются вместе, чтобы разрешить запрос термина таксономии; должны быть оба или WordPress не знает, какую таксономию проверять.)
Вы можете задаться вопросом, как business
появился в элементе taxonomy
массива query_vars
. То, что мы написали в нашем parse_query
, вызвало внутреннюю магию WordPress, которая была заложена в ожидании, когда вы зарегистрировали таксономию «business
», установив query_var
на true (register_taxonomy ()
копирует имя таксономии в качестве query_var
), вы можете изменить ее, но если у вас есть конфликт, лучше придерживаться того же)
& л;? PHP
add_action ( 'инициализации', 'register_business_taxonomy');
function register_business_taxonomy () {
register_taxonomy ( 'бизнес', массив ( 'список'), массив (
'label' => «Бизнес»,
'Общественное' = > правда,
'Иерархического' = > правда,
'Show_ui' = > правда,
'Query_var' = > истинно
));
}
Теперь WordPress '$ wp_query был написан для использования пули для стандартных запросов, связанных с таксономией, а не идентификаторов терминов таксономии. Для этого случая использования нам действительно нужно выполнить наш запрос на фильтрацию:
таксономия
: бизнес
term
: бизнес-1 (т. е.slug
)
Не следующие:
таксономия
: бизнес
term
: 27 (т. е.term_id
)
Интересно и, к сожалению, выпадающее меню wp_dropdown_categories ()
задает атрибут <option>
value
для термина ( /business ') term_id
, not термин slug
. Поэтому нам нужно преобразовать $ wp_query-> query_vars ['term']
из числового term_id
в строку slug
, как показано в фрагменте (обратите внимание, что это не самый эффективный способ запроса базы данных, но пока WordPress не добавит поддержку term_ids в свой запрос, это лучшее, что мы можем сделать!):
& л;? PHP
$ term = get_term_by ('id', $ qv ['term'], 'business');
$ qv ['term'] = $ term-> slug;
И все! С этими двумя функциями вы получаете требуемую фильтрацию.
НО ПОДОЖДИТЕ, БОЛЬШЕ! : -)
Я пошел вперед и добавил столбец «Бизнес» в список списка, потому что, я знал, что это будет ваш следующий вопрос. Без столбца для того, что вы фильтруете, это может быть очень запутанным для конечного пользователя. (Я сам боролся с этим, и я был кодером!) Вы можете, конечно, уже увидеть столбец «Бизнес» в предыдущих снимках экрана выше.
Шаг №3: Ключ фильтра manage_posts_columns
.
Чтобы добавить столбец в список сообщений, требуется два (2) дополнительных крючка. Первый из них - это manage_posts_columns
или версия типа post manage_listing_posts_columns
, которую я вызывал. Он принимает один параметр (posts_columns
) и вызывается из /wp-admin/includes/template.php
(в версии 3.0.1, вызов которого находится в строке 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 ['business'] = null;
$ new_posts_columns [$ key] = $ posts_column;
}
}
$ new_posts_columns ['business'] = 'Бизнесы';
return $ new_posts_columns;
}
Функция hook manage_posts_columns
получает переданный массив столбцов, где значение представляет собой отображаемый заголовок столбца, а ключ - внутренний идентификатор столбца. Идентификаторы стандартных столбцов могут включать эти и другие параметры: 'cb'
, 'title
', 'author'
, `` 'date`` и т. Д. .
'cb'
, является столбцом checkbox
, и оба 'title'
и 'date'
относятся к post_title
и post_date
из таблицы wp_posts
, соответственно. 'author'
, конечно, это поле post_author
после получения имени автора из таблицы wp_users
.
Дляmanage_posts_columns
мы просто хотим вставить наш столбец business
в массив $ posts_columns
до 'author'
, предполагая другой плагин еще не удалил author
из списка!
$ new_posts_columns ['business'] = 'Businesses',
( Примечание , как я писал add_businesses_column_to_listing_list ()
, мне пришло в голову, что PHP должен иметь более простой способ чтобы вставить значение в ассоциативный массив в правильном порядке?!? Или, по крайней мере, в ядре WordPress есть функция, чтобы сделать это? Но так как Google меня подвела, я пошел с тем, что сработало. Если у кого-то есть какие-либо предложенные альтернативы Я буду все уши и благодарен заранее!)
Что, наконец, приводит нас к ...
Шаг # 4: Ключ действия manage_posts_custom_column
Вторая вещь из двух (2), которую нам нужно сделать, чтобы наши компании отображались в столбце, - это фактически выводить имя каждого из связанных компаний, используя manage_posts_custom_column
действие. Этот крючок принимает два (2) параметра (column_id
и post_id
) и также вызывается из /wp-admin/includes/template.php
( в v3.0.1, вызов которого находится в строке 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 = 'бизнес';
switch ($ column_name) {
деловые компании:
$ business = get_the_terms ($ post_id, $ taxonomy);
if (is_array ($ business)) {
foreach ($ business as $ key => $ business) {
$ edit_link = get_term_link ($ business, $ taxonomy);
$ business [$ key] = '<a href = "'. $ edit_link. '">' , $ business-> имя. '& Л; /а >';
}
//echo implode («<br />», $ business);
echo implode ('|', $ business);
}
ломать;
}
}
}
Этот крючок вызывается для каждого столбца для каждой строки post (/business). Сначала мы проверим, что мы действительно работаем только с типом post listing
, а затем мы используем оператор switch
для проверки на column_id
. Я выбрал switch
, потому что этот крючок часто используется для генерации вывода для разных столбцов, особенно если мы используем одну функцию для разных типов сообщений, которые могут выглядеть примерно так:
& л;? 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':
эхо "... что угодно ...";
ломать;
case 'listing: property':
эхо "... что угодно ...";
ломать;
case 'agent: listing':
эхо "... что угодно ...";
ломать;
}
}
Осмотрев наш прецедент немного ближе, вы увидите функцию get_the_terms ()
, которая просто возвращает список терминов для этой таксономии (например, компании для этого листинга). Здесь получите permalink для интерфейсной веб-страницы термина, в которой обычно перечисляются сообщения, связанные с этим термином, но, конечно же, могут отличаться в зависимости от установленной темы и /или плагинов.
Мы используем постоянную ссылку для гиперссылки на этот термин только потому, что мне нравится гиперссылка на вещи. Затем мы объединяем все гиперссылки (/business) вместе с символом pipe ('|
') и выводим его в буфер PHP, который отправляет его клиенту /клиенту пользователя:
& л;? PHP
$ business = get_the_terms ($ post_id, $ taxonomy);
if (is_array ($ business)) {
foreach ($ business as $ key => $ business) {
$ edit_link = get_term_link ($ business, $ taxonomy);
$ business [$ key] = '<a href = "'. $ edit_link. '">' , $ business-> имя. '& Л; /а >';
}
//echo implode («<br />», $ business);
echo implode ('|', $ business);
}
СЕЙЧАС , мы, наконец, закончили.
Резюме
Итак, вы должны использовать следующие четыре (4) крючка, чтобы получить как фильтр, так и соответствующий столбец на странице списков пользовательских сообщений (О, он также будет работать с сообщениями и страницами). Они:
- Шаг # 1: Ключ действия
restrict_manage_posts
. - Шаг # 2: Захват фильтра
parse_query
. - Шаг # 3: Ключ фильтра
manage_posts_columns
. - Шаг # 4: Ключ действия
manage_posts_custom_column
Где скачать код
Но если бы я заставил вас прочитать все вышеизложенное, то я, конечно, не был бы очень хорошим человеком, если бы я также заставил вас выкопать код только длябыть в состоянии попробовать! Но вопреки тому, что говорят некоторые люди, мне приятно. Итак, здесь вы идете:
- Загрузите код в : http: //gist.github. ком /541505
ПРИМЕЧАНИЕ к @tarasm : я включил крючки для register_post_type ()
и register_taxonomy ()
, чтобы другие могли бы попробовать это, не создавая их. Вы, вероятно, захотите удалить эти два вызова функций, прежде чем вы проверите это.
КОНЕЦ
Оригинальный ответ:
Привет @tarasm :
Вы ищете один снимок вверху , подобный этому экрану, или вы ищете один снимок за пост-запись , и если да, то как вы ожидаете последнего работать?
Если первый, взгляните на этот ответ на вопрос Как отсортировать область администрирования пользовательского типа Wordpress по настраиваемому полю? Если это то, что вам нужно, я могу предоставить более подробную информацию о таксономии.
Просто хотел поделиться альтернативной реализацией. У меня не было невероятного учебника Майка, когда я это выяснил, поэтому мое решение немного отличается. В частности, я собираюсь упростить шаг Майка <1> и устранить шаг # 2 Майка. Другие шаги по-прежнему применимы.
В учебнике Майка использование wp_dropdown_categories ()
сохраняет нам ручное построение списка, но требует некоторой сложной условной модификации запроса ( шаг # 2 ) для обработки его использования ID вместо slug. Не говоря уже о трудностях изменения этого кода для работы с другими сценариями, например, с несколькими фильтрами таксономии.
Другой подход состоит в том, чтобы просто не использовать дефектный wp_dropdown_categories ()
вообще, но вместо этого создавать собственные выпадающие списки выбора с нуля. Это не так сложно, занимает менее 30 строк кода и вообще не требует подключения parse_query
:
add_action ('restrict_manage_posts', 'my_restrict_manage_posts');
function my_restrict_manage_posts () {
//отображать только эти таксономические фильтры по желаемым пользовательским спискам post_type
global $ typenow;
if ($ typenow == 'photos' || $ typenow == 'videos') {
//создаем массив таксономических пулей, которые вы хотите фильтровать, - если вы хотите получить все таксономии, можете использовать get_taxonomies () для создания списка
$ filters = array («растения», «животные», «насекомые»);
foreach ($ filters as $ tax_slug) {
//получить объект таксономии
$ tax_obj = get_taxonomy ($ tax_slug);
$ tax_name = $ tax_obj-> label-> имя;
//получить массив терминных объектов для таксономии
$ terms = get_terms ($ tax_slug);
//выводить html для выпадающего фильтра таксономии
echo "<select name = '$ tax_slug' id = '$ tax_slug' class = 'postform'>";
echo "<option value = ''> Показать все $ tax_name </option>";
foreach ($ terms as $ term) {
//выводим каждую строку выбора select, проверяем на последний $ _GET, чтобы показать выбранную текущую опцию
echo '<option value ='. $ term-> slug, $ _GET [$ tax_slug] == $ term-> slug? 'selected = "selected"': '', '>' , $ term-> имя. ' ('. $ term-> count.') </option> ';
}
echo "</select>";
}
}
}
Просто подключив нужные таксономии к массиву $ filters
, вы можете быстро вывести несколько таксономических фильтров. Они выглядят точно так же, как и в скриншотах Майка. Затем вы можете выполнить шаг # 3 и # 4 .
Вот версия этого, которая автоматически создает и применяет фильтры из всех таксономий, которые применяются ко всем пользовательским типам сообщений, которые их используют. (что за ржавчина) В любом случае, я также изменил его, чтобы он работал с wp_dropdown_categories () и wordpress 3.1. Проект, над которым я работаю, называется ToDo, вы можете переименовать функции в нечто, что имеет смысл для вас, но это должно в значительной степени работать на все автоматически.
функция 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 (массив (
'show_option_all' => __ ('Показать все'. $ Tax_obj-> label),
'таксономия' => $ Tax_slug,
'name' => $ Tax_obj- > имя,
'orderby' => 'Term_order',
'selected' => $ _GET [$ tax_obj- > query_var],
«Иерархический» => $ Tax_obj- > иерархическая,
'show_count' => ложный,
'hide_empty' => правда
));
}
}
}
функция todo_convert_restrict ($ query) {
глобальный $ 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');
Обратите внимание, что я использую плагин, который добавляет «term_order» как способ упорядочения условий, вам придется изменить это или удалить этот аргумент, чтобы вернуться к умолчанию.
Поздний ответ
Изменить
Я написал Фильтровать , плагин, который добавит эту функцию как можно более простой способ.
Обновление для WordPress 3.5 +
Теперь, когда все намного проще, вот просто very простое плагин или mu-plugin.
Он использует как можно меньше ресурсов, загружает только нужные экраны и добавляет Columns + Filters для каждой пользовательской таксономии.
add_action ('plugins_loaded', array ('WCM_Admin_PT_List_Tax_Filter', 'init'));
класс WCM_Admin_PT_List_Tax_Filter
{
private static $ instance;
public $ post_type;
общедоступные таксономии;
статическая функция init ()
{
null === self :: $ instance AND self :: $ instance = new self;
return self :: $ instance;
}
публичная функция __construct ()
{
add_action ('load-edit.php', array ($ this, '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-> таксономии = array_diff (
get_object_taxonomies ($ this-> post_type),
get_taxonomies (array ('show_admin_column' => 'false'))
);
}
public function add_columns ($ taxonomies)
{
return array_merge (таксономии, $ this-> таксономии);
}
public function get_select ()
{
$ walker = новый WCMF_walker;
foreach ($ this-> таксономии как $ tax)
{
wp_dropdown_categories (массив (
'таксономия' => $ Налог,
'hide_if_empty' => правда,
'show_option_all' => Sprintf (
get_taxonomy ($ tax) -> метки-> all_items
),
'hide_empty' => правда,
«Иерархический» => is_taxonomy_hierarchical ($ tax),
'show_count' => правда,
'orderby' => 'имя',
'selected' => '0'! == get_query_var ($ tax)
? get_query_var ($ tax)
: ложный,
'name' => $ Налог,
'id' => $ Налог,
'walker' => $ Ходунки,
));
}
}
}
И тогда вам просто нужен настроенный класс Walker.
класс WCMF_walker расширяет Walker_CategoryDropdown
{
public $ tree_type = 'category';
public $ db_fields = array (
'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-> имя, $ term);
$ output. = sprintf (
'<option class = "level-% s" value = "% s"% s>% s% s </option>',
$ Глубина,
$ & GT перспектива,; пробковая,
выбран (
$ арг [ 'выбран'],
$ & GT перспектива,; пробковая,
ложный
),
$ Подушечка. $ Cat_name,
$ арг [ 'show_count']
? "& Амп; NBSP; & амп; NBSP; ({$ & GT перспективу,; число})"
: ''
);
}
}
Я просто хотел сделать короткую заметку. В более новых версиях WP списки сообщений в admin обрабатываются классом WP_Posts_List_Table. Код apply_filters теперь выглядит следующим образом:
if ('page' == $ post_type)
$ posts_columns = apply_filters ('manage_pages_columns', $ posts_columns);
еще
$ posts_columns = apply_filters ('manage_posts_columns', $ posts_columns, $ post_type);
$ posts_columns = apply_filters ("manage _ {$ post_type} _posts_columns", $ posts_columns);
Итак, чтобы добавить новые столбцы, крюк add_filter должен выглядеть примерно так:
add_filter ('manage_posts_columns', 'my_add_columns', 10, 2);
Вот пример:
function my_add_columns ($ posts_columns, $ post_type)
{
if ('myposttype' == $ post_type) {
$ posts_columns = array (
"cb" => "<input type = \" checkbox \ "/>",
"title" => "Заглавие",
"anothercolumn" => "Бекон",
"date" => __( 'Дата' )
);
return $ posts_columns;
}
}
Теперь, для строк post. Это код, который обрабатывает данные столбцов в списках:
по умолчанию:
? >
<td <? php echo $ attributes?> <& phis;
if (is_post_type_hierarchical ($ post-> post_type))
do_action ('manage_pages_custom_column', $ column_name, $ post-> ID);
еще
do_action ('manage_posts_custom_column', $ column_name, $ post-> ID);
do_action ("manage _ {$ post-> post_type} _posts_custom_column", $ column_name, $ post-> ID);
? > & Lt; /тд >
& Lt;? PHP
Чтобы получить данные наших постов, мы должны добавить такой крючок действия, как это:
add_action ("manage_ (here_goes_your_post_type) _posts_custom_column", "my_posttype_add_column", 10, 2);
Пример (в этом примере используются таксономии, но вы можете запросить любые другие вещи):
function my_posttype_add_column ($ column_name, $ post_id)
{
switch ($ column_name) {
case 'anothercolumn':
$ flavors = get_the_terms ($ post_id, 'flavor');
if (is_array ($ flavors)) {
foreach ($ flavors as $ key => $ flavor) {
$ edit_link = get_term_link ($ flavor, 'flavor');
$ flavors [$ key] = '<a href = "'. $ edit_link. '">' , $ flavour-> имя. '& Л; /а >';
}
echo implode ('|', $ flavors);
}
ломать;
по умолчанию:
ломать;
}
}
РАБОТАЕТ В WP 3.2!
custom_post_type: книги custom_taxonomy: жанр
Модифицируйте только: //изменить ЗДЕСЬ
function restrict_books_by_genre () {
global $ typenow;
$ post_type = 'books'; //изменить ЗДЕСЬ
$ таксономия = 'жанр'; //изменить ЗДЕСЬ
if ($ typenow == $ post_type) {
$ selected = isset ($ _ GET [$ таксономия])? $ _GET [$ taxonomy]: '';
$ info_taxonomy = get_taxonomy ($ таксономия);
wp_dropdown_categories (массив (
'show_option_all' => __ ("Показать все {$ info_taxonomy-> label}"),
'таксономия' => $ Систематики,
'name' => $ Систематики,
'orderby' => 'имя',
'selected' => $ Выбран,
'show_count' => правда,
'hide_empty' => правда,
));
};
}
add_action ('restrict_manage_posts', 'restrict_books_by_genre');
функция convert_id_to_term_in_query ($ query) {
глобальный $ pagenow;
$ post_type = 'books'; //изменить ЗДЕСЬ
$ таксономия = 'жанр'; //изменить ЗДЕСЬ
$ q_vars = & $ query-> query_vars;
if ($ pagenow == 'edit.php' & isset ($ q_vars ['post_type']) & & $ q_vars ['post_type'] == $ post_type & & isset ($ q_vars [$ таксономия]) & is_numeric ($ q_vars [$ таксономия]) & & $ 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');
Вот как это сделать, используя действие restrict_manage_posts. Кажется, это хорошо работает для меня и добавляет способность фильтровать по таксономии для всех типов сообщений и связанных с ними таксономий.
//регистрирует все выпадающие списки таксономического фильтра
function sunrise_fbt_add_taxonomy_filters () {
global $ typenow; //текущий тип сообщения
$ 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) {
//Проверяем, является ли иерархическое - если так построить иерархическое раскрывающееся меню
if ($ tax-> иерархический) {
$ args = array (
'show_option_all' => «Все». $ Tax-> label-> имя,
'show_option_none' => «Выбрать». $ Tax-> label-> имя,
'show_count' => 1,
'hide_empty' => 0,
'echo' => 1,
«Иерархический» => 1,
'depth' => 3,
'name' => $ Руль > переписать [ 'пули'],
'id' => $ Руль > переписать [ 'пули'],
'class' => 'Postform',
'depth' => 0,
'tab_index' => 0,
'таксономия' => $ TaxName,
'hide_if_empty' => ложный);
$ args ['walker'] = new Walker_FilterByTaxonomy;
wp_dropdown_categories ($ арг);
} else {
echo "<select name = '". $ tax-> rewrite [' slug ']. "' id = '". $ tax-> переписать [' slug ']. "' class = 'postform'> «;
echo "<option value = ''> Показать все". $ tax-> label-> name. "</option>";
foreach ($ terms as $ term) {
echo '<option value = "'. $ term-> slug. '"', $ _GET [$ taxName] == $ term-> slug? 'selected = "selected"': '', '>' , $ term-> имя. ' ('. $ term-> count.') </option> ';
}
echo "</select>";
}
}
}
}
}
add_action ('restrict_manage_posts', 'sunrise_fbt_add_taxonomy_filters', 100);
/**
* Создайте раскрывающийся список категорий.
*
* @package WordPress
* @since 2.1.0
* @uses Уолкер
* /
класс Walker_FilterByTaxonomy расширяет 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";
}
}
Одна нота - я попытался ограничить глубину, потому что некоторые из моих иерархических таксономий довольно велики, но это не сработало - может быть ошибка в функции wp_dropdown_categories?
Иерархическая версия ответа @ somatic, запрошенная @kevin:
& л;? PHP
add_action ('restrict_manage_posts', 'my_restrict_manage_posts');
function my_restrict_manage_posts () {
//отображать только эти таксономические фильтры по желаемым пользовательским спискам post_type
global $ typenow;
if ($ typenow == 'photos' || $ typenow == 'videos') {
//создаем массив таксономических пулей, которые вы хотите фильтровать, - если вы хотите получить все таксономии, можете использовать get_taxonomies () для создания списка
$ filters = array («растения», «животные», «насекомые»);
foreach ($ filters as $ tax_slug) {
//получить объект таксономии
$ tax_obj = get_taxonomy ($ tax_slug);
$ tax_name = $ tax_obj-> label-> имя;
//выводить html для выпадающего фильтра таксономии
echo "<select name = '$ tax_slug' id = '$ tax_slug' class = 'postform'>";
echo "<option value = ''> Показать все $ 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);
$ Вкладка = '';
для ($ I = 0; $ я < $ уровня; $ я ++) {
$ Вкладка = '-'.
}
foreach ($ terms as $ term) {
//выводим каждую строку выбора select, проверяем на последний $ _GET, чтобы показать выбранную текущую опцию
echo '<option value ='. $ term-> slug, $ _GET [$ tax_slug] == $ term-> slug? 'selected = "selected"': '', '>' . $ Таб. $ term-> имя. ' ('. $ term-> count.') </option> ';
generate_taxonomy_options ($ tax_slug, $ term-> term_id, $ level + 1);
}
}
? >
Я в основном удалил код, который создал параметры, и поместил его в свою собственную функцию. Функция «generate_taxonomy_options», помимо принятия tax_slug, также принимает параметр parent и level. Функция предполагает, что ее параметры создания для родителя 0, которые будут выбирать все термины уровня корня. В цикле функция будет рекурсивно вызывать себя, используя этот текущий термин как родительский и увеличивая уровень на единицу. Он автоматически добавляет тики в сторону, чем глубже вы спускаетесь по дереву и вуаля!
Обновление ответа @Drew Gourley для WP 3.3.1 (и включение кода из 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 (массив (
'show_option_all' => __ ('Показать все'. $ Tax_obj-> label),
'таксономия' => $ Tax_slug,
'name' => $ Tax_obj- > имя,
'orderby' => 'Term_order',
'selected' => $ & GT перспектива,; term_id,
«Иерархический» => $ Tax_obj- > иерархическая,
'show_count' => ложный,
//'hide_empty' => правда,
'hide_empty' => ложный,
'walker' => новый DropdownSlugWalker ()
));
}
}
}
//Класс отсечения фильтра. Используется с wp_dropdown_categories (), чтобы в результате выпадающего списка использовались термины slugs вместо ids.
класс DropdownSlugWalker расширяет 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";
}
}
Это неизвестно, я думаю, но с wordpress 3.5 вы можете передать 'show_admin_column' => true
в register_taxonomy
. Это делает 2 вещи:
- Добавляет столбец таксономии в представление списка типа сообщения администратора
- Нажимая имя термина в столбце taxonomy, он фактически фильтрует список для этого термина .
Таким образом, не совсем то же самое, что иметь выделенную, но почти такую же функциональность, ширину всего одну строку кода.
https://make.wordpress.org/core/2012/12/11/wordpress-3-5-admin-columns-for-custom-taxonomies/
Кроме того, как вы можете прочитать, есть новый фильтр, специально предназначенный для ручного добавления столбца таксономии (если вам действительно нужно).
Извиняется за то, что, как новый пользователь, я не могу оставлять комментарии, но я могу опубликовать ответ ...
Как и WordPress 3.1 (RC 1) Ответ Майка (который служил мне так хорошо для прошлой пары в течение нескольких месяцев) больше не работает для меня; ограничение любым ребенком таксономии дает пустой результат. Я попробовал обновление Somatic и отлично работал; еще лучше, он работает с многочисленными запросами таксономии , которые были обработаны в этой версии.
Просто попробовал оба кода, от Майка и соматики, и задавался вопросом, как получить одну вещь от каждой техники:
С кодом Майка отображается раскрывающийся список с иерархическим вариантом, который очень помогает. Но для отображения двух выпадающих я должен был дублировать выражение if ($ typenow == 'produtos') {...}
в функции restrict_listings_by_business ()
, а также if ($ pagenow == 'edit.php' & ...}
в функции convert_business_id_to_taxonomy_term_in_query ($ query)
, которая теперь дает много кода.
С кодом соматики мне просто нужно указать таксономии, которые я хотел бы видеть как выпадающие меню и bam, работает; $ filters = array ('taxo1', 'taxo2');
Вопрос: могу ли я получить соматический подход, а также иметь иерархическую опцию?
Большое спасибо в любом случае за этот учебник, много помогли!
Учебник Майка об этом замечательный! Я, вероятно, не стал бы добавлять эту функциональность в свой плагин Media Categories, если бы мне пришлось разобраться в этом самостоятельно.
Тем не менее, я думаю, используя parse_query
, а затем получить тогда запрос для этого термина не требуется. Это чище для создания собственного пользовательского класса walker. Возможно, это было невозможно, когда он написал свой пост - его 3-х лет во время написания этого.
Оформить этот отличный фрагмент на github. Работает как шарм, меняет идентификаторы в выпадающих значениях на пули, поэтому он просто работает изначально без изменения запроса.