Özel Bir Yazı Tipi için Yönetici Listesine Taksonomi Filtresi Eklemek?


129

Özel bir Posta Türü yarattım 'listing've bir Özel Bir Taksonomi adı verildi 'businesses'. Girişler için yönetici listesine bir açılır liste listesi eklemek istiyorum.

Bu işlevsellik Mesajlar için yönetici listesinde göründüğü gibi (Özel Yazı Tipim için de aynısını istiyorum):

Kategorilerdeki Açılan Kategoriler

İşte şu anki kodum ( Ve işte Gist'teki aynı kod. ):

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

İşletmelerin açılır listesini Girişlerin yönetici listesine nasıl ekleyebilirim?


8
Ekran görüntüsü için teşekkürler, bu gerçekten olması için yardımcı olur.
MikeSchinkel

Tam işi yapabilen bir eklenti Yönetici Taksonomisi Filtresi var.
Anh Tran

Yanıtlar:


140

GÜNCELLEME: Yeni bir tam cevap ekledim, ancak orijinal yanıtımı ilk birkaç yorumun referans aldığı altta bıraktım.


Merhaba @tarasm :

Her ne kadar zor olmasa da söylesem de biraz karışır. Ama kodu girmeden önce ...

Ekran Görüntüleri:

... bitmiş ürün için bazı ekran resimlerini inceleyelim:

Filtre Yok ile Listeler listesi sayfası :

Filtre Yok ile Listeler listesi sayfası
(kaynak: mikeschinkel.com )

Listeler liste sayfası ile Filtreleme:

İlan listesi sayfası Filtreli
(kaynak: mikeschinkel.com )

Kod

İşte başlıyoruz ... ( Not: Taksonomisinin adı için tekil bir form kullandım business; umarım sizinkiyle eşleşir. Geçmişte hem WordPress hem de veritabanı gelişimi ile ilgili çok fazla tecrübeden bu şekilde yapmanın en iyisi olduğuna inanıyorum. .)

Adım # 1: restrict_manage_postsİşlem kancası.

Yapmanız gereken ilk şey restrict_manage_posts, parametresi olmayan ve çağrılan eylemi bağlamaktır /wp-admin/edit.php(v3.0.1'de bu çağrı 378 numaralı hattan yapılır.) Bu, listenin yukarısındaki uygun konumda açılan seçimi oluşturmanıza olanak sağlar. İlanlar listeleniyor.

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

Biz kontrol ederek başlayın $typenowbiz üzerinde aslında olduğundan emin olmak için değişken post_typearasında listing. Bunu alamazsanız, bazı durumlarda istediğiniz, ancak bu durumda olmayan tüm yazı tipleri için aşağı açılırsınız.

Daha sonra kullanarak işletme taksonomisi hakkında bilgi yüklüyoruz get_taxonomy(). Taksonominin etiketini almak için buna ihtiyacımız var (yani " İşletmeler "; kodlanmış olabiliriz, ancak daha sonra uluslararasılaşmanız gerekiyorsa bu çok iyi değil.) Daha sonra diziyi oluşturmak için dizideki wp_dropdown_categories()tüm uygun argümanları çağırıyoruz $args. yıkılmak

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

Fakat uygun argümanlar nelerdir? Her birine ayrı ayrı bakalım:

  • show_optional_all- Oldukça basittir, ilk başta açılan menüde ve filtreleme uygulanmadığında görüntülenir. Bizim durumumuzda böyle olacak "Tüm İşletmeleri Göster " olabilir, ancak "Tüm İşletmeler İçin Listeler" veya ne istersen diyebilirdik.

  • taxonomy- Bu argümanlar, fonksiyonun categoriesadına sahip olsa bile, hangi taksonominin terimleri çekeceğini fonksiyona söyler . V2.8 ve önceki sürümlerde WordPress'in özel taksonomileri yoktu, ancak eklendiklerinde ekip bu fonksiyona bir taksonomi argümanı eklemenin başka bir isimle başka bir fonksiyon oluşturmaktan daha kolay olacağına karar verdi.

  • name- Bu argüman, WordPress'in nameaçılan menü için oluşturulan <select> öğesinin niteliği için kullanacağı değeri belirtmenizi sağlar . Sadece bariz olmadığı durumda, bu aynı zamanda filtrelemede URL'de kullanılacak değerdir.

  • orderby- Bu argüman WordPress'e sonuçların alfabetik olarak nasıl sıralanacağını anlatır. Bizim durumumuzda, sipariş vermeyi nametaksonomideki terimlerin, yani bu durumda işletme adlarının satın alınması gerektiğini belirttik .

  • selected- Bu argüman gereklidir, böylece aşağı açılır menüde geçerli filtreyi aşağı açılır menüde gösterebilir. Bu olmalı term_idseçilen sınıflandırma teriminden. Bizim durumumuzda bu olabilir term_iddan "İşletme 2." . Bu değeri nereden alıyoruz? WordPress'in global değişkeninden $wp_query; querytüm URL parametrelerinin ve değerlerinin bir dizisini içeren bir özelliğe sahiptir (elbette bazı yönlerde bir eklenti önceden değiştirilmediği sürece.) WordPress'in işleyişi nasıl işlerse term, kullanıcı filtreyi tıklattığında URL'de geçirilen bir URL parametresi olacak kullanıcı geçerli bir terim seçerse (yani listelenen işletmelerden biri).

  • hierarchical- Bunu ayarlayarak truetaksonominin hiyerarşik yapısına saygı gösterme işlevini anlatır ve aslında terimlerin (işletmelerin) çocuk sahibi olması durumunda bunları bir ağaç görünümünde gösterirsiniz. Bunun nasıl göründüğünü görmek için ekran görüntüsü almak için aşağıya bakın.

  • depth- Bu argüman hierarchical, fonksiyonun çocukları göstermede ne kadar derinlemesine devam etmesi gerektiğini belirleyen argümanla birlikte çalışır .

  • show_count- Eğer truebu argüman parantez içindeki sayıları yazılan listedeki adın soluna getirecekse. Bu durumda, bir işletmeyle ilgili sayıları listeler. Bunun nasıl göründüğünü görmek için ekran görüntüsü almak için aşağıya bakın.

  • hide_empty- Son olarak, eğer taksonomide bir yazıyla ilgili olmayan terimler varsa (yani, bir girişle ilişkili olmayan işletmeler), o zaman bunu trueaşağıya dahil edilmelerini önleyecek şekilde ayarlamak gerekir.

Taksonomi Bırakma hiyerarşisi olmalı ve sayılmalı
(kaynak: mikeschinkel.com )

Adım # 2: parse_queryFiltre kancası.

Daha sonra dikkatimizi parse_querybir parametresi ( $query) olan ve çağrılan /wp-includes/query.php(v3.0.1'de bu çağrı 1549 hattında ) olan filtre kancasına çağırıyoruz. aktif $wp_querygibi şeyleri de içeren $wp_query->is_homeve $wp_query->is_authorvb

parse_queryFiltre kancası çalıştıktan sonra, WordPress get_posts()şu anda etkin olanda belirtilenlere dayanarak gönderilerin bir listesini çağırır ve yükler $wp_query. Bu nedenle parse_query, WordPress'in hangi yazıların yükleneceği konusundaki fikrini değiştirmesini sağlamak için genellikle harika bir yer.

Kullanım durumunuzda, seçilen iş alanlarına göre filtrelemek için WordPress'i almak istiyoruz; yani, yalnızca seçilen işletmeyle ilişkilendirilmiş Listeleri görüntülemek (yalnızca " seçili işletme tarafından " kategorize edilmiş " Listeleri" diyebilirim , ancak teknik doğru değil; categoryeşdüzey kendi taksonomisi? ile businessharicinde categoryWordPress yerleşik ve businessgelenektir. Fakat kategorize mesajların aşina olanlar için bu hepsi benzer şekilde çalışırken anlamanıza yardımcı olabilir. Ama konuyu dağıtmak ...)

Kodda. Yaptığımız ilk şey şu anda etkin bir başvuru kapmak olduğunu $wp_query's query_varskendi sadece kendi WordPress içinde yapılır nasıl gibi çalışmak daha da kolaylaştırmak için' parse_query()fonksiyonu. $wp_query->queryURL'ye iletilen parametreleri yansıtmak için kullanılanın aksine , $wp_query->query_varsdizi, WordPress'in çalıştığı ve değiştirilmesi beklenen sorguyu kontrol etmek için kullanılır. Eğer birini değiştirmeniz gerekirse, bu o olurdu (en azından bunun ikisi arasında farklı olduğunu düşünüyorum ; eğer bir başkası biliyorsa lütfen bana bildirin, bu yüzden bunu güncelleyeyim!)

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

Daha sonra $pagenow, gerçekten de WordPress'i URL yolundan yüklediğimizden emin olmak için test ediyoruz /wp-admin/edit.php. Bunu, yanlışlıkla diğer sayfalardaki sorguları karıştırmamak için yapıyoruz. Aynı zamanda hem businessbir taxonomyeleman hem de bir eleman olduğumuzdan emin olmak için kontrol ederiz term. (Not taxonomyve termbir çift; bir taksonomi teriminin sorgulanmasına izin vermek için birlikte kullanılırlar; her ikisine de sahip olmalılar veya WordPress hangi taksonomiyi kontrol edeceğini bilmiyor.)

Sen nasıl merak edebilirsiniz businessiçinde geldi taxonomyunsuru query_varsdizisi. Kancamıza yazdıklarımız parse_query, " business" taksonomisini query_vargerçek olarak ayarlayarak beklerken koymakta beklediğiniz iç sihri tetikledi ( register_taxonomy()taksonominin ismini olduğu gibi kopyalar query_var; tabii ki değiştirebilirsin, ama bir çelişki yoksa) aynı ile sopa en iyisidir):

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

Şimdi WordPress '$ wp_query, taksonomi kimlikleri yerine, standart taksonomi filtreli sorgular için sümüklü böcek kullanmak üzere yazılmıştır. Bu kullanım için, filtreleme sorgumuzu çalıştırmamız için gerçekten ihtiyacımız olan şeyler şunlardır:

taxonomy:

term: İş 1 (yani slug)

Bunlar değil:

taxonomy:

term: 27 (örneğin term_id)

İlginçtir ve maalesef tarafından üretilen açılan wp_dropdown_categories()set <option>'ın value(terimin / iş) için özelliği' ni term_id, değil terim slug. Bu yüzden $wp_query->query_vars['term'], bir sayısal term_iddizgeden dizgisine slug, yukarıdan sapan snippet'te olduğu gibi dönüştürmemiz gerekiyor (Not: Bir veritabanını sorgulamak için en performanslı yol değil, WordPress term_id'ler için yapabileceğimiz en iyi sorguyu destekleyene kadar!) :

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

Ve bu kadar! Bu iki fonksiyonla istediğiniz filtrelemeyi elde edersiniz.

AMA BEKLEYİN, DAHA FAZLASI! :-)

