एक कस्टम पोस्ट प्रकार के लिए व्यवस्थापक सूची में एक वर्गीकरण फ़िल्टर जोड़ना?


129

मैंने एक कस्टम पोस्ट टाइप बनाया है, जिसे 'listing'कस्टम टैक्सोनॉमी कहा जाता है और जोड़ा जाता है 'businesses'। मैं सूची के लिए व्यवस्थापन सूची में व्यवसाय की ड्रॉपडाउन सूची जोड़ना चाहूंगा।

यहां पोस्ट के लिए व्यवस्थापक सूची में यह कार्यक्षमता दिखती है (मैं अपने कस्टम पोस्ट प्रकार के लिए भी यही चाहूंगा):

पोस्ट में श्रेणियाँ ड्रॉपडाउन

यहाँ मेरा वर्तमान कोड है ( और यहाँ 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();
}

मैं सूची के लिए व्यवस्थापन सूची में व्यवसाय की ड्रॉपडाउन सूची कैसे जोड़ सकता हूं?


8
स्क्रीनशॉट के लिए धन्यवाद, यह वास्तव में उन लोगों के लिए मदद करता है।
माइकस्किंकल

एक प्लगइन एडमिन टैक्सोनॉमी फ़िल्टर है जो सटीक काम कर सकता है।
एएन ट्रान

जवाबों:


140

अद्यतन: मैंने एक नया पूर्ण उत्तर शामिल किया है, लेकिन यहां तक ​​कि मैंने अपनी मूल प्रतिक्रिया को नीचे छोड़ दिया है जिसमें पहले कुछ टिप्पणियाँ संदर्भ हैं।


हाय @tarasm :

हालांकि मैंने कहा कि यह मुश्किल नहीं होना चाहिए यह थोड़ा सा शामिल है। लेकिन इससे पहले कि हम कोड में खुदाई करें ...

स्क्रीनशॉट:

... चलो समाप्त उत्पाद के लिए कुछ स्क्रीन शॉट्स देखें:

नो फिल्टरिंग के साथ सूची पृष्ठ की सूची :

नो फिल्टरिंग के साथ सूची पृष्ठ को सूचीबद्ध करना
(स्रोत: mikeschinkel.com )

फ़िल्टरिंग के साथ सूची पृष्ठ

छानने के साथ सूची पृष्ठ पृष्ठ
(स्रोत: mikeschinkel.com )

कोड

तो यहाँ हम चलते हैं ... ( नोट: मैंने टैक्सोनॉमी नाम के लिए एक विलक्षण रूप का उपयोग किया है business; मुझे आशा है कि यह आपके मेल खाता है। अतीत में वर्डप्रेस और डेटाबेस विकास दोनों के साथ बहुत सारे अनुभव से मेरा मानना ​​है कि यह इस तरह से करना सबसे अच्छा है। ।)

चरण # 1: restrict_manage_postsकार्रवाई हुक।

पहली चीज जो आपको करने की ज़रूरत है वह उस restrict_manage_postsकार्रवाई को हुक करने के लिए है जिसमें कोई पैरामीटर नहीं है और /wp-admin/edit.php(v3.0.1 से कहा जाता है कि कॉल लाइन 378 पर है।) यह आपको ड्रॉप डाउन जनरेट करने की अनुमति देगा सूची के ऊपर उपयुक्त स्थान पर चयन करें लिस्टिंग पोस्ट।

<?php
add_action('restrict_manage_posts','restrict_listings_by_business');
function restrict_listings_by_business() {
    global $typenow;
    global $wp_query;
    if ($typenow=='listing') {
        $taxonomy = 'business';
        $business_taxonomy = get_taxonomy($taxonomy);
        wp_dropdown_categories(array(
            'show_option_all' =>  __("Show All {$business_taxonomy->label}"),
            'taxonomy'        =>  $taxonomy,
            'name'            =>  'business',
            'orderby'         =>  'name',
            'selected'        =>  $wp_query->query['term'],
            'hierarchical'    =>  true,
            'depth'           =>  3,
            'show_count'      =>  true, // Show # listings in parens
            'hide_empty'      =>  true, // Don't show businesses w/o listings
        ));
    }
}

हम $typenowयह सुनिश्चित करने के लिए चर की जाँच करके शुरू करते हैं कि हम वास्तव में किस पर post_typeहैं listing। यदि आप नहीं करते हैं तो आपको यह ड्रॉप डाउन सभी प्रकार के पोस्टों के लिए मिलेगा जो कुछ मामलों में आप क्या चाहते हैं, लेकिन यह मामला नहीं।

आगे हम उपयोग कर व्यापार वर्गीकरण के बारे में जानकारी लोड करते हैं get_taxonomy()। हमें इसे टैक्सोनॉमी (यानी " बिज़नेस " के लिए लेबल को पुनः प्राप्त करने की आवश्यकता है ; हम हार्ड-कोडित हो सकते हैं, लेकिन यह बहुत अच्छा नहीं है यदि आपको बाद में अंतर्राष्ट्रीयकरण करने की आवश्यकता है।) तो हम सरणी में उत्पन्न करने के लिए wp_dropdown_categories()सभी उपयुक्त तर्कों के साथ कॉल $argsकरते हैं। ड्रॉप डाउन

<?php
return wp_dropdown_categories(array(
    'show_option_all' =>  __("Show All {$business_taxonomy->label}"),
    'taxonomy'        =>  $taxonomy,
    'name'            =>  'business',
    'orderby'         =>  'name',
    'selected'        =>  $wp_query->query['term'],
    'hierarchical'    =>  true,
    'depth'           =>  3,
    'show_count'      =>  true, // Show # listings in parens
    'hide_empty'      =>  true, // Don't show businesses w/o listings
));

