wp_terms_checklist

The timeline below displays how wordpress function wp_terms_checklist has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.3

/**
 * Outputs an unordered list of checkbox input elements labelled with term names.
 *
 * Taxonomy-independent version of wp_category_checklist().
 *
 * @since 3.0.0
 * @since 4.4.0 Introduced the `$echo` argument.
 *
 * @param int          $post_id Optional. Post ID. Default 0.
 * @param array|string $args {
 *     Optional. Array or string of arguments for generating a terms checklist. Default empty array.
 *
 *     @type int    $descendants_and_self ID of the category to output along with its descendants.
 *                                        Default 0.
 *     @type int[]  $selected_cats        Array of category IDs to mark as checked. Default false.
 *     @type int[]  $popular_cats         Array of category IDs to receive the "popular-category" class.
 *                                        Default false.
 *     @type Walker $walker               Walker object to use to build the output. Default empty which
 *                                        results in a Walker_Category_Checklist instance being used.
 *     @type string $taxonomy             Taxonomy to generate the checklist for. Default 'category'.
 *     @type bool   $checked_ontop        Whether to move checked items out of the hierarchy and to
 *                                        the top of the list. Default true.
 *     @type bool   $echo                 Whether to echo the generated markup. False to return the markup instead
 *                                        of echoing it. Default true.
 * }
 * @return string HTML list of input elements.
 */
