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

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

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

Категории раскрывающегося списка в сообщениях

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

<?php
/*
Plugin Name: Listing Content Item
Plugin URI:
Description: 
Author: 
Version: 1.0
Author URI: 
*/

class Listing {
  var $meta_fields = array("list-address1","list-address2","list-country","list-province","list-city","list-postcode","list-firstname","list-lastname","list-website","list-mobile","list-phone","list-fax","list-email", "list-profile", "list-distributionrange", "list-distributionarea");

  public function loadStyleScripts() {
    $eventsURL = trailingslashit( WP_PLUGIN_URL ) . trailingslashit( plugin_basename( dirname( __FILE__ ) ) ) . 'css/';
    wp_enqueue_style('listing-style', $eventsURL.'listing.css');
  }

  function Listing() {
    // Register custom post types
    register_post_type('listing', array(
      'labels' => array(
        'name' => __('Listings'), 'singular_name' => __( 'Listing' ),
        'add_new' => __( 'Add Listing' ),
        'add_new_item' => __( 'Add New Listing' ),
        'edit' => __( 'Edit' ),
        'edit_item' => __( 'Edit Listing' ),
        'new_item' => __( 'New Listing' ),
        'view' => __( 'View Listing' ),
        'view_item' => __( 'View Listing' ),
        'search_items' => __( 'Search Listings' ),
        'not_found' => __( 'No listings found' ),
        'not_found_in_trash' => __( 'No listings found in Trash' ),
        'parent' => __( 'Parent Listing' ),
      ),
      'singular_label' => __('Listing'),
      'public' => true,
      'show_ui' => true, // UI in admin panel
      '_builtin' => false, // It's a custom post type, not built in
      '_edit_link' => 'post.php?post=%d',
      'capability_type' => 'post',
      'hierarchical' => false,
      'rewrite' => array("slug" => "listings"), // Permalinks
      'query_var' => "listings", // This goes to the WP_Query schema
      'supports' => array('title','editor')
    ));

    add_filter("manage_edit-listing_columns", array(&$this, "edit_columns"));
    add_action("manage_posts_custom_column", array(&$this, "custom_columns"));

    // Register custom taxonomy

    #Businesses
    register_taxonomy("businesses", array("listing"), array(
      "hierarchical" => true, 
      "label" => "Listing Categories", 
      "singular_label" => "Listing Categorie", 
      "rewrite" => true,
    ));

    # Region
    register_taxonomy("regions", array("listing"), array(
      'labels' => array(
        'search_items' =>  __( 'Search Regions' ),
        'popular_items' => __( 'Popular Regions' ),
        'all_items' => __( 'All Regions' ),
        'parent_item' => null,
        'parent_item_colon' => null,
        'edit_item' => __( 'Edit Region' ), 
        'update_item' => __( 'Update Region' ),
        'add_new_item' => __( 'Add New Region' ),
        'new_item_name' => __( 'New Region Name' ),
        'separate_items_with_commas' => __( 'Separate regions with commas' ),
        'add_or_remove_items' => __( 'Add or remove regions' ),
        'choose_from_most_used' => __( 'Choose from the most used regions' ),
      ),
      "hierarchical" => false, 
      "label" => "Listing Regions", 
      "singular_label" => "Listing Region", 
      "rewrite" => true,
    ));

    # Member Organizations
    register_taxonomy("organizations", array("listing"), array(
      'labels' => array(
        'search_items' =>  __( 'Search Member Organizations' ),
        'popular_items' => __( 'Popular Member Organizations' ),
        'all_items' => __( 'All Member Organizations' ),
        'parent_item' => null,
        'parent_item_colon' => null,
        'edit_item' => __( 'Edit Member Organization' ), 
        'update_item' => __( 'Update Member Organization' ),
        'add_new_item' => __( 'Add New Member Organization' ),
        'new_item_name' => __( 'New Member Organization Name' ),
        'separate_items_with_commas' => __( 'Separate member organizations with commas' ),
        'add_or_remove_items' => __( 'Add or remove member organizations' ),
        'choose_from_most_used' => __( 'Choose from the most used member organizations' ),
      ),
      "hierarchical" => false, 
      "label" => "Member Organizations", 
      "singular_label" => "Member Organization", 
      "rewrite" => true,
    ));

    # Retail Products
    register_taxonomy("retails", array("listing"), array(
      'labels' => array(
        'search_items' =>  __( 'Search Retail Products' ),
        'popular_items' => __( 'Popular Retail Products' ),
        'all_items' => __( 'All Retail Products' ),
        'parent_item' => null,
        'parent_item_colon' => null,
        'edit_item' => __( 'Edit Retail Product' ), 
        'update_item' => __( 'Update Retail Product' ),
        'add_new_item' => __( 'Add New Retail Product' ),
        'new_item_name' => __( 'New Retail Product Name' ),
        'separate_items_with_commas' => __( 'Separate retail products with commas' ),
        'add_or_remove_items' => __( 'Add or remove retail products' ),
        'choose_from_most_used' => __( 'Choose from the most used retail products' ),
      ),
      "hierarchical" => false, 
      "label" => "Retail Products", 
      "singular_label" => "Retail Product", 
      "rewrite" => true,
    ));

    # Farming Practices
    register_taxonomy("practices", array("listing"), array(
      'labels' => array(
        'search_items' =>  __( 'Search Farming Practices' ),
        'popular_items' => __( 'Popular Farming Practices' ),
        'all_items' => __( 'All Farming Practices' ),
        'parent_item' => null,
        'parent_item_colon' => null,
        'edit_item' => __( 'Edit Farming Practice' ), 
        'update_item' => __( 'Update Farming Practice' ),
        'add_new_item' => __( 'Add New Farming Practice' ),
        'new_item_name' => __( 'New Farming Practice Name' ),
        'separate_items_with_commas' => __( 'Separate farming practices with commas' ),
        'add_or_remove_items' => __( 'Add or remove farming practices' ),
        'choose_from_most_used' => __( 'Choose from the most used farming practices' ),
      ),
      "hierarchical" => false, 
      "label" => "Farming Practices", 
      "singular_label" => "Farming Practice", 
      "rewrite" => true,
     ));

    # Products 
    register_taxonomy("products", array("listing"), array(
      'labels' => array(
        'search_items' =>  __( 'Search Products' ),
        'popular_items' => __( 'Popular Products' ),
        'all_items' => __( 'All Products' ),
        'parent_item' => null,
        'parent_item_colon' => null,
        'edit_item' => __( 'Edit Product' ), 
        'update_item' => __( 'Update Product' ),
        'add_new_item' => __( 'Add New Product' ),
        'new_item_name' => __( 'New Product Name' ),
        'separate_items_with_commas' => __( 'Separate products with commas' ),
        'add_or_remove_items' => __( 'Add or remove products' ),
        'choose_from_most_used' => __( 'Choose from the most used products' ),
      ),
      "hierarchical" => false, 
      "label" => "Products", 
      "singular_label" => "Product", 
      "rewrite" => true,
    ));


    // Admin interface init
    add_action("admin_init", array(&$this, "admin_init"));
    add_action("template_redirect", array(&$this, 'template_redirect'));

    // Insert post hook
    add_action("wp_insert_post", array(&$this, "wp_insert_post"), 10, 2);
  }

