it-swarm-ko.tech

맞춤 게시물 유형에 대한 관리 목록에 분류 필터 추가

'listing'라는 사용자 정의 게시 유형을 작성하고 'businesses'라는 사용자 정의 분류를 추가했습니다. 목록에 대한 관리자 목록에 비즈니스 드롭 다운 목록을 추가하고 싶습니다.

다음은이 기능이 Posts 에 대한 관리자 목록에서 보이는 것입니다 (사용자 정의 Post Type에 대해서도 마찬가지입니다) :

Categories Dropdown in Posts

여기에 현재 코드가 있습니다 ( 그리고 여기에 Gist의 코드가 있습니다 ) :

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

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

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

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

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

    // Register custom taxonomy

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

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

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

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

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

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


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

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

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

    return $columns;
  }

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

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

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

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

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

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

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

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

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

비즈니스 목록 드롭 다운 목록을 관리자 목록에 추가하려면 어떻게해야합니까?

128
Taras Mankovski

PDATE : 새로운 완전한 답변을 포함 시켰지만 처음 몇 개의 주석이 참조하는 맨 아래에 원래의 응답을 남겼습니다.


안녕하세요 @ tarasm :

비록 어렵지 않아야한다고 말했지만 조금 복잡합니다. 그러나 코드를 파기 전에 ...

스크린 샷 :

... 완제품의 스크린 샷을 확인하십시오.

No 필터링이 포함 된 리스팅 목록 페이지 :

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

리스팅 목록 페이지 With 필터링 :

Listings list page With Filtering
(출처 : mikeschinkel.com )

코드

그래서 여기에갑니다 ... (참고 : 분류 변수 이름 business에 대해 단일 형식을 사용했습니다; 귀하와 일치하기를 바랍니다. WordPress 및 데이터베이스 개발에 대한 많은 경험에서 과거에는 이렇게하는 것이 가장 좋다고 생각합니다.)

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 변수가 listingpost_type에 있는지 확인하기 시작합니다. 그렇지 않으면 모든 게시물 유형에 대해이 드롭 다운을 얻을 수 있지만 경우에 따라 원하는 것은 아니지만이 경우는 아닙니다.

다음으로 get_taxonomy()을 사용하여 비즈니스 분류법에 대한 정보를로드합니다. 분류 체계의 레이블을 검색하려면이 레이블이 필요합니다 (예 : " Businesses "; 하드 코딩 할 수는 있지만 나중에 국제화해야하는 경우에는 좋지 않습니다). $args 배열의 모든 적절한 인수와 함께 wp_dropdown_categories()을 호출하여 드롭 다운을 생성하십시오.

