Question

J'ai créé un Custom Post Type 'listing' et ajout d'une Taxonomie Personnalisée appelé 'businesses'.Je voudrais ajouter une liste déroulante des Entreprises à l'administrateur de la liste pour les Listes.

Voici ce que cette fonctionnalité ressemble dans l'admin de la liste des Postes (Je voudrais le même pour mon Custom Post Type):

Categories Dropdown in Posts

Voici mon code actuel (Et voici le même code sur les 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();
}

Comment puis-je faire ajouter une liste déroulante des Entreprises à l'administrateur de la liste pour les Listes?

Était-ce utile?

La solution

Mise à JOUR: J'ai inclus une nouvelle réponse complète mais même ainsi, j'ai quitté ma réponse initiale au fond de laquelle les premiers commentaires de référence.


Salut @tarasm:

Bien que je l'ai dit, il ne devrait pas être difficile, il est un peu impliqué.Mais avant de nous plonger dans le code...

Les Captures D'Écran:

...nous allons vérifier quelques captures d'écran pour le produit fini:

Les listes la liste de page avec Pas de Filtrage:

Listings list page with No Filtering
(source: mikeschinkel.com)

Les listes la liste de page Avec Filtrage:

Listings list page With Filtering
(source: mikeschinkel.com)

Le Code

Donc, ici, nous allons...(Note: J'ai utilisé une forme singulière de la taxonomie nom de business;J'espère que les matches de votre.À partir de lots de l'expérience avec WordPress et développement de base de données dans le passé, je crois qu'il est préférable de le faire de cette façon.)

Étape #1:L' restrict_manage_posts action crochet.