  function edit_columns($columns) {
    $columns = array(
      "cb" => "<input type=\"checkbox\" />",
      "title" => "Business Name",
      "description" => "Description",
      "list-personal" => "Personal Information",
      "list-location" => "Location",
      "list-categorie" => "Categorie",
    );

    return $columns;
  }

  function custom_columns($column) {
    global $post;
    switch ($column) {
      case "description":
        the_excerpt();
        break;
      case "list-personal":
        $custom = get_post_custom();
        if(isset($custom["list-firstname"][0])) echo $custom["list-firstname"][0]."<br />";
        if(isset($custom["list-lastname"][0])) echo $custom["list-lastname"][0]."<br />";
        if(isset($custom["list-email"][0])) echo $custom["list-email"][0]."<br />";
        if(isset($custom["list-website"][0])) echo $custom["list-website"][0]."<br />";
        if(isset($custom["list-phone"][0])) echo $custom["list-phone"][0]."<br />";
        if(isset($custom["list-mobile"][0])) echo $custom["list-mobile"][0]."<br />";
        if(isset($custom["list-fax"][0])) echo $custom["list-fax"][0];
        break;
      case "list-location":
        $custom = get_post_custom();
        if(isset($custom["list-address1"][0])) echo $custom["list-address1"][0]."<br />";
        if(isset($custom["list-address2"][0])) echo $custom["list-address2"][0]."<br />";
        if(isset($custom["list-city"][0])) echo $custom["list-city"][0]."<br />";
        if(isset($custom["list-province"][0])) echo $custom["list-province"][0]."<br />";
        if(isset($custom["list-postcode"][0])) echo $custom["list-postcode"][0]."<br />";
        if(isset($custom["list-country"][0])) echo $custom["list-country"][0]."<br />";
        if(isset($custom["list-profile"][0])) echo $custom["list-profile"][0]."<br />";
        if(isset($custom["list-distributionrange"][0])) echo $custom["list-distributionrange"][0]."<br />";
        if(isset($custom["list-distributionarea"][0])) echo $custom["list-distributionarea"][0];
        break;
      case "list-categorie":
        $speakers = get_the_terms(0, "businesses");
        $speakers_html = array();
        if(is_array($speakers)) {
          foreach ($speakers as $speaker)
          array_push($speakers_html, '<a href="' . get_term_link($speaker->slug, 'businesses') . '">' . $speaker->name . '</a>');
          echo implode($speakers_html, ", ");
        }
        break;
    }
  }

  // Template selection
  function template_redirect() {
    global $wp;
    if (isset($wp->query_vars["post_type"]) && ($wp->query_vars["post_type"] == "listing")) {
      include(STYLESHEETPATH . "/listing.php");
      die();
    }
  }

  // When a post is inserted or updated
  function wp_insert_post($post_id, $post = null) {
    if ($post->post_type == "listing") {
      // Loop through the POST data
      foreach ($this->meta_fields as $key) {
        $value = @$_POST[$key];
        if (empty($value)) {
          delete_post_meta($post_id, $key);
          continue;
        }

        // If value is a string it should be unique
        if (!is_array($value)) {
          // Update meta
          if (!update_post_meta($post_id, $key, $value)) {
            // Or add the meta data
            add_post_meta($post_id, $key, $value);
          }
        }
        else
        {
          // If passed along is an array, we should remove all previous data
          delete_post_meta($post_id, $key);

          // Loop through the array adding new values to the post meta as different entries with the same name
          foreach ($value as $entry)
            add_post_meta($post_id, $key, $entry);
        }
      }
    }
  }

  function admin_init() {
    // Custom meta boxes for the edit listing screen
    add_meta_box("list-pers-meta", "Personal Information", array(&$this, "meta_personal"), "listing", "normal", "low");
    add_meta_box("list-meta", "Location", array(&$this, "meta_location"), "listing", "normal", "low");
  }

