Добавление фильтра таксономии в список администраторов для пользовательского типа записи?


Я создал пользовательский тип записи с именем 'listing' и добавил пользовательскую таксономию с именем 'businesses'. Я хотел бы добавить выпадающий список предприятий в список администраторов для списков.

Вот как выглядит эта функция в списке администраторов для сообщений (Я хотел бы то же самое для моего пользовательского типа сообщений):

Categories Dropdown in Posts

Вот мой текущий код ( И вот тот же код по сути.):

<?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();
}

Как я могу добавить выпадающий список предприятий в списке администраторов для списков?

Author: MikeSchinkel, 2010-08-19

14 answers

ОБНОВЛЕНИЕ: Я включил новый полный ответ, но даже в этом случае я оставил свой первоначальный ответ внизу, на который ссылаются первые несколько комментариев.


Привет@таразм:

Хотя я сказал, что это не должно быть сложно, это немного сложно. Но прежде чем мы углубимся в код...

Скриншоты:

...давайте посмотрим несколько снимков экрана для готового продукта:

Страница списка объявлений с Номером Фильтрация:

Listings list page with No Filtering
( источник: mikeschinkel.com)

Страница списка объявлений С Фильтрацией:

Listings list page With Filtering
( источник: mikeschinkel.com)

Код

Итак, поехали... ( Примечание: Я использовал единственную форму для названия таксономии business; Надеюсь, это соответствует вашему. Благодаря большому опыту работы как с WordPress, так и с разработкой баз данных в в прошлом я считаю, что лучше всего сделать это таким образом.)

Шаг №1: Крючок действия restrict_manage_posts.

Первое, что вам нужно сделать, это подключить действие restrict_manage_posts, которое не имеет параметров и вызывается из /wp-admin/edit.php (в версии v3.0.1 этот вызов находится в строке 378.) Это позволит вам сгенерировать выпадающий список "Выбрать" в соответствующем месте над списком объявлений.

<?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
        ));
    }
}

Мы начнем с проверки переменной $typenow, чтобы убедиться, что мы действительно находимся на post_type из listing. Если ты этого не сделаешь, ты получите это выпадающее меню для всех типов сообщений, что в некоторых случаях является тем, что вам нужно, но не в этом случае.

Далее мы загружаем информацию о таксономии бизнеса с помощью get_taxonomy(). Нам это нужно, чтобы получить метку для таксономии (т. Е. "Предприятия"; мы могли бы жестко запрограммировать, но это не очень хорошо, если вам понадобится интернационализация позже.) Затем мы вызываем wp_dropdown_categories() со всеми соответствующими аргументами в массиве $args, чтобы сгенерировать выпадающий список

<?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
));

Но каковы подходящие аргументы? Давайте рассмотрим каждого в отдельности:

  • show_optional_all - Довольно просто, это то, что отображается в раскрывающемся списке сначала и когда фильтрация не применялась. В нашем случае это будет "Показать все предприятия ", но мы могли бы назвать это "Списки для всех предприятий" или как вам угодно.

  • taxonomy - Эти аргументы сообщают функции, какую таксономию следует извлечь термины из, даже если функция имеет categories в его названии. В версии 2.0 и более ранних версиях WordPress не было пользовательских таксономий, но когда они были добавлены, команда решила, что будет проще добавить аргумент таксономии к этой функции, чем создавать другую функцию с другим именем.

  • name - Этот аргумент позволяет указать значение, которое WordPress использует для атрибута name элемента

  • orderby - Этот аргумент указывает WordPress, как упорядочить результаты в алфавитном порядке. В нашем случае мы указали, чтобы заказать покупку name терминов в таксономии, т.Е. названий компаний в данном случае.

  • selected - Этот аргумент необходим для того, чтобы раскрывающийся список мог отображать текущий фильтр в раскрывающемся списке. Это должно быть term_id из выбранного термина таксономии. В нашем случае это может быть term_id из "Бизнес № 2". Откуда мы берем эту ценность? Из глобальной переменной WordPress $wp_query; у нее есть свойство query, которое содержит массив всех параметров URL и их значений (если, конечно, какой-нибудь своенравный плагин уже не изменил его). Учитывая, как WordPress обрабатывает данные, в URL-адресе будет передан параметр URL term, когда пользователь нажимает кнопку фильтра, если пользователь выбрал допустимый термин (т.е. один из перечисленных предприятий).

  • hierarchical - Установив для этого значение true, вы указываете функции уважать иерархическую природу таксономии и отображать их в виде дерева, если у терминов (предприятий) действительно есть дочерние элементы. Снимок экрана, чтобы увидеть, как это выглядит, смотрите ниже.

  • depth - Этот аргумент взаимодействует с аргументом hierarchical, чтобы определить, на сколько уровней должна углубляться функция отображение детей.

  • show_count - Если true этот аргумент отобразит количество сообщений в круглых скобках слева от имени термина в раскрывающемся списке. В этом случае он будет отображать количество объявлений, связанных с бизнесом. Снимок экрана, чтобы увидеть, как это выглядит, смотрите ниже.

  • hide_empty - Наконец, если в таксономии есть термины, которые не связаны с должностью (т. Е. Предприятиями не связано со списком), то при установке этого значения в true они не будут включены в раскрывающийся список.