<?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-아주 간단합니다. 처음에는 드롭 다운에 표시되고 필터링이 적용되지 않은 경우입니다. 우리의 경우에는 "Show All Businesses "이 될 수 있지만 "모든 비즈니스에 대한 리스팅" 너는 좋아한다.

  • taxonomy-이 인수는 함수에 이름에 categories이 있어도 용어를 가져 오는 분류법을 함수에 알려줍니다. v2.8 이전 버전에서는 WordPress에 사용자 정의 분류법이 없었지만 팀을 추가 할 때 다른 이름으로 다른 함수를 작성하는 것보다이 함수에 분류 인수를 추가하는 것이 더 쉬울 것이라고 결정했습니다.

  • name-이 인수를 사용하면 드롭 다운에 대해 생성 된 <select> 요소의 name 속성에 WordPress 값을 지정할 수 있습니다. 명확하지 않은 경우 필터링 할 때 URL에 사용될 값이기도합니다.

  • orderby-이 인수는 결과를 사전 순으로 정렬하는 방법을 WordPress에 알려줍니다. 이 경우 분류 체계에서 용어의 name (이 경우 비즈니스 이름)을 구매하도록 주문했습니다.

  • selected-드롭 다운에서 드롭 다운에 현재 필터를 표시하려면이 인수가 필요합니다. 선택한 분류 용어의 term_id 여야합니다. 우리의 경우 "Business # 2"term_id 일 수 있습니다. 이 값은 어디에서 얻습니까? WordPress의 전역 변수에서 $wp_query; 여기에는 모든 URL 매개 변수 및 해당 값의 배열을 포함하는 query 속성이 있습니다 (물론 플러그인이 이미 수정하지 않은 한) WordPress가 처리하는 방식을 고려할 때 URL에 term URL 매개 변수가 전달됩니다 사용자가 유효한 용어 (예 : 나열된 업체 중 하나)를 선택한 경우 사용자가 필터 버튼을 클릭 할 때.

  • hierarchical-이 값을 true로 설정하면 함수의 분류 체계의 계층 적 특성을 존중하고 실제로 용어 (비즈니스)에 자식이있는 경우이를 트리보기로 표시합니다. 스크린 샷에 대한 자세한 내용은 아래를 참조하십시오.

  • depth-이 인수는 hierarchical 인수와 협력하여 함수가 하위를 표시하는 데 얼마나 많은 레벨이 필요한지를 결정합니다.

  • show_count-true 인 경우이 인수는 드롭 다운 내에서 용어 이름 왼쪽의 괄호 안에 카운트 포스트를 표시합니다. 이 경우 업체와 관련된 업체 정보가 표시됩니다. 스크린 샷에 대한 자세한 내용은 아래를 참조하십시오.

  • hide_empty-마지막으로 분류법에 not 게시물과 관련된 용어 (예 : 업체 정보와 관련이없는 업체)가있는 경우이를 다음과 같이 설정합니다. true은 드롭 다운에 포함되지 않습니다.

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

2 단계 : parse_query 필터 후크.

다음으로 하나의 매개 변수 (parse_query)가 있고 $query (v3.0.1에서는 호출이 1549 행에 있음)에서 호출되는 /wp-includes/query.php 필터 후크에주의를 기울입니다. WordPress가 URL 검사를 마치면 호출됩니다. $wp_query$wp_query->is_home 등을 포함하여 현재 활성화 된 $wp_query->is_author에서 모든 적절한 값을 설정합니다.

parse_query 필터 후크가 실행 된 후 WordPress는 get_posts()을 호출하고 현재 활성화 된 $wp_query에 지정된 내용을 기반으로 게시물 목록을로드합니다. 따라서 parse_query는 WordPress에서로드 할 게시물에 대한 마음을 바꿀 수있는 좋은 장소입니다.

사용 사례에서 WordPress를 선택하여 선택한 비즈니스를 기준으로 필터링하려고합니다. 즉, 선택한 업체와 관련된 업체 정보 만 표시합니다 (선택한 업체에 의해 "카테고리 화 된" 인 업체 정보 만 표시합니다 "). " 그러나 기술적으로 정확하지는 않습니다; categorybusiness이 (가) WordPress에 내장되어 있고 category이 사용자 정의 된 것을 제외하고 business과의 피어에 대한 자체 분류법입니다. 거의 똑같이 작동하지만 나는 ...)

코드에. 우리가하는 첫 번째 일은 현재 활성화 된 $wp_queryquery_vars에 대한 참조를 가져 와서 WordPress 자체의 parse_query() 함수 내에서 수행되는 방식과 마찬가지로 작업하기가 더 편리합니다. URL에 전달 된 매개 변수를 미러링하는 데 사용되는 $wp_query->query와 달리 $wp_query->query_vars 배열은 WordPress가 실행되고 수정 될 것으로 예상되는 쿼리를 제어하는 ​​데 사용됩니다. 따라서 하나를 수정 해야하는 경우 하나 이상이어야합니다 (적어도 I think 둘 다 다릅니다. 누군가가 다른 것을 알고 있다면 please 알려 주시면 업데이트 할 수 있습니다!)

<?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를 테스트하여 URL 경로 /wp-admin/edit.php에서 WordPress을 (를) 실제로로드하고 있는지 확인합니다. 다른 페이지에서 실수로 쿼리를 조이지 않도록하기 위해이 작업을 수행합니다. 또한 business 요소로 taxonomyterm 요소가 모두 있는지 확인합니다. 참고 taxonomyterm은 쌍입니다. 분류 용어를 쿼리 할 수 ​​있도록 함께 사용됩니다. 둘 다 또는 WordPress에 어떤 분류 체계를 검사할지 알 수 없습니다.