  function meta_personal() {
    global $post;
    $custom = get_post_custom($post->ID);
    if(isset($custom["list-firstname"][0])) $first_name = $custom["list-firstname"][0];else $first_name = '';
    if(isset($custom["list-lastname"][0])) $last_name = $custom["list-lastname"][0];else $last_name = '';
    if(isset($custom["list-website"][0])) $website = $custom["list-website"][0];else $website = '';
    if(isset($custom["list-phone"][0])) $phone = $custom["list-phone"][0];else $phone = '';
    if(isset($custom["list-mobile"][0])) $mobile = $custom["list-mobile"][0];else $mobile = '';
    if(isset($custom["list-fax"][0])) $fax = $custom["list-fax"][0];else $fax = '';
    if(isset($custom["list-email"][0])) $email = $custom["list-email"][0];else $email = '';
?>
<div class="personal">
<table border="0" id="personal">
<tr><td class="personal_field"><label>Firstname:</label></td><td class="personal_input"><input name="list-firstname" value="<?php echo $first_name; ?>" /></td></tr>
<tr><td class="personal_field"><label>Lastname:</label></td><td class="personal_input"><input name="list-lastname" value="<?php echo $last_name; ?>" /></td></tr>
<tr><td class="personal_field"><label>Email:</label></td><td class="personal_input"><input name="list-email" value="<?php echo $email; ?>" size="40"/></td></tr>
<tr><td class="personal_field"><label>Website:</label></td><td class="personal_input"><input name="list-website" value="<?php echo $website; ?>" size="40"/></td></tr>
<tr><td class="personal_field"><label>Phone:</label></td><td class="personal_input"><input name="list-phone" value="<?php echo $phone; ?>" /></td></tr>
<tr><td class="personal_field"><label>Mobile:</label></td><td class="personal_input"><input name="list-mobile" value="<?php echo $mobile; ?>" /></td></tr>
<tr><td class="personal_field"><label>Fax:</label></td><td class="personal_input"><input name="list-fax" value="<?php echo $fax; ?>" /></td></tr>
</table>
</div>
     <?php
  }

  // Admin post meta contents
  function meta_location() {
    global $post;
    $custom = get_post_custom($post->ID);
    if(isset($custom["list-address1"])) $address1 = $custom["list-address1"][0];else $address1 = '';
    if(isset($custom["list-address2"])) $address2 = $custom["list-address2"][0];else $address2 = '';
    if(isset($custom["list-country"])) $country = $custom["list-country"][0];else $country = '';
    if(isset($custom["list-province"])) $province = $custom["list-province"][0];else $province = '';
    if(isset($custom["list-city"])) $city = $custom["list-city"][0];else $city = '';
    if(isset($custom["list-postcode"])) $post_code = $custom["list-postcode"][0];else $post_code = '';
    if(isset($custom["list-profile"])) $profile = $custom["list-profile"][0];else $profile = '';
    if(isset($custom["list-distributionrange"])) $distribution_range = $custom["list-distributionrange"][0];else $distribution_range = '';
    if(isset($custom["list-distributionarea"])) $distribution_area = $custom["list-distributionarea"][0];else $ddistribution_area = '';
  ?>
<div class="location">
<table border="0" id="location">
<tr><td class="location_field"><label>Address 1:</label></td><td class="location_input"><input name="list-address1" value="<?php echo $address1; ?>" size="60" /></td></tr>
<tr><td class="location_field"><label>Address 2:</label></td><td class="location_input"><input name="list-address2" value="<?php echo $address2; ?>" size="60" /></td></tr>
<tr><td class="location_field"><label>City:</label></td><td class="location_input"><input name="list-city" value="<?php echo $city; ?>" /></td></tr>
<tr><td class="location_field"><label>Province:</label></td><td class="location_input"><input name="list-province" value="Ontario" readonly /></td></tr>
<tr><td class="location_field"><label>Postal Code:</label></td><td class="location_input"><input name="list-postcode" value="<?php echo $post_code; ?>" /></td></tr>
<tr><td class="location_field"><label>Country:</label></td><td class="location_input"><input name="list-country" value="Canada" readonly /></td></tr>
<tr><td class="location_field"><label>Profile:</label></td><td class="location_input"><input name="list-profile" value="<?php echo $profile; ?>" size="60" /></td></tr>
<tr><td class="location_field"><label>Distribution Range:</label></td><td class="location_input"><input name="list-distributionrange" value="<?php echo $distribution_range; ?>" size="60" /></td></tr>
<tr><td class="location_field"><label>Distribution Area:</label></td><td class="location_input"><input name="list-distributionarea" value="<?php echo $distribution_area; ?>" size="60" /></td></tr>
</table>
</div>
   <?php
  }
}

// Initiate the plugin
add_action("init", "ListingInit");
function ListingInit() { 
  global $listing;
  $listing = new Listing();
  $add_css = $listing->loadStyleScripts();
}

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

124 голоса | спросил Taras Mankovski 19 PM00000070000002931 2010, 19:13:29

13 ответов


134

UPDATE: Я включил новый полный ответ, но даже в этом случае я оставил свой первоначальный ответ внизу, на который ссылаются первые несколько комментариев.


Привет @tarasm :

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

Скриншоты:

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

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

Страница списка списков без фильтрации

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

Страница списка списков с фильтрацией

Код

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

Шаг # 1: Ключ действия restrict_manage_posts.

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

& л;? PHP
add_action ( 'restrict_manage_posts', 'restrict_listings_by_business');
function restrict_listings_by_business () {
    global $ typenow;
    глобальный $ wp_query;
    if ($ typenow == 'listing') {
        $ taxonomy = 'бизнес';
        $ business_taxonomy = get_taxonomy ($ taxonomy);
        wp_dropdown_categories (массив (
            'show_option_all' => __ ("Показать все {$ business_taxonomy-> label}"),
            'таксономия' => $ Систематики,
            'name' => 'бизнес',
            'orderby' => 'имя',
            'selected' => $ Wp_query- > запрос [ 'термин'],
            «Иерархический» => правда,
            'depth' => 3,
            'show_count' => true, //Показывать # списка в parens
            'hide_empty' => true, //Не показывать предприятия без списков
        ));
    }
}

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

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