Taxonomy Drop Down should hierarchy and counts
( источник: mikeschinkel.com)

Шаг №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_queryquery_vars, чтобы с ним было удобнее работать, точно так же, как это делается в собственной функции WordPress parse_query(). В отличие от $wp_query->query, который используется для отражения параметров, передаваемых по URL, массив $wp_query->query_vars используется для управления запросом, который выполняется WordPress и, как ожидается, будет изменен. Так что, если вам нужно изменить один из них, это будет тот (по крайней мере, я думаю, что это разница между ними; если кто-нибудь знает в противном случае пожалуйста, дайте мне знать, чтобы я мог обновить это!)

<?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;
    }
}

Далее мы проверяем $pagenow, чтобы убедиться, что мы действительно загружаем WordPress с URL-адреса /wp-admin/edit.php. Мы делаем это, чтобы случайно не испортить запросы на других страницах. Мы также проверяем, чтобы убедиться, что у нас есть как business в качестве элемента taxonomy, так и элемент term. (Примечание taxonomy и term являются парой; они используются вместе, чтобы разрешить запрос термина таксономии; должны быть оба, или WordPress не знает, какой таксономия для проверки.)

Вы можете задаться вопросом, как business оказался в элементе taxonomy массива query_vars. То, что мы написали в нашем parse_query крючке, вызвало внутреннюю магию WordPress, которая была заложена в ожидании, когда вы зарегистрировали таксономию "business", установив query_var значение true (register_taxonomy() копирует название таксономии как ее query_var; вы, конечно, можете изменить его, но если у вас нет конфликта, лучше придерживаться того же):

<?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
    ));
}

Теперь WordPress '$wp_query был написан для использования слизней для стандартных запросов с фильтрацией по таксономии, а не идентификаторов терминов таксономии. Для этого варианта использования нам действительно нужно, чтобы наш запрос фильтрации работал следующим образом:

taxonomy: бизнес

term: бизнес-1 (т.е. slug)

Не эти:

taxonomy: бизнес

term: 27 ( т.е. term_id)

Интересно и, к сожалению, раскрывающийся список, созданный wp_dropdown_categories(), устанавливает атрибут <option> value для термина(/business') term_id, не термин 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 или версия для конкретного типа сообщения manage_listing_posts_columns, которую я вызвал вместо этого. Он принимает один параметр (posts_columns) и вызывается из /wp-admin/includes/template.php (в версии v3.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['businesses'] = null;
            $new_posts_columns[$key] = $posts_column;
        }
    }
    $new_posts_columns['businesses'] = 'Businesses';
    return $new_posts_columns;
}