İlerlemeye gittim ve bir "İşletmeler" sütunu ekledik , çünkü bir sonraki sorunuz olacağını biliyordum. Ne filtrelediğiniz için bir sütun olmadan son kullanıcı için kafa karıştırıcı olabilir. (Onunla kendim mücadele ettim ve kodlayıcıydım!) Tabii ki , önceki ekran görüntülerinde "İşletmeler" sütununu zaten görebilirsiniz .

Adım # 3: manage_posts_columnsFiltre kancası.

Posta listesine bir sütun eklemek için iki (2) kanca daha çağırmak gerekir. İlki manage_posts_columnsveya manage_listing_posts_columnsbunun yerine aradığım yazı tipine özgü sürüm . Bir parametreyi ( posts_columns) kabul eder ve çağrılır /wp-admin/includes/template.php(v3.0.1'de bu çağrı 623 hattındadır):

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

İşletme manage_posts_columnsdeğer gösterilir sütun başlığı ve önemli iç sütun tanımlayıcıdır kanca işlevi sütun dizisi aktarılır. : Standart kolon tanımlayıcıları bu ve daha fazlasını içerebilir 'cb', 'title' 'author'vb ``' date'`,

'cb'Olduğu checkboxkolon ve her ikisi de 'title've 'date'bakın post_titleve post_dategelen wp_postssırasıyla tablo. 'author'Tabii ki post_authoryazarın adı wp_userstablodan alındıktan sonraki alan .

'Cb' ekran görüntüsü onay kutusunu işaretler.
(kaynak: mikeschinkel.com )

İçin manage_posts_columnskanca biz sadece bizim sütun eklemek isteyen vardır businessesiçine $posts_columnsönce dizide 'author'kaldırmamıştır diğer bazı eklenti varsayarak authorhenüz listeden!

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

( PHP'nin uygun bir ilişkisel diziye bir değer eklemek için daha kolay bir yolu olması gerektiğini yazdığımı yazdığımı not edin ?!? Veya en azından WordPress çekirdeğinde bunu yapmak için bir işlev olması gerekiyor? beni hayal kırıklığına uğrattım. İşe yarayanlarla birlikte gittim. Herhangi birinin önerdiği alternatifler varsa, önceden tüm kulaklarımı ve minnettar olacağım!)add_businesses_column_to_listing_list()

Bu da sonunda bizi ...

Adım # 4: manage_posts_custom_columnEylem kancası

İşletmelerimizin sütunda görünmesini sağlamak için yapmamız gereken iki (2) ikinci şey ise manage_posts_custom_columneylem kancasını kullanarak ilişkili işletmelerin adını gerçekten vermektir. Bu kanca iki (2) parametreyi ( column_idve post_id) kabul eder ve ayrıca /wp-admin/includes/template.php(v3.0.1'de bu çağrı 1459 hattındadır) denir.

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

Bu kanca, her gönderi (/ iş) satırı için her sütun için çağrılır. İlk önce gerçekten sadece listingözel posta tipiyle çalıştığımızı doğruladıktan sonra switchtest etmek için bir ifade kullanıyoruz column_id. Seçtim switchçünkü bu kanca genellikle farklı sütunlar için çıktı üretmek için kullanılıyor, özellikle de şuna benzeyen birçok farklı yazı tipi için bir işlev kullanıyorsak:

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

Bizim kullanım senaryosunu incelenmesi biraz daha yakına Gördüğünüz get_the_terms()sadece bu taksonomisinde için terimler listesini verir fonksiyonunu (bu liste için yani işletmeler.) Burada olsun kalıcı bağlantı normalde ilişkili mesajları listeleyen terimin ön uç Web sayfası için tabiri ancak elbette yüklü tema ve / veya eklentilere bağlı olarak değişebilir.

Ben sadece köprüyü kullanarak köprü kurarım çünkü sadece şeyleri köprü severim. Ardından, (' |') karakteri ile ayrılmış tüm köprülü terimleri (/ işletmeler) bir araya getirip kullanıcının tarayıcısına / HTTP istemcisine gönderen PHP arabelleğine çıkarıyoruz:

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

ŞİMDİ sonunda bitti.

özet

Dolayısıyla, özet olarak, özel mesajlar listesi sayfasında hem bir filtre hem de ilgili bir sütun elde etmek için aşağıdaki dört (4) kancayı kullanmanız gerekir (Oh, ayrıca Mesajlar ve Sayfalarla da çalışacaktır.) Bunlar:

  • Adım # 1: restrict_manage_postsİşlem kancası.
  • Adım # 2: parse_queryFiltre kancası.
  • Adım # 3: manage_posts_columnsFiltre kancası.
  • Adım # 4: manage_posts_custom_columnEylem kancası

Kodu nereden indirebilirim?

Ama sizi yukarıdakilerin tamamını okumak için zorladıysam, aynı zamanda sadece onu denemek için de kodunu çıkardıysam kesinlikle çok iyi bir insan olmazdım! Ama bazılarının söylediğinin aksine, ben iyiyim. Öyleyse işte ya:

NOT @tarasm : Ben a için kancalar ekledimregister_post_type() ,register_taxonomy()böylece başkaları bunları yeniden yaratmak zorunda kalmadan deneyebilirdi. Bunu denemeden önce muhtemelen bu iki işlev çağrısını silmek isteyeceksiniz.

SON


Orijinal Yanıt:

Merhaba @tarasm :

Aradığınız üstünde aşağı bir damla bu ekran gibi ya Aradığınız sonrası kayıt başına aşağı bir damla ve böylece ikinci çalışmasını bekliyoruz nasıl olur?

WordPress Yöneticisi'nde Özel Bir Yazı Tipi için Sıralamaya Göre İşlevsellik Nasıl Oluşturulur
(kaynak: mikeschinkel.com )

Eski ise, şu cevaba bir göz atın . Bir Wordpress özel yazı tipinin admin alanı özel bir alana göre nasıl sıralanır? İhtiyacınız olan şey buysa, taksonomi ile ilgili daha fazla özellik sağlayabilirim.


Kategoriler filtresini gösterecek en üstte 1 açılır liste arıyorum. Özel kod yazmak zorunda kalmadan bunu yapmanın standart bir yolu olup olmadığını dolaşıyordum.
Taras Mankovski

İlk bakışta özel kod olmadan yapabileceğini sanmıyorum ama sonra özel kodun önemli olacağını sanmıyorum. Hazırlık yapacak bir müşteri çağrım var, bu yüzden bugün daha sonra olacak.
MikeSchinkel

2
Aslında her iki çözüm (somatic ve MikeSchinkel), aynı filtrede 2 farklı taksonomiyi filtrelemeye çalıştığınızda çalışmıyor: - / Aynı anda 2+ filtrelemeye çalıştığınızda daima en son taksonomiyi filtreleme.
Ünsal Korkmaz

1
@ Ünsal WordPress'in (3.0) şu anki sürümü birden fazla Taksonomi sorgusunu desteklememektedir, ancak duyduklarımdan 3.1 sürümüyle değişeceğini. Bu örneğin çoklu taksonomilerle çalışmasını sağlamak için, Posts_join ve posts_where filtre kancaları aracılığıyla sorgunuza bazı bağlantılar ve yerler eklemeniz gerekir.
Manny Fleurmond

1
WP 3.1 + 'da @ drew-gourley cevabında bir ve iki adımlar daha iyidir (aslında, 2. adımınız benim için işe yaramadı, sanırım yeni WordPress'te bu filtrelemede değişiklikler var).
Tomasz Struczyński

44

Sadece alternatif bir uygulamayı paylaşmak istedim. Bunu çözerken Mike'ın inanılmaz bir öğreticisine sahip değildim, bu yüzden benim çözümüm biraz farklı. Özellikle, Mike'ın # 1 no'lu adımını basitleştireceğim ve # 2 no'lu adımı elimine edeceğim - diğer adımlar hala uygulanabilir.

Mike'ın öğreticisinde, wp_dropdown_categories()bazı el ile liste oluşturma işleminden tasarruf etmemize rağmen , sümüklü böcek yerine kimliğini kullanması için bazı karmaşık koşullu sorgu değişikliği gerektiriyor ( adım # 2 ). Birden fazla taksonomi filtresi gibi bu senaryoyu diğer senaryolarla başa çıkmak için değiştirmenin zorluğundan bahsetmiyorum bile ..

Diğer bir yaklaşım ise, kusurlu olanı hiç kullanmamak wp_dropdown_categories(), ancak kendi açılır listemizi seçmek için baştan sona kendi listelerimizi oluşturmaktır. O kadar karmaşık değil, 30 satırdan az kod alıyor ve hiç takma gerektirmiyor 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>";
        }
    }
}

İstediğiniz taksonomileri $filtersdiziye kolayca takarak hızlıca çoklu taksonomi filtreleri çıkartabilirsiniz. Mike'ın ekranlarındakilerle tamamen aynı görünüyorlar. Sonra adım # 3 ve # 4 ile takip edebilirsiniz .


4
@somatic - Güzel güncelleme! Evet, kullanmak wp_dropdown_categories()çok fazla geçici çözüm gerektiriyor. Mümkün olduğunda ana işlevlere bağlı kalmaya çalışıyorum, ancak sizin de belirttiğiniz gibi, bazen bu şekilde daha fazla iş gerektiriyor. Sadece WordPress ile bir sorunu çözmek için genellikle birden fazla iyi yol olduğunu kanıtlamaya gideriz. Aferin!
MikeSchinkel

WordPress 3.1 benim için çalışmayı bıraktı. Tam olarak neyin değiştiğini anlamaya çalışıyorum. Hala çalışıyor olmalı gibi görünüyor: taksonomi ve terim salyangozları url'de GET değeri olarak görünüyor, ancak sonuçta elde edilen sonuç 0
sonuçtur

Bu çalışmayı elde etmeye çalışıyorum, ancak tek yolum parse_query kancasını kullanmak, taksonominin sorgusu var değişkenini kontrol etmek ve buna göre taksonomiyi ve terim sorgusu değişkenlerini ayarlamaktı. WP Kullanımı 3.1. Filtre gönderilirken URL’de taksonomi ve terim görünmeli mi?
sanchothefat

2
Benim için bir cazibe gibi çalışıyor! Gerçekten de çok şık bir çözüm. Size bir bira borcum var :)
Michal Mau

@somatic Bu harika çalışıyor, ancak $ term-> count'in yalnızca bu post tipinin terimlerini saymasının bir yolu var mı? Örneğin, hem fotoğraflar hem de videolar için özel bir taksonomiyetim varsa, videoların özel gönderisine bakarken bana gösterecek olan, yalnızca bu videoyu kullanan toplam video gönderisi sayısı yerine, her iki özel gönderim türünden bu terimin toplam yayın sayısını yazın terim.
Greenhoe

13

İşte bunun, bunları kullanan tüm özel yazı türlerine uygulanan tüm taksonomilerden otomatik olarak filtre oluşturan ve uygulayan bir sürümü. (ne ağız dolusu) Her neyse, ben de çimdiklendim, böylece wp_dropdown_category () ve wordpress 3.1 ile çalışacaktı. Üzerinde çalıştığım projenin adı ToDo, işlevleri sizin için anlamlı bir şey olarak yeniden adlandırabilirsiniz, ancak bu hemen hemen her şey için otomatik olarak çalışmalıdır.

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

Şartları sipariş etmenin bir yolu olarak 'term_order' ekleyen bir eklenti kullandığımı, bunu değiştirmek zorunda kalacağınızı veya bu argümanı varsayılana geri döndürmek zorunda kalacağınızı unutmayın.


gerçekten çok seksi. Hata bildirimleri alıyordum, bu yüzden Tümünü görüntüle 0 ile ilişkili terimleri bulmaya çalışmaktan kaçının (isset ($ var)) if (isset ($ var) && $ var> 0) olarak değiştirdim. oh ve ben todo_convert_restrict fonksiyonunda $ sorgu dönmek zorunda kaldı
helgatheviking

11

Geç cevap

Düzenle

Bu işlevi en kolay şekilde ekleyebilecek bir eklenti olan Filterama'yı yazdım .

WordPress 3.5+ Güncellemesi

Artık işler daha kolay, işte eklenti ya da mu-eklenti olarak çok basit bir çözüm.

Mümkün olduğu kadar az kaynak kullanıyor, yalnızca gereken ekranlara yüklüyor ve her özel taksonomi için Sütun + Filtreler ekliyor.

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

    }

}

Ve sonra sadece özelleştirilmiş bir Walker sınıfına ihtiyacınız var.

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

Bu bir koşuşturma verdi, ancak get_select () yöntemi eksik gibi görünüyor.
Dave Romsey

@ goto10 Haklıydın. Güncellenmiş. Btw: Sadece bağlantılı eklentiyi kapmak daha kolay. Eklenti havuzunda bir veya iki hafta içinde kullanıma sunulacak. (Zaten onaylandı).
kaiser

Ben kullanmak zorunda $this->setup_vars();başında public function setup()olması için "manage_taxonomies_for_{$this->post_type}_columns"çalışma
Christian

Ama olabilir, çünkü ben Theme işlevinde kullanıyorum.php ileadd_action( 'init', array( 'WCM_Admin_PT_List_Tax_Filter', 'init' ) );
Christian

@Christian Bu tema malzemesi değil. Bu, bir eklentiye aittir ve yukarıdaki kod şu anda olduğu gibi Temalar yüklenmeden çok önce yüklenmiştir.
kaiser

7

Sadece kısa bir not almak istedim. WP'nin daha yeni sürümlerinde, yönetici üzerindeki kayıt listeleri WP_Posts_List_Table sınıfı tarafından yönetilir. Application_filters kodu şimdi şöyle:

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

Dolayısıyla, yeni sütunlar eklemek için bir add_filter kancası şöyle olmalıdır:

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

İşte bir örnek:

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

Şimdi, posta satırları için. Bu, listelerdeki sütun verilerini işleyen koddur:

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

Gönderi verilerimizi almak için, şöyle bir eylem kancası eklemeliyiz:

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

Örnek (bu örnek taksonomileri kullanır, ancak diğer maddeleri sorgulayabilirsiniz):

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'DEKİ İŞLER!

custom_post_type: kitaplar custom_taxonomy: tarz

Sadece değişiklik diyordu: // BURAYA değiştir

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+ için bu güzel ve kolay bir çözüm.
petermolnar

çalışır ancak __("Show All {$info_taxonomy->label}")çevrilebilir dizeleri kullanmak için yanlış bir yoldur.
Mark Kaplun

2

İşte restrict_manage_posts eylemini kullanarak yapmanın bir yolu. Benim için iyi çalışıyor gibi görünüyor ve tüm post tipleri ve oradaki ilgili taksonomiler için taksonomiye göre filtreleme yeteneği ekliyor.

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

Bir not - Derinliği kısıtlamaya çalıştım, çünkü bazı hiyerarşik taksonomilerim oldukça büyük fakat işe yaramadı - wp_dropdown_category işlevinde bir hata olabilir mi?


2

Bu iyi sanırım bilinmemektedir, ancak wordpress 3.5'lik gibi, sen iletebilirsiniz 'show_admin_column' => trueiçin register_taxonomy. Bu 2 şey yapar:

  1. Taksonomi sütununu yönetici yazı tipi listesi görünümüne ekler
  2. Taksonomi sütunundaki terimin adını tıklatarak, listeyi o terime göre filtreleyecektir .

Yani, tamamen bir seçime sahip olmakla aynı değil, neredeyse aynı işlevselliğe sahip, sadece bir satır kod genişliği.

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

Ayrıca, okuyabileceğiniz gibi, el ile ekleme taksonomisi sütunu için özel olarak tasarlanmış yeni bir filtre var (gerçekten ihtiyacınız varsa).


1

@Kevin tarafından talep edilen @ somatic'in cevabının hiyerarşik versiyonu:

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

}
?>

Temelde seçenekleri yaratan kodu kaldırdım ve kendi fonksiyonuna koydum. 'Create_taxonomy_options' işlevi, tax_slug kullanımına ek olarak ayrıca bir üst ve seviye parametresi alır. İşlev, tüm kök düzeyi terimlerini seçecek olan üst 0 seçeneğinin oluşturma seçeneklerini varsayar. Döngüde, fonksiyon öznitelikle kendisini çağırır, şu anki terimi bir ebeveyn olarak kullanır ve seviyeyi bir artırır. Ağaca ve işten aşağı doğru ilerlediğiniz tarafa otomatik olarak keneler ekler!


1

WP 3.3.1 (ve kod dahil etmek için @Drew Gourley en cevabın Güncelleme 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";
    }
}

0

Yeni bir kullanıcı olarak yorum gönderemem ama cevap yazabildiğim için özür dilerim ...

WordPress 3.1'den (RC 1) Mike'ın cevabı (aylar boyunca bana son derece iyi hizmet eden) artık benim için çalışmıyor; Herhangi bir taksonomi çocuğu tarafından kısıtlanması boş bir sonuç verir. Somatic'in güncellemesini denedim ve harika çalıştı; daha da iyisi, bu sürümde çalışılmış olan çoklu taksonomik sorgularla çalışıyor.


Nedense somatic sürümü 3.1 için de çalışmıyor
Manny Fleurmond

0

Sadece her iki kodu da denedim, Mike ve somatic ve her teknikten bir şeyi nasıl elde edeceğinizi merak ediyordum:

Mike koduyla, açılan listeyi çok yardımcı olan hiyerarşik seçeneğiyle birlikte gösterir . Ancak iki açılır listeleri görüntülemek için ben çoğaltmak zorunda if ($typenow=='produtos') {...}fonksiyonunda deyimi restrict_listings_by_business()ve ayrıca if ($pagenow=='edit.php' && ... }içinde convert_business_id_to_taxonomy_term_in_query($query)artık bir sürü kod verir fonksiyonu.

Somatic koduyla sadece dropdown ve bam olarak görmek istediğim taksonomileri belirtmem gerekiyor; $filters = array('taxo1', 'taxo2');

Soru: Somatik'in yaklaşımını ve hiyerarşik seçeneğini bulabilir miyim?

Yine de bu eğitim için çok teşekkürler, çok yardımcı oldu!


Hiyerarşik bir çözüm için cevabımı gör
Manny Fleurmond

0

Mike'ın bu konuda öğretici harika! Kendi başıma çözmek zorunda kalsaydım, muhtemelen bu işlevi Medya Kategorileri eklentisine eklemekten rahatsız olmazdım.

Bu, kullanarak düşünüyorum parse_queryve sonra terim için sorgu almak gerekli olmadığını söyledi. Kendi özel yürüteç sınıfını oluşturmak için daha temiz. Belki de görevini yazarken bu mümkün değildi - yazı yazarken 3 yaşındaydı.

Github'daki bu harika pasajı kontrol et. Bir cazibe gibi çalışır, aşağı açılan değerlerdeki kimlikleri sümüklü böcekler olarak değiştirir, bu nedenle sorguyu değiştirmeden yalnızca yerel olarak çalışır.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.