query_vars 배열의 business 요소에서 taxonomy이 어떻게 나타 났는지 궁금 할 것입니다. parse_query 훅에서 우리가 쓴 것은 query_var를 true로 설정하여 "business"분류 체계를 등록 할 때 대기하는 WordPress의 내부 마술을 유발했습니다 (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
    ));
}

이제 WordPress의 $ wp_query는 분류 용어 ID가 아닌 표준 분류 체계 필터링 된 쿼리에 슬러그를 사용하도록 작성되었습니다. 이 사용 사례에서 필터링 쿼리를 작동시키기 위해 실제로 필요한 것은 다음과 같습니다.

taxonomy : business

term : business-1 (즉, slug)

이것들은 아닙니다 :

taxonomy : business

term : 27 (즉, term_id)

흥미롭고 불행하게도 wp_dropdown_categories()에 의해 생성 된 드롭 다운은 <option>value 속성을 용어 (/ business ') term_id, not slug이라는 용어로 설정했습니다. 따라서 위의 스 니펫에서 다음과 같이 $wp_query->query_vars['term']를 숫자 term_id에서 문자열 slug로 변환해야합니다 (이것은 데이터베이스를 쿼리하는 가장 성능이 좋은 방법은 아니지만 WordPress가 term_ids에 대한 지원을 쿼리에 추가 할 때까지) 우리가 할 수있는 최선!) :

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

그리고 그게 다야! 이 두 기능을 사용하면 원하는 필터링을 얻을 수 있습니다.

하지만 더 기다려! :-)

계속해서 목록 목록에 "Businesses" 열을 추가했습니다. 왜냐하면 다음 질문이 될 것이라는 것을 알았 기 때문입니다. 필터링 대상에 대한 열이 없으면 최종 사용자에게는 매우 혼란 스러울 수 있습니다. (나는 스스로 어려움을 겪었고 코더였습니다!) 위의 이전 스크린 샷에서 "Businesses" 열을 이미 볼 수 있습니다.

3 단계 : manage_posts_columns 필터 후크.

게시물 목록에 열을 추가하려면 두 개 이상의 후크를 호출해야합니다. 첫 번째는 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_datewp_posts를 나타냅니다. 'author'는 저자 이름이 post_author 테이블에서 검색된 후 wp_users 필드입니다.

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

manage_posts_columns 훅의 경우 다른 플러그인이 목록에서 businesses을 (를) 아직 제거하지 않았다고 가정하면 $posts_columns 전에 'author' 배열에 author 열을 삽입하려고합니다!

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

( Note add_businesses_column_to_listing_list()을 쓸 때 PHP must 적절한 순서로 연관 배열에 값을 삽입하는 더 쉬운 방법?!? 또는 적어도 WordPress 핵심에 기능이 있어야합니까? 그러나 Google이 나를 실망시킨 이후로 작동하는 방식으로 진행했습니다. 누군가 제안 된 대안이 있다면 미리 귀를 기울이고 감사 할 것입니다!)

마침내 우리를 ...

4 단계 : manage_posts_custom_column 작업 후크

비즈니스를 열에 표시하기 위해해야 ​​할 두 번째 일은 실제로 manage_posts_custom_column 작업 후크를 사용하여 연결된 각 비즈니스의 이름을 출력하는 것입니다. 이 후크는 두 개의 매개 변수 (column_idpost_id)를 허용하며 /wp-admin/includes/template.php (v3.0.1에서는 호출이 1459 행에 있음)에서 호출됩니다.