Вашей функции manage_posts_columns hook передается массив столбцов, где значение является отображаемым заголовком столбца, а ключ - внутренним идентификатором столбца. Стандартные идентификаторы столбцов могут включите это и многое другое: 'cb', 'title', 'author', `' дата" и т.д.

'cb', является столбцом checkbox, и оба 'title' и 'date' ссылаются на post_title и post_date из таблицы wp_posts соответственно. 'author' конечно, это поле post_author после того, как имя автора будет извлечено из таблицы wp_users.

Screenshot of the 'cb' posts column as a checkbox.
( источник: mikeschinkel.com)

Для крючка manage_posts_columns мы просто хотим вставить наш столбец businesses в $posts_columns массив перед 'author', предполагая, что какой-то другой плагин еще не удалил author из списка!

$new_posts_columns['businesses'] = '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 = '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;
        }
    }
}

Этот крючок вызывается для каждого столбца для каждой строки сообщения (/бизнес). Сначала мы проверяем, что действительно работаем только с пользовательским типом записи 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':
        echo '...whatever...';
        break;
    case 'listing:property':
        echo '...whatever...';
        break;
    case 'agent:listing':
        echo '...whatever...';
        break;
    }
}

Немного изучив наш вариант использования ближе вы видите функцию get_the_terms(), которая просто возвращает список терминов для этой таксономии (т. Е. Предприятий для этого списка). Здесь получите постоянную ссылку для интерфейсной веб-страницы термина, на которой обычно перечислены публикации, связанные с термином, но, конечно, могут отличаться в зависимости от темы и/или установленных плагинов.

Мы используем постоянную ссылку для гиперссылки на термин только потому, что мне нравится делать гиперссылки на вещи. Затем мы объединяем все термины с гиперссылками (/предприятия) вместе разделяется символом канала ('|') и выводится в буфер PHP, который отправляет его в браузер пользователя/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);
}

СЕЙЧАС мы, наконец, закончили.

Краткое описание

Итак, вкратце, вам нужно использовать следующие четыре (4) крючка, чтобы получить как фильтр, так и связанный столбец на странице списка пользовательских записей (О, это также будет работать с записями и страницами). Это:

  • Шаг № 1: Действие restrict_manage_posts крюк.
  • Шаг №2: Крючок фильтра parse_query.
  • Шаг №3: Крючок фильтра manage_posts_columns.
  • Шаг №4: Крючок действия manage_posts_custom_column

Где скачать код

Но если бы я заставил вас прочитать все вышесказанное, то я, конечно, не был бы очень хорошим человеком, если бы я также заставил вас откопать код, чтобы просто попробовать его! Но вопреки тому, что говорят некоторые люди, я хороший. Итак, вот так:

ПРИМЕЧАНИЕ для @tarasm: Я включил крючки для register_post_type() и register_taxonomy(), чтобы другие могли попробовать это, не создавая их заново. Вероятно, вы захотите удалить эти два вызова функций, прежде чем протестировать это.

КОНЕЦ


Первоначальный ответ:

Привет@таразм:

Вы ищете одно падение сверху нравится этот экран или вы ищете по одному выпадающему списку на запись записи , и если да, то как вы ожидаете, что последнее будет работать?

How to Create Sort By functionality for a Custom Post Type in the WordPress Admin
( источник: mikeschinkel.com)

Если первое, взгляните на этот ответ на вопрос Как отсортировать область администрирования пользовательского типа записи Wordpress по пользовательскому полю? Если это то, что вам нужно, я могу предоставить более подробную информацию, связанную с таксономией.

 144
Author: MikeSchinkel, 2020-06-15 08:21:38

Просто хотел поделиться альтернативной реализацией. У меня не было невероятного урока Майка, когда я разбирался в этом, поэтому мое решение немного отличается. В частности, я собираюсь упростить шаг Майка #1 и устранить шаг №2 - другие шаги все еще применимы.

В учебнике Майка использование wp_dropdown_categories() экономит нам некоторое ручное построение списка, но требует некоторой сложной модификации условного запроса ( шаг #2) для обработки его использования Удостоверение личности вместо пули. Не говоря уже о сложности изменения этого кода для работы с другими сценариями, такими как несколько фильтров таксономии..

Другой подход заключается в том, чтобы просто не использовать ошибочный wp_dropdown_categories() вообще, а вместо этого создавать наши собственные выпадающие списки выбора с нуля. Это не так сложно, занимает менее 30 строк кода и вообще не требует подключения parse_query:

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

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

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

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

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

Просто подключив нужные таксономии к массиву $filters, вы можете быстро вывести несколько фильтры таксономии. Они выглядят точно так же, как на скриншотах Майка. Затем вы можете выполнить шаг #3 и #4.

 44
Author: somatic, 2010-10-23 07:10:58

Вот версия этого, которая автоматически создает и применяет фильтры из всех таксономий, которые применяются ко всем пользовательским типам записей, которые их используют. (какой глоток) В любом случае, я также изменил его, чтобы он работал с wp_dropdown_categories() и wordpress 3.1. Проект, над которым я работаю, называется todo, вы можете переименовать функции во что-то, что имеет смысл для вас, но это должно в значительной степени работать для всего автоматически.

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');

Обратите внимание, что я использую плагин, который добавляет "term_order" как способ упорядочения терминов, вам придется изменить это или удалить этот аргумент, чтобы вернуться к значению по умолчанию.

 13
Author: Drew Gourley, 2012-02-23 08:37:58

Поздний ответ

Редактировать

Я написал Фильтрама, плагин, который добавит эту функциональность самым простым из возможных способов.

Обновление для WordPress 3.5+

Теперь, когда все стало намного проще, вот очень простое решение в виде плагина или mu-плагина.

Он использует как можно меньше ресурсов, загружает только необходимые экраны и добавляет столбцы + фильтры для каждой пользовательской таксономии.

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,
            ) );
        }

    }

}

А потом ты просто нужен индивидуальный класс ходунков.

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

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

Я просто хотел сделать небольшую заметку. В более новых версиях WP объявления о публикациях в admin обрабатываются классом WP_Posts_List_Table. Код apply_filters теперь выглядит следующим образом:

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 );

Поэтому для добавления новых столбцов крючок 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"         => "Title",
      "anothercolumn" => "Bacon",
      "date"          => __( 'Date' )
    );
    return $posts_columns;
  }
} 

Теперь перейдем к строкам сообщений. Это код, который обрабатывает данные столбцов в списках:

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

Чтобы получить данные о наших сообщениях, мы должны добавить крючок действия, например это:

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':
      $flavours = get_the_terms($post_id, 'flavour');
      if (is_array($flavours)) {
        foreach($flavours as $key => $flavour) {
          $edit_link = get_term_link($flavour, 'flavour');
          $flavours[$key] = '<a href="'.$edit_link.'">' . $flavour->name . '</a>';
        }
        echo implode(' | ',$flavours);
      }
      break;

    default:
      break;
  }
}
 7
Author: mines, 2011-08-29 11:44:11

РАБОТАЕТ В WP 3.2!

Пользовательский_пост_тип: книги пользовательская_таксономия: жанр

Только измените, если там написано: //изменить ЗДЕСЬ

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

add_action('restrict_manage_posts', 'restrict_books_by_genre');


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

add_filter('parse_query', 'convert_id_to_term_in_query');
 7
Author: lacroixca, 2011-10-16 03:54:53

Я думаю, это не очень хорошо известно, но, начиная с wordpress 3.5, вы можете передать 'show_admin_column' => true в register_taxonomy. Это делает 2 вещи:

  1. Добавляет столбец таксономии в представление списка типов записей администратора
  2. Щелкнув по названию термина в столбце таксономия, он фактически отфильтрует список по этому термину.

Таким образом, не совсем то же самое, что выбор, но почти та же функциональность, ширина всего одной строки код.

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

Кроме того, как вы можете прочитать, есть новый фильтр, предназначенный для ручного добавления столбца таксономии (если вам действительно нужно).

 3
Author: Luca Reghellin, 2017-09-15 12:00:54

Вот способ сделать это с помощью действия restrict_manage_posts. Кажется, это хорошо работает для меня и добавляет возможность фильтрации по таксономии для всех типов сообщений и связанных с ними таксономий.

// 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";
        }
} 

Одно замечание - я попытался ограничить глубину, потому что некоторые из моих иерархических таксономий довольно велики, но это не сработало - может быть ошибка в функции wp_dropdown_categories?

 2
Author: Brad Trivers, 2012-02-17 19:53:24

Иерархическая версия ответа @somatic, запрошенная @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);
    }

}
?>

Я в основном удалил код, который создал параметры, и поместил его в свою собственную функцию. Функция "generate_taxonomy_options", помимо использования tax_slug, также принимает родительский параметр и параметр уровня. Функция предполагает, что ее параметры создания для родительского 0, в котором будут выбраны все термины корневого уровня. В цикле функция будет рекурсивно вызывать саму себя, используя этот текущий термин как родитель и повышение уровня на единицу. Он автоматически добавляет галочки в сторону, чем глубже вы спускаетесь по дереву, и вуаля!

 1
Author: Manny Fleurmond, 2011-01-08 06:04:37

Обновление ответа @Дрю Гурли для 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(array(
                'show_option_all' => __('Show All '.$tax_obj->label ),
                'taxonomy' => $tax_slug,
                'name' => $tax_obj->name,
                'orderby' => 'term_order',
                'selected' => $term->term_id,
                'hierarchical' => $tax_obj->hierarchical,
                'show_count' => false,
                // 'hide_empty' => true,
                'hide_empty' => false,
                'walker' => new DropdownSlugWalker()
            ));
        }
    }
}


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

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

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

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

        $output .= '>';
        $output .= $pad.$cat_name;
        $output .= "</option>\n";
    }
}
 1
Author: rinogo, 2013-01-25 20:47:17

Приношу извинения за то, что, как новый пользователь, я не могу оставлять комментарии, но я могу опубликовать ответ...

Начиная с WordPress 3.1 (RC 1) Ответ Майка (который так хорошо служил мне последние пару месяцев) больше не работает для меня; ограничение любым дочерним элементом таксономии дает пустой результат. Я попробовал обновление Somatic, и оно отлично сработало; еще лучше, оно работает с несколькими запросами таксономии, которые были обработаны в этом выпуске.

 0
Author: , 2010-12-27 20:37:04

Только что попробовал оба кода, от Майка и соматика, и мне было интересно, как получить одну вещь от каждой техники:

В коде Майка отображается раскрывающийся список с параметром иерархический, что очень помогает. Но для отображения двух выпадающих списков мне пришлось дублировать оператор if ($typenow=='produtos') {...} в функции restrict_listings_by_business(), а также if ($pagenow=='edit.php' && ... } в функции convert_business_id_to_taxonomy_term_in_query($query), которая теперь дает много кода.

С кодом соматика мне просто нужно указать таксономии, которые я хотел бы видеть как выпадающие списки и бам, работает; $filters = array('taxo1', 'taxo2');

Вопрос: могу ли я получить подход соматика, а также использовать иерархическую опцию?

В любом случае большое спасибо за этот урок, он очень помог!

 0
Author: kevin, 2011-01-06 19:00:53

Учебник Майка по этому вопросу просто великолепен! Я, вероятно, не стал бы утруждать себя добавлением этой функции в свой плагин категорий мультимедиа, если бы мне пришлось разбираться в этом самостоятельно.

Тем не менее, я думаю, что использование parse_query, а затем получение запроса для этого термина не является необходимым. Это чище для создания собственного пользовательского класса ходоков. Возможно, это было невозможно, когда он писал свой пост - ему было 3 года на момент моего написания этого.

Проверьте этот замечательный фрагмент на github. Работает как очарование, изменяет идентификаторы в раскрывающихся значениях на пули, поэтому он просто работает изначально, не изменяя запрос.

Https://gist.github.com/stephenh1988/2902509

 0
Author: eddiemoya, 2014-03-27 20:04:55

Просто добавьте это в свой functions.php или код плагина (и замените YOURCUSTOMTYPE и YOURCUSTOMTAXONOMY). (Я получил код от generatewp)

add_action( 'restrict_manage_posts', 'filter_backend_by_taxonomies' , 99, 2);

function filter_backend_by_taxonomies( $post_type, $which ) {
    // Apply this to a specific CPT
    if ( 'YOURCUSTOMTYPE' !== $post_type )
        return;
    // A list of custom taxonomy slugs to filter by
    $taxonomies = array( 'YOURCUSTOMTAXONOMY' );
    foreach ( $taxonomies as $taxonomy_slug ) {
        // Retrieve taxonomy data
        $taxonomy_obj = get_taxonomy( $taxonomy_slug );
        $taxonomy_name = $taxonomy_obj->labels->name;
        // Retrieve taxonomy terms
        $terms = get_terms( $taxonomy_slug );
        // Display filter HTML
        echo "<select name='{$taxonomy_slug}' id='{$taxonomy_slug}' class='postform'>";
        echo '<option value="">' . sprintf( esc_html__( 'Category', 'text_domain' ), $taxonomy_name ) . '</option>';
        foreach ( $terms as $term ) {
            printf(
                '<option value="%1$s" %2$s>%3$s (%4$s)</option>',
                $term->slug,
                ( ( isset( $_GET[$taxonomy_slug] ) && ( $_GET[$taxonomy_slug] == $term->slug ) ) ? ' selected="selected"' : '' ),
                $term->name,
                $term->count
            );
        }
        echo '</select>';
    }
}
 0
Author: Fanky, 2020-06-29 11:28:23