लेकिन उपयुक्त तर्क क्या हैं? आइए प्रत्येक को अलग-अलग देखें:

  • show_optional_all- बहुत सीधा, यह वही है जो पहली बार में ड्रॉप डाउन में प्रदर्शित होता है और जब कोई फ़िल्टरिंग लागू नहीं होती है। हमारे मामले में ऐसा हो रहा है "सभी व्यवसाय दिखाएं " लेकिन हम इसे "सभी व्यवसायों के लिए सूचियाँ" या जो कुछ भी आप चाहते हैं, कह सकते हैं।

  • taxonomy- यह दलीलें फ़ंक्शन को बताती हैं कि फ़ंक्शन categoriesको उसके नाम पर होने के बावजूद क्या शर्तें हैं । V2.8 और पहले के वर्डप्रेस में कस्टम टैक्सोनॉमी नहीं थी, लेकिन जब उन्हें टीम में शामिल किया गया तो उन्होंने निर्णय लिया कि इस फ़ंक्शन में एक अन्य नाम के साथ एक अन्य फ़ंक्शन बनाने की तुलना में एक टैक्सोनॉमी तर्क जोड़ना आसान होगा।

  • name- यह तर्क आपको उस मूल्य को निर्दिष्ट करने की अनुमति देता है जो वर्डप्रेस nameड्रॉप डाउन के लिए उत्पन्न <select> तत्व की विशेषता के लिए उपयोग करता है। बस अगर यह स्पष्ट नहीं होता है तो यह वह मूल्य भी होता है जो फ़िल्टर करते समय URL में उपयोग किया जाएगा।

  • orderby- यह तर्क वर्डप्रेस को बताता है कि वर्णानुक्रम में परिणामों को कैसे ऑर्डर किया जाए। हमारे मामले में हमने nameइस मामले में कर नाम की शर्तों को खरीदने का आदेश दिया है।

  • selected- इस तर्क की आवश्यकता है ताकि ड्रॉप डाउन ड्रॉप डाउन में वर्तमान फिल्टर दिखा सके। यह term_idचयनित वर्गीकरण अवधि से होना चाहिए । हमारे मामले में यह "बिजनेस # 2"term_id से हो सकता है । हमें यह मूल्य कहां से मिलता है? वर्डप्रेस के वैश्विक चर से ; इसमें ऐसी संपत्ति होती है, जिसमें सभी URL पैरामीटर और उनके मानों की एक सरणी होती है (जब तक कि किसी तरह के प्लगइन ने इसे पहले से ही संशोधित नहीं किया है, निश्चित रूप से।) यह देखते हुए कि वर्डप्रेस चीजों को कैसे संसाधित करता है URL पर एक पैरामीटर पारित हो जाएगा जब उपयोगकर्ता फ़िल्टर पर क्लिक करता है। बटन यदि उपयोगकर्ता एक वैध शब्द (यानी सूचीबद्ध व्यवसायों में से एक) का चयन करता है।$wp_queryqueryterm

  • hierarchical- इसे सेट करके trueआप फ़ंक्शन को वर्गीकरण की पदानुक्रमित प्रकृति का सम्मान करने और उन्हें पेड़ के दृश्य में प्रदर्शित करने के लिए कहेंगे यदि वास्तव में शब्द (व्यवसाय) बच्चे हैं। स्क्रीन शॉट के लिए यह देखने के लिए कि यह कैसा दिखता है, नीचे देखें।

  • depth- यह तर्क यह hierarchicalनिर्धारित करने में तर्क के साथ सहयोग करता है कि बच्चों को प्रदर्शित करने में फ़ंक्शन को कितने स्तरों पर जाना चाहिए।

  • show_count- यदि trueयह तर्क ड्रॉप डाउन के भीतर शब्द के बाईं ओर कोष्ठक के भीतर एक गिनती पोस्ट प्रदर्शित करेगा। इस मामले में यह व्यवसायों से जुड़ी लिस्टिंग की एक संख्या प्रदर्शित करेगा। स्क्रीन शॉट के लिए यह देखने के लिए कि यह कैसा दिखता है, नीचे देखें।

  • hide_empty- अंत में, अगर वहाँ वर्गीकरण में ऐसे शब्द हैं जो किसी पोस्ट के साथ नहीं जुड़े हैं (यानी एक लिस्टिंग से जुड़े व्यवसाय नहीं हैं) तो यह निर्धारित करने के लिए trueउन्हें ड्रॉप डाउन में शामिल होने से रोक दिया जाएगा।

टैक्सोनॉमी ड्रॉप डाउन को पदानुक्रम और मायने रखना चाहिए
(स्रोत: mikeschinkel.com )

चरण # 2: parse_queryफिल्टर हुक।

इसके बाद हम अपने नोट को parse_queryफ़िल्टर हुक में कहते हैं जिसका एक पैरामीटर ( $query) है और इसे /wp-includes/query.php(v3.0.1 में कहा जाता है कि कॉल लाइन 1549 पर है।) यह तब कहा जाता है जब वर्डप्रेस ने URL का निरीक्षण करना और वर्तमान में सभी उपयुक्त मान सेट करना समाप्त कर दिया है $wp_queryजैसी चीजों को सक्रिय करना , $wp_query->is_homeऔर $wp_query->is_authorआदि।

parse_queryफ़िल्टर हुक के चलने के बाद, वर्डप्रेस get_posts()वर्तमान में सक्रिय में निर्दिष्ट किए गए पदों के आधार पर कॉल और लोड करेगा $wp_query। तो parse_queryवर्डप्रेस को बदलने के लिए अक्सर एक शानदार जगह होती है यह मन है कि यह किन पोस्टों को लोड करने जा रहा है।

आपके उपयोग-मामले में हम चयनित व्यवसायों के आधार पर फ़िल्टर करना चाहते हैं; केवल उन सूचियों को प्रदर्शित करने के लिए जो चयनित व्यवसाय से जुड़ी हुई हैं (मैं कहूंगा "... केवल उन सूचियों को जो " चयनित व्यवसाय द्वारा "श्रेणीबद्ध" किया गया है, लेकिन यह तकनीकी सही नहीं है; categoryक्या यह सहकर्मी पर खुद का वर्गीकरण है। साथ businessसिवाय इसके कि categoryवर्डप्रेस में बनाया गया है और businessरिवाज है। लेकिन श्रेणीबद्ध पदों से परिचित लोगों के लिए यह आप समझ के रूप में वे लगभग हूबहू काम करने में मदद कर सकते हैं। लेकिन मैं पीछे हटना ...)

कोड पर। पहली बात हम करते हैं वर्तमान में सक्रिय के लिए एक संदर्भ हड़पने है $wp_queryके query_varsइतना है कि यह, और अधिक के साथ काम करने के लिए सुविधाजनक है बस वर्डप्रेस के भीतर अपनी कैसे किया तरह की अपनी parse_query()कार्य करते हैं। $wp_query->queryजिसके विपरीत URL पर दिए गए पैरामीटर को मिरर करने के लिए उपयोग किया जाता है, उस $wp_query->query_varsसरणी का उपयोग उस क्वेरी को नियंत्रित करने के लिए किया जाता है जिसे वर्डप्रेस चलाता है और जिसके संशोधित होने की उम्मीद है। इसलिए यदि आपको एक को संशोधित करने की आवश्यकता है, तो वह एक होगा (कम से कम मुझे लगता है कि दोनों के बीच अलग है; अगर किसी को पता है तो कृपया मुझे बताएं ताकि मैं इसे अपडेट कर सकूं!)