& л;? PHP
return wp_dropdown_categories (массив (
    'show_option_all' => __ ("Показать все {$ business_taxonomy-> label}"),
    'таксономия' => $ Систематики,
    'name' => 'бизнес',
    'orderby' => 'имя',
    'selected' => $ Wp_query- > запрос [ 'термин'],
    «Иерархический» => правда,
    'depth' => 3,
    'show_count' => true, //Показывать # списка в parens
    'hide_empty' => true, //Не показывать предприятия без списков
));

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

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

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

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

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

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

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

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

  • show_count - если true, этот аргумент будет отображать столбцы в скобках слева от имени имени в кадре вниз. В этом случае будет отображаться количество списков, связанных с бизнесом. Для экрана, чтобы увидеть, как это выглядит, см. Ниже.

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

Выделение таксономии должно быть иерархией и считается

Шаг # 2: Захват фильтра parse_query.

Затем мы вызываем наше внимание на крючок фильтра parse_query, который имеет один параметр ($ query) и вызывается из /wp-includes/query.php (в v3.0.1, вызов которого находится в строке 1549.) Он вызывается, когда WordPress завершил проверку URL-адреса и установил все соответствующие значения в текущем активном $ wp_query, включая такие вещи, как $ wp_query-> is_home и $ wp_query-> is_author и т. д.

После того, как зацепит фильтр parse_query, WordPress вызовет get_posts () и загрузит список сообщений на основе того, что указано в текущем активном $ wp_query. Таким образом, parse_query часто является отличным местом, чтобы заставить WordPress изменить свое мнение о том, какие сообщения он будет загружать.

В вашем прецеденте мы хотим, чтобы WordPress фильтровался на основе выбранных предприятий; т.е. отображать только те листинги, которые были связаны с выбранным бизнесом (я бы сказал, "... только те листинги, которые были " категоризированы " по выбранному бизнесу" но это не является техническим правилом; category - это собственная таксономия на одноранговом узле с business, за исключением того, что category встроена в WordPress и business является обычным, но для тех, кто знаком с категоризацией сообщений, это может помочь вам понять, поскольку они работают почти одинаково. Но я отвлекаюсь ...)

Ввод кода. Первое, что мы делаем, это захватить ссылку на текущий активный $ wp_query 'query_vars, так что с ним удобнее работать, точно так же, как это делается в WordPress parse_query (). В отличие от $ wp_query-> query, который используется для зеркалирования параметров, переданных по URL-адресу, массив $ wp_query-> query_vars используется для управления запросом WordPress и как ожидается, будет изменен. Поэтому, если вам нужно изменить один, это будет один (по крайней мере, я думаю , который отличается от двух, если кто-то знает иначе please , дайте мне знать, так Я могу это обновить!)

& л;? PHP
add_filter ( 'parse_query', 'convert_business_id_to_taxonomy_term_in_query');
функция convert_business_id_to_taxonomy_term_in_query ($ query) {
    глобальный $ pagenow;
    $ qv = & $ query-> query_vars;
    if ($ pagenow == 'edit.php' & & &
            isset ($ qv ['taxonomy']) & & & $ qv ['taxonomy'] == 'business' & & &
            isset ($ qv ['term']) & & & is_numeric ($ qv ['term'])) {
        $ term = get_term_by ('id', $ qv ['term'], 'business');
        $ qv ['term'] = $ term-> slug;
    }
}

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

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

& л;? PHP
add_action ( 'инициализации', 'register_business_taxonomy');
    function register_business_taxonomy () {
        register_taxonomy ( 'бизнес', массив ( 'список'), массив (
        'label' => «Бизнес»,
        'Общественное' = > правда,
        'Иерархического' = > правда,
        'Show_ui' = > правда,
        'Query_var' = > истинно
    ));
}

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

  

таксономия : бизнес

     

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

Не следующие:

  

таксономия : бизнес

     

term : 27 (т. е. term_id)

Интересно и, к сожалению, выпадающее меню wp_dropdown_categories () задает атрибут <option> value для термина ( /business ') term_id, not термин slug. Поэтому нам нужно преобразовать $ wp_query-> query_vars ['term'] из числового term_id в строку slug, как показано в фрагменте (обратите внимание, что это не самый эффективный способ запроса базы данных, но пока WordPress не добавит поддержку term_ids в свой запрос, это лучшее, что мы можем сделать!):

& л;? PHP
$ term = get_term_by ('id', $ qv ['term'], 'business');
$ qv ['term'] = $ term-> slug;

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

НО ПОДОЖДИТЕ, БОЛЬШЕ! : -)

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

Шаг №3: Ключ фильтра manage_posts_columns.

Чтобы добавить столбец в список сообщений, требуется два (2) дополнительных крючка. Первый из них - это manage_posts_columns или версия типа post manage_listing_posts_columns, которую я вызывал. Он принимает один параметр (posts_columns) и вызывается из /wp-admin/includes/template.php (в версии 3.0.1, вызов которого находится в строке 623):

& л;? PHP
add_action ('manage_listing_posts_columns', 'add_businesses_column_to_listing_list');
function add_businesses_column_to_listing_list ($ posts_columns) {
    if (! isset ($ posts_columns ['author'])) {
        $ new_posts_columns = $ posts_columns;
    } else {
        $ new_posts_columns = array ();
        $ index = 0;
        foreach ($ posts_columns as $ key => $ posts_column) {
            if ($ key == 'author')
                $ new_posts_columns ['business'] = null;
            $ new_posts_columns [$ key] = $ posts_column;
        }
    }
    $ new_posts_columns ['business'] = 'Бизнесы';
    return $ new_posts_columns;
}

