WordPress.org

Make WordPress Core

Changeset 21788


Ignore:
Timestamp:
09/08/2012 03:18:36 AM (6 years ago)
Author:
nacin
Message:

Allow easy registration of taxonomy columns on post (and custom post type) list table screens.

To register a column for a list table, use the new manage_taxonomies_for_{$post_type}_columns
filter. Introduces show_admin_column => true for register_taxonomy(), which automatically
displays that column on all associated post types.

props jtsternberg, SergeyBiryukov for initial patches.
fixes #21240.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/includes/class-wp-posts-list-table.php

    r21743 r21788  
    270270            $posts_columns['author'] = __( 'Author' );
    271271
    272         if ( empty( $post_type ) || is_object_in_taxonomy( $post_type, 'category' ) )
    273             $posts_columns['categories'] = __( 'Categories' );
    274 
    275         if ( empty( $post_type ) || is_object_in_taxonomy( $post_type, 'post_tag' ) )
    276             $posts_columns['tags'] = __( 'Tags' );
     272        $taxonomies = array();
     273
     274        $taxonomies = get_object_taxonomies( $post_type, 'objects' );
     275        $taxonomies = wp_filter_object_list( $taxonomies, array( 'show_admin_column' => true ), 'and', 'name' );
     276
     277        $taxonomies = apply_filters( "manage_taxonomies_for_{$post_type}_columns", $taxonomies, $post_type );
     278        $taxonomies = array_filter( $taxonomies, 'taxonomy_exists' );
     279
     280        foreach ( $taxonomies as $taxonomy ) {
     281            if ( 'category' == $taxonomy )
     282                $column_key = 'categories';
     283            elseif ( 'post_tag' == $taxonomy )
     284                $column_key = 'tags';
     285            else
     286                $column_key = 'taxonomy-' . $taxonomy;
     287
     288            $posts_columns[ $column_key ] = get_taxonomy( $taxonomy )->labels->name;
     289        }
    277290
    278291        $post_status = !empty( $_REQUEST['post_status'] ) ? $_REQUEST['post_status'] : 'all';
     
    603616            break;
    604617
    605             case 'categories':
    606             ?>
    607             <td <?php echo $attributes ?>><?php
    608                 $categories = get_the_category();
    609                 if ( !empty( $categories ) ) {
    610                     $out = array();
    611                     foreach ( $categories as $c ) {
    612                         $out[] = sprintf( '<a href="%s">%s</a>',
    613                             esc_url( add_query_arg( array( 'post_type' => $post->post_type, 'category_name' => $c->slug ), 'edit.php' ) ),
    614                             esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'category', 'display' ) )
    615                         );
    616                     }
    617                     /* translators: used between list items, there is a space after the comma */
    618                     echo join( __( ', ' ), $out );
    619                 } else {
    620                     _e( 'Uncategorized' );
    621                 }
    622             ?></td>
    623             <?php
    624             break;
    625 
    626             case 'tags':
    627             ?>
    628             <td <?php echo $attributes ?>><?php
    629                 $tags = get_the_tags( $post->ID );
    630                 if ( !empty( $tags ) ) {
    631                     $out = array();
    632                     foreach ( $tags as $c ) {
    633                         $out[] = sprintf( '<a href="%s">%s</a>',
    634                             esc_url( add_query_arg( array( 'post_type' => $post->post_type, 'tag' => $c->slug ), 'edit.php' ) ),
    635                             esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'tag', 'display' ) )
    636                         );
    637                     }
    638                     /* translators: used between list items, there is a space after the comma */
    639                     echo join( __( ', ' ), $out );
    640                 } else {
    641                     _e( 'No Tags' );
    642                 }
    643             ?></td>
    644             <?php
    645             break;
    646 
    647618            case 'comments':
    648619            ?>
     
    669640
    670641            default:
     642                if ( 'categories' == $column_name )
     643                    $taxonomy = 'category';
     644                elseif ( 'tags' == $column_name )
     645                    $taxonomy = 'post_tag';
     646                elseif ( 0 === strpos( $column_name, 'taxonomy-' ) )
     647                    $taxonomy = substr( $column_name, 9 );
     648
     649                if ( ! empty( $taxonomy ) ) {
     650                    $taxonomy_object = get_taxonomy( $taxonomy );
     651                    echo '<td ' . $attributes . '>';
     652                    if ( $terms = get_the_terms( $post->ID, $taxonomy ) ) {
     653                        $out = array();
     654                        foreach ( $terms as $t ) {
     655                            $posts_in_term_qv = array();
     656                            if ( 'post' != $post->post_type )
     657                                $posts_in_term_qv['post_type'] = $post->post_type;
     658                            if ( $taxonomy_object->query_var ) {
     659                                $posts_in_term_qv[ $taxonomy_object->query_var ] = $t->slug;
     660                            } else {
     661                                $posts_in_term_qv['taxonomy'] = $taxonomy;
     662                                $posts_in_term_qv['term'] = $t->slug;
     663                            }
     664
     665                            $out[] = sprintf( '<a href="%s">%s</a>',
     666                                esc_url( add_query_arg( $posts_in_term_qv, 'edit.php' ) ),
     667                                esc_html( sanitize_term_field( 'name', $t->name, $t->term_id, $taxonomy, 'display' ) )
     668                            );
     669                        }
     670                        /* translators: used between list items, there is a space after the comma */
     671                        echo join( __( ', ' ), $out );
     672                    } else {
     673                        if ( 'category' == $taxonomy )
     674                            echo __( 'Uncategorized' );
     675                        else
     676                            echo '&#8212;';
     677                    }
     678                    echo '</td>';
     679                    break;
     680                }
    671681            ?>
    672682            <td <?php echo $attributes ?>><?php
     
    679689            <?php
    680690            break;
    681         }
    682     }
     691            }
     692        }
    683693    ?>
    684694        </tr>
  • trunk/wp-includes/taxonomy.php

    r21766 r21788  
    4848        'public' => true,
    4949        'show_ui' => true,
     50        'show_admin_column' => true,
    5051        '_builtin' => true,
    5152    ) );
     
    5758        'public' => true,
    5859        'show_ui' => true,
     60        'show_admin_column' => true,
    5961        '_builtin' => true,
    6062    ) );
Note: See TracChangeset for help on using the changeset viewer.