<?php
add_filter('parse_query','convert_business_id_to_taxonomy_term_in_query');
function convert_business_id_to_taxonomy_term_in_query($query) {
    global $pagenow;
    $qv = &$query->query_vars;
    if ($pagenow=='edit.php' &&
            isset($qv['taxonomy']) && $qv['taxonomy']=='business' &&
            isset($qv['term']) && is_numeric($qv['term'])) {
        $term = get_term_by('id',$qv['term'],'business');
        $qv['term'] = $term->slug;
    }
}

अगला हम $pagenowयह सुनिश्चित करने के लिए परीक्षण करते हैं कि हम वास्तव में WordPress को URL पथ से लोड कर रहे हैं /wp-admin/edit.php। हम गलती से अन्य पृष्ठों पर प्रश्नों को खराब करने से रोकते हैं। हम यह सुनिश्चित करने के लिए भी जांच करते हैं कि हमारे पास businessएक taxonomyतत्व और एक termतत्व दोनों भी हैं। (ध्यान दें taxonomyऔर termएक जोड़ी हैं; उन्हें एक वर्गीकरण शब्द की क्वेरी की अनुमति देने के लिए एक साथ उपयोग किया जाता है; दोनों में या वर्डप्रेस को यह पता नहीं होता है कि किस वर्गीकरण का निरीक्षण करना है।)

आपको आश्चर्य हो सकता है कि सरणी businessके taxonomyतत्व में कैसे बदल गया query_vars। जब हमने अपने parse_queryहुक में वर्डप्रेस के आंतरिक जादू को लिखा था, जो तब प्रतीक्षा में रखा गया था जब आपने सत्य होने की businessसेटिंग द्वारा " " वर्गीकरण को पंजीकृत किया था query_var( register_taxonomy()इसके रूप में वर्गीकरण के नाम को कॉपी करता है query_var; आप इसे बदल सकते हैं, लेकिन जब तक कि आपके पास कोई संघर्ष न हो; उसी के साथ रहना सबसे अच्छा है):

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

अब वर्डप्रेस के $ wp_query को मानक टैक्सोनॉमी फ़िल्टर किए गए प्रश्नों के लिए स्लग का उपयोग करने के लिए लिखा गया था, न कि टैक्सोनॉमी शब्द आईडी। इस उपयोग-मामले के लिए जिसे हमें वास्तव में अपने फ़िल्टरिंग क्वेरी कार्य को बनाने की आवश्यकता है वे हैं:

taxonomy: व्यापार

term: व्यापार -1 (यानी slug)

ये नहीं:

taxonomy: व्यापार

term: 27 (यानी term_id)

दिलचस्प बात यह है और दुर्भाग्य से ड्रॉप-डाउन द्वारा उत्पन्न wp_dropdown_categories()सेट <option>की value(अवधि के / व्यापार) के लिए विशेषता ' term_id, नहीं अवधि slug। इसलिए हमें $wp_query->query_vars['term']एक सांख्यिक term_idसे इसे स्ट्रिंग slugमें परिवर्तित करने की आवश्यकता है क्योंकि ऊपर से स्निपेट में निम्नलिखित है (ध्यान दें कि यह डेटाबेस को क्वेरी करने का सबसे अच्छा तरीका नहीं है लेकिन जब तक वर्डप्रेस अपने क्वेरी में term_ids के लिए समर्थन जोड़ता है जो कि हम सबसे अच्छा कर सकते हैं!) :

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

और बस! उन दो कार्यों के साथ आप अपनी इच्छा के अनुसार फ़िल्टरिंग प्राप्त करते हैं।

लेकिन, यह और अधिक है! :-)

मैंने आगे बढ़कर आपकी सूची में "व्यवसाय" कॉलम जोड़ा क्योंकि, ठीक है, मुझे पता था कि यह आपका अगला प्रश्न होगा। आपके द्वारा फ़िल्टर किए जाने वाले कॉलम के बिना यह अंत उपयोगकर्ता के लिए बहुत भ्रमित हो सकता है। (मैं खुद इसके साथ संघर्ष किया, और मैं कोडर था!) ​​आप निश्चित रूप से पहले से ही ऊपर स्क्रीन शॉट्स में "बिजनेस" कॉलम देख सकते हैं ।

चरण # 3: manage_posts_columnsफिल्टर हुक।

पोस्ट सूची में एक स्तंभ जोड़ने के लिए दो (2) अधिक हुक कॉलिंग लेता है। पहला एक manage_posts_columnsया पोस्ट प्रकार-विशिष्ट संस्करण है manage_listing_posts_columnsजिसे मैंने इसके बजाय बुलाया था। यह एक पैरामीटर को स्वीकार करता है ( posts_columns) और /wp-admin/includes/template.php(v3.0.1 से कहा जाता है कि कॉल लाइन 623 पर है):

<?php
add_action('manage_listing_posts_columns', 'add_businesses_column_to_listing_list');
function add_businesses_column_to_listing_list( $posts_columns ) {
    if (!isset($posts_columns['author'])) {
        $new_posts_columns = $posts_columns;
    } else {
        $new_posts_columns = array();
        $index = 0;
        foreach($posts_columns as $key => $posts_column) {
            if ($key=='author')
                $new_posts_columns['businesses'] = null;
            $new_posts_columns[$key] = $posts_column;
        }
    }
    $new_posts_columns['businesses'] = 'Businesses';
    return $new_posts_columns;
}

