it-swarm-eu.dev

Přidání filtru taxonomie do seznamu správců pro vlastní typ příspěvku?

Vytvořil jsem vlastní typ příspěvku nazvaný 'listing' a přidal vlastní taxonomii nazvanou 'businesses'. Chtěl (a) bych do seznamu administrátorů pro výpisy přidat rozevírací seznam firem.

Jak vypadá tato funkce v seznamu admin pro Příspěvky (pro stejný typ příspěvku bych chtěl stejný):

Categories Dropdown in Posts

Zde je můj aktuální kód ( A tady je stejný kód na 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();
}

Jak mohu přidat seznam rozevíracích seznamů firem do seznamu admin?

128
Taras Mankovski

UPDATE: Vložil jsem novou úplnou odpověď, ale i tak jsem opustil svou původní odpověď v dolní části, na kterou odkazuje několik prvních komentářů.


Hi @tarasm :

I když jsem říkal, že by to nemělo být těžké, je to málo. Ale než začneme kopat do kódu ...

Snímky obrazovky:

... podívejme se na nějaké snímky obrazovky pro hotový produkt:

Stránka seznamu výpisů s Ne Filtrování:

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

Stránka seznamu výpisů With Filtrování:

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

Kód

Tak tady máme jít ... ( Poznámka: Použil jsem jednotný formulář pro název taxonomie business; doufám, že to odpovídá vašemu. Od mnoha zkušeností s vývojem WordPressu a databází v minulosti tomu věřím je to nejlepší.

Krok # 1: Akce restrict_manage_posts akce.

První věc, kterou musíte udělat, je zavolat akci restrict_manage_posts, která nemá žádné parametry, a zavolá se z /wp-admin/edit.php (ve v3.0.1 je toto volání na lince 378). seznam příspěvků.

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

Začneme kontrolou $typenow proměnné, abychom zajistili, že jsme vlastně na post_typelisting. Pokud nechcete, dostanete tento rozevírací seznam pro všechny typy příspěvků, které jsou v některých případech to, co chcete, ale ne tento případ.

Dále načteme informace o obchodní taxonomii pomocí get_taxonomy(). Potřebujeme, aby bylo možné získat označení pro taxonomii (tj. „Firmy“; mohli bychom mít pevný kód, ale to není příliš dobré, pokud budete potřebovat internacionalizaci později.) Pak voláme wp_dropdown_categories() se všemi příslušnými argumenty v poli $args generují rozevírací seznam

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

Jaké jsou však vhodné argumenty? Podívejme se na každou jednotlivě:

  • show_optional_all- Docela přímočaré, je to to, co je zobrazeno v rozevíracím seznamu na první a když nebylo použito žádné filtrování. V našem případě to tak bude "Zobrazit všechny podniky", ale mohli bychom to nazvat "Výpisy pro všechny podniky" nebo cokoliv chcete.

  • taxonomy- Tyto argumenty říkají funkci co taxonomie vytáhne termíny, i když má funkce categories ve svém názvu. Ve verzi v2.8 a dřívější WordPress neměl vlastní taxonomie, ale když byly přidány, tým se rozhodl, že by bylo jednodušší přidat argument této taxonomie než vytvořit jinou funkci s jiným názvem.

  • name- Tento argument umožňuje zadat hodnotu, kterou WordPress použije pro atribut name prvku <select> vytvořeného pro rozevírací seznam. V případě, že to není zřejmé, je to také hodnota, která bude použita v URL při filtrování.

  • orderby- Tento argument říká WordPressu, jak objednávat výsledky abecedně. V našem případě jsme určili, že si objednáme nákup name termínů v taxonomii, tj. Obchodních jmen v tomto případě.

  • selected- Tento argument je nutný, aby rozevírací seznam mohl zobrazit aktuální filtr v rozevíracím seznamu. Mělo by to být term_id z vybraného termínu taxonomie. V našem případě to může být term_id z "Business # 2". Kde získáme tuto hodnotu? Z globální proměnné WordPressu $wp_query; má vlastnost query, která obsahuje pole všech parametrů URL a jejich hodnot (pokud některý wayward plugin to již samozřejmě neupravil.) Vzhledem k tomu, jak WordPress zpracovává věci, bude parametr term URL předán URL, když uživatel klikne tlačítko filtr, pokud uživatel zvolil platný termín (tj. jeden z uvedených podniků).

  • hierarchical- Nastavením na true řeknete funkci, aby respektovala hierarchickou povahu taxonomie a zobrazovala je ve stromovém zobrazení, pokud termíny (podniky) ve skutečnosti mají děti. Chcete-li zjistit, jak to vypadá, podívejte se níže.

  • depth- Tento argument spolupracuje s argumentem hierarchical, aby určil, kolik úrovní by měla funkce funkce zobrazovat při zobrazování dětí.

  • show_count- Pokud true tento argument zobrazí počet příspěvků v závorkách nalevo od názvu v rámci rozevíracího seznamu. V tomto případě by se zobrazil počet záznamů spojených s podniky. Chcete-li zjistit, jak to vypadá, podívejte se níže.

  • hide_empty- Konečně, pokud v taxonomii existují termíny, které jsou s {ne spojeny s příspěvkem (tj. podniky, které nejsou spojeny se zápisem), pak nastavení na true vynechá zahrnutí v rozevíracím seznamu.

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

Krok # 2: Háček filtru parse_query.

Dále zavoláme naše pozornosti k háčku parse_query, který má jeden parametr ($query) a je volán z /wp-includes/query.php (v v3.0.1, že volání je na lince 1549.) Volá se, když WordPress dokončil kontrolu adresy URL a nastavil všechny příslušné hodnoty v aktuálně aktivní $wp_query včetně věcí jako $wp_query->is_home a $wp_query->is_author atd.

Po spuštění zavěšení parse_query zavěsí WordPress zavolá get_posts() a načte seznam příspěvků podle toho, co je zadáno v aktuálně aktivním $wp_query. Takže parse_query je často skvělým místem k tomu, aby WordPress změnil názor na to, které příspěvky bude načíst.

Ve vašem případě použití chceme, aby WordPress filtroval na základě vybraných podniků; tj. zobrazit pouze ty záznamy, které byly přidruženy k vybranému podniku (řekl bych, že {"... pouze ty záznamy, které byly" kategorizovány "podle vybrané firmy" ale není to správné, category je to jeho vlastní taxonomie na peer s business kromě toho, že category je zabudováno do WordPressu a business je zvykem, ale pro ty, kteří jsou seznámeni s kategorizací příspěvků, to může pomoci pochopit, jak fungují téměř identicky. .)

Na kód. První věc, kterou děláme, je chytit odkaz na aktuálně aktivní $wp_query 's query_vars, takže je vhodnější pracovat s ním, stejně jako jeho vlastní funkce parse_query() WordPress. Na rozdíl od $wp_query->query, který se používá k zrcadlení parametrů předaných na URL, se pole $wp_query->query_vars používá k řízení dotazu, který WordPress spouští a očekává se, že bude změněn. Takže pokud potřebujete upravit jeden, tak by to bylo jedno (alespoň I myslím to je rozdíl mezi těmito dvěma, pokud někdo ví jinak prosím dejte mi vědět, abych mohl aktualizujte to!)

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

Dále testujeme $pagenow, abychom zajistili, že skutečně načítáme WordPress z cesty URL /wp-admin/edit.php. Děláme to proto, abychom zabránili náhodnému zašifrování dotazů na jiných stránkách. Také se ujistíme, že máme business jako prvek taxonomy a také prvek term. (Poznámka taxonomy a term jsou dvojice; jsou používány společně, aby umožnily dotazování termínu taxonomie; musí mít obojí nebo WordPress neví, kterou taxonomii zkontrolovat.)

Možná se divíte, jak se business objevilo v taxonomy prvku pole query_vars. Co jsme napsali v našem parse_query háčku spouštěném interním magickém programu WordPress ', který byl položen v čekání, když jste zaregistrovali "business" taxonomii nastavením query_var na true (register_taxonomy() zkopíruje název taxonomie jako query_var; můžete ji samozřejmě změnit, ale samozřejmě pokud nemáte konflikt, je nejlepší držet se stejného):

<?php
add_action('init','register_business_taxonomy');
    function register_business_taxonomy() {
        register_taxonomy('business',array('listing'),array(
        'label' => 'Businesses',
        'public'=>true,
        'hierarchical'=>true,
        'show_ui'=>true,
        'query_var'=>true
    ));
}

WordPress '$ wp_query byl napsán pro použití slimáků pro standardní dotazy filtrované pomocí taxonomie, nikoli ID výrazů taxonomie. Pro tento případ použití, který skutečně potřebujeme, aby naše práce s filtrovacími dotazy probíhala, jsou tyto:

taxonomy: business

term: business-1 (tj. slug)

Ne tyto:

taxonomy: business

term: 27 (tj. term_id)

Zajímavé a bohužel rozevírací pole vytvořené wp_dropdown_categories() nastavilo <option> 'value atribut na výraz (/ business') term_id, notslug. Takže musíme převést $wp_query->query_vars['term'] z numerické term_id na řetězec slug, jak je to v úryvku, který je zachycen shora (Poznámka: toto není nejvýkonnější způsob dotazování databáze, ale dokud WordPress nepřidá podporu pro term_ids do dotazu, který je nejlepší, co můžeme dělat!):

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

A to je vše! S těmito dvěma funkcemi získáte filtrování, které si přejete.

ČEKEJTE, JSOU VÍCE! :-)

Šel jsem dopředu a přidal jsem "Firmy"do vašeho seznamu, protože jsem věděl, že to bude vaše další otázka. Bez sloupce pro to, co filtrujete, může být pro koncového uživatele velmi matoucí. (Já jsem s tím bojoval sám a já jsem byl kodér!) Samozřejmě již můžete vidět sloupec "Firmy"v předchozích snímcích.

Krok # 3: Háček filtru manage_posts_columns.

Přidání sloupce do seznamu příspěvků vyžaduje volání dvou (2) více háčků. První z nich je manage_posts_columns nebo verze specifická pro typ příspěvku manage_listing_posts_columns, kterou jsem nazval. Přijímá jeden parametr (posts_columns) a je volán z /wp-admin/includes/template.php (ve v3.0.1 je volání na řádku 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;
}

Funkce manage_posts_columns zavěšení předává matici sloupců, kde je hodnota zobrazena záhlavím sloupce a klíčem je vnitřní identifikátor sloupce. Standardní identifikátory sloupců mohou obsahovat tyto a další: 'cb', 'title ', 'author', ``' date'` atd.

'cb', je checkbox sloupec a oba 'title' a 'date' odkazují na post_title a post_date z tabulky wp_posts. 'author' je samozřejmě pole post_author po načtení jména autora z tabulky wp_users.

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

Pro háček manage_posts_columns jednoduše chceme vložit sloupec businesses do pole $posts_columns před 'author', za předpokladu, že některý jiný plugin ze seznamu ještě neodstranil author!

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

(Poznámkajak jsem napsal add_businesses_column_to_listing_list() mě napadlo, že PHP must má snadnější způsob, jak vložit hodnotu do asociativního pole v nebo alespoň tam musí být funkce v jádru WordPress to udělat? Ale protože Google mě pustil, takže jsem šel s tím, co fungovalo.Pokud někdo má nějaké navrhované alternativy budu všechny uši a vděčný v záloha!)

Což nás nakonec přivádí k ...

Krok # 4: Hák manage_posts_custom_column akce

Druhá věc ze dvou (2), kterou musíme udělat, aby se naše podniky zobrazily ve sloupci, je vlastně výstup názvu každého z přidružených podniků pomocí háku akce manage_posts_custom_column. Tento háček přijímá dva (2) parametry (column_id a post_id) a je také volán z /wp-admin/includes/template.php (ve v3.0.1 je volání na řádku 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;
        }
    }
}

Tento hák je volán pro každý sloupec pro každý řádek pošty (/ business). Nejprve ověříme, že skutečně pracujeme pouze s vlastním typem příspěvků listing, a pak použijeme příkaz switch k otestování proti souboru column_id. Zvolil jsem switch, protože tento háček je často používán pro generování výstupu pro mnoho různých sloupců, zejména pokud používáme jednu funkci pro mnoho různých typů příspěvků, které by mohly vypadat takto:

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

Prohlídka našeho případu použití jen o něco blíže uvidíte funkci get_the_terms(), která jednoduše vrátí seznam termínů pro tuto taxonomii (tj. Podniky pro tento záznam.) Zde získáte permalink pro webovou stránku front-end. které normálně uvádí příspěvky, které jsou s termínem spojeny, ale samozřejmě by se mohly lišit v závislosti na nainstalovaném tématu a/nebo zásuvných modulech.

Permalink používáme k hypertextovému odkazu pouze proto, že se mi líbí odkazy. Poté sloučíme všechny hypertextové odkazy (/ podniky) společně oddělené znakem kanálu ('|') a výstupem do vyrovnávací paměti PHP, která jej odešle do prohlížeče uživatele/klienta 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);
}

NYNÍjsme konečně hotovi.

Souhrn

Takže v souhrnu musíte použít následující čtyři (4) háčky, abyste získali jak filtr, tak související sloupec na stránce se seznamem vlastních příspěvků (Oh, bude to také pracovat s Posts and Pages).

  • Krok # 1: Akce restrict_manage_posts akce.
  • Krok # 2: Háček filtru parse_query.
  • Krok # 3: Háček filtru manage_posts_columns.
  • Krok # 4: Hák manage_posts_custom_column akce

Kde stáhnout kód

Ale kdybych vás nutil číst přes všechny výše uvedené, pak bych určitě nebyl velmi milý člověk, kdybych vás také vykopal kód, aby si to mohl vyzkoušet! Ale na rozdíl od toho, co říkají někteří lidé, jsem Nice. Tak tady jděte:

POZNÁMKA k @ tarasmu: Zahrnula jsem háčky pro register_post_type() a register_taxonomy(), aby si to ostatní mohli vyzkoušet, aniž by je museli znovu vytvořit. Tyto dvě funkce volání budete pravděpodobně chtít před testováním odstranit.

KONEC


Původní odpověď:

Hi @tarasm :

Hledáte jedna rozbalovací nabídka nahoře, jako je tato obrazovka, nebo hledáte jedna rozbalovací nabídka na záznam po poště a pokud ano, jak byste očekávali, že bude pracovat?

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

Pokud se jedná o první, podívejte se na tuto odpověď na otázku Jak třídit admin oblasti vlastního příspěvku typu Wordpress vlastní pole? Pokud je to to, co potřebujete, mohu poskytnout více specifik souvisejících s taxonomií.

138
MikeSchinkel

Jen jsem chtěl sdílet alternativní implementaci. Neměl jsem Mikeův neuvěřitelný tutoriál, když jsem to zjistil, takže moje řešení je trochu jiné. Konkrétně budu zjednodušovat Mikeův krok # 1 a eliminovat krok # 2 - ostatní kroky jsou stále použitelné.

V Mikeově tutoriálu nám pomocí wp_dropdown_categories() uložíme nějaké ruční sestavování seznamů, ale vyžaduje nějaké komplikované podmíněné modifikace dotazů ( krok # 2 ), aby bylo možné zpracovat jeho použití ID namísto slug. Nemluvě o obtížnosti úpravy kódu, který by se zabýval jinými scénáři, jako jsou například filtry více taxonomií.

Dalším přístupem je jednoduše nepoužít chybné wp_dropdown_categories() vůbec, ale místo toho vytvořit vlastní rozevírací seznamy od nuly. Není to tak složité, trvá méně než 30 řádků kódu a nevyžaduje háčkování parse_query vůbec:

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

Jednoduchým připojením požadovaných taxonomií do pole $filters můžete rychle odeslat více taxonomických filtrů. Vypadají přesně stejně jako v Mikeových screenshotech. Pak můžete sledovat krok # 3 a # 4 .

44
somatic

Zde je verze, která automaticky vytváří a aplikuje filtry ze všech taxonomií, které platí pro všechny vlastní typy příspěvků, které je používají. (to, co slíbil) Mimochodem, také jsem vylepšil, takže to funguje s wp_dropdown_categories () a wordpress 3.1. Projekt, na kterém pracuji, se nazývá ToDo, můžete tyto funkce přejmenovat na něco, co pro vás dává smysl, ale to by mělo fungovat automaticky.

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

Všimněte si, že používám plugin, který přidává výraz „term_order“ jako způsob objednání výrazů, budete ho muset změnit nebo tento argument odstranit jako výchozí.

13
Drew Gourley

Pozdní odpověď

Upravit

Napsal jsem Filterama , plugin, který tuto funkcionalitu přidá nejjednodušším možným způsobem.

Aktualizace pro WordPress 3.5+

Teď, když jsou věci mnohem jednodušší, tady je velmijednoduché řešení jako plugin nebo mu-plugin.

Využívá co nejmenší množství prostředků, načte pouze potřebné obrazovky a přidá sloupce + filtry pro každou vlastní taxonomii.

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

    }

}

A pak potřebujete jen přizpůsobenou Walker třídu.

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

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

Jen jsem chtěl udělat rychlou poznámku. Na novějších verzích WP jsou postpings na admin spravovány třídou WP_Posts_List_Table. Kód apply_filters je nyní následující:

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

Chcete-li přidat nové sloupce, měl by být háček add_filter takový jako:

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

Zde je příklad:

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

Teď pro post řádky. Toto je kód, který zpracovává data sloupců v záznamech:

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

Abychom mohli získávat data z našich příspěvků, musíme přidat takový akční hák:

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

Příklad (tento příklad používá taxonomie, ale můžete dotazovat všechny ostatní věci):

function my_posttype_add_column($column_name, $post_id)
{
  switch ($column_name) {
    case 'anothercolumn':
      $flavours = get_the_terms($post_id, 'flavour');
      if (is_array($flavours)) {
        foreach($flavours as $key => $flavour) {
          $edit_link = get_term_link($flavour, 'flavour');
          $flavours[$key] = '<a href="'.$edit_link.'">' . $flavour->name . '</a>';
        }
        echo implode(' | ',$flavours);
      }
      break;

    default:
      break;
  }
}
7
mines

WORKS IN WP 3.2!

custom_post_type: books custom_taxonomy: žánr

Změnit pouze to, co říká: // změnit ZDE

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

add_action('restrict_manage_posts', 'restrict_books_by_genre');


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

add_filter('parse_query', 'convert_id_to_term_in_query');
7
lacroixca

To není dobře známo, myslím, ale jako wordpress 3.5, můžete předat 'show_admin_column' => true do register_taxonomy. To dělá 2 věci:

  1. Přidá sloupec taxonomie do zobrazení seznamu účtů admin
  2. Kliknutím na název výrazu ve sloupci taxonomie bude ve skutečnosti seznam filtrovat do tohoto termínu .

Takže, ne úplně stejně jako s vybranou, ale téměř stejnou funkcionalitou, šířka jen jeden řádek kódu.

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

Také, jak můžete číst, existuje nový filtr přizpůsobený pro ruční přidávání sloupců taxonomie (pokud opravdu potřebujete).

2
Luca Reghellin

Zde je způsob, jak to provést pomocí akce strict_manage_posts. Zdá se, že pro mě funguje dobře a přidává schopnost filtrovat podle taxonomie pro všechny typy příspěvků a související taxonomie.

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

Jedna poznámka - snažil jsem se omezit hloubku, protože některé z mých hierarchických taxonomií jsou poměrně velké, ale nefungovalo to - mohla by být chyba ve funkci wp_dropdown_categories?

2
Brad Trivers

Hierarchická verze odpovědi @ somatic, jak požaduje @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);
    }

}
?>

V podstatě jsem odstranil kód, který vytvořil možnosti a dal to do své vlastní funkce. Funkce „generator_taxonomy_options“, kromě převzetí tax_slug, bere také parametr parent a level. Funkce předpokládá, že její možnosti vytvoření pro nadřazenou 0, která bude vybírat všechny kořenové úrovně. Ve smyčce se funkce rekurzivně zavolá, přičemž tento aktuální termín použije jako rodiče a zvyšuje úroveň o jednu. To automaticky přidá klíště na stranu hlouběji jdete dolů strom a voila!

1
Manny Fleurmond

Aktualizace odpovědi @Drew Gourley pro WP 3.3.1 (a začlenění kódu z http://wordpress.org/support/topic/wp_dropdown_categories-generating-url-id-number-instead-of- slug? replies = 6 # post-2529115 ):

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

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

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

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

            wp_dropdown_categories(array(
                'show_option_all' => __('Show All '.$tax_obj->label ),
                'taxonomy' => $tax_slug,
                'name' => $tax_obj->name,
                'orderby' => 'term_order',
                'selected' => $term->term_id,
                'hierarchical' => $tax_obj->hierarchical,
                'show_count' => false,
                // 'hide_empty' => true,
                'hide_empty' => false,
                'walker' => new DropdownSlugWalker()
            ));
        }
    }
}


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

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

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

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

        $output .= '>';
        $output .= $pad.$cat_name;
        $output .= "</option>\n";
    }
}
1
rinogo

Vyzkoušeli oba kódy, od Mika a somatického, a zajímalo mě, jak získat jednu věc z každé techniky:

S Mikeovým kódem se zobrazí rozevírací seznam s hierarchickou možností, který hodně pomáhá. Abychom však mohli zobrazit dvě rozevírací seznamy, musela jsem duplikovat příkaz if ($typenow=='produtos') {...} ve funkci restrict_listings_by_business() a také if ($pagenow=='edit.php' && ... } ve funkci convert_business_id_to_taxonomy_term_in_query($query), která nyní dává mnoho kódu.

S somatickým kódem musím jen specifikovat taxonomie, které bych rád viděl jako rozevírací seznamy a díla; $filters = array('taxo1', 'taxo2');

Otázka: mohu získat somatický přístup a mít také hierarchickou volbu?

Díky moc za tento návod, hodně pomohl!

0
kevin

Omlouvá se za to, že jako nový uživatel nemohu psát komentáře, ale mohu odeslat odpověď ...

Jak od WordPress 3.1 (RC 1) Mikeova odpověď (která mi tak dobře sloužila za posledních pár měsíců) už pro mě nefunguje; Omezení jakýmkoli dítětem taxonomie dává prázdný výsledek. Vyzkoušela jsem Somatovu aktualizaci a fungovalo to skvěle; ještě lépe, pracuje s vícenásobnými dotazy na taxonomii které byly zpracovány do této verze.

0
rsigg

Mikeův návod na toto je skvělý! Pravděpodobně bych se neobtěžoval přidávat tuto funkci do pluginu Mé kategorie médií, kdybych to musel vymyslet sám.

To znamená, že myslím, že pomocí parse_query a pak se pak dotaz na termín není nutné. Je to čistší pro vytvoření vlastní třídy Walker. Možná, že to nebylo možné, když napsal svůj příspěvek - jeho 3 roky starý v době psaní tohoto článku.

Pokuste se o tento skvělý úryvek na githubu. Funguje jako kouzlo, mění ID v hodnotách rozevíracího seznamu na slimáky, takže to funguje pouze nativně bez úpravy dotazu.

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

0
eddiemoya