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

Я создал Пользовательский названный Тип Сообщения '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();
}

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

128
04.11.2010, 23:16
12 ответов

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


Привет @tarasm:

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

Снимки экрана:

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

Списки перечисляют страницу без Фильтрации:

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

Списки перечисляют страницу With Filtering:

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 переменная для обеспечения мы находимся на самом деле на a 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 на его имя. В v2.8 и более раннем WordPress не имел пользовательского taxonomies, но когда они были добавлены, команда решила, что просто будет легче добавить аргумент таксономии этой функции, чем создать другую функцию с другим именем.

  • name - Этот аргумент позволяет Вам указывать значение что WordPress с использованием для name атрибут <избранного> элемента сгенерирован для выпадающего. На всякий случай не очевидно, что это - также значение, которое будет использоваться в URL при фильтрации.

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

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

  • 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_query query_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 как a taxonomy элемент и a term элемент также. (Примечание taxonomy и term пара; они используются вместе, чтобы позволить запрашивать термина таксономии; должен иметь обоих, или WordPress не знает который таксономия осмотреть.)

Вы могли бы задаться вопросом как business поднятый в taxonomy элемент query_vars массив. Что мы записали в нашем parse_query сцепитесь инициировал внутреннее волшебство WordPress, которое было положено в ожидании, когда Вы зарегистрировались"business"таксономия путем установки query_var быть верным (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
    ));
}

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

taxonomy: бизнес

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

Не они:

taxonomy: бизнес

term: 27 (т.е. term_id)

Интересно и к сожалению выпадающее, сгенерированное wp_dropdown_categories() установите <option> value припишите термину (/бизнес) 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;

И вот именно! С теми двумя функциями Вы получаете фильтрацию, Вы требуете.

НО ОЖИДАЙТЕ, СУЩЕСТВУЕТ БОЛЬШЕ!:-)

Я шел вперед и добавил столбец "Businesses" к Вашему списку Списка, потому что, ну, в общем, я знал, что это было Вашим следующим вопросом. Не имея столбца для то, что Вы фильтруете его, может очень сбивать с толку конечного пользователя. (Я боролся с ним сам, и я был кодером!) Можно, конечно, уже видеть столбец "Businesses" в предшествующих снимках экрана выше.

Шаг № 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 функция рычага передается массив столбцов, где значение является заголовком отображаемого столбца, и ключ является внутренним идентификатором столбца. Стандартные идентификаторы столбцов могут включать их и больше: '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 пользовательский тип сообщения и затем мы используем a 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: Я включал рычаги для a register_post_type() и register_taxonomy() так, чтобы другие могли испытать это, не имея необходимость воссоздавать их. Вы, вероятно, захотите удалить те два вызова функции, прежде чем Вы проверите это.

КОНЕЦ


Исходный ответ:

Привет @tarasm:

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

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

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

139
19.02.2020, 21:54
  • 1
    я ищу 1 выпадающее наверху, которое показало бы фильтр Категорий. Я был блужданием, если существует стандартный способ сделать это, не имея необходимость писать пользовательский код. –  Taras Mankovski 19.08.2010, 20:04
  • 2
    На первый взгляд я не думаю, что можно сделать w/o пользовательский код, но затем я не думаю, что пользовательский код будет значительным. Я сделал, чтобы клиент звонил для подготовки к тому, таким образом, это должно будет быть позже сегодня все же. –  MikeSchinkel 19.08.2010, 20:30
  • 3
    На самом деле и решение (телесный и MikeSchinkel) не работают, когда Вы пытаетесь отфильтровать 2 другой таксономии в том же фильтре :-/ Всегда фильтруя последнюю таксономию, когда попытка отфильтровать 2 + в то же время. –  Ünsal Korkmaz 03.11.2010, 05:24
  • 4
    @Ünsal текущая версия WordPress (3.0) не поддерживает несколько запросов Таксономии, но от того, что я услышал, что это изменится с версией 3.1. Чтобы заставить этот пример работать с несколькими taxonomies, необходимо ли было бы добавить некоторые соединения и где к запросу через Posts_join и рычаги фильтра posts_where. –  Manny Fleurmond 05.01.2011, 18:07
  • 5
    В WP 3.1 +, шаги один и два лучше в @drew-gourley ответе (на самом деле, Ваш шаг 2 не работал на меня, я думаю, что существуют изменения в этом просачивании нового WordPress). –  Tomasz Struczyński 03.12.2011, 12:10

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

В учебном руководстве Mike's, с помощью 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>";
        }
    }
}

Путем простого включения желаемого taxonomies в $filters массив, можно быстро произвести несколько фильтров таксономии. Они появляются точно то же как те, которые в снимках экрана Mike's. Затем можно выполнить с шагом № 3 и № 4.