Функция hook manage_posts_columns получает переданный массив столбцов, где значение представляет собой отображаемый заголовок столбца, а ключ - внутренний идентификатор столбца. Идентификаторы стандартных столбцов могут включать эти и другие параметры: 'cb', 'title', 'author', `` 'date`` и т. Д. .

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

Снимок экрана с столбцом столбцов 'cb' как флажок.

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

  

$ new_posts_columns ['business'] = 'Businesses',

( Примечание , как я писал add_businesses_column_to_listing_list (), мне пришло в голову, что PHP должен иметь более простой способ чтобы вставить значение в ассоциативный массив в правильном порядке?!? Или, по крайней мере, в ядре WordPress есть функция, чтобы сделать это? Но так как Google меня подвела, я пошел с тем, что сработало. Если у кого-то есть какие-либо предложенные альтернативы Я буду все уши и благодарен заранее!)

Что, наконец, приводит нас к ...

Шаг # 4: Ключ действия manage_posts_custom_column

Вторая вещь из двух (2), которую нам нужно сделать, чтобы наши компании отображались в столбце, - это фактически выводить имя каждого из связанных компаний, используя manage_posts_custom_column действие. Этот крючок принимает два (2) параметра (column_id и post_id) и также вызывается из /wp-admin/includes/template.php ( в v3.0.1, вызов которого находится в строке 1459.):

& л;? PHP
add_action ('manage_posts_custom_column', 'show_businesses_column_for_listing_list', 10,2);
function show_businesses_column_for_listing_list ($ column_id, $ post_id) {
    global $ typenow;
    if ($ typenow == 'listing') {
        $ taxonomy = 'бизнес';
        switch ($ column_name) {
        деловые компании:
            $ business = get_the_terms ($ post_id, $ taxonomy);
            if (is_array ($ business)) {
                foreach ($ business as $ key => $ business) {
                    $ edit_link = get_term_link ($ business, $ taxonomy);
                    $ business [$ key] = '<a href = "'. $ edit_link. '">' , $ business-> имя. '& Л; /а >';
                }
                //echo implode («<br />», $ business);
                echo implode ('|', $ business);
            }
            ломать;
        }
    }
}

Этот крючок вызывается для каждого столбца для каждой строки post (/business). Сначала мы проверим, что мы действительно работаем только с типом post listing, а затем мы используем оператор switch для проверки на column_id. Я выбрал switch, потому что этот крючок часто используется для генерации вывода для разных столбцов, особенно если мы используем одну функцию для разных типов сообщений, которые могут выглядеть примерно так:

& л;? PHP
add_action ('manage_posts_custom_column', 'my_manage_posts_custom_column', 10,2);
function my_manage_posts_custom_column ($ column_id, $ post_id) {
    global $ typenow;
    switch ("{$ typenow}: {$ column_id}") {
    case 'listing: business':
        эхо "... что угодно ...";
        ломать;
    case 'listing: property':
        эхо "... что угодно ...";
        ломать;
    case 'agent: listing':
        эхо "... что угодно ...";
        ломать;
    }
}

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

Мы используем постоянную ссылку для гиперссылки на этот термин только потому, что мне нравится гиперссылка на вещи. Затем мы объединяем все гиперссылки (/business) вместе с символом pipe ('|') и выводим его в буфер PHP, который отправляет его клиенту /клиенту пользователя:

& л;? PHP
$ business = get_the_terms ($ post_id, $ taxonomy);
if (is_array ($ business)) {
    foreach ($ business as $ key => $ business) {
        $ edit_link = get_term_link ($ business, $ taxonomy);
        $ business [$ key] = '<a href = "'. $ edit_link. '">' , $ business-> имя. '& Л; /а >';
    }
    //echo implode («<br />», $ business);
    echo implode ('|', $ business);
}

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

Резюме

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

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

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

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

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

КОНЕЦ


Оригинальный ответ:

Привет @tarasm :

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

Как создать функцию сортировки по пользовательскому типу сообщения в администраторе WordPress

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

ответил MikeSchinkel 19 PM00000070000003731 2010, 19:58:37
43

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

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

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

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

    //отображать только эти таксономические фильтры по желаемым пользовательским спискам post_type
    global $ typenow;
    if ($ typenow == 'photos' || $ typenow == 'videos') {

        //создаем массив таксономических пулей, которые вы хотите фильтровать, - если вы хотите получить все таксономии, можете использовать get_taxonomies () для создания списка
        $ filters = array («растения», «животные», «насекомые»);

        foreach ($ filters as $ tax_slug) {
            //получить объект таксономии
            $ tax_obj = get_taxonomy ($ tax_slug);
            $ tax_name = $ tax_obj-> label-> имя;
            //получить массив терминных объектов для таксономии
            $ terms = get_terms ($ tax_slug);

            //выводить html для выпадающего фильтра таксономии
            echo "<select name = '$ tax_slug' id = '$ tax_slug' class = 'postform'>";
            echo "<option value = ''> Показать все $ tax_name </option>";
            foreach ($ terms as $ term) {
                //выводим каждую строку выбора select, проверяем на последний $ _GET, чтобы показать выбранную текущую опцию
                echo '<option value ='. $ term-> slug, $ _GET [$ tax_slug] == $ term-> slug? 'selected = "selected"': '', '>' , $ term-> имя. ' ('. $ term-> count.') </option> ';
            }
            echo "</select>";
        }
    }
}

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

ответил somatic 23 +04002010-10-23T09:00:36+04:00312010bEurope/MoscowSat, 23 Oct 2010 09:00:36 +0400 2010, 09:00:36
13

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