function wp_terms_checklist($post_id = 0, $args = array())
{
    $defaults = array('descendants_and_self' => 0, 'selected_cats' => false, 'popular_cats' => false, 'walker' => null, 'taxonomy' => 'category', 'checked_ontop' => true, 'echo' => true);
    /**
     * Filters the taxonomy terms checklist arguments.
     *
     * @since 3.4.0
     *
     * @see wp_terms_checklist()
     *
     * @param array|string $args    An array or string of arguments.
     * @param int          $post_id The post ID.
     */
    $params = apply_filters('wp_terms_checklist_args', $args, $post_id);
    $parsed_args = wp_parse_args($params, $defaults);
    if (empty($parsed_args['walker']) || !$parsed_args['walker'] instanceof Walker) {
        $walker = new Walker_Category_Checklist();
    } else {
        $walker = $parsed_args['walker'];
    }
    $taxonomy = $parsed_args['taxonomy'];
    $descendants_and_self = (int) $parsed_args['descendants_and_self'];
    $args = array('taxonomy' => $taxonomy);
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    $args['list_only'] = !empty($parsed_args['list_only']);
    if (is_array($parsed_args['selected_cats'])) {
        $args['selected_cats'] = array_map('intval', $parsed_args['selected_cats']);
    } elseif ($post_id) {
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    } else {
        $args['selected_cats'] = array();
    }
    if (is_array($parsed_args['popular_cats'])) {
        $args['popular_cats'] = array_map('intval', $parsed_args['popular_cats']);
    } else {
        $args['popular_cats'] = get_terms(array('taxonomy' => $taxonomy, 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
    }
    if ($descendants_and_self) {
        $categories = (array) get_terms(array('taxonomy' => $taxonomy, 'child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0));
        $self = get_term($descendants_and_self, $taxonomy);
        array_unshift($categories, $self);
    } else {
        $categories = (array) get_terms(array('taxonomy' => $taxonomy, 'get' => 'all'));
    }
    $output = '';
    if ($parsed_args['checked_ontop']) {
        /*
         * 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).
         */
        $checked_categories = array();
        $keys = array_keys($categories);
        foreach ($keys as $k) {
            if (in_array($categories[$k]->term_id, $args['selected_cats'], true)) {
                $checked_categories[] = $categories[$k];
                unset($categories[$k]);
            }
        }
        // Put checked categories on top.
        $output .= $walker->walk($checked_categories, 0, $args);
    }
    // Then the rest of them.
    $output .= $walker->walk($categories, 0, $args);
    if ($parsed_args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 6.1

/**
 * Outputs an unordered list of checkbox input elements labelled with term names.
 *
 * Taxonomy-independent version of wp_category_checklist().
 *
 * @since 3.0.0
 * @since 4.4.0 Introduced the `$echo` argument.
 *
 * @param int          $post_id Optional. Post ID. Default 0.
 * @param array|string $args {
 *     Optional. Array or string of arguments for generating a terms checklist. Default empty array.
 *
 *     @type int    $descendants_and_self ID of the category to output along with its descendants.
 *                                        Default 0.
 *     @type int[]  $selected_cats        Array of category IDs to mark as checked. Default false.
 *     @type int[]  $popular_cats         Array of category IDs to receive the "popular-category" class.
 *                                        Default false.
 *     @type Walker $walker               Walker object to use to build the output. Default empty which
 *                                        results in a Walker_Category_Checklist instance being used.
 *     @type string $taxonomy             Taxonomy to generate the checklist for. Default 'category'.
 *     @type bool   $checked_ontop        Whether to move checked items out of the hierarchy and to
 *                                        the top of the list. Default true.
 *     @type bool   $echo                 Whether to echo the generated markup. False to return the markup instead
 *                                        of echoing it. Default true.
 * }
 * @return string HTML list of input elements.
 */
function wp_terms_checklist($post_id = 0, $args = array())
{
    $defaults = array('descendants_and_self' => 0, 'selected_cats' => false, 'popular_cats' => false, 'walker' => null, 'taxonomy' => 'category', 'checked_ontop' => true, 'echo' => true);
    /**
     * Filters the taxonomy terms checklist arguments.
     *
     * @since 3.4.0
     *
     * @see wp_terms_checklist()
     *
     * @param array|string $args    An array or string of arguments.
     * @param int          $post_id The post ID.
     */
    $params = apply_filters('wp_terms_checklist_args', $args, $post_id);
    $parsed_args = wp_parse_args($params, $defaults);
    if (empty($parsed_args['walker']) || !$parsed_args['walker'] instanceof Walker) {
        $walker = new Walker_Category_Checklist();
    } else {
        $walker = $parsed_args['walker'];
    }
    $taxonomy = $parsed_args['taxonomy'];
    $descendants_and_self = (int) $parsed_args['descendants_and_self'];
    $args = array('taxonomy' => $taxonomy);
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    $args['list_only'] = !empty($parsed_args['list_only']);
    if (is_array($parsed_args['selected_cats'])) {
        $args['selected_cats'] = array_map('intval', $parsed_args['selected_cats']);
    } elseif ($post_id) {
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    } else {
        $args['selected_cats'] = array();
    }
    if (is_array($parsed_args['popular_cats'])) {
        $args['popular_cats'] = array_map('intval', $parsed_args['popular_cats']);
    } else {
        $args['popular_cats'] = get_terms(array('taxonomy' => $taxonomy, 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
    }
    if ($descendants_and_self) {
        $categories = (array) get_terms(array('taxonomy' => $taxonomy, 'child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0));
        $self = get_term($descendants_and_self, $taxonomy);
        array_unshift($categories, $self);
    } else {
        $categories = (array) get_terms(array('taxonomy' => $taxonomy, 'get' => 'all'));
    }
    $output = '';
    if ($parsed_args['checked_ontop']) {
        // 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).
        $checked_categories = array();
        $keys = array_keys($categories);
        foreach ($keys as $k) {
            if (in_array($categories[$k]->term_id, $args['selected_cats'], true)) {
                $checked_categories[] = $categories[$k];
                unset($categories[$k]);
            }
        }
        // Put checked categories on top.
        $output .= $walker->walk($checked_categories, 0, $args);
    }
    // Then the rest of them.
    $output .= $walker->walk($categories, 0, $args);
    if ($parsed_args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 5.9

/**
 * Output an unordered list of checkbox input elements labelled with term names.
 *
 * Taxonomy-independent version of wp_category_checklist().
 *
 * @since 3.0.0
 * @since 4.4.0 Introduced the `$echo` argument.
 *
 * @param int          $post_id Optional. Post ID. Default 0.
 * @param array|string $args {
 *     Optional. Array or string of arguments for generating a terms checklist. Default empty array.
 *
 *     @type int    $descendants_and_self ID of the category to output along with its descendants.
 *                                        Default 0.
 *     @type int[]  $selected_cats        Array of category IDs to mark as checked. Default false.
 *     @type int[]  $popular_cats         Array of category IDs to receive the "popular-category" class.
 *                                        Default false.
 *     @type Walker $walker               Walker object to use to build the output.
 *                                        Default is a Walker_Category_Checklist instance.
 *     @type string $taxonomy             Taxonomy to generate the checklist for. Default 'category'.
 *     @type bool   $checked_ontop        Whether to move checked items out of the hierarchy and to
 *                                        the top of the list. Default true.
 *     @type bool   $echo                 Whether to echo the generated markup. False to return the markup instead
 *                                        of echoing it. Default true.
 * }
 * @return string HTML list of input elements.
 */
function wp_terms_checklist($post_id = 0, $args = array())
{
    $defaults = array('descendants_and_self' => 0, 'selected_cats' => false, 'popular_cats' => false, 'walker' => null, 'taxonomy' => 'category', 'checked_ontop' => true, 'echo' => true);
    /**
     * Filters the taxonomy terms checklist arguments.
     *
     * @since 3.4.0
     *
     * @see wp_terms_checklist()
     *
     * @param array|string $args    An array or string of arguments.
     * @param int          $post_id The post ID.
     */
    $params = apply_filters('wp_terms_checklist_args', $args, $post_id);
    $parsed_args = wp_parse_args($params, $defaults);
    if (empty($parsed_args['walker']) || !$parsed_args['walker'] instanceof Walker) {
        $walker = new Walker_Category_Checklist();
    } else {
        $walker = $parsed_args['walker'];
    }
    $taxonomy = $parsed_args['taxonomy'];
    $descendants_and_self = (int) $parsed_args['descendants_and_self'];
    $args = array('taxonomy' => $taxonomy);
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    $args['list_only'] = !empty($parsed_args['list_only']);
    if (is_array($parsed_args['selected_cats'])) {
        $args['selected_cats'] = array_map('intval', $parsed_args['selected_cats']);
    } elseif ($post_id) {
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    } else {
        $args['selected_cats'] = array();
    }
    if (is_array($parsed_args['popular_cats'])) {
        $args['popular_cats'] = array_map('intval', $parsed_args['popular_cats']);
    } else {
        $args['popular_cats'] = get_terms(array('taxonomy' => $taxonomy, 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
    }
    if ($descendants_and_self) {
        $categories = (array) get_terms(array('taxonomy' => $taxonomy, 'child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0));
        $self = get_term($descendants_and_self, $taxonomy);
        array_unshift($categories, $self);
    } else {
        $categories = (array) get_terms(array('taxonomy' => $taxonomy, 'get' => 'all'));
    }
    $output = '';
    if ($parsed_args['checked_ontop']) {
        // 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).
        $checked_categories = array();
        $keys = array_keys($categories);
        foreach ($keys as $k) {
            if (in_array($categories[$k]->term_id, $args['selected_cats'], true)) {
                $checked_categories[] = $categories[$k];
                unset($categories[$k]);
            }
        }
        // Put checked categories on top.
        $output .= $walker->walk($checked_categories, 0, $args);
    }
    // Then the rest of them.
    $output .= $walker->walk($categories, 0, $args);
    if ($parsed_args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 5.1

/**
 * Output an unordered list of checkbox input elements labelled with term names.
 *
 * Taxonomy-independent version of wp_category_checklist().
 *
 * @since 3.0.0
 * @since 4.4.0 Introduced the `$echo` argument.
 *
 * @param int          $post_id Optional. Post ID. Default 0.
 * @param array|string $args {
 *     Optional. Array or string of arguments for generating a terms checklist. Default empty array.
 *
 *     @type int    $descendants_and_self ID of the category to output along with its descendants.
 *                                        Default 0.
 *     @type int[]  $selected_cats        Array of category IDs to mark as checked. Default false.
 *     @type int[]  $popular_cats         Array of category IDs to receive the "popular-category" class.
 *                                        Default false.
 *     @type Walker $walker               Walker object to use to build the output.
 *                                        Default is a Walker_Category_Checklist instance.
 *     @type string $taxonomy             Taxonomy to generate the checklist for. Default 'category'.
 *     @type bool   $checked_ontop        Whether to move checked items out of the hierarchy and to
 *                                        the top of the list. Default true.
 *     @type bool   $echo                 Whether to echo the generated markup. False to return the markup instead
 *                                        of echoing it. Default true.
 * }
 * @return string HTML list of input elements.
 */
function wp_terms_checklist($post_id = 0, $args = array())
{
    $defaults = array('descendants_and_self' => 0, 'selected_cats' => false, 'popular_cats' => false, 'walker' => null, 'taxonomy' => 'category', 'checked_ontop' => true, 'echo' => true);
    /**
     * Filters the taxonomy terms checklist arguments.
     *
     * @since 3.4.0
     *
     * @see wp_terms_checklist()
     *
     * @param array $args    An array of arguments.
     * @param int   $post_id The post ID.
     */
    $params = apply_filters('wp_terms_checklist_args', $args, $post_id);
    $parsed_args = wp_parse_args($params, $defaults);
    if (empty($parsed_args['walker']) || !$parsed_args['walker'] instanceof Walker) {
        $walker = new Walker_Category_Checklist();
    } else {
        $walker = $parsed_args['walker'];
    }
    $taxonomy = $parsed_args['taxonomy'];
    $descendants_and_self = (int) $parsed_args['descendants_and_self'];
    $args = array('taxonomy' => $taxonomy);
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    $args['list_only'] = !empty($parsed_args['list_only']);
    if (is_array($parsed_args['selected_cats'])) {
        $args['selected_cats'] = array_map('intval', $parsed_args['selected_cats']);
    } elseif ($post_id) {
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    } else {
        $args['selected_cats'] = array();
    }
    if (is_array($parsed_args['popular_cats'])) {
        $args['popular_cats'] = array_map('intval', $parsed_args['popular_cats']);
    } else {
        $args['popular_cats'] = get_terms(array('taxonomy' => $taxonomy, 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
    }
    if ($descendants_and_self) {
        $categories = (array) get_terms(array('taxonomy' => $taxonomy, 'child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0));
        $self = get_term($descendants_and_self, $taxonomy);
        array_unshift($categories, $self);
    } else {
        $categories = (array) get_terms(array('taxonomy' => $taxonomy, 'get' => 'all'));
    }
    $output = '';
    if ($parsed_args['checked_ontop']) {
        // 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).
        $checked_categories = array();
        $keys = array_keys($categories);
        foreach ($keys as $k) {
            if (in_array($categories[$k]->term_id, $args['selected_cats'], true)) {
                $checked_categories[] = $categories[$k];
                unset($categories[$k]);
            }
        }
        // Put checked categories on top.
        $output .= $walker->walk($checked_categories, 0, $args);
    }
    // Then the rest of them.
    $output .= $walker->walk($categories, 0, $args);
    if ($parsed_args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 5.5

/**
 * Output an unordered list of checkbox input elements labelled with term names.
 *
 * Taxonomy-independent version of wp_category_checklist().
 *
 * @since 3.0.0
 * @since 4.4.0 Introduced the `$echo` argument.
 *
 * @param int          $post_id Optional. Post ID. Default 0.
 * @param array|string $args {
 *     Optional. Array or string of arguments for generating a terms checklist. Default empty array.
 *
 *     @type int    $descendants_and_self ID of the category to output along with its descendants.
 *                                        Default 0.
 *     @type int[]  $selected_cats        Array of category IDs to mark as checked. Default false.
 *     @type int[]  $popular_cats         Array of category IDs to receive the "popular-category" class.
 *                                        Default false.
 *     @type Walker $walker               Walker object to use to build the output.
 *                                        Default is a Walker_Category_Checklist instance.
 *     @type string $taxonomy             Taxonomy to generate the checklist for. Default 'category'.
 *     @type bool   $checked_ontop        Whether to move checked items out of the hierarchy and to
 *                                        the top of the list. Default true.
 *     @type bool   $echo                 Whether to echo the generated markup. False to return the markup instead
 *                                        of echoing it. Default true.
 * }
 * @return string HTML list of input elements.
 */
function wp_terms_checklist($post_id = 0, $args = array())
{
    $defaults = array('descendants_and_self' => 0, 'selected_cats' => false, 'popular_cats' => false, 'walker' => null, 'taxonomy' => 'category', 'checked_ontop' => true, 'echo' => true);
    /**
     * Filters the taxonomy terms checklist arguments.
     *
     * @since 3.4.0
     *
     * @see wp_terms_checklist()
     *
     * @param array $args    An array of arguments.
     * @param int   $post_id The post ID.
     */
    $params = apply_filters('wp_terms_checklist_args', $args, $post_id);
    $parsed_args = wp_parse_args($params, $defaults);
    if (empty($parsed_args['walker']) || !$parsed_args['walker'] instanceof Walker) {
        $walker = new Walker_Category_Checklist();
    } else {
        $walker = $parsed_args['walker'];
    }
    $taxonomy = $parsed_args['taxonomy'];
    $descendants_and_self = (int) $parsed_args['descendants_and_self'];
    $args = array('taxonomy' => $taxonomy);
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    $args['list_only'] = !empty($parsed_args['list_only']);
    if (is_array($parsed_args['selected_cats'])) {
        $args['selected_cats'] = $parsed_args['selected_cats'];
    } elseif ($post_id) {
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    } else {
        $args['selected_cats'] = array();
    }
    if (is_array($parsed_args['popular_cats'])) {
        $args['popular_cats'] = $parsed_args['popular_cats'];
    } else {
        $args['popular_cats'] = get_terms(array('taxonomy' => $taxonomy, 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
    }
    if ($descendants_and_self) {
        $categories = (array) get_terms(array('taxonomy' => $taxonomy, 'child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0));
        $self = get_term($descendants_and_self, $taxonomy);
        array_unshift($categories, $self);
    } else {
        $categories = (array) get_terms(array('taxonomy' => $taxonomy, 'get' => 'all'));
    }
    $output = '';
    if ($parsed_args['checked_ontop']) {
        // 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).
        $checked_categories = array();
        $keys = array_keys($categories);
        foreach ($keys as $k) {
            if (in_array($categories[$k]->term_id, $args['selected_cats'], true)) {
                $checked_categories[] = $categories[$k];
                unset($categories[$k]);
            }
        }
        // Put checked categories on top.
        $output .= $walker->walk($checked_categories, 0, $args);
    }
    // Then the rest of them.
    $output .= $walker->walk($categories, 0, $args);
    if ($parsed_args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 5.4

/**
 * Output an unordered list of checkbox input elements labelled with term names.
 *
 * Taxonomy-independent version of wp_category_checklist().
 *
 * @since 3.0.0
 * @since 4.4.0 Introduced the `$echo` argument.
 *
 * @param int          $post_id Optional. Post ID. Default 0.
 * @param array|string $args {
 *     Optional. Array or string of arguments for generating a terms checklist. Default empty array.
 *
 *     @type int    $descendants_and_self ID of the category to output along with its descendants.
 *                                        Default 0.
 *     @type int[]  $selected_cats        Array of category IDs to mark as checked. Default false.
 *     @type int[]  $popular_cats         Array of category IDs to receive the "popular-category" class.
 *                                        Default false.
 *     @type Walker $walker               Walker object to use to build the output.
 *                                        Default is a Walker_Category_Checklist instance.
 *     @type string $taxonomy             Taxonomy to generate the checklist for. Default 'category'.
 *     @type bool   $checked_ontop        Whether to move checked items out of the hierarchy and to
 *                                        the top of the list. Default true.
 *     @type bool   $echo                 Whether to echo the generated markup. False to return the markup instead
 *                                        of echoing it. Default true.
 * }
 * @return string HTML list of input elements.
 */
function wp_terms_checklist($post_id = 0, $args = array())
{
    $defaults = array('descendants_and_self' => 0, 'selected_cats' => false, 'popular_cats' => false, 'walker' => null, 'taxonomy' => 'category', 'checked_ontop' => true, 'echo' => true);
    /**
     * Filters the taxonomy terms checklist arguments.
     *
     * @since 3.4.0
     *
     * @see wp_terms_checklist()
     *
     * @param array $args    An array of arguments.
     * @param int   $post_id The post ID.
     */
    $params = apply_filters('wp_terms_checklist_args', $args, $post_id);
    $parsed_args = wp_parse_args($params, $defaults);
    if (empty($parsed_args['walker']) || !$parsed_args['walker'] instanceof Walker) {
        $walker = new Walker_Category_Checklist();
    } else {
        $walker = $parsed_args['walker'];
    }
    $taxonomy = $parsed_args['taxonomy'];
    $descendants_and_self = (int) $parsed_args['descendants_and_self'];
    $args = array('taxonomy' => $taxonomy);
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    $args['list_only'] = !empty($parsed_args['list_only']);
    if (is_array($parsed_args['selected_cats'])) {
        $args['selected_cats'] = $parsed_args['selected_cats'];
    } elseif ($post_id) {
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    } else {
        $args['selected_cats'] = array();
    }
    if (is_array($parsed_args['popular_cats'])) {
        $args['popular_cats'] = $parsed_args['popular_cats'];
    } else {
        $args['popular_cats'] = get_terms(array('taxonomy' => $taxonomy, 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
    }
    if ($descendants_and_self) {
        $categories = (array) get_terms(array('taxonomy' => $taxonomy, 'child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0));
        $self = get_term($descendants_and_self, $taxonomy);
        array_unshift($categories, $self);
    } else {
        $categories = (array) get_terms(array('taxonomy' => $taxonomy, 'get' => 'all'));
    }
    $output = '';
    if ($parsed_args['checked_ontop']) {
        // 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).
        $checked_categories = array();
        $keys = array_keys($categories);
        foreach ($keys as $k) {
            if (in_array($categories[$k]->term_id, $args['selected_cats'])) {
                $checked_categories[] = $categories[$k];
                unset($categories[$k]);
            }
        }
        // Put checked categories on top.
        $output .= $walker->walk($checked_categories, 0, $args);
    }
    // Then the rest of them.
    $output .= $walker->walk($categories, 0, $args);
    if ($parsed_args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 5.3

/**
 * Output an unordered list of checkbox input elements labelled with term names.
 *
 * Taxonomy-independent version of wp_category_checklist().
 *
 * @since 3.0.0
 * @since 4.4.0 Introduced the `$echo` argument.
 *
 * @param int          $post_id Optional. Post ID. Default 0.
 * @param array|string $args {
 *     Optional. Array or string of arguments for generating a terms checklist. Default empty array.
 *
 *     @type int    $descendants_and_self ID of the category to output along with its descendants.
 *                                        Default 0.
 *     @type int[]  $selected_cats        Array of category IDs to mark as checked. Default false.
 *     @type int[]  $popular_cats         Array of category IDs to receive the "popular-category" class.
 *                                        Default false.
 *     @type object $walker               Walker object to use to build the output.
 *                                        Default is a Walker_Category_Checklist instance.
 *     @type string $taxonomy             Taxonomy to generate the checklist for. Default 'category'.
 *     @type bool   $checked_ontop        Whether to move checked items out of the hierarchy and to
 *                                        the top of the list. Default true.
 *     @type bool   $echo                 Whether to echo the generated markup. False to return the markup instead
 *                                        of echoing it. Default true.
 * }
 */
function wp_terms_checklist($post_id = 0, $args = array())
{
    $defaults = array('descendants_and_self' => 0, 'selected_cats' => false, 'popular_cats' => false, 'walker' => null, 'taxonomy' => 'category', 'checked_ontop' => true, 'echo' => true);
    /**
     * Filters the taxonomy terms checklist arguments.
     *
     * @since 3.4.0
     *
     * @see wp_terms_checklist()
     *
     * @param array $args    An array of arguments.
     * @param int   $post_id The post ID.
     */
    $params = apply_filters('wp_terms_checklist_args', $args, $post_id);
    $parsed_args = wp_parse_args($params, $defaults);
    if (empty($parsed_args['walker']) || !$parsed_args['walker'] instanceof Walker) {
        $walker = new Walker_Category_Checklist();
    } else {
        $walker = $parsed_args['walker'];
    }
    $taxonomy = $parsed_args['taxonomy'];
    $descendants_and_self = (int) $parsed_args['descendants_and_self'];
    $args = array('taxonomy' => $taxonomy);
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    $args['list_only'] = !empty($parsed_args['list_only']);
    if (is_array($parsed_args['selected_cats'])) {
        $args['selected_cats'] = $parsed_args['selected_cats'];
    } elseif ($post_id) {
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    } else {
        $args['selected_cats'] = array();
    }
    if (is_array($parsed_args['popular_cats'])) {
        $args['popular_cats'] = $parsed_args['popular_cats'];
    } else {
        $args['popular_cats'] = get_terms(array('taxonomy' => $taxonomy, 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
    }
    if ($descendants_and_self) {
        $categories = (array) get_terms(array('taxonomy' => $taxonomy, 'child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0));
        $self = get_term($descendants_and_self, $taxonomy);
        array_unshift($categories, $self);
    } else {
        $categories = (array) get_terms(array('taxonomy' => $taxonomy, 'get' => 'all'));
    }
    $output = '';
    if ($parsed_args['checked_ontop']) {
        // 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)
        $checked_categories = array();
        $keys = array_keys($categories);
        foreach ($keys as $k) {
            if (in_array($categories[$k]->term_id, $args['selected_cats'])) {
                $checked_categories[] = $categories[$k];
                unset($categories[$k]);
            }
        }
        // Put checked cats on top
        $output .= $walker->walk($checked_categories, 0, $args);
    }
    // Then the rest of them
    $output .= $walker->walk($categories, 0, $args);
    if ($parsed_args['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 5.1

/**
 * Output an unordered list of checkbox input elements labelled with term names.
 *
 * Taxonomy-independent version of wp_category_checklist().
 *
 * @since 3.0.0
 * @since 4.4.0 Introduced the `$echo` argument.
 *
 * @param int          $post_id Optional. Post ID. Default 0.
 * @param array|string $args {
 *     Optional. Array or string of arguments for generating a terms checklist. Default empty array.
 *
 *     @type int    $descendants_and_self ID of the category to output along with its descendants.
 *                                        Default 0.
 *     @type int[]  $selected_cats        Array of category IDs to mark as checked. Default false.
 *     @type int[]  $popular_cats         Array of category IDs to receive the "popular-category" class.
 *                                        Default false.
 *     @type object $walker               Walker object to use to build the output.
 *                                        Default is a Walker_Category_Checklist instance.
 *     @type string $taxonomy             Taxonomy to generate the checklist for. Default 'category'.
 *     @type bool   $checked_ontop        Whether to move checked items out of the hierarchy and to
 *                                        the top of the list. Default true.
 *     @type bool   $echo                 Whether to echo the generated markup. False to return the markup instead
 *                                        of echoing it. Default true.
 * }
 */
function wp_terms_checklist($post_id = 0, $args = array())
{
    $defaults = array('descendants_and_self' => 0, 'selected_cats' => false, 'popular_cats' => false, 'walker' => null, 'taxonomy' => 'category', 'checked_ontop' => true, 'echo' => true);
    /**
     * Filters the taxonomy terms checklist arguments.
     *
     * @since 3.4.0
     *
     * @see wp_terms_checklist()
     *
     * @param array $args    An array of arguments.
     * @param int   $post_id The post ID.
     */
    $params = apply_filters('wp_terms_checklist_args', $args, $post_id);
    $r = wp_parse_args($params, $defaults);
    if (empty($r['walker']) || !$r['walker'] instanceof Walker) {
        $walker = new Walker_Category_Checklist();
    } else {
        $walker = $r['walker'];
    }
    $taxonomy = $r['taxonomy'];
    $descendants_and_self = (int) $r['descendants_and_self'];
    $args = array('taxonomy' => $taxonomy);
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    $args['list_only'] = !empty($r['list_only']);
    if (is_array($r['selected_cats'])) {
        $args['selected_cats'] = $r['selected_cats'];
    } elseif ($post_id) {
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    } else {
        $args['selected_cats'] = array();
    }
    if (is_array($r['popular_cats'])) {
        $args['popular_cats'] = $r['popular_cats'];
    } else {
        $args['popular_cats'] = get_terms($taxonomy, array('fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
    }
    if ($descendants_and_self) {
        $categories = (array) get_terms($taxonomy, array('child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0));
        $self = get_term($descendants_and_self, $taxonomy);
        array_unshift($categories, $self);
    } else {
        $categories = (array) get_terms($taxonomy, array('get' => 'all'));
    }
    $output = '';
    if ($r['checked_ontop']) {
        // 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)
        $checked_categories = array();
        $keys = array_keys($categories);
        foreach ($keys as $k) {
            if (in_array($categories[$k]->term_id, $args['selected_cats'])) {
                $checked_categories[] = $categories[$k];
                unset($categories[$k]);
            }
        }
        // Put checked cats on top
        $output .= call_user_func_array(array($walker, 'walk'), array($checked_categories, 0, $args));
    }
    // Then the rest of them
    $output .= call_user_func_array(array($walker, 'walk'), array($categories, 0, $args));
    if ($r['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 4.6

/**
 * Output an unordered list of checkbox input elements labelled with term names.
 *
 * Taxonomy-independent version of wp_category_checklist().
 *
 * @since 3.0.0
 * @since 4.4.0 Introduced the `$echo` argument.
 *
 * @param int          $post_id Optional. Post ID. Default 0.
 * @param array|string $args {
 *     Optional. Array or string of arguments for generating a terms checklist. Default empty array.
 *
 *     @type int    $descendants_and_self ID of the category to output along with its descendants.
 *                                        Default 0.
 *     @type array  $selected_cats        List of categories to mark as checked. Default false.
 *     @type array  $popular_cats         List of categories to receive the "popular-category" class.
 *                                        Default false.
 *     @type object $walker               Walker object to use to build the output.
 *                                        Default is a Walker_Category_Checklist instance.
 *     @type string $taxonomy             Taxonomy to generate the checklist for. Default 'category'.
 *     @type bool   $checked_ontop        Whether to move checked items out of the hierarchy and to
 *                                        the top of the list. Default true.
 *     @type bool   $echo                 Whether to echo the generated markup. False to return the markup instead
 *                                        of echoing it. Default true.
 * }
 */
function wp_terms_checklist($post_id = 0, $args = array())
{
    $defaults = array('descendants_and_self' => 0, 'selected_cats' => false, 'popular_cats' => false, 'walker' => null, 'taxonomy' => 'category', 'checked_ontop' => true, 'echo' => true);
    /**
     * Filters the taxonomy terms checklist arguments.
     *
     * @since 3.4.0
     *
     * @see wp_terms_checklist()
     *
     * @param array $args    An array of arguments.
     * @param int   $post_id The post ID.
     */
    $params = apply_filters('wp_terms_checklist_args', $args, $post_id);
    $r = wp_parse_args($params, $defaults);
    if (empty($r['walker']) || !$r['walker'] instanceof Walker) {
        $walker = new Walker_Category_Checklist();
    } else {
        $walker = $r['walker'];
    }
    $taxonomy = $r['taxonomy'];
    $descendants_and_self = (int) $r['descendants_and_self'];
    $args = array('taxonomy' => $taxonomy);
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    $args['list_only'] = !empty($r['list_only']);
    if (is_array($r['selected_cats'])) {
        $args['selected_cats'] = $r['selected_cats'];
    } elseif ($post_id) {
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    } else {
        $args['selected_cats'] = array();
    }
    if (is_array($r['popular_cats'])) {
        $args['popular_cats'] = $r['popular_cats'];
    } else {
        $args['popular_cats'] = get_terms($taxonomy, array('fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
    }
    if ($descendants_and_self) {
        $categories = (array) get_terms($taxonomy, array('child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0));
        $self = get_term($descendants_and_self, $taxonomy);
        array_unshift($categories, $self);
    } else {
        $categories = (array) get_terms($taxonomy, array('get' => 'all'));
    }
    $output = '';
    if ($r['checked_ontop']) {
        // 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)
        $checked_categories = array();
        $keys = array_keys($categories);
        foreach ($keys as $k) {
            if (in_array($categories[$k]->term_id, $args['selected_cats'])) {
                $checked_categories[] = $categories[$k];
                unset($categories[$k]);
            }
        }
        // Put checked cats on top
        $output .= call_user_func_array(array($walker, 'walk'), array($checked_categories, 0, $args));
    }
    // Then the rest of them
    $output .= call_user_func_array(array($walker, 'walk'), array($categories, 0, $args));
    if ($r['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 4.4

/**
 * Output an unordered list of checkbox input elements labelled with term names.
 *
 * Taxonomy-independent version of wp_category_checklist().
 *
 * @since 3.0.0
 * @since 4.4.0 Introduced the `$echo` argument.
 *
 * @param int          $post_id Optional. Post ID. Default 0.
 * @param array|string $args {
 *     Optional. Array or string of arguments for generating a terms checklist. Default empty array.
 *
 *     @type int    $descendants_and_self ID of the category to output along with its descendants.
 *                                        Default 0.
 *     @type array  $selected_cats        List of categories to mark as checked. Default false.
 *     @type array  $popular_cats         List of categories to receive the "popular-category" class.
 *                                        Default false.
 *     @type object $walker               Walker object to use to build the output.
 *                                        Default is a Walker_Category_Checklist instance.
 *     @type string $taxonomy             Taxonomy to generate the checklist for. Default 'category'.
 *     @type bool   $checked_ontop        Whether to move checked items out of the hierarchy and to
 *                                        the top of the list. Default true.
 *     @type bool   $echo                 Whether to echo the generated markup. False to return the markup instead
 *                                        of echoing it. Default true.
 * }
 */
function wp_terms_checklist($post_id = 0, $args = array())
{
    $defaults = array('descendants_and_self' => 0, 'selected_cats' => false, 'popular_cats' => false, 'walker' => null, 'taxonomy' => 'category', 'checked_ontop' => true, 'echo' => true);
    /**
     * Filter the taxonomy terms checklist arguments.
     *
     * @since 3.4.0
     *
     * @see wp_terms_checklist()
     *
     * @param array $args    An array of arguments.
     * @param int   $post_id The post ID.
     */
    $params = apply_filters('wp_terms_checklist_args', $args, $post_id);
    $r = wp_parse_args($params, $defaults);
    if (empty($r['walker']) || !$r['walker'] instanceof Walker) {
        $walker = new Walker_Category_Checklist();
    } else {
        $walker = $r['walker'];
    }
    $taxonomy = $r['taxonomy'];
    $descendants_and_self = (int) $r['descendants_and_self'];
    $args = array('taxonomy' => $taxonomy);
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    $args['list_only'] = !empty($r['list_only']);
    if (is_array($r['selected_cats'])) {
        $args['selected_cats'] = $r['selected_cats'];
    } elseif ($post_id) {
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    } else {
        $args['selected_cats'] = array();
    }
    if (is_array($r['popular_cats'])) {
        $args['popular_cats'] = $r['popular_cats'];
    } else {
        $args['popular_cats'] = get_terms($taxonomy, array('fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
    }
    if ($descendants_and_self) {
        $categories = (array) get_terms($taxonomy, array('child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0));
        $self = get_term($descendants_and_self, $taxonomy);
        array_unshift($categories, $self);
    } else {
        $categories = (array) get_terms($taxonomy, array('get' => 'all'));
    }
    $output = '';
    if ($r['checked_ontop']) {
        // 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)
        $checked_categories = array();
        $keys = array_keys($categories);
        foreach ($keys as $k) {
            if (in_array($categories[$k]->term_id, $args['selected_cats'])) {
                $checked_categories[] = $categories[$k];
                unset($categories[$k]);
            }
        }
        // Put checked cats on top
        $output .= call_user_func_array(array($walker, 'walk'), array($checked_categories, 0, $args));
    }
    // Then the rest of them
    $output .= call_user_func_array(array($walker, 'walk'), array($categories, 0, $args));
    if ($r['echo']) {
        echo $output;
    }
    return $output;
}

WordPress Version: 4.2

/**
 * Output an unordered list of checkbox input elements labelled with term names.
 *
 * Taxonomy-independent version of wp_category_checklist().
 *
 * @since 3.0.0
 *
 * @param int          $post_id Optional. Post ID. Default 0.
 * @param array|string $args {
 *     Optional. Array or string of arguments for generating a terms checklist. Default empty array.
 *
 *     @type int    $descendants_and_self ID of the category to output along with its descendants.
 *                                        Default 0.
 *     @type array  $selected_cats        List of categories to mark as checked. Default false.
 *     @type array  $popular_cats         List of categories to receive the "popular-category" class.
 *                                        Default false.
 *     @type object $walker               Walker object to use to build the output.
 *                                        Default is a Walker_Category_Checklist instance.
 *     @type string $taxonomy             Taxonomy to generate the checklist for. Default 'category'.
 *     @type bool   $checked_ontop        Whether to move checked items out of the hierarchy and to
 *                                        the top of the list. Default true.
 * }
 */
function wp_terms_checklist($post_id = 0, $args = array())
{
    $defaults = array('descendants_and_self' => 0, 'selected_cats' => false, 'popular_cats' => false, 'walker' => null, 'taxonomy' => 'category', 'checked_ontop' => true);
    /**
     * Filter the taxonomy terms checklist arguments.
     *
     * @since 3.4.0
     *
     * @see wp_terms_checklist()
     *
     * @param array $args    An array of arguments.
     * @param int   $post_id The post ID.
     */
    $params = apply_filters('wp_terms_checklist_args', $args, $post_id);
    $r = wp_parse_args($params, $defaults);
    if (empty($r['walker']) || !$r['walker'] instanceof Walker) {
        $walker = new Walker_Category_Checklist();
    } else {
        $walker = $r['walker'];
    }
    $taxonomy = $r['taxonomy'];
    $descendants_and_self = (int) $r['descendants_and_self'];
    $args = array('taxonomy' => $taxonomy);
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    $args['list_only'] = !empty($r['list_only']);
    if (is_array($r['selected_cats'])) {
        $args['selected_cats'] = $r['selected_cats'];
    } elseif ($post_id) {
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    } else {
        $args['selected_cats'] = array();
    }
    if (is_array($r['popular_cats'])) {
        $args['popular_cats'] = $r['popular_cats'];
    } else {
        $args['popular_cats'] = get_terms($taxonomy, array('fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
    }
    if ($descendants_and_self) {
        $categories = (array) get_terms($taxonomy, array('child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0));
        $self = get_term($descendants_and_self, $taxonomy);
        array_unshift($categories, $self);
    } else {
        $categories = (array) get_terms($taxonomy, array('get' => 'all'));
    }
    if ($r['checked_ontop']) {
        // 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)
        $checked_categories = array();
        $keys = array_keys($categories);
        foreach ($keys as $k) {
            if (in_array($categories[$k]->term_id, $args['selected_cats'])) {
                $checked_categories[] = $categories[$k];
                unset($categories[$k]);
            }
        }
        // Put checked cats on top
        echo call_user_func_array(array($walker, 'walk'), array($checked_categories, 0, $args));
    }
    // Then the rest of them
    echo call_user_func_array(array($walker, 'walk'), array($categories, 0, $args));
}

WordPress Version: 4.1

/**
 * Output an unordered list of checkbox input elements labelled with term names.
 *
 * Taxonomy independent version of {@see wp_category_checklist()}.
 *
 * @since 3.0.0
 *
 * @todo Properly document optional default arguments.
 *
 * @param int   $post_id Post ID.
 * @param array $args    Arguments to form the terms checklist.
 */
function wp_terms_checklist($post_id = 0, $args = array())
{
    $defaults = array('descendants_and_self' => 0, 'selected_cats' => false, 'popular_cats' => false, 'walker' => null, 'taxonomy' => 'category', 'checked_ontop' => true);
    /**
     * Filter the taxonomy terms checklist arguments.
     *
     * @since 3.4.0
     *
     * @see wp_terms_checklist()
     *
     * @param array $args    An array of arguments.
     * @param int   $post_id The post ID.
     */
    $params = apply_filters('wp_terms_checklist_args', $args, $post_id);
    $r = wp_parse_args($params, $defaults);
    if (empty($r['walker']) || !is_a($r['walker'], 'Walker')) {
        $walker = new Walker_Category_Checklist();
    } else {
        $walker = $r['walker'];
    }
    $taxonomy = $r['taxonomy'];
    $descendants_and_self = (int) $r['descendants_and_self'];
    $args = array('taxonomy' => $taxonomy);
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    if (is_array($r['selected_cats'])) {
        $args['selected_cats'] = $r['selected_cats'];
    } elseif ($post_id) {
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    } else {
        $args['selected_cats'] = array();
    }
    if (is_array($r['popular_cats'])) {
        $args['popular_cats'] = $r['popular_cats'];
    } else {
        $args['popular_cats'] = get_terms($taxonomy, array('fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
    }
    if ($descendants_and_self) {
        $categories = (array) get_terms($taxonomy, array('child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0));
        $self = get_term($descendants_and_self, $taxonomy);
        array_unshift($categories, $self);
    } else {
        $categories = (array) get_terms($taxonomy, array('get' => 'all'));
    }
    if ($r['checked_ontop']) {
        // 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)
        $checked_categories = array();
        $keys = array_keys($categories);
        foreach ($keys as $k) {
            if (in_array($categories[$k]->term_id, $args['selected_cats'])) {
                $checked_categories[] = $categories[$k];
                unset($categories[$k]);
            }
        }
        // Put checked cats on top
        echo call_user_func_array(array($walker, 'walk'), array($checked_categories, 0, $args));
    }
    // Then the rest of them
    echo call_user_func_array(array($walker, 'walk'), array($categories, 0, $args));
}

WordPress Version: 4.0

/**
 * Output an unordered list of checkbox <input> elements labelled
 * with term names. Taxonomy independent version of wp_category_checklist().
 *
 * @since 3.0.0
 *
 * @param int $post_id
 * @param array $args
 */
function wp_terms_checklist($post_id = 0, $args = array())
{
    $defaults = array('descendants_and_self' => 0, 'selected_cats' => false, 'popular_cats' => false, 'walker' => null, 'taxonomy' => 'category', 'checked_ontop' => true);
    /**
     * Filter the taxonomy terms checklist arguments.
     *
     * @since 3.4.0
     *
     * @see wp_terms_checklist()
     *
     * @param array $args    An array of arguments.
     * @param int   $post_id The post ID.
     */
    $params = apply_filters('wp_terms_checklist_args', $args, $post_id);
    $r = wp_parse_args($params, $defaults);
    if (empty($r['walker']) || !is_a($r['walker'], 'Walker')) {
        $walker = new Walker_Category_Checklist();
    } else {
        $walker = $r['walker'];
    }
    $taxonomy = $r['taxonomy'];
    $descendants_and_self = (int) $r['descendants_and_self'];
    $args = array('taxonomy' => $taxonomy);
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    if (is_array($r['selected_cats'])) {
        $args['selected_cats'] = $r['selected_cats'];
    } elseif ($post_id) {
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    } else {
        $args['selected_cats'] = array();
    }
    if (is_array($r['popular_cats'])) {
        $args['popular_cats'] = $r['popular_cats'];
    } else {
        $args['popular_cats'] = get_terms($taxonomy, array('fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
    }
    if ($descendants_and_self) {
        $categories = (array) get_terms($taxonomy, array('child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0));
        $self = get_term($descendants_and_self, $taxonomy);
        array_unshift($categories, $self);
    } else {
        $categories = (array) get_terms($taxonomy, array('get' => 'all'));
    }
    if ($r['checked_ontop']) {
        // 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)
        $checked_categories = array();
        $keys = array_keys($categories);
        foreach ($keys as $k) {
            if (in_array($categories[$k]->term_id, $args['selected_cats'])) {
                $checked_categories[] = $categories[$k];
                unset($categories[$k]);
            }
        }
        // Put checked cats on top
        echo call_user_func_array(array($walker, 'walk'), array($checked_categories, 0, $args));
    }
    // Then the rest of them
    echo call_user_func_array(array($walker, 'walk'), array($categories, 0, $args));
}

WordPress Version: 3.9

/**
 * Output an unordered list of checkbox <input> elements labelled
 * with term names. Taxonomy independent version of wp_category_checklist().
 *
 * @since 3.0.0
 *
 * @param int $post_id
 * @param array $args
 */
function wp_terms_checklist($post_id = 0, $args = array())
{
    $defaults = array('descendants_and_self' => 0, 'selected_cats' => false, 'popular_cats' => false, 'walker' => null, 'taxonomy' => 'category', 'checked_ontop' => true);
    /**
     * Filter the taxonomy terms checklist arguments.
     *
     * @since 3.4.0
     *
     * @see wp_terms_checklist()
     *
     * @param array $args    An array of arguments.
     * @param int   $post_id The post ID.
     */
    $args = apply_filters('wp_terms_checklist_args', $args, $post_id);
    extract(wp_parse_args($args, $defaults), EXTR_SKIP);
    if (empty($walker) || !is_a($walker, 'Walker')) {
        $walker = new Walker_Category_Checklist();
    }
    $descendants_and_self = (int) $descendants_and_self;
    $args = array('taxonomy' => $taxonomy);
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    if (is_array($selected_cats)) {
        $args['selected_cats'] = $selected_cats;
    } elseif ($post_id) {
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    } else {
        $args['selected_cats'] = array();
    }
    if (is_array($popular_cats)) {
        $args['popular_cats'] = $popular_cats;
    } else {
        $args['popular_cats'] = get_terms($taxonomy, array('fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
    }
    if ($descendants_and_self) {
        $categories = (array) get_terms($taxonomy, array('child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0));
        $self = get_term($descendants_and_self, $taxonomy);
        array_unshift($categories, $self);
    } else {
        $categories = (array) get_terms($taxonomy, array('get' => 'all'));
    }
    if ($checked_ontop) {
        // 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)
        $checked_categories = array();
        $keys = array_keys($categories);
        foreach ($keys as $k) {
            if (in_array($categories[$k]->term_id, $args['selected_cats'])) {
                $checked_categories[] = $categories[$k];
                unset($categories[$k]);
            }
        }
        // Put checked cats on top
        echo call_user_func_array(array(&$walker, 'walk'), array($checked_categories, 0, $args));
    }
    // Then the rest of them
    echo call_user_func_array(array(&$walker, 'walk'), array($categories, 0, $args));
}

WordPress Version: 3.7

/**
 * Output an unordered list of checkbox <input> elements labelled
 * with term names. Taxonomy independent version of wp_category_checklist().
 *
 * @since 3.0.0
 *
 * @param int $post_id
 * @param array $args
 */
function wp_terms_checklist($post_id = 0, $args = array())
{
    $defaults = array('descendants_and_self' => 0, 'selected_cats' => false, 'popular_cats' => false, 'walker' => null, 'taxonomy' => 'category', 'checked_ontop' => true);
    $args = apply_filters('wp_terms_checklist_args', $args, $post_id);
    extract(wp_parse_args($args, $defaults), EXTR_SKIP);
    if (empty($walker) || !is_a($walker, 'Walker')) {
        $walker = new Walker_Category_Checklist();
    }
    $descendants_and_self = (int) $descendants_and_self;
    $args = array('taxonomy' => $taxonomy);
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
    if (is_array($selected_cats)) {
        $args['selected_cats'] = $selected_cats;
    } elseif ($post_id) {
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    } else {
        $args['selected_cats'] = array();
    }
    if (is_array($popular_cats)) {
        $args['popular_cats'] = $popular_cats;
    } else {
        $args['popular_cats'] = get_terms($taxonomy, array('fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false));
    }
    if ($descendants_and_self) {
        $categories = (array) get_terms($taxonomy, array('child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0));
        $self = get_term($descendants_and_self, $taxonomy);
        array_unshift($categories, $self);
    } else {
        $categories = (array) get_terms($taxonomy, array('get' => 'all'));
    }
    if ($checked_ontop) {
        // 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)
        $checked_categories = array();
        $keys = array_keys($categories);
        foreach ($keys as $k) {
            if (in_array($categories[$k]->term_id, $args['selected_cats'])) {
                $checked_categories[] = $categories[$k];
                unset($categories[$k]);
            }
        }
        // Put checked cats on top
        echo call_user_func_array(array(&$walker, 'walk'), array($checked_categories, 0, $args));
    }
    // Then the rest of them
    echo call_user_func_array(array(&$walker, 'walk'), array($categories, 0, $args));
}