44
19.02.2020, 21:54
  • 1
    @somatic - Хорошее обновление! Да, использование wp_dropdown_categories() действительно требует большого количества обходных решений. Я пытаюсь придерживаться базовых функций, когда возможный, но как Вы иногда указываете, это берет больше, прокладывают себе путь. Просто идет, чтобы доказать что с WordPress часто существует больше чем один хороший способ решить проблему. Хорошее задание! спасибо –  MikeSchinkel 23.10.2010, 12:53
  • 2
    Просто остановленная работа для меня на WordPress 3.1. Попытка выяснить, что точно изменилось. Похоже, что это должно все еще работать: таксономия и краткие заголовки термина обнаруживаются, как ПОЛУЧАЮТ значения в URL, но все, к чему это приводит, является 0 результатами –  Manny Fleurmond 24.02.2011, 08:40
  • 3
    я пытался получить эту работу, но единственный путь я мог, должен был использовать рычаг parse_query, проверить на var запроса таксономии и установить таксономию и назвать запрос Варом на основе этого. Использование WP 3.1. Таксономия и термин должны появляться в URL, когда фильтр отправлен? –  sanchothefat 22.03.2011, 19:36
  • 4
    Работы как очарование для меня! Очень изящное решение действительно. Я должен Вам пиво :) –  Michal Mau 26.04.2011, 14:31
  • 5
    @somatic Это работает отлично, но является там способом иметь $term->, считают только количество условиями для того типа сообщения? Например, если у меня будет пользовательская таксономия и для фотографий и для видео, то она покажет мне при рассмотрении видео пользовательский тип сообщения общее количество сообщений для того термина от обоих пользовательских типов сообщения вместо просто общего количества видеопостов, которые используют тот термин. –  Greenhoe 11.06.2015, 16:40

Вот версия этого, которое автоматически создает и применяет фильтры от всех taxonomies, которые относятся ко всем пользовательским типам сообщения, которые используют их. (что полный рот) Так или иначе, я также настроил его так, это работает с 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
19.02.2020, 21:54
  • 1
    , очень сексуальный действительно. я получал ошибочные уведомления, таким образом, я изменился, если (isset ($var)), к если (isset ($var) && $var> 0), чтобы не пытаться найти условия связанными с Представлением все - 0 значений. о, и я должен был возвратить $query в функции todo_convert_restrict –  helgatheviking 08.01.2012, 00:17

Я просто хотел сделать быстрое примечание. На более новых версиях WP списки сообщений на администраторе обрабатываются классом 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);

Пример (этот пример использует taxonomies, но Вы могли запросить любой другой материал):

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
19.02.2020, 21:54

Иерархическая версия ответа @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
19.02.2020, 21:54

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

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

0
19.02.2020, 21:54
  • 1
    По некоторым причинам версия somatic не работает ни один на 3,1 –  Manny Fleurmond 24.02.2011, 08:17

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

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

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

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

Большое спасибо так или иначе для этого учебного руководства, которому помогают много!

0
19.02.2020, 21:54
  • 1
    Se мой ответ для иерархического решения –  Manny Fleurmond 08.01.2011, 08:02

РАБОТЫ В WP 3.2!

custom_post_type: книги custom_taxonomy: жанр

Только измените, было это, говорит://изменяются ЗДЕСЬ

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
19.02.2020, 21:54
  • 1
    То, что хорошее и легкое решение для WP 3.2 +. –  petermolnar 30.07.2015, 13:27
  • 2
    , это работает, но __("Show All {$info_taxonomy->label}") неправильный путь состоит в том, чтобы использовать переводимые строки. –  Mark Kaplun 23.08.2017, 08:24

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

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

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

2
19.02.2020, 21:54

Обновление ответа @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(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
19.02.2020, 21:54

Последний ответ

Править

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

Обновление для 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,
            ) );
        }

    }

}

И затем Вам просто нужен специализированный класс 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
19.02.2020, 21:54
  • 1
    Дал этому водоворот, но get_select () метод, кажется, отсутствует. –  Dave Romsey 15.03.2013, 17:40
  • 2
    @goto10 Вы были правы. Обновленный. Btw: легче просто захватить связанный плагин. Это будет доступно в сменном репозитории через одну или две недели. (Уже подтвержденный). –  kaiser 16.03.2013, 13:09
  • 3
    я должен был использовать $this->setup_vars(); в начале public function setup() чтобы иметь "manage_taxonomies_for_{$this->post_type}_columns" работа –  Christian 02.07.2013, 14:44
  • 4
    Но это могло быть, потому что я использую его в Теме function.php с add_action( 'init', array( 'WCM_Admin_PT_List_Tax_Filter', 'init' ) ); –  Christian 02.07.2013, 14:52
  • 5
    @Christian Это не материал темы. Это принадлежит в плагин и поскольку код выше в настоящее время стоит, он загрузился далеко, прежде чем Темы загружаются. –  kaiser 02.07.2013, 15:49

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

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

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

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

0
19.02.2020, 21:54

Теги

Похожие вопросы