функция todo_restrict_manage_posts () {
    global $ typenow;
    $ args = array ('public' => true, '_builtin' => false);
    $ post_types = get_post_types ($ args);
    if (in_array ($ typenow, $ post_types)) {
    $ filters = get_object_taxonomies ($ typenow);
        foreach ($ filters as $ tax_slug) {
            $ tax_obj = get_taxonomy ($ tax_slug);
            wp_dropdown_categories (массив (
                'show_option_all' => __ ('Показать все'. $ Tax_obj-> label),
                'таксономия' => $ Tax_slug,
                'name' => $ Tax_obj- > имя,
                'orderby' => 'Term_order',
                'selected' => $ _GET [$ tax_obj- > query_var],
                «Иерархический» => $ Tax_obj- > иерархическая,
                'show_count' => ложный,
                'hide_empty' => правда
            ));
        }
    }
}
функция todo_convert_restrict ($ query) {
    глобальный $ pagenow;
    global $ typenow;
    if ($ pagenow == 'edit.php') {
        $ filters = get_object_taxonomies ($ typenow);
        foreach ($ filters as $ tax_slug) {
            $ var = & $ query-> query_vars [$ tax_slug];
            if (isset ($ var)) {
                $ term = get_term_by ('id', $ var, $ tax_slug);
                $ var = $ term-> slug;
            }
        }
    }
    return $ query;
}
add_action ('restrict_manage_posts', 'todo_restrict_manage_posts');
add_filter ( 'parse_query', 'todo_convert_restrict');

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

ответил Drew Gourley 23 MarpmWed, 23 Mar 2011 23:40:00 +03002011-03-23T23:40:00+03:0011 2011, 23:40:00
11

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

Изменить

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

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

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

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

add_action ('plugins_loaded', array ('WCM_Admin_PT_List_Tax_Filter', 'init'));
класс WCM_Admin_PT_List_Tax_Filter
{
    private static $ instance;

    public $ post_type;

    общедоступные таксономии;

    статическая функция init ()
    {
        null === self :: $ instance AND self :: $ instance = new self;
        return self :: $ instance;
    }

    публичная функция __construct ()
    {
        add_action ('load-edit.php', array ($ this, 'setup'));
    }

    настройка публичных функций ()
    {
        add_action (current_filter (), array ($ this, 'setup_vars'), 20);

        add_action ('restrict_manage_posts', array ($ this, 'get_select'));

        add_filter ("manage_taxonomies_for _ {$ this-> post_type} _columns", array ($ this, 'add_columns'));
    }

    public function setup_vars ()
    {
        $ this-> post_type = get_current_screen () -> post_type;
        $ this-> таксономии = array_diff (
            get_object_taxonomies ($ this-> post_type),
            get_taxonomies (array ('show_admin_column' => 'false'))
        );
    }

    public function add_columns ($ taxonomies)
    {
        return array_merge (таксономии, $ this-> таксономии);
    }


    public function get_select ()
    {
        $ walker = новый WCMF_walker;
        foreach ($ this-> таксономии как $ tax)
        {
            wp_dropdown_categories (массив (
                'таксономия' => $ Налог,
                'hide_if_empty' => правда,
                'show_option_all' => Sprintf (
                    get_taxonomy ($ tax) -> метки-> all_items
                ),
                'hide_empty' => правда,
                «Иерархический» => is_taxonomy_hierarchical ($ tax),
                'show_count' => правда,
                'orderby' => 'имя',
                'selected' => '0'! == get_query_var ($ tax)
                    ? get_query_var ($ tax)
                    : ложный,
                'name' => $ Налог,
                'id' => $ Налог,
                'walker' => $ Ходунки,
            ));
        }

    }

}

И тогда вам просто нужен настроенный класс Walker.

класс WCMF_walker расширяет Walker_CategoryDropdown
{
    public $ tree_type = 'category';
    public $ db_fields = array (
        'parent' => «Родитель»,
        'id' => 'Term_id',
    );
    public $ tax_name;

    public function start_el (& $ output, $ term, $ depth, $ args, $ id = 0)
    {
        $ pad = str_repeat ('& nbsp;', $ depth * 3);
        $ cat_name = apply_filters ('list_cats', $ term-> имя, $ term);
        $ output. = sprintf (
            '<option class = "level-% s" value = "% s"% s>% s% s </option>',
            $ Глубина,
            $ & GT перспектива,; пробковая,
            выбран (
                $ арг [ 'выбран'],
                $ & GT перспектива,; пробковая,
                ложный
            ),
            $ Подушечка. $ Cat_name,
            $ арг [ 'show_count']
                ? "& Амп; NBSP; & амп; NBSP; ({$ & GT перспективу,; число})"
                : ''
        );
    }
}
ответил kaiser 19 Jpm1000000pmSat, 19 Jan 2013 23:57:01 +040013 2013, 23:57:01
7

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

if ('page' == $ post_type)
        $ posts_columns = apply_filters ('manage_pages_columns', $ posts_columns);
    еще
        $ posts_columns = apply_filters ('manage_posts_columns', $ posts_columns, $ post_type);
    $ posts_columns = apply_filters ("manage _ {$ post_type} _posts_columns", $ posts_columns);

Итак, чтобы добавить новые столбцы, крюк add_filter должен выглядеть примерно так:

add_filter ('manage_posts_columns', 'my_add_columns', 10, 2);

Вот пример:

function my_add_columns ($ posts_columns, $ post_type)
{
  if ('myposttype' == $ post_type) {
    $ posts_columns = array (
      "cb" => "<input type = \" checkbox \ "/>",
      "title" => "Заглавие",
      "anothercolumn" => "Бекон",
      "date" => __( 'Дата' )
    );
    return $ posts_columns;
  }
}

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

