WordPress.org

Make WordPress Core

Ticket #19556: 19556.diff

File 19556.diff, 14.3 KB (added by sillybean, 5 years ago)

Make wp_term_checklist() available as a template tag, add support for 'name' argument

  • trunk/src/wp-admin/includes/template.php

     
    88 * @subpackage Administration
    99 */
    1010
    11 //
    12 // Category Checklists
    13 //
    14 
    15 /**
    16  * Walker to output an unordered list of category checkbox <input> elements.
    17  *
    18  * @see Walker
    19  * @see wp_category_checklist()
    20  * @see wp_terms_checklist()
    21  * @since 2.5.1
    22  */
    23 class Walker_Category_Checklist extends Walker {
    24         var $tree_type = 'category';
    25         var $db_fields = array ('parent' => 'parent', 'id' => 'term_id'); //TODO: decouple this
    26 
    27         function start_lvl( &$output, $depth = 0, $args = array() ) {
    28                 $indent = str_repeat("\t", $depth);
    29                 $output .= "$indent<ul class='children'>\n";
    30         }
    31 
    32         function end_lvl( &$output, $depth = 0, $args = array() ) {
    33                 $indent = str_repeat("\t", $depth);
    34                 $output .= "$indent</ul>\n";
    35         }
    36 
    37         function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {
    38                 extract($args);
    39                 if ( empty($taxonomy) )
    40                         $taxonomy = 'category';
    41 
    42                 if ( $taxonomy == 'category' )
    43                         $name = 'post_category';
    44                 else
    45                         $name = 'tax_input['.$taxonomy.']';
    46 
    47                 $class = in_array( $category->term_id, $popular_cats ) ? ' class="popular-category"' : '';
    48                 $output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="'.$name.'[]" id="in-'.$taxonomy.'-' . $category->term_id . '"' . checked( in_array( $category->term_id, $selected_cats ), true, false ) . disabled( empty( $args['disabled'] ), false, false ) . ' /> ' . esc_html( apply_filters('the_category', $category->name )) . '</label>';
    49         }
    50 
    51         function end_el( &$output, $category, $depth = 0, $args = array() ) {
    52                 $output .= "</li>\n";
    53         }
    54 }
    55 
    56 /**
    57  * Output an unordered list of checkbox <input> elements labelled
    58  * with category names.
    59  *
    60  * @see wp_terms_checklist()
    61  * @since 2.5.1
    62  *
    63  * @param int $post_id Mark categories associated with this post as checked. $selected_cats must not be an array.
    64  * @param int $descendants_and_self ID of the category to output along with its descendents.
    65  * @param bool|array $selected_cats List of categories to mark as checked.
    66  * @param bool|array $popular_cats Override the list of categories that receive the "popular-category" class.
    67  * @param object $walker Walker object to use to build the output.
    68  * @param bool $checked_ontop Move checked items out of the hierarchy and to the top of the list.
    69  */
    70 function wp_category_checklist( $post_id = 0, $descendants_and_self = 0, $selected_cats = false, $popular_cats = false, $walker = null, $checked_ontop = true ) {
    71         wp_terms_checklist( $post_id, array(
    72                 'taxonomy' => 'category',
    73                 'descendants_and_self' => $descendants_and_self,
    74                 'selected_cats' => $selected_cats,
    75                 'popular_cats' => $popular_cats,
    76                 'walker' => $walker,
    77                 'checked_ontop' => $checked_ontop
    78         ) );
    79 }
    80 
    81 /**
    82  * Output an unordered list of checkbox <input> elements labelled
    83  * with term names. Taxonomy independent version of wp_category_checklist().
    84  *
    85  * @since 3.0.0
    86  *
    87  * @param int $post_id
    88  * @param array $args
    89  */
    90 function wp_terms_checklist($post_id = 0, $args = array()) {
    91         $defaults = array(
    92                 'descendants_and_self' => 0,
    93                 'selected_cats' => false,
    94                 'popular_cats' => false,
    95                 'walker' => null,
    96                 'taxonomy' => 'category',
    97                 'checked_ontop' => true
    98         );
    99         $args = apply_filters( 'wp_terms_checklist_args', $args, $post_id );
    100 
    101         extract( wp_parse_args($args, $defaults), EXTR_SKIP );
    102 
    103         if ( empty($walker) || !is_a($walker, 'Walker') )
    104                 $walker = new Walker_Category_Checklist;
    105 
    106         $descendants_and_self = (int) $descendants_and_self;
    107 
    108         $args = array('taxonomy' => $taxonomy);
    109 
    110         $tax = get_taxonomy($taxonomy);
    111         $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    112 
    113         if ( is_array( $selected_cats ) )
    114                 $args['selected_cats'] = $selected_cats;
    115         elseif ( $post_id )
    116                 $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    117         else
    118                 $args['selected_cats'] = array();
    119 
    120         if ( is_array( $popular_cats ) )
    121                 $args['popular_cats'] = $popular_cats;
    122         else
    123                 $args['popular_cats'] = get_terms( $taxonomy, array( 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) );
    124 
    125         if ( $descendants_and_self ) {
    126                 $categories = (array) get_terms($taxonomy, array( 'child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0 ) );
    127                 $self = get_term( $descendants_and_self, $taxonomy );
    128                 array_unshift( $categories, $self );
    129         } else {
    130                 $categories = (array) get_terms($taxonomy, array('get' => 'all'));
    131         }
    132 
    133         if ( $checked_ontop ) {
    134                 // Post process $categories rather than adding an exclude to the get_terms() query to keep the query the same across all posts (for any query cache)
    135                 $checked_categories = array();
    136                 $keys = array_keys( $categories );
    137 
    138                 foreach( $keys as $k ) {
    139                         if ( in_array( $categories[$k]->term_id, $args['selected_cats'] ) ) {
    140                                 $checked_categories[] = $categories[$k];
    141                                 unset( $categories[$k] );
    142                         }
    143                 }
    144 
    145                 // Put checked cats on top
    146                 echo call_user_func_array(array(&$walker, 'walk'), array($checked_categories, 0, $args));
    147         }
    148         // Then the rest of them
    149         echo call_user_func_array(array(&$walker, 'walk'), array($categories, 0, $args));
    150 }
    151 
    152 /**
    153  * Retrieve a list of the most popular terms from the specified taxonomy.
    154  *
    155  * If the $echo argument is true then the elements for a list of checkbox
    156  * <input> elements labelled with the names of the selected terms is output.
    157  * If the $post_ID global isn't empty then the terms associated with that
    158  * post will be marked as checked.
    159  *
    160  * @since 2.5.0
    161  *
    162  * @param string $taxonomy Taxonomy to retrieve terms from.
    163  * @param int $default Unused.
    164  * @param int $number Number of terms to retrieve. Defaults to 10.
    165  * @param bool $echo Optionally output the list as well. Defaults to true.
    166  * @return array List of popular term IDs.
    167  */
    168 function wp_popular_terms_checklist( $taxonomy, $default = 0, $number = 10, $echo = true ) {
    169         $post = get_post();
    170 
    171         if ( $post && $post->ID )
    172                 $checked_terms = wp_get_object_terms($post->ID, $taxonomy, array('fields'=>'ids'));
    173         else
    174                 $checked_terms = array();
    175 
    176         $terms = get_terms( $taxonomy, array( 'orderby' => 'count', 'order' => 'DESC', 'number' => $number, 'hierarchical' => false ) );
    177 
    178         $tax = get_taxonomy($taxonomy);
    179 
    180         $popular_ids = array();
    181         foreach ( (array) $terms as $term ) {
    182                 $popular_ids[] = $term->term_id;
    183                 if ( !$echo ) // hack for AJAX use
    184                         continue;
    185                 $id = "popular-$taxonomy-$term->term_id";
    186                 $checked = in_array( $term->term_id, $checked_terms ) ? 'checked="checked"' : '';
    187                 ?>
    188 
    189                 <li id="<?php echo $id; ?>" class="popular-category">
    190                         <label class="selectit">
    191                         <input id="in-<?php echo $id; ?>" type="checkbox" <?php echo $checked; ?> value="<?php echo (int) $term->term_id; ?>" <?php disabled( ! current_user_can( $tax->cap->assign_terms ) ); ?> />
    192                                 <?php echo esc_html( apply_filters( 'the_category', $term->name ) ); ?>
    193                         </label>
    194                 </li>
    195 
    196                 <?php
    197         }
    198         return $popular_ids;
    199 }
    200 
    20111/**
    20212 * {@internal Missing Short Description}}
    20313 *
  • trunk/src/wp-includes/category-template.php

     
    11891189
    11901190        return $r;
    11911191}
     1192
     1193//
     1194// Category Checklists
     1195//
     1196
     1197/**
     1198 * Walker to output an unordered list of category checkbox <input> elements.
     1199 *
     1200 * @see Walker
     1201 * @see wp_category_checklist()
     1202 * @see wp_terms_checklist()
     1203 * @since 2.5.1
     1204 */
     1205class Walker_Category_Checklist extends Walker {
     1206        var $tree_type = 'category';
     1207        var $db_fields = array ('parent' => 'parent', 'id' => 'term_id'); //TODO: decouple this
     1208
     1209        function start_lvl( &$output, $depth = 0, $args = array() ) {
     1210                $indent = str_repeat("\t", $depth);
     1211                $output .= "$indent<ul class='children'>\n";
     1212        }
     1213
     1214        function end_lvl( &$output, $depth = 0, $args = array() ) {
     1215                $indent = str_repeat("\t", $depth);
     1216                $output .= "$indent</ul>\n";
     1217        }
     1218
     1219        function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) {
     1220                extract($args);
     1221
     1222                if ( empty($taxonomy) )
     1223                        $taxonomy = 'category';
     1224
     1225                if ( !isset($name) || !$name ) {
     1226                        if ( $taxonomy == 'category' )
     1227                                $name = 'post_category';
     1228                        else
     1229                                $name = 'tax_input['.$taxonomy.']';
     1230                }
     1231
     1232                $class = in_array( $category->term_id, $popular_cats ) ? ' class="popular-category"' : '';
     1233                $output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="'.$name.'[]" id="in-'.$taxonomy.'-' . $category->term_id . '"' . checked( in_array( $category->term_id, $selected_cats ), true, false ) . disabled( empty( $args['disabled'] ), false, false ) . ' /> ' . esc_html( apply_filters('the_category', $category->name )) . '</label>';
     1234        }
     1235
     1236        function end_el( &$output, $category, $depth = 0, $args = array() ) {
     1237                $output .= "</li>\n";
     1238        }
     1239}
     1240
     1241/**
     1242 * Output an unordered list of checkbox <input> elements labelled
     1243 * with category names.
     1244 *
     1245 * @see wp_terms_checklist()
     1246 * @since 2.5.1
     1247 *
     1248 * @param int $post_id Mark categories associated with this post as checked. $selected_cats must not be an array.
     1249 * @param int $descendants_and_self ID of the category to output along with its descendents.
     1250 * @param bool|array $selected_cats List of categories to mark as checked.
     1251 * @param bool|array $popular_cats Override the list of categories that receive the "popular-category" class.
     1252 * @param object $walker Walker object to use to build the output.
     1253 * @param bool $checked_ontop Move checked items out of the hierarchy and to the top of the list.
     1254 */
     1255function wp_category_checklist( $post_id = 0, $descendants_and_self = 0, $selected_cats = false, $popular_cats = false, $walker = null, $checked_ontop = true ) {
     1256        wp_terms_checklist( $post_id, array(
     1257                'taxonomy' => 'category',
     1258                'descendants_and_self' => $descendants_and_self,
     1259                'selected_cats' => $selected_cats,
     1260                'popular_cats' => $popular_cats,
     1261                'walker' => $walker,
     1262                'checked_ontop' => $checked_ontop
     1263        ) );
     1264}
     1265
     1266/**
     1267 * Output an unordered list of checkbox <input> elements labelled
     1268 * with term names. Taxonomy independent version of wp_category_checklist().
     1269 *
     1270 * @since 3.0.0
     1271 *
     1272 * @param int $post_id
     1273 * @param array $args
     1274 */
     1275function wp_terms_checklist($post_id = 0, $args = array()) {
     1276        $defaults = array(
     1277                'descendants_and_self' => 0,
     1278                'selected_cats' => false,
     1279                'popular_cats' => false,
     1280                'walker' => null,
     1281                'taxonomy' => 'category',
     1282                'checked_ontop' => true
     1283        );
     1284        $args = apply_filters( 'wp_terms_checklist_args', $args, $post_id );
     1285
     1286        extract( wp_parse_args($args, $defaults), EXTR_SKIP );
     1287
     1288        if ( empty($walker) || !is_a($walker, 'Walker') )
     1289                $walker = new Walker_Category_Checklist;
     1290
     1291        $descendants_and_self = (int) $descendants_and_self;
     1292
     1293        $args = array('taxonomy' => $taxonomy);
     1294
     1295        if ( isset($name) )
     1296                $args['name'] = $name;
     1297
     1298        if ( is_array( $selected_cats ) )
     1299                $args['selected_cats'] = $selected_cats;
     1300        elseif ( $post_id )
     1301                $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
     1302        else
     1303                $args['selected_cats'] = array();
     1304
     1305        if ( is_array( $popular_cats ) )
     1306                $args['popular_cats'] = $popular_cats;
     1307        else
     1308                $args['popular_cats'] = get_terms( $taxonomy, array( 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) );
     1309
     1310        if ( $descendants_and_self ) {
     1311                $categories = (array) get_terms($taxonomy, array( 'child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0 ) );
     1312                $self = get_term( $descendants_and_self, $taxonomy );
     1313                array_unshift( $categories, $self );
     1314        } else {
     1315                $categories = (array) get_terms($taxonomy, array('get' => 'all'));
     1316        }
     1317
     1318        if ( $checked_ontop ) {
     1319                // Post process $categories rather than adding an exclude to the get_terms() query to keep the query the same across all posts (for any query cache)
     1320                $checked_categories = array();
     1321                $keys = array_keys( $categories );
     1322
     1323                foreach( $keys as $k ) {
     1324                        if ( in_array( $categories[$k]->term_id, $args['selected_cats'] ) ) {
     1325                                $checked_categories[] = $categories[$k];
     1326                                unset( $categories[$k] );
     1327                        }
     1328                }
     1329
     1330                // Put checked cats on top
     1331                echo call_user_func_array(array(&$walker, 'walk'), array($checked_categories, 0, $args));
     1332        }
     1333        // Then the rest of them
     1334        echo call_user_func_array(array(&$walker, 'walk'), array($categories, 0, $args));
     1335}
     1336
     1337/**
     1338 * Retrieve a list of the most popular terms from the specified taxonomy.
     1339 *
     1340 * If the $echo argument is true then the elements for a list of checkbox
     1341 * <input> elements labelled with the names of the selected terms is output.
     1342 * If the $post_ID global isn't empty then the terms associated with that
     1343 * post will be marked as checked.
     1344 *
     1345 * @since 2.5.0
     1346 *
     1347 * @param string $taxonomy Taxonomy to retrieve terms from.
     1348 * @param int $default Unused.
     1349 * @param int $number Number of terms to retrieve. Defaults to 10.
     1350 * @param bool $echo Optionally output the list as well. Defaults to true.
     1351 * @return array List of popular term IDs.
     1352 */
     1353function wp_popular_terms_checklist( $taxonomy, $default = 0, $number = 10, $echo = true ) {
     1354        $post = get_post();
     1355
     1356        if ( $post && $post->ID )
     1357                $checked_terms = wp_get_object_terms($post->ID, $taxonomy, array('fields'=>'ids'));
     1358        else
     1359                $checked_terms = array();
     1360
     1361        $terms = get_terms( $taxonomy, array( 'orderby' => 'count', 'order' => 'DESC', 'number' => $number, 'hierarchical' => false ) );
     1362
     1363        $popular_ids = array();
     1364        foreach ( (array) $terms as $term ) {
     1365                $popular_ids[] = $term->term_id;
     1366                if ( !$echo ) // hack for AJAX use
     1367                continue;
     1368                $id = "popular-$taxonomy-$term->term_id";
     1369                $checked = in_array( $term->term_id, $checked_terms ) ? 'checked="checked"' : '';
     1370                ?>
     1371
     1372                <li id="<?php echo $id; ?>" class="popular-category">
     1373                        <label class="selectit">
     1374                                <input id="in-<?php echo $id; ?>" type="checkbox" <?php echo $checked; ?> value="<?php echo (int) $term->term_id; ?>" />
     1375                                <?php echo esc_html( apply_filters( 'the_category', $term->name ) ); ?>
     1376                        </label>
     1377                </li>
     1378
     1379        <?php
     1380        }
     1381        return $popular_ids;
     1382}
     1383 No newline at end of file