आपका manage_posts_columnsहुक फ़ंक्शन स्तंभों का एक सरणी पास कर देता है जहां मूल्य प्रदर्शित स्तंभ शीर्षक है और कुंजी आंतरिक स्तंभ पहचानकर्ता है। : मानक स्तंभ पहचानकर्ता इन आदि शामिल हो सकते 'cb', 'title' 'author', ``' date'`, आदि

'cb', है checkboxस्तंभ और दोनों 'title'और 'date'का उल्लेख post_titleऔर post_dateसे wp_postsक्रमश: मेज,। 'author'बेशक post_authorलेखक का नाम wp_usersतालिका से पुनर्प्राप्त करने के बाद क्षेत्र है ।

एक चेकबॉक्स के रूप में 'सीबी' पोस्ट कॉलम का स्क्रीनशॉट।
(स्रोत: mikeschinkel.com )

के लिए manage_posts_columnsहुक हम केवल हमारे स्तंभ सम्मिलित करना चाहते हैं कर रहे हैं businessesमें $posts_columnsसे पहले सरणी 'author'कुछ अन्य प्लगइन संभालने हटाया नहीं गया है, authorअभी तक सूची से!

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

( ध्यान दें जैसा कि मैंने लिखा add_businesses_column_to_listing_list()है कि PHP के पास उचित क्रम में एक साहचर्य सरणी में मान डालने का एक आसान तरीका होना चाहिए ? -? या कम से कम वर्डप्रेस कोर में एक फ़ंक्शन होने के लिए इसे करने के लिए मिला है? लेकिन Google के बाद से मुझे निराश कर दो, तो मैं काम कर गया। अगर किसी के पास कोई विकल्प है तो मैं सभी कानों और अग्रिम में सराहना करूंगा!)

जो आखिर में हमें लाता है ...

चरण # 4: manage_posts_custom_columnकार्रवाई हुक

दो (2) की दूसरी बात हमें अपने व्यवसायों को कॉलम में प्रदर्शित करने के लिए करने की आवश्यकता है वास्तव में manage_posts_custom_columnकार्रवाई हुक का उपयोग करके संबंधित व्यवसायों में से प्रत्येक के नाम का उत्पादन करना है । यह हुक दो (2) पैरामीटर्स ( column_idऔर post_id) को स्वीकार करता है और इसे /wp-admin/includes/template.php(v3.0.1 से) भी कहा जाता है, जो कि कॉल 14.19 लाइन पर है:

<?php
add_action('manage_posts_custom_column', 'show_businesses_column_for_listing_list',10,2);
function show_businesses_column_for_listing_list( $column_id,$post_id ) {
    global $typenow;
    if ($typenow=='listing') {
        $taxonomy = 'business';
        switch ($column_name) {
        case 'businesses':
            $businesses = get_the_terms($post_id,$taxonomy);
            if (is_array($businesses)) {
                foreach($businesses as $key => $business) {
                    $edit_link = get_term_link($business,$taxonomy);
                    $businesses[$key] = '<a href="'.$edit_link.'">' . $business->name . '</a>';
                }
                //echo implode("<br/>",$businesses);
                echo implode(' | ',$businesses);
            }
            break;
        }
    }
}

यह हुक प्रत्येक पोस्ट (/ व्यवसाय) पंक्ति के लिए प्रत्येक कॉलम के लिए कहा जाता है। हम पहले यह सत्यापित करते हैं कि हम वास्तव में केवल listingकस्टम पोस्ट प्रकार के साथ काम कर रहे हैं और फिर हम इसके switchखिलाफ परीक्षण करने के लिए एक बयान का उपयोग करते हैं column_id। मैंने चुना switchक्योंकि यह हुक अक्सर कई अलग-अलग स्तंभों के लिए आउटपुट उत्पन्न करने के लिए उपयोग किया जाता है, खासकर अगर हम कई अलग-अलग पोस्ट प्रकारों के लिए एक फ़ंक्शन का उपयोग करते हैं जो इस तरह से कुछ देख सकते हैं:

<?php
add_action('manage_posts_custom_column', 'my_manage_posts_custom_column',10,2);
function my_manage_posts_custom_column( $column_id,$post_id ) {
    global $typenow;
    switch ("{$typenow}:{$column_id}") {
    case 'listing:business':
        echo '...whatever...';
        break;
    case 'listing:property':
        echo '...whatever...';
        break;
    case 'agent:listing':
        echo '...whatever...';
        break;
    }
}

हमारे उपयोग-मामले का निरीक्षण करने के बस थोड़ा सा आप उस get_the_terms()फ़ंक्शन को देखते हैं जो बस इस वर्गीकरण के लिए शर्तों की सूची लौटाता है (यानी इस सूची के लिए व्यवसाय।) यहां शब्द के फ्रंट-एंड वेब पेज के लिए पर्मलिंक मिलते हैं जो सामान्य रूप से जुड़े पदों को सूचीबद्ध करता है। शब्द के साथ, लेकिन निश्चित रूप से विषय और / या प्लग इन के आधार पर अलग-अलग हो सकता है।

हम पर्मलिंक का उपयोग केवल हाइपरलिंक शब्द के लिए करते हैं क्योंकि मुझे हाइपरलिंक चीजें पसंद हैं। फिर हम सभी हाइपरलिंक किए गए शब्दों (/ व्यवसायों) को एक साथ पाइप (' |') वर्ण और आउटपुट के साथ अलग करते हैं जो PHP बफर को भेजता है जो इसे उपयोगकर्ता के ब्राउज़र / HTTP क्लाइंट को भेजता है:

<?php
$businesses = get_the_terms($post_id,$taxonomy);
if (is_array($businesses)) {
    foreach($businesses as $key => $business) {
        $edit_link = get_term_link($business,$taxonomy);
        $businesses[$key] = '<a href="'.$edit_link.'">' . $business->name . '</a>';
    }
    //echo implode("<br/>",$businesses);
    echo implode(' | ',$businesses);
}

अब हम आखिरकार कर रहे हैं।

सारांश

इसलिए सारांश में, आपको कस्टम पोस्ट सूची पृष्ठ (ओह, यह पोस्ट और पेज के साथ भी काम करेगा) दोनों में एक फिल्टर और एक संबंधित कॉलम प्राप्त करने के लिए निम्नलिखित चार (4) हुक का उपयोग करने की आवश्यकता है: वे हैं:

  • चरण # 1: restrict_manage_postsकार्रवाई हुक।
  • चरण # 2: parse_queryफिल्टर हुक।
  • चरण # 3: manage_posts_columnsफिल्टर हुक।
  • चरण # 4: manage_posts_custom_columnकार्रवाई हुक

कोड डाउनलोड करने के लिए कहाँ

लेकिन अगर मैंने आपको उपरोक्त सभी के माध्यम से पढ़ने के लिए मजबूर किया, तो मैं निश्चित रूप से बहुत अच्छा व्यक्ति नहीं बनूंगा अगर मैंने आपको कोड खोदने के लिए बस इसे आज़माने में सक्षम होने के लिए बनाया है! लेकिन कुछ लोगों के कहने के विपरीत, मैं अच्छा हूं। तो यहां जाएं:

@Tarasm पर ध्यान दें : मैंने एक के लिए हुक शामिल किएregister_post_type()औरregister_taxonomy()ताकि दूसरों को इसे फिर से बनाने के लिए बिना कोशिश कर सकें। इससे पहले कि आप इसका परीक्षण करें, संभवतः आप उन दो फ़ंक्शन कॉल को हटाना चाहते हैं।

समाप्त


मूल प्रतिक्रिया:

हाय @tarasm :

क्या आप इस स्क्रीन की तरह शीर्ष पर एक ड्रॉप डाउन की तलाश कर रहे हैं या क्या आप पोस्ट रिकॉर्ड के अनुसार एक ड्रॉप डाउन की तलाश कर रहे हैं और यदि ऐसा है तो आप बाद में काम करने की उम्मीद कैसे करेंगे?

वर्डप्रेस एडमिन में कस्टम पोस्ट प्रकार के लिए कार्यक्षमता के आधार पर क्रिएट कैसे करें
(स्रोत: mikeschinkel.com )

यदि पूर्व, प्रश्न के इस उत्तर पर एक नज़र डालते हैं कि किसी कस्टम फ़ील्ड द्वारा Wordpress कस्टम पोस्ट प्रकार के व्यवस्थापक क्षेत्र को कैसे सॉर्ट किया जाए? अगर ऐसा है तो आपको मेरी जरूरत है कि मैं टैक्सोनोमी से संबंधित अधिक विवरण प्रदान कर सकूं।


मैं शीर्ष पर 1 ड्रॉपडाउन की तलाश कर रहा हूं जो श्रेणियाँ फ़िल्टर दिखाएगा। अगर कस्टम कोड लिखने के बिना ऐसा करने का एक मानक तरीका है, तो मैं भटक रहा था।
तारास मनकोवस्की

पहले ब्लश पर मुझे नहीं लगता कि आप w / o कस्टम कोड कर सकते हैं लेकिन फिर मुझे नहीं लगता कि कस्टम कोड महत्वपूर्ण होगा। मेरे पास तैयार करने के लिए एक क्लाइंट कॉल है इसलिए इसे आज बाद में होना होगा।
माइकस्किंकेल

2
वास्तव में दोनों समाधान (सोमैटिक और माइकस्किंकल) तब काम नहीं कर रहे हैं जब आप एक ही फिल्टर में 2 अलग-अलग टैक्सोनॉमी को फ़िल्टर करने का प्रयास करते हैं: - / हमेशा नवीनतम टैक्सोनॉमी को फ़िल्टर करते समय एक ही समय में 2+ फ़िल्टर करने का प्रयास करें।
सनल कोरकमाज़

1
@ )Nsal वर्डप्रेस का मौजूदा संस्करण (3.0) कई करोनॉमी प्रश्नों का समर्थन नहीं करता है, लेकिन मैंने जो सुना है वह संस्करण 3.1 के साथ बदल जाएगा। इस उदाहरण को कई टैक्सोनॉमीज़ के साथ काम करने के लिए, आपको पोस्ट्स_जॉइन और posts_where फ़िल्टर हुक के माध्यम से क्वेरी में कुछ जोड़ और व्हेयर जोड़ना होगा।
मैन्नी फ्लेममंड

1
WP 3.1+ में, @ drew-gourley उत्तर में चरण एक और दो बेहतर हैं (वास्तव में, आपके चरण 2 ने मेरे लिए काम नहीं किया, मुझे लगता है कि नए वर्डप्रेस में इस फ़िल्टरिंग में परिवर्तन हैं)।
टॉमाज़ स्ट्रुस्कीस्की

44

बस एक वैकल्पिक कार्यान्वयन साझा करना चाहता था। मेरे पास माइक का अविश्वसनीय ट्यूटोरियल नहीं था जब मैं इसे समझ रहा था, इसलिए मेरा समाधान थोड़ा अलग है। विशेष रूप से, मैं माइक के चरण # 1 को सरल बनाने जा रहा हूं और चरण 2 को समाप्त कर रहा हूं - अन्य चरण अभी भी लागू हैं।

माइक के ट्यूटोरियल में, wp_dropdown_categories()हमें कुछ मैनुअल लिस्ट-बिल्डिंग को सेव करता है, लेकिन स्लग के बजाय आईडी के उपयोग को संभालने के लिए कुछ जटिल सशर्त क्वेरी मॉडिफिकेशन ( चरण # 2 ) की आवश्यकता होती है । अन्य परिदृश्यों से निपटने के लिए उस कोड को संशोधित करने की कठिनाई का उल्लेख नहीं करना चाहिए, जैसे कि कई वर्गीकरण फ़िल्टर।

एक अन्य तरीका यह है कि हम केवल त्रुटिपूर्ण उपयोग न करें wp_dropdown_categories(), बल्कि स्क्रैच से हमारी स्वयं की ड्रॉपडाउन सूची का निर्माण करें। यह जटिल नहीं है, कोड की 30 से कम लाइनें लेता है, और इसके लिए हुकिंग की आवश्यकता नहीं होती है parse_query:

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

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

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

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

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

बस वांछित वर्गीकरणों को $filtersसरणी में प्लग करके , आप कई टैक्सोनॉमी फ़िल्टर जल्दी से आउटपुट कर सकते हैं। वे माइक के स्क्रीनशॉट में उन लोगों की तरह ही दिखाई देते हैं। फिर आप चरण # 3 और # 4 के माध्यम से अनुसरण कर सकते हैं ।


4
@somatic - अच्छा अद्यतन! हां, उपयोग करने के लिए wp_dropdown_categories()बहुत सारे वर्कआर्ड की आवश्यकता होती है। मैं जब संभव हो तो मुख्य कार्यों के साथ रहने की कोशिश करता हूं लेकिन जैसा कि आप कभी-कभी बताते हैं कि यह उस तरह से अधिक काम लेता है। बस यह साबित करने के लिए जाता है कि वर्डप्रेस के साथ अक्सर एक समस्या को हल करने के लिए एक से अधिक अच्छे तरीके होते हैं। बहुत बढ़िया!
माइकस्किंकल

बस मेरे लिए वर्डप्रेस 3.1 पर काम करना बंद कर दिया। यह जानने की कोशिश करना कि वास्तव में क्या बदला। ऐसा लगता है कि यह अभी भी काम करना चाहिए: टैरोनॉमी और टर्म स्लग, यूआरएल में जीईटी मान के रूप में दिखाई देते हैं, लेकिन सभी में इसका परिणाम 0 होता है
मैन्नी फ्लेमर्ड

मैं इस काम को प्राप्त करने की कोशिश कर रहा हूं, लेकिन एकमात्र तरीका है कि मैं पार्स_क्वेरी हुक का उपयोग कर सकता हूं, टैक्सोनॉमी के क्वेरी संस्करण के लिए जांच कर सकता हूं और उस आधार पर टैक्सोनॉमी और टर्म क्वेरी संस्करण सेट कर सकता हूं। WP 3.1 का उपयोग करना। फ़िल्टर सबमिट किए जाने पर URL में टैक्सोनॉमी और टर्म दिखाई देनी चाहिए?
sanchothefat

2
मेरे लिए एक आकर्षण की तरह काम करता है! बहुत सुंदर समाधान वास्तव में। मैं आपको एक बीयर का एहसानमंद हूं :)
मिशाल मऊ

@somatic यह बहुत अच्छा काम करता है लेकिन क्या $ टर्म रखने का एक तरीका है-> गिनती केवल उस पोस्ट के प्रकार की शर्तें गिनाएं? उदाहरण के लिए, यदि मेरे पास फ़ोटो और वीडियो दोनों के लिए एक कस्टम टैक्सोनॉमी है, तो यह तब मुझे दिखाई देगा जब वीडियो कस्टम पोस्ट देख रहे हों, उस शब्द के लिए कुल कस्टम पोस्ट प्रकारों की कुल संख्या के बजाय केवल कस्टम पोस्ट प्रकारों की कुल संख्या वाले वीडियो पोस्ट का उपयोग करें अवधि।
ग्रीनहो

13

यहाँ इसका एक संस्करण है जो स्वचालित रूप से उन सभी टैक्स पोस्टों पर फ़िल्टर बनाता है और लागू करता है जो सभी कस्टम पोस्ट प्रकारों पर लागू होते हैं जो उनका उपयोग करते हैं। (क्या एक कौर) वैसे भी, मैं भी इसे tweaked तो यह wp_dropdown_categories () और Wordpress 3.1 के साथ काम करता है। जिस परियोजना पर मैं काम कर रहा हूं उसे टूडो कहा जाता है, आप कार्यों को किसी ऐसी चीज़ में बदल सकते हैं जो आपके लिए समझ में आता है, लेकिन यह सब कुछ के लिए स्वचालित रूप से बहुत काम करना चाहिए।

function todo_restrict_manage_posts() {
    global $typenow;
    $args=array( 'public' => true, '_builtin' => false ); 
    $post_types = get_post_types($args);
    if ( in_array($typenow, $post_types) ) {
    $filters = get_object_taxonomies($typenow);
        foreach ($filters as $tax_slug) {
            $tax_obj = get_taxonomy($tax_slug);
            wp_dropdown_categories(array(
                'show_option_all' => __('Show All '.$tax_obj->label ),
                'taxonomy' => $tax_slug,
                'name' => $tax_obj->name,
                'orderby' => 'term_order',
                'selected' => $_GET[$tax_obj->query_var],
                'hierarchical' => $tax_obj->hierarchical,
                'show_count' => false,
                'hide_empty' => true
            ));
        }
    }
}
function todo_convert_restrict($query) {
    global $pagenow;
    global $typenow;
    if ($pagenow=='edit.php') {
        $filters = get_object_taxonomies($typenow);
        foreach ($filters as $tax_slug) {
            $var = &$query->query_vars[$tax_slug];
            if ( isset($var) ) {
                $term = get_term_by('id',$var,$tax_slug);
                $var = $term->slug;
            }
        }
    }
    return $query;
}
add_action( 'restrict_manage_posts', 'todo_restrict_manage_posts' );
add_filter('parse_query','todo_convert_restrict');

ध्यान दें कि मैं एक प्लगइन का उपयोग कर रहा हूं जो शब्दों को आदेश देने के तरीके के रूप में 'term_order' जोड़ता है, आपको उसे बदलना होगा, या उस तर्क को डिफ़ॉल्ट पर वापस करना होगा।


बहुत सेक्सी है। मैं त्रुटि नोटिस प्राप्त कर रहा था, इसलिए मैंने अगर (isset ($ var)) को if (isset ($ var) && $ var> 0) में बदल दिया, तो व्यू ऑल के 0 मान से जुड़े शब्दों को खोजने की कोशिश से बचने के लिए। ओह, और मुझे todo_convert_restrict फंक्शन में $ क्वेरी लौटानी थी
helgatheviking

11

देर से जवाब

संपादित करें

मैंने फ़िल्टरमा लिखा है , एक प्लगइन जो इस कार्यक्षमता को सबसे आसान तरीके से जोड़ देगा।

वर्डप्रेस 3.5+ के लिए अपडेट करें

अब जबकि चीजें बहुत आसान हैं, यहाँ प्लगइन या म्यू-प्लगइन के रूप में एक बहुत ही सरल समाधान है।

यह यथासंभव कम संसाधनों का उपयोग करता है, केवल आवश्यक स्क्रीन पर लोड होता है और हर कस्टम टैक्सोनॉमी के लिए कॉलम + फिल्टर जोड़ता है।

add_action( 'plugins_loaded', array( 'WCM_Admin_PT_List_Tax_Filter', 'init' ) );
class WCM_Admin_PT_List_Tax_Filter
{
    private static $instance;

    public $post_type;

    public $taxonomies;

    static function init()
    {
        null === self::$instance AND self::$instance = new self;
        return self::$instance;
    }

    public function __construct()
    {
        add_action( 'load-edit.php', array( $this, 'setup' ) );
    }

    public function setup()
    {
        add_action( current_filter(), array( $this, 'setup_vars' ), 20 );

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

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

    public function setup_vars()
    {
        $this->post_type  = get_current_screen()->post_type;
        $this->taxonomies = array_diff(
            get_object_taxonomies( $this->post_type ),
            get_taxonomies( array( 'show_admin_column' => 'false' ) )
        );
    }

    public function add_columns( $taxonomies )
    {
        return array_merge( taxonomies, $this->taxonomies );
    }


    public function get_select()
    {
        $walker = new WCMF_walker;
        foreach ( $this->taxonomies as $tax )
        {
            wp_dropdown_categories( array(
                'taxonomy'        => $tax,
                'hide_if_empty'   => true,
                'show_option_all' => sprintf(
                    get_taxonomy( $tax )->labels->all_items
                ),
                'hide_empty'      => true,
                'hierarchical'    => is_taxonomy_hierarchical( $tax ),
                'show_count'      => true,
                'orderby'         => 'name',
                'selected'        => '0' !== get_query_var( $tax )
                    ? get_query_var( $tax )
                    : false,
                'name'            => $tax,
                'id'              => $tax,
                'walker'          => $walker,
            ) );
        }

    }

}

और फिर आपको बस एक स्वनिर्धारित वॉकर वर्ग की आवश्यकता है।

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

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

यह एक चक्कर दिया, लेकिन get_select () विधि याद आ रही है।
डेव रोमसे

@ goto10 आप सही थे। अपडेट किया गया। Btw: केवल लिंक किए गए प्लगइन को पकड़ना आसान है। यह एक या दो सप्ताह में प्लगइन रिपॉजिटरी में उपलब्ध होगा। (पहले से ही पुष्टि की है)।
कैसर

मैं का इस्तेमाल किया था $this->setup_vars();की शुरुआत में public function setup()आदेश पाने के लिए "manage_taxonomies_for_{$this->post_type}_columns"काम कर रहे
ईसाई

लेकिन यह हो सकता है क्योंकि मैं इसे एक थीम फ़ंक्शन में उपयोग करता हूं। add_action( 'init', array( 'WCM_Admin_PT_List_Tax_Filter', 'init' ) );
क्रिश्चियन

@ क्रिसटन यह विषय सामग्री नहीं है। यह एक प्लगइन में आता है और ऊपर दिए गए कोड के अनुसार वर्तमान में इसे थीम लोड किए जाने से पहले लोड किया गया है।
केसर

7

मैं सिर्फ एक त्वरित नोट बनाना चाहता था। WP के नए संस्करणों पर, व्यवस्थापक पर पोस्ट लिस्टिंग को WP_Posts_List_Table वर्ग द्वारा नियंत्रित किया जाता है। Apply_filters कोड अब इस प्रकार है:

if ( 'page' == $post_type )
        $posts_columns = apply_filters( 'manage_pages_columns', $posts_columns );
    else
        $posts_columns = apply_filters( 'manage_posts_columns', $posts_columns, $post_type );
    $posts_columns = apply_filters( "manage_{$post_type}_posts_columns", $posts_columns );

इसलिए नए कॉलम जोड़ने के लिए add_filter हुक इस तरह होना चाहिए:

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

यहाँ एक उदाहरण दिया गया है:

function my_add_columns($posts_columns, $post_type)
{
  if ('myposttype' == $post_type) {
    $posts_columns = array(
      "cb"            => "<input type=\"checkbox\" />",
      "title"         => "Title",
      "anothercolumn" => "Bacon",
      "date"          => __( 'Date' )
    );
    return $posts_columns;
  }
} 

अब, पोस्ट पंक्तियों के लिए। यह वह कोड है जो लिस्टिंग पर कॉलम डेटा को हैंडल करता है:

default:
            ?>
            <td <?php echo $attributes ?>><?php
                if ( is_post_type_hierarchical( $post->post_type ) )
                    do_action( 'manage_pages_custom_column', $column_name, $post->ID );
                else
                    do_action( 'manage_posts_custom_column', $column_name, $post->ID );
                do_action( "manage_{$post->post_type}_posts_custom_column", $column_name, $post->ID );
            ?></td>
            <?php

हमारे पोस्ट डेटा को पुनः प्राप्त करने के लिए, हमें इस तरह एक एक्शन हुक जोड़ना होगा:

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

उदाहरण (यह उदाहरण टैक्सोनोमी का उपयोग करता है, लेकिन आप किसी अन्य सामान को क्वेरी कर सकते हैं):

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

WP 3.2 में काम करता है!

custom_post_type: पुस्तकें custom_taxonomy: शैली

केवल संशोधित थे यह कहता है: // यहाँ बदलें

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

add_action('restrict_manage_posts', 'restrict_books_by_genre');


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

add_filter('parse_query', 'convert_id_to_term_in_query');

WP 3.2+ के लिए यह एक अच्छा और आसान उपाय है।
पीटरमारन

यह काम करता है लेकिन __("Show All {$info_taxonomy->label}")अनुवाद योग्य तार का उपयोग करने का एक गलत तरीका है।
मार्क कप्लून

2

यहां इसे प्रतिबंधित_मनगा_पोस्ट एक्शन का उपयोग करने का एक तरीका है। यह मेरे लिए अच्छा काम करता है और सभी प्रकार के पोस्ट और संबंधित टैक्सोनॉमी के लिए टैक्सोनॉमी द्वारा फ़िल्टर करने की क्षमता को जोड़ता है।

// registers each of the taxonomy filter drop downs
function sunrise_fbt_add_taxonomy_filters() {
    global $typenow;            // the current post type
    $taxonomies = get_taxonomies('','objects');
    foreach($taxonomies as $taxName => $tax) {
    if(in_array($typenow,$tax->object_type) && $taxName != 'category' && $taxName != 'tags') {
            $terms = get_terms($taxName);
            if(count($terms) > 0) {
              //Check if hierarchical - if so build hierarchical drop-down
              if($tax->hierarchical) {
                $args = array(
                      'show_option_all'    => 'All '.$tax->labels->name,
                      'show_option_none'   => 'Select '.$tax->labels->name,
                      'show_count'         => 1,
                      'hide_empty'         => 0, 
                      'echo'               => 1,
                      'hierarchical'       => 1,
                      'depth'              => 3, 
                      'name'               => $tax->rewrite['slug'],
                      'id'                 => $tax->rewrite['slug'],                      
                      'class'              => 'postform',
                      'depth'              => 0,
                      'tab_index'          => 0,
                      'taxonomy'           => $taxName,
                      'hide_if_empty'      => false);
            $args['walker'] = new Walker_FilterByTaxonomy;
                wp_dropdown_categories($args);
              } else {
                    echo "<select name='".$tax->rewrite['slug']."' id='".$tax->rewrite['slug']."' class='postform'>";
                    echo "<option value=''>Show All ".$tax->labels->name."</option>";
                    foreach ($terms as $term) { 
              echo '<option value="' . $term->slug . '"', $_GET[$taxName] == $term->slug ? ' selected="selected"' : '','>' . $term->name .' (' . $term->count .')</option>'; 
            }
                    echo "</select>";
                }
            }
    }
    }
}
add_action( 'restrict_manage_posts', 'sunrise_fbt_add_taxonomy_filters', 100 );

/**
 * Create HTML dropdown list of Categories.
 *
 * @package WordPress
 * @since 2.1.0
 * @uses Walker
 */
class Walker_FilterByTaxonomy extends Walker {
    var $tree_type = 'category';
    var $db_fields = array ('parent' => 'parent', 'id' => 'term_id');
    function start_el(&$output, $category, $depth, $args) {
      $args['selected'] = get_query_var( $args['taxonomy'] );
        $pad = str_repeat('&nbsp;', $depth * 3);

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

एक नोट - मैंने गहराई को सीमित करने की कोशिश की क्योंकि मेरे कुछ पदानुक्रमित टैक्सोनॉमी काफी बड़े हैं, लेकिन यह काम नहीं किया - wp_dropdown_categories फ़ंक्शन में बग हो सकता है?


2

यह अच्छी तरह से ज्ञात नहीं है मुझे लगता है कि, लेकिन वर्डप्रेस 3.5 के रूप में, आप पास कर सकते हैं 'show_admin_column' => trueकरने के लिए register_taxonomy। यह 2 चीजें करता है:

  1. टैक्सोनॉमी कॉलम को व्यवस्थापक पोस्ट प्रकार सूची दृश्य में जोड़ता है
  2. टैक्सोनॉमी कॉलम पर शब्द के नाम पर क्लिक करने से, यह वास्तव में उस शब्द की सूची को फ़िल्टर कर देगा

तो, चयन के रूप में बिल्कुल समान नहीं है, लेकिन लगभग समान कार्यक्षमता, कोड की सिर्फ एक पंक्ति की चौड़ाई।

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

इसके अलावा, जैसा कि आप पढ़ सकते हैं, टैक्सोनॉमी कॉलम को मैन्युअल रूप से जोड़ने के लिए एक नया फ़िल्टर है (यदि आपको वास्तव में ज़रूरत है)।


1

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

}
?>

मैंने मूल रूप से उस कोड को हटा दिया है जो विकल्प बनाता है और इसे अपने स्वयं के फ़ंक्शन में डालता है। फ़ंक्शन 'जेनरेट_टैक्सोनॉमी_टॉप्स', कर_लॉग लेने के अलावा, एक मूल और स्तर पैरामीटर भी लेता है। फ़ंक्शन मानता है कि मूल 0 के लिए इसके बनाने के विकल्प, जो सभी रूट स्तर की शर्तों का चयन करेगा। लूप में फ़ंक्शन पुन: आवर्ती होगा, एक माता-पिता के रूप में उस वर्तमान शब्द का उपयोग करके और एक के बाद एक स्तर बढ़ाएगा। यह स्वचालित रूप से उस किनारे को जोड़ देता है जितना गहरा आप पेड़ और वॉयला के नीचे जाते हैं!


1

WP 3.3.1 के लिए @Drew Gourley के उत्तर का अद्यतन (और http://wordpress.org/support/topic/wp_dropdown_categories-generating-url-id-number-instead-of-sunug?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";
    }
}

0

इस तथ्य के लिए माफी कि, एक नए उपयोगकर्ता के रूप में, मैं टिप्पणी पोस्ट नहीं कर सकता लेकिन मैं एक उत्तर पोस्ट कर सकता हूं ...

वर्डप्रेस 3.1 (आरसी 1) के रूप में माइक का जवाब (जिसने मुझे पिछले कुछ महीनों से इतनी अच्छी तरह से सेवा दी है) अब मेरे लिए काम नहीं करता है; किसी भी टैक्सोनॉमी बच्चे द्वारा प्रतिबंधित एक खाली परिणाम देता है। मैंने सोमाटिक के अद्यतन की कोशिश की और इसने बहुत अच्छा काम किया; इससे भी बेहतर, यह कई टैक्सोनॉमी प्रश्नों के साथ काम करता है जिन्हें इस रिलीज में काम किया गया है।


किसी कारण से दैहिक का संस्करण 3.1 के लिए भी काम नहीं करता है
मैन्नी फ्लेममंड

0

बस माइक और दैहिक से दोनों कोड की कोशिश की, और सोच रहा था कि प्रत्येक तकनीक से एक चीज कैसे प्राप्त की जाए:

माइक के कोड के साथ, यह पदानुक्रम विकल्प के साथ ड्रॉपडाउन सूची दिखाता है , जो बहुत मदद करता है। लेकिन आदेश दो ड्रॉपडाउन प्रदर्शित करने के लिए मैं नकल करने के लिए किया था if ($typenow=='produtos') {...}समारोह में बयान restrict_listings_by_business()और भी if ($pagenow=='edit.php' && ... }में convert_business_id_to_taxonomy_term_in_query($query)समारोह जो अब कोड का एक बहुत कुछ देता है।

दैहिक कोड के साथ मुझे केवल उन वर्गीकरणों को निर्दिष्ट करने की आवश्यकता है जिन्हें मैं ड्रॉपडाउन और बाम, कार्यों के रूप में देखना चाहता हूं; $filters = array('taxo1', 'taxo2');

प्रश्न: क्या मुझे दैहिक दृष्टिकोण मिल सकता है और पदानुक्रमित विकल्प भी हो सकता है?

इस ट्यूटोरियल के लिए वैसे भी बहुत बहुत धन्यवाद, बहुत मदद की!


एक पदानुक्रमित समाधान के लिए मेरा जवाब
देखिए

0

इस पर माइक का ट्यूटोरियल बहुत अच्छा है! मैं शायद अपने मीडिया श्रेणियाँ प्लगइन में इस कार्यक्षमता को जोड़ने की जहमत नहीं उठाता अगर मुझे इसे अपने दम पर पता लगाना होता।

उसने कहा, मुझे लगता है कि उपयोग करना parse_queryऔर फिर प्राप्त करना आवश्यक नहीं है। यह अपने स्वयं के कस्टम वॉकर वर्ग बनाने के लिए क्लीनर है। हो सकता है कि यह संभव नहीं था जब उन्होंने अपनी पोस्ट लिखी थी - मेरे लेखन के समय यह 3 साल पुरानी थी।

इस महान स्निपेट को गितुब पर चेकआउट करें। एक आकर्षण की तरह काम करता है, आईडी के ड्रॉपडाउन मूल्यों को स्लग में बदल देता है, इसलिए यह क्वेरी को संशोधित किए बिना केवल मूल रूप से काम करता है।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.