по умолчанию:
            ? >
            <td <? php echo $ attributes?> <& phis;
                if (is_post_type_hierarchical ($ post-> post_type))
                    do_action ('manage_pages_custom_column', $ column_name, $ post-> ID);
                еще
                    do_action ('manage_posts_custom_column', $ column_name, $ post-> ID);
                do_action ("manage _ {$ post-> post_type} _posts_custom_column", $ column_name, $ post-> ID);
            ? > & Lt; /тд >
            & Lt;? PHP

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

add_action ("manage_ (here_goes_your_post_type) _posts_custom_column", "my_posttype_add_column", 10, 2);

Пример (в этом примере используются таксономии, но вы можете запросить любые другие вещи):

function my_posttype_add_column ($ column_name, $ post_id)
{
  switch ($ column_name) {
    case 'anothercolumn':
      $ flavors = get_the_terms ($ post_id, 'flavor');
      if (is_array ($ flavors)) {
        foreach ($ flavors as $ key => $ flavor) {
          $ edit_link = get_term_link ($ flavor, 'flavor');
          $ flavors [$ key] = '<a href = "'. $ edit_link. '">' , $ flavour-> имя. '& Л; /а >';
        }
        echo implode ('|', $ flavors);
      }
      ломать;

    по умолчанию:
      ломать;
  }
}
ответил mines 29 PM00000030000001131 2011, 15:44:11
6

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

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

Модифицируйте только: //изменить ЗДЕСЬ

function restrict_books_by_genre () {
    global $ typenow;
    $ post_type = 'books'; //изменить ЗДЕСЬ
    $ таксономия = 'жанр'; //изменить ЗДЕСЬ
    if ($ typenow == $ post_type) {
        $ selected = isset ($ _ GET [$ таксономия])? $ _GET [$ taxonomy]: '';
        $ info_taxonomy = get_taxonomy ($ таксономия);
        wp_dropdown_categories (массив (
            'show_option_all' => __ ("Показать все {$ info_taxonomy-> label}"),
            'таксономия' => $ Систематики,
            'name' => $ Систематики,
            'orderby' => 'имя',
            'selected' => $ Выбран,
            'show_count' => правда,
            'hide_empty' => правда,
        ));
    };
}

add_action ('restrict_manage_posts', 'restrict_books_by_genre');


функция convert_id_to_term_in_query ($ query) {
    глобальный $ pagenow;
    $ post_type = 'books'; //изменить ЗДЕСЬ
    $ таксономия = 'жанр'; //изменить ЗДЕСЬ
    $ q_vars = & $ query-> query_vars;
    if ($ pagenow == 'edit.php' & isset ($ q_vars ['post_type']) & & $ q_vars ['post_type'] == $ post_type & & isset ($ q_vars [$ таксономия]) & is_numeric ($ q_vars [$ таксономия]) & & $ q_vars [$ taxonomy]! = 0) {
        $ term = get_term_by ('id', $ q_vars [$ taxonomy], $ taxonomy);
        $ q_vars [$ taxonomy] = $ term-> slug;
    }
}

add_filter ('parse_query', 'convert_id_to_term_in_query');
ответил lacroixca 16 +04002011-10-16T07:54:53+04:00312011bEurope/MoscowSun, 16 Oct 2011 07:54:53 +0400 2011, 07:54:53
2

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

//регистрирует все выпадающие списки таксономического фильтра
function sunrise_fbt_add_taxonomy_filters () {
    global $ typenow; //текущий тип сообщения
    $ taxonomies = get_taxonomies ('', 'objects');
    foreach ($ taxonomies as $ taxName => $ tax) {
    if (in_array ($ typenow, $ tax-> object_type) & & $ taxName! = 'category' & & $ taxName! = 'tags') {
            $ terms = get_terms ($ taxName);
            if (count ($ terms)> 0) {
              //Проверяем, является ли иерархическое - если так построить иерархическое раскрывающееся меню
              if ($ tax-> иерархический) {
                $ args = array (
                      'show_option_all' => «Все». $ Tax-> label-> имя,
                      'show_option_none' => «Выбрать». $ Tax-> label-> имя,
                      'show_count' => 1,
                      'hide_empty' => 0,
                      'echo' => 1,
                      «Иерархический» => 1,
                      'depth' => 3,
                      'name' => $ Руль > переписать [ 'пули'],
                      'id' => $ Руль > переписать [ 'пули'],
                      'class' => 'Postform',
                      'depth' => 0,
                      'tab_index' => 0,
                      'таксономия' => $ TaxName,
                      'hide_if_empty' => ложный);
            $ args ['walker'] = new Walker_FilterByTaxonomy;
                wp_dropdown_categories ($ арг);
              } else {
                    echo "<select name = '". $ tax-> rewrite [' slug ']. "' id = '". $ tax-> переписать [' slug ']. "' class = 'postform'> «;
                    echo "<option value = ''> Показать все". $ tax-> label-> name. "</option>";
                    foreach ($ terms as $ term) {
              echo '<option value = "'. $ term-> slug. '"', $ _GET [$ taxName] == $ term-> slug? 'selected = "selected"': '', '>' , $ term-> имя. ' ('. $ term-> count.') </option> ';
            }
                    echo "</select>";
                }
            }
    }
    }
}
add_action ('restrict_manage_posts', 'sunrise_fbt_add_taxonomy_filters', 100);