<?php
add_action('manage_posts_custom_column', 'show_businesses_column_for_listing_list',10,2);
function show_businesses_column_for_listing_list( $column_id,$post_id ) {
    global $typenow;
    if ($typenow=='listing') {
        $taxonomy = '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() 함수를 사용하면이 분류 체계의 용어 목록 (즉,이 목록의 비즈니스)을 간단히 반환합니다. 여기서 permalink 일반적으로 용어와 관련이 있지만 게시 된 테마 및/또는 플러그인에 따라 다르게 게시 될 수있는 게시물을 나열하는 용어의 프론트 엔드 웹 페이지.

우리는 하이퍼 링크를 사용하여 용어를 하이퍼 링크하기 위해 퍼머 링크를 사용합니다. 그런 다음 파이프 ( '|') 문자로 구분 된 모든 하이퍼 링크 용어 (/ businesses)를 병합하고이를 사용자의 브라우저/HTTP 클라이언트로 보내는 PHP 버퍼로 ​​출력합니다.

<?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 :

이 화면과 같이 one drop down at top 을 찾고 있습니까, 아니면 post record per one record 을 찾고 있습니까? 어떻게 후자가 작동 할 것으로 기대하십니까?

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

전자의 경우 질문에 대한이 답변을 살펴보십시오. Wordpress 사용자 정의 게시물 유형의 관리 영역을 사용자 정의 필드로 정렬하는 방법? 분류법과 관련된보다 구체적인 정보를 제공 할 수 있습니다.

139
MikeSchinkel

대체 구현을 공유하고 싶었습니다. 이것을 알아낼 때 Mike의 놀라운 자습서가 없었으므로 솔루션이 약간 다릅니다. 구체적으로 Mike의 단계 # 1 제거 단계 # 2- 다른 단계는 여전히 적용 가능합니다.

Mike의 튜토리얼에서 wp_dropdown_categories()을 사용하면 수동 목록 작성이 필요하지만 슬러그 대신 ID 사용을 처리하기 위해 복잡한 조건부 쿼리 수정 (단계 # 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 배열에 꽂기 만하면 여러 분류 체계 필터를 신속하게 출력 할 수 있습니다. 그들은 Mike의 스크린 샷과 정확히 동일하게 나타납니다. 그런 다음 단계 ## 4로 진행할 수 있습니다.

44
somatic

다음은이를 사용하는 모든 사용자 정의 게시 유형에 적용되는 모든 분류에서 필터를 자동으로 작성하고 적용하는 버전입니다. (한마디로) 어쨌든 wp_dropdown_categories () 및 wordpress 3.1에서도 작동하도록 조정했습니다. 내가 작업하고있는 프로젝트는 ToDo라고 불리우며, 함수의 이름을 당신에게 의미있는 것으로 바꿀 수는 있지만 이것은 모든 것을 자동으로 처리해야합니다.

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'를 추가하는 플러그인을 사용하고 있습니다.이 플러그인을 변경하거나 기본값으로 폴백하기 위해 해당 인수를 제거해야합니다.

13
Drew Gourley

Late answer

편집하다

필자는 Filterama ,이 기능을 가장 쉬운 방법으로 추가 할 플러그인을 작성했습니다.

WordPress 3.5 이상용 업데이트

이제 그 일이 훨씬 쉬워졌습니다. 여기에는 아주간단한 플러그인 또는 플러그인으로서의 해결책이 있습니다.

가능한 적은 리소스를 사용하고 필요한 화면에서만로드하고 모든 사용자 지정 분류에 대해 Columns + Filters를 추가합니다.

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

    }

}

그리고 사용자 정의 된 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})"
                : ''
        );
    }
}
11
kaiser

나는 단지 빠른 노트를 만들고 싶었다. 최신 버전의 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
mines

WP 3.2에서 작동합니다!

custom_post_type : books 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');
7
lacroixca

이것은 잘 모르겠지만, Wordpress 3.5에서는 'show_admin_column' => trueregister_taxonomy로 전달할 수 있습니다. 이것은 2 가지 일을합니다 :

  1. 관리 게시물 유형 목록보기에 분류 열을 추가합니다.
  2. Taxonomy 열에있는 용어의 이름을 클릭하면 실제로 해당 용어를 목록으로 필터링합니다.

따라서 정확히 select와 거의 같지는 않지만 코드의 행이 하나뿐입니다.

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