La première chose que vous devez faire est de connecter l' restrict_manage_posts action qui n'a pas de paramètres et est appelée à partir de /wp-admin/edit.php (en v3.0.1 que l'appel est en ligne 378.) Cela vous permettra de générer la liste déroulante, sélectionnez à l'endroit approprié au-dessus de la liste de Liste de messages.

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

On commence par la vérification de l' $typenow variable pour nous assurer que nous sommes en fait sur un post_type de listing.Si vous n'en avez pas, vous obtiendrez cette liste déroulante pour tous les types de poste qui, dans certains cas, est ce que vous voulez, mais pas à ce cas.

Ensuite, nous charger de l'information sur l'entreprise taxonomie à l'aide de get_taxonomy().Nous en avons besoin pour récupérer l'étiquette de la taxinomie (c'est à dire"Les entreprises";nous pourrions avoir codé en dur, mais ce n'est pas très bon si vous avez besoin d'internationaliser plus tard.) Ensuite, nous appelons wp_dropdown_categories() avec tous les arguments appropriés, dans le $args tableau pour générer la liste déroulante

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

Mais quels sont les arguments?Examinons chacun individuellement:

  • show_optional_all - Assez simple, c'est ce qui est affiché dans le menu déroulant en premier et quand il n'y a pas de filtrage appliquée.Dans notre cas, il va donc être "Montrer Toutes Les Entreprises"mais nous pourrions vous l'avez appelé "Inscriptions pour Toutes les Entreprises" ou ce que vous voulez.

  • taxonomy - Ce des arguments indique la fonction de ce que la taxonomie de tirer termes, même si la fonction a categories en son nom.Dans la v2.8 et antérieures WordPress n'ai pas de custom taxonomies mais quand ils ont été ajoutés à l'équipe a décidé qu'il serait plus facile d'ajouter une taxonomie argument de cette fonction que de créer une autre fonction avec un autre nom.

  • name - Cet argument permet de spécifier la valeur que WordPress avec l'utilisation de la name attribut de l' <select> élément généré pour le menu déroulant.Juste au cas où il n'est pas évident c'est aussi la valeur qui sera utilisée dans l'URL lors du filtrage.

  • orderby - Cet argument indique WordPress façon de trier les résultats par ordre alphabétique.Dans notre cas, nous avons spécifié à la commande d'acheter le name les termes de la taxonomie, c'est à direles noms commerciaux dans ce cas.

  • selected - Cet argument est nécessaire pour que la liste déroulante pouvez afficher le filtre dans la liste déroulante.Il devrait être le term_id à partir du terme de taxonomie.Dans notre cas, il pourrait être la term_id à partir de "Business #2".Où pouvons-nous obtenir cette valeur?À partir de WordPress, une variable globale $wp_query;il a une propriété query que contient un tableau de tous les paramètres de l'URL et de leurs valeurs (à moins que certains rebelle plugin modifié déjà, bien sûr.) Compte tenu de la façon dont WordPress processus les choses, il sera un term URL paramètre passé dans l'URL lorsque l'utilisateur clique sur le bouton filtre, si l'utilisateur a sélectionné un terme valide (c'est à direla liste des entreprises).

  • hierarchical Par cette définition true vous dites à la fonction à l'égard de la nature hiérarchique de la taxonomie et de les afficher dans une vue en arborescence si les conditions (entreprises) dans le fait d'avoir des enfants.Pour une capture d'écran pour voir à quoi ça ressemble, voir ci-dessous.

  • depth - Cet argument collabore avec l' hierarchical argument pour déterminer le nombre de niveaux de la fonction devrait aller dans l'affichage des enfants.

  • show_count - Si true cet argument va afficher le nombre de postes à l'intérieur des parenthèses à gauche de la durée de nom dans le menu déroulant.Dans ce cas, il serait d'afficher le nombre de listes associées avec les entreprises.Pour une capture d'écran pour voir à quoi ça ressemble, voir ci-dessous.

  • hide_empty - Enfin, si il y a des termes de la taxonomie qui sont pas associé à un post (c'est à direentreprises qui ne sont pas associés à l'inscription), puis de mettre ce paramètre à true va omettre de les inclure dans la liste déroulante.

Taxonomy Drop Down should hierarchy and counts
(source: mikeschinkel.com)

Étape #2:L' parse_query filtre crochet.

Ensuite, nous appelons de nos attentions à la parse_query filtre crochet qui a un seul paramètre ($query) et est appelé à partir de /wp-includes/query.php (en v3.0.1 que l'appel est en ligne 1549.) Elle est appelée quand WordPress a terminé l'inspection de l'URL et le réglage de toutes les valeurs appropriées dans la population active actuellement $wp_query y compris des choses comme $wp_query->is_home et $wp_query->is_author, etc.

Après l' parse_query filtre crochet court WordPress va appeler get_posts() et de la charge, une liste des postes en fonction de ce qui est spécifié dans la population active actuellement $wp_query.Donc parse_query est souvent un endroit idéal pour obtenir WordPress pour changer son esprit au sujet de quels sont les postes qu'il va charger.

Dans votre cas d'utilisation, nous voulons obtenir WordPress pour filtrer sur la base des entreprises sélectionnées;c'est à direpour afficher uniquement les annonces qui ont été associés avec l'entreprise sélectionnée (je dirais "...seulement ces annonces qui ont été "catégorisation" par l'entreprise sélectionnée" mais ce n'est pas technique correcte; category est-il propre taxonomie sur les réseaux peer avec business sauf que category est intégré dans WordPress et business c'est personnalisé.Mais pour ceux qui sont familiers avec la catégorisation des postes cela peut vous aider à comprendre car ils fonctionnent presque de la même manière.Mais je m'égare...)

Sur le code.La première chose à faire est de saisir une référence à l'actif actuellement $wp_query's query_vars de sorte qu'il est plus pratique de travailler avec, juste comme la façon dont son fait à l'intérieur de WordPress propre parse_query() fonction.Contrairement à $wp_query->query qui est utilisé pour refléter les paramètres passés dans l'URL de la $wp_query->query_vars tableau est utilisé pour contrôler la requête que WordPress fonctionne et est prévu pour être modifié.Donc, si vous avez besoin de modifier un, ce serait l'un (au moins je pense c'est la différence entre les deux;si quelqu'un sait autrement merci laissez-moi savoir afin que je puisse mettre à jour ce sujet!)

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

Ensuite, nous test $pagenow pour s'assurer que nous sommes, en effet, le chargement de WordPress à partir du chemin d'accès d'URL /wp-admin/edit.php.Nous faisons cela pour maintenir accidentellement le vissage des requêtes sur d'autres pages.Nous avons également vérifier pour s'assurer que nous avons à la fois business en tant que taxonomy élément et un term l'élément de trop.(Note taxonomy et term sont une paire;ils sont utilisés ensemble pour permettre l'interrogation d'un terme de taxonomie;dois avoir deux ou WordPress ne sais pas qui taxonomie pour l'inspecter.)

Vous pourriez vous demander comment business transformé en taxonomy élément de la query_vars tableau.Ce que nous avons écrit dans notre parse_query crochet déclenché WordPress interne de la magie qui a été mis en attente lorsque vous avez enregistré l' "business"taxonomie par la mise en query_var pour être vrai (register_taxonomy() des exemplaires le nom de la taxonomie comme sa query_var;vous pouvez le changer, bien sûr, mais sauf si vous avez un conflit, il est préférable de rester avec le même):

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

Maintenant WordPress' $wp_query a été écrit pour utiliser les limaces pour la norme de la taxonomie filtré requêtes, pas taxonomie terme de l'IDs.Pour ce cas d'utilisation que nous avons vraiment besoin de faire notre requête de filtrage de travail sont les suivants:

taxonomy: entreprise

term: d'affaires de 1 (c'est à direl' slug)

Pas ces:

taxonomy: entreprise

term: 27 (c'est à direl' term_id)

Il est intéressant de noter, et malheureusement, les déroulante généré par wp_dropdown_categories() définir le <option>'s value l'attribut du terme(/entreprise) term_id, pas le terme slug.Nous avons donc besoin de les convertir $wp_query->query_vars['term'] à partir d'un numérique term_id à la chaîne slug comme suite à l'extrait accroché à partir de ci-dessus (Notez que ce n'est pas le plus performant façon d'interroger une base de données, mais jusqu'à ce que WordPress ajoute le support pour term_ids dans sa requête que c'est le meilleur que nous pouvons faire!):

<?php
$term = get_term_by('id',$qv['term'],'business');
$qv['term'] = $term->slug;

Et c'est tout!Avec ces deux fonctions, vous obtenez le filtrage que vous désirez.

MAIS ATTENDEZ, IL YA PLUS!:-)

Je suis allé de l'avant et a ajouté "Les entreprises" colonne de votre liste de Cotation parce que, eh bien, je savais que ça allait être votre prochaine question.Sans avoir une colonne pour ce que vous filtre, il peut être très déroutant pour l'utilisateur final.(J'ai lutté avec moi-même, et j'ai été le codeur!) Bien sûr, vous pouvez déjà voir la "Les entreprises" colonne en avant les captures d'écran ci-dessus.

Étape #3:L' manage_posts_columns filtre crochet.

Pour ajouter une colonne à la liste des messages prend l'appel de deux (2) plus de crochets.Le premier est manage_posts_columns ou le type de poste spécifique à la version manage_listing_posts_columns que j'ai appelé à la place.Il accepte un seul paramètre (posts_columns) et est appelé à partir de /wp-admin/includes/template.php (en v3.0.1 que l'appel est en ligne 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;
}

Votre manage_posts_columns crochet de la fonction reçoit un tableau de colonnes dont la valeur est de l'affichage de l'en-tête de colonne et la clé est à l'intérieur de la colonne d'identifiant.Standard de la colonne des identifiants pouvez inclure ces et plus: 'cb', 'title', 'author', `'date", etc.

'cb', est l' checkbox la colonne et les deux 'title' et 'date' reportez-vous à post_title et post_date à partir de la wp_posts tableau, respectivement. 'author' bien sûr, le post_author champ après le nom de l'auteur est extrait de l' wp_users table.

Screenshot of the 'cb' posts column as a checkbox.
(source: mikeschinkel.com)

Pour l' manage_posts_columns crochet nous sommes tout simplement désireux d'insérer notre colonne businesses dans le $posts_columns tableau avant de 'author', en supposant qu'une autre plugin n'a pas été éliminée author à partir de la liste de!

$new_posts_columns['businesses'] = 'Businesses';

(Note comme je l'ai écrit add_businesses_column_to_listing_list() il m'est apparu que PHP doit avoir un moyen plus facile d'insérer une valeur dans un tableau associatif dans le bon ordre?!?Ou au moins, il y a obtenu d'être une fonction de base WordPress pour le faire?Mais depuis que Google permettez-moi de sorte que je suis allé avec ce qui a fonctionné.Si quelqu'un a des solutions de rechange proposées, je vais être à l'écoute et apprécie à l'avance!)

Qui enfin nous amène à...

Étape #4:L' manage_posts_custom_column action crochet

La deuxième chose est de deux (2) nous devons faire pour rendre nos entreprises d'affichage dans la colonne, c'est le nom de chacun des associés des entreprises à l'aide de la manage_posts_custom_column action crochet.Ce crochet accepte deux (2) paramètres (column_id et post_id) et est également appelée à partir de /wp-admin/includes/template.php (en v3.0.1 que l'appel est en ligne 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;
        }
    }
}

Ce hook est appelé pour chaque colonne pour chaque poste (ou affaires) de ligne.Nous avons d'abord vérifier que nous sommes en effet à travailler uniquement avec les listing custom post type et ensuite, nous utilisons un switch déclaration de tester la column_id.J'ai choisi switch parce que ce crochet est souvent utilisé pour générer la sortie de plusieurs colonnes différentes, surtout si nous utilisons une fonction pour beaucoup de différents types de poste qui pourrait ressembler à quelque chose comme ceci:

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

L'inspection de notre cas d'utilisation, juste un peu plus près, vous voyez le get_the_terms() fonction qui retourne simplement la liste des termes de cette taxonomie (c'est à direles entreprises de cette liste.) Ici obtenir l' permalien pour le terme avant la fin de la page web que normalement les listes de postes qui sont associées avec le terme, mais bien sûr, pourraient différemment en fonction du thème et/ou des plugins installés.

Nous utilisons le permalien de lien hypertexte le terme juste parce que j'aime le lien hypertexte choses.Nous avons ensuite fusionner tous les hyperliens des termes (ou des entreprises), ensemble, séparés, avec le tube ('|') le caractère et la sortie pour le PHP tampon qui l'envoie au navigateur de l'utilisateur/client 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);
}

MAINTENANT nous sommes finalement fait.

Résumé

Donc en résumé, vous devez utiliser les quatre (4) crochets à obtenir à la fois un filtre et une colonne dans la boîte de messages de la liste de la page (Oh, il va également travailler avec les Messages et les Pages.) Ils sont les suivants:

  • Étape #1:L' restrict_manage_posts action crochet.
  • Étape #2:L' parse_query filtre crochet.
  • Étape #3:L' manage_posts_columns filtre crochet.
  • Étape #4:L' manage_posts_custom_column action crochet

Où télécharger le code

Mais si je vous a forcé à lire tous les ci-dessus, alors je ne serait certainement pas être une personne très agréable si j'ai aussi fait de creuser le code juste pour être en mesure de l'essayer!Mais contrairement à ce que certains disent, je suis de nice.Donc, ici, ya go:

REMARQUE de @tarasm:J'ai inclus des crochets pour une register_post_type() et register_taxonomy() afin que d'autres puissent l'essayer sans avoir à les recréer.Vous aurez probablement envie de supprimer ces deux appels de fonction avant de la tester.

LA FIN


Origine De La Réponse:

Salut @tarasm:

Vous êtes à la recherche pour un menu déroulant en haut comme cet écran, ou vous êtes à la recherche pour une liste déroulante pour afficher des et si oui, comment vous attendez-vous au travail?

How to Create Sort By functionality for a Custom Post Type in the WordPress Admin
(source: mikeschinkel.com)

Dans le premier cas, jetez un oeil à ce lieu de répondre à la question Comment trier la zone d'administration de Wordpress custom post type par un champ personnalisé? Si c'est ce que vous avez besoin je peux fournir plus de spécificités liées à la taxonomie.

Autres conseils

Je voulais juste partager une autre mise en oeuvre. Je n'ai pas eu tutoriel incroyable de Mike quand j'essayant de se faire, donc ma solution est un peu différent. Plus précisément, je vais simplifier Mike Étape # 1 et éliminer Étape # 2 -. Les autres étapes sont encore applicables

tutoriel Dans Mike, en utilisant wp_dropdown_categories() nous sauve une liste construction manuelle, mais nécessite une modification de la requête conditionnelle compliquée ( Étape # 2 ) pour gérer son utilisation d'ID au lieu de limace. Sans parler de la difficulté de modifier ce code pour faire face à d'autres scénarios, tels que les filtres de taxonomie multiples ..

Une autre approche consiste à tout simplement pas utiliser le wp_dropdown_categories() défectueux du tout, mais au lieu de construire nos propres listes de sélection déroulantes à partir de zéro. Il est pas si compliqué, prend moins de 30 lignes de code, et ne nécessite pas l'accrochage parse_query du tout:

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

En branchant simplement les taxonomies souhaitées dans le tableau de $filters, vous pouvez plusieurs filtres de taxonomie rapidement sortie. Ils apparaissent exactement les mêmes que celles dans les captures d'écran de Mike. Ensuite, vous pouvez suivre avec Étape # 3 et # 4 .

Voici une version de ce qui crée automatiquement et applique des filtres de toutes les taxonomies applicables à tous les types de postes personnalisés qui les utilisent. (Quelle bouchée) Quoi qu'il en soit, j'ai aussi pincé si cela fonctionne avec wp_dropdown_categories () et WordPress 3.1. Le projet sur lequel je travaille est appelé ToDo, vous pouvez renommer les fonctions à quelque chose qui fait sens pour vous, mais cela ne devrait assez de travail pour tout automatiquement.

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

Notez que j'utilise un plugin qui ajoute « term_order » comme un moyen de termes d'ordre, vous devrez changer, ou supprimer cet argument pour revenir sur la valeur par défaut.

réponse tardive

Modifier

J'ai écrit Filterama , un plugin ajoutera cette fonctionnalité la plus simple possible.

Mise à jour pour WordPress 3.5 +

Maintenant que les choses sont beaucoup plus faciles, voici une très solution simple plugin ou mu-plugin.

Il utilise aussi moins de ressources que les charges possibles, uniquement sur les écrans nécessaires et ajoute des colonnes + filtres pour chaque taxonomie personnalisée.

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

    }

}

Et puis vous avez juste besoin d'une classe Walker sur mesure.

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})"
                : ''
        );
    }
}

Je voulais juste faire une note rapide. Sur les versions plus récentes de WP, post sur des listes d'administration sont gérées par la classe WP_Posts_List_Table. Le code est maintenant apply_filters suit comme:

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

Donc, pour ajouter de nouvelles colonnes un crochet add_filter devrait ressembler à ceci:

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

Ici va un exemple:

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

Maintenant, pour les lignes de poste. Ceci est le code qui gère les données de colonnes sur les listes:

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

Afin de récupérer nos messages de données, nous devons ajouter un crochet d'action comme ceci:

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

Exemple (cet exemple utilise des taxonomies, mais vous pouvez interroger toute autre substance):

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

OEUVRES WP 3.2!

custom_post_type: Livres custom_taxonomy: genre

modifions seulement étaient il dit: // changement ICI

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

Voici une façon de le faire en utilisant l'action restrict_manage_posts. Il semble bien fonctionner pour moi et ajoute la possibilité de filtrer par taxonomie pour tous les types de postes et il taxonomies liées.

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

Une note - j'ai essayé de restreindre la profondeur parce que certains de mes taxonomies hiérarchiques sont assez grandes, mais ça n'a pas marché - pourrait être un bogue dans la fonction wp_dropdown_categories

Ce n'est pas bien connue, je suppose, mais de 3,5 wordpress, vous pouvez passer à 'show_admin_column' => true register_taxonomy. Cela fait 2 choses:

  1. Ajoute la colonne de taxonomie à la vue de la liste de type post-admin
  2. En cliquant sur le nom du terme sur la colonne de taxonomie, il sera dans le filtre de fait la liste à ce terme .

Alors, pas exactement la même chose que d'avoir une sélection, mais presque la même fonctionnalité, largeur qu'une seule ligne de code.

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

En outre, comme vous pouvez le lire, il y a un nouveau filtre adapté pour la colonne ajout manuel de taxonomie (si vous avez vraiment besoin).

La version hiérarchique de la réponse de @ somatiques, tel que demandé par @ 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);
    }

}
?>

Je retire essentiellement le code qui a créé les options et le mettre dans sa propre fonction. La fonction « generate_taxonomy_options », en plus de prendre le tax_slug, prend également un paramètre de parent et de niveau. La fonction suppose que la création d'options pour le parent 0, ce qui sélectionnera tous les termes de niveau racine. Dans la boucle la fonction récursive appeler lui-même, en utilisant ce terme en cours en tant que parent et en augmentant le niveau d'un. Il ajoute automatiquement les tiques sur le côté plus vous allez vers le bas l'arbre et le tour est joué!

Mise à jour de la réponse de @Drew Gourley pour WP 3.3.1 (et le code incorporant 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";
    }
}

Toutes mes excuses pour le fait que, en tant que nouvel utilisateur, je ne peux pas poster des commentaires, mais je peux poster une réponse ...

de WordPress 3.1 (RC 1) de la réponse de Mike (qui m'a si bien servi les deux derniers pendant des mois) ne fonctionne plus pour moi; limitant par un enfant de taxonomie donne un résultat vide. J'ai essayé la mise à jour de Somatic et il a très bien fonctionné; mieux encore, il fonctionne avec taxonomie multiples requêtes qui a été travaillé dans cette version.

Juste essayé les deux codes, de Mike et somatique et se demandait comment obtenir une chose de chaque technique:

Avec le code de Mike, il affiche la liste déroulante avec hiérarchique , ce qui aide beaucoup. Mais afin d'afficher deux listes déroulantes je devais reproduire la déclaration de if ($typenow=='produtos') {...} dans la fonction restrict_listings_by_business() et aussi la if ($pagenow=='edit.php' && ... } dans la fonction convert_business_id_to_taxonomy_term_in_query($query) qui donne maintenant beaucoup de code.

i juste besoin Avec le code somatique pour spécifier les taxonomies je voudrais voir comme dropdowns et bam, œuvres; $filters = array('taxo1', 'taxo2');

Question: puis-je obtenir l'approche de somatiques et ont également la hiérarchique

?

Merci beaucoup en tout cas pour ce tutoriel, beaucoup aidé!

tutoriel de Mike sur ce qui est excellent! Je ne serais probablement pas pris la peine d'ajouter cette ai fonctionnalité à mon plugin Catégories médias si j'aurais dû le comprendre moi-même.

Cela dit, je pense que l'aide parse_query puis obtenir ensuite la requête pour le terme n'est pas nécessaire. Il est plus propre pour créer votre propre classe marcheur personnalisé. Peut-être que cela n'a pas été possible quand il a écrit son poste -. Ses 3 ans au moment de ma rédaction de ce

Commander ce grand extrait sur GitHub. Fonctionne comme un charme, change l'ID de valeurs dans les déroulantes dans les limaces, donc il fonctionne nativement sans modifier la requête.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top