/**
 * Создайте раскрывающийся список категорий.
 *
 * @package WordPress
 * @since 2.1.0
 * @uses Уолкер
 * /
класс Walker_FilterByTaxonomy расширяет Walker {
    var $ tree_type = 'category';
    var $ db_fields = array ('parent' => 'parent', 'id' => 'term_id');
    function start_el (& $ output, $ category, $ depth, $ args) {
      $ args ['selected'] = get_query_var ($ args ['taxonomy']);
        $ pad = str_repeat ('& nbsp;', $ depth * 3);

        $ cat_name = apply_filters ('list_cats', $ category-> name, $ category);
        $ output. = "\ t <option class = \" level- $ depth \ "value = \" ". $ category-> slug." \ "";
        if ($ category-> slug == $ args ['selected'])
            $ output. = 'selected = "selected"';
        $ output. = '>';
        $ output. = $ pad. $ cat_name;
        if ($ args ['show_count'])
            $ output. = '& nbsp; & nbsp; ('. $ category-> count. ')';
        if ($ args ['show_last_update']) {
            $ format = 'Y-m-d';
            $ output. = '& nbsp; & nbsp;' , gmdate ($ format, $ category-> last_update_timestamp);
        }
        $ output. = "</option> \ n";
        }
}

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

ответил Brad Trivers 17 FebruaryEurope/MoscowbFri, 17 Feb 2012 23:53:24 +0400000000pmFri, 17 Feb 2012 23:53:24 +040012 2012, 23:53:24
1

Иерархическая версия ответа @ somatic, запрошенная @kevin:

& л;? PHP
add_action ('restrict_manage_posts', 'my_restrict_manage_posts');
function my_restrict_manage_posts () {

    //отображать только эти таксономические фильтры по желаемым пользовательским спискам post_type
    global $ typenow;
    if ($ typenow == 'photos' || $ typenow == 'videos') {

        //создаем массив таксономических пулей, которые вы хотите фильтровать, - если вы хотите получить все таксономии, можете использовать get_taxonomies () для создания списка
        $ filters = array («растения», «животные», «насекомые»);

        foreach ($ filters as $ tax_slug) {
            //получить объект таксономии
            $ tax_obj = get_taxonomy ($ tax_slug);
            $ tax_name = $ tax_obj-> label-> имя;

            //выводить html для выпадающего фильтра таксономии
            echo "<select name = '$ tax_slug' id = '$ tax_slug' class = 'postform'>";
            echo "<option value = ''> Показать все $ tax_name </option>";
            generate_taxonomy_options ($ tax_slug, 0,0);
            echo "</select>";
        }
    }
}

function generate_taxonomy_options ($ tax_slug, $ parent = '', $ level = 0) {
    $ args = array ('show_empty' => 1);
    if (! is_null ($ parent)) {
        $ args = array ('parent' => $ parent);
    }
    $ terms = get_terms ($ tax_slug, $ args);
    $ Вкладка = '';
    для ($ I = 0; $ я < $ уровня; $ я ++) {
        $ Вкладка = '-'.
    }
    foreach ($ terms as $ term) {
        //выводим каждую строку выбора select, проверяем на последний $ _GET, чтобы показать выбранную текущую опцию
        echo '<option value ='. $ term-> slug, $ _GET [$ tax_slug] == $ term-> slug? 'selected = "selected"': '', '>' . $ Таб. $ term-> имя. ' ('. $ term-> count.') </option> ';
        generate_taxonomy_options ($ tax_slug, $ term-> term_id, $ level + 1);
    }

}
? >

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

ответил Manny Fleurmond 7 Jam1000000amFri, 07 Jan 2011 10:12:50 +030011 2011, 10:12:50
1

Обновление ответа @Drew Gourley для WP 3.3.1 (и включение кода из http://wordpress.org/support/topic/wp_dropdown_categories-generating-url-id-number-instead-of-slug?replies=6#post- 2529115 ):

add_action ('restrict_manage_posts', 'xyz_restrict_manage_posts');
function xyz_restrict_manage_posts () {
    global $ typenow;

    $ args = array ('public' => true, '_builtin' => false);
    $ post_types = get_post_types ($ args);

    if (in_array ($ typenow, $ post_types)) {
        $ filters = get_object_taxonomies ($ typenow);

        foreach ($ filters as $ tax_slug) {
            $ tax_obj = get_taxonomy ($ tax_slug);
            $ term = get_term_by ('slug', $ _GET [$ tax_obj-> query_var], $ tax_slug);

            wp_dropdown_categories (массив (
                'show_option_all' => __ ('Показать все'. $ Tax_obj-> label),
                'таксономия' => $ Tax_slug,
                'name' => $ Tax_obj- > имя,
                'orderby' => 'Term_order',
                'selected' => $ & GT перспектива,; term_id,
                «Иерархический» => $ Tax_obj- > иерархическая,
                'show_count' => ложный,
                //'hide_empty' => правда,
                'hide_empty' => ложный,
                'walker' => новый DropdownSlugWalker ()
            ));
        }
    }
}


//Класс отсечения фильтра. Используется с wp_dropdown_categories (), чтобы в результате выпадающего списка использовались термины slugs вместо ids.
класс DropdownSlugWalker расширяет Walker_CategoryDropdown {

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

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

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

        $ output. = '>';
        $ output. = $ pad. $ cat_name;
        $ output. = "</option> \ n";
    }
}
ответил rinogo 26 Jam1000000amSat, 26 Jan 2013 00:47:17 +040013 2013, 00:47:17
1

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

  1. Добавляет столбец таксономии в представление списка типа сообщения администратора
  2. Нажимая имя термина в столбце taxonomy, он фактически фильтрует список для этого термина .

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

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

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

ответил Stratboy 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 15 Sep 2017 15:00:54 +0300 2017, 15:00:54
0

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

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

ответил 27 MonEurope/Moscow2010-12-27T23:37:04+03:00Europe/Moscow12bEurope/MoscowMon, 27 Dec 2010 23:37:04 +0300 2010, 23:37:04
0

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

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

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

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

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

ответил kevin 6 Jpm1000000pmThu, 06 Jan 2011 22:00:53 +030011 2011, 22:00:53
0

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

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

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

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

ответил eddiemoya 28 MaramFri, 28 Mar 2014 00:04:55 +04002014-03-28T00:04:55+04:0012 2014, 00:04:55

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132