또한 읽을 수 있듯이 분류 열을 수동으로 추가하기 위해 맞춤 설정된 새로운 필터가 있습니다 (실제로 필요한 경우).

2
Luca Reghellin

여기에 restrict_manage_posts 작업을 사용하여 수행하는 방법이 있습니다. 그것은 나를 위해 잘 작동하는 것 같고 모든 게시물 유형 및 관련 택 소노 미에 대한 분류법에 따라 필터링하는 기능을 추가합니다.

// 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
Brad Trivers

@ somvin의 요청에 따라 @ somatic의 대답의 계층 적 버전 :

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

}
?>

기본적으로 옵션을 만든 코드를 제거하고 자신의 함수에 넣습니다. tax_slug를 가져 오는 것 외에도 'generate_taxonomy_options'함수는 부모 및 수준 매개 변수를 사용합니다. 이 함수는 모든 루트 수준 용어를 선택할 부모 0에 대한 생성 옵션을 가정합니다. 루프에서 함수는 자신을 재귀 적으로 호출합니다. 현재 용어를 부모로 사용하고 레벨을 하나씩 늘립니다. 그것은 자동적으로 옆에 진드기를 더합니다. 나무와 깊은 곳으로 내려 가면 더 깊어집니다!

1
Manny Fleurmond

WP 3.3.1에 대한 @Drew Gourley의 답변 및 ( http://wordpress.org/support/topic/wp_dropdown_categories-generating-url-id-number-instead-of의 코드 통합 -slug? replies = 6 # post-2529115 ) :

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

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

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

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

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


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

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

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

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

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

Mike와 somatic의 두 코드를 모두 시험해 보았고 각 기법에서 한 가지를 얻는 방법에 대해 궁금해하고있었습니다.

Mike의 코드를 사용하면 hierarchical 옵션을 가진 드롭 다운 목록이 표시되어 많은 도움이됩니다. 하지만 두 개의 드롭 다운을 표시하려면 if ($typenow=='produtos') {...} 문을 restrict_listings_by_business() 함수에서 복제해야했고 convert_business_id_to_taxonomy_term_in_query($query) 함수에서 if ($pagenow=='edit.php' && ... }를 사용하여 많은 코드를 제공해야했습니다.

Somatic의 코드로 나는 드롭 다운과 빵으로보고 싶은 택 소노 미를 지정해야한다. $filters = array('taxo1', 'taxo2');

질문 : somatic의 접근법을 얻을 수 있고 또한 계층 적 옵션을 가질 수 있습니까?

어쨌든이 튜토리얼을 많이 주셔서 감사합니다.

0
kevin

새로운 사용자로서 나는 의견을 게시 할 수 없지만 답변을 게시 할 수 있다는 사실에 사과드립니다 ...

WordPress 3.1 (RC 1)에서 마이크의 대답은 (지난 몇 개월 동안 나에게 잘 해줬 음) 더 이상 나를 위해 일하지 않습니다. 어떤 택 소노 미 아이에 의해 제한하면 빈 결과가 나온다. 나는 Somatic의 업데이트를 시도했고 그것은 훌륭하게 작동했다; 더 나은 점은이 릴리스로 작업 한 다중 분류 쿼리와 함께 작동한다는 것입니다.

0
rsigg

이것에 대한 Mike의 튜토리얼은 훌륭합니다! 나는 아마 내 미디어 카테고리 플러그인에이 기능을 추가하는 데 신경 쓰지 않았을 것이다.

즉, 나는 parse_query를 사용한다고 생각하고 용어에 대한 질의를 얻을 필요는 없다. 나만의 커스텀 워커 클래스를 만드는 것이 더 깔끔합니다. 어쩌면 그것이 그가 나의 글을 쓸 때 가능하지 않았을 것입니다.

Github에서이 멋진 스 니펫을 확인하십시오. 매력처럼 작동하여 드롭 다운 값의 ID를 슬러그로 변경하므로 쿼리를 수정하지 않고도 기본적으로 작동합니다.

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

0
eddiemoya