wp_list_bookmarks

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

WordPress Version: 6.1

/**
 * Retrieves or echoes all of the bookmarks.
 *
 * List of default arguments are as follows:
 *
 * These options define how the Category name will appear before the category
 * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will
 * display for only the 'title_li' string and only if 'title_li' is not empty.
 *
 * @since 2.1.0
 *
 * @see _walk_bookmarks()
 *
 * @param string|array $args {
 *     Optional. String or array of arguments to list bookmarks.
 *
 *     @type string       $orderby          How to order the links by. Accepts post fields. Default 'name'.
 *     @type string       $order            Whether to order bookmarks in ascending or descending order.
 *                                          Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'.
 *     @type int          $limit            Amount of bookmarks to display. Accepts 1+ or -1 for all.
 *                                          Default -1.
 *     @type string       $category         Comma-separated list of category IDs to include links from.
 *                                          Default empty.
 *     @type string       $category_name    Category to retrieve links for by name. Default empty.
 *     @type int|bool     $hide_invisible   Whether to show or hide links marked as 'invisible'. Accepts
 *                                          1|true or 0|false. Default 1|true.
 *     @type int|bool     $show_updated     Whether to display the time the bookmark was last updated.
 *                                          Accepts 1|true or 0|false. Default 0|false.
 *     @type int|bool     $echo             Whether to echo or return the formatted bookmarks. Accepts
 *                                          1|true (echo) or 0|false (return). Default 1|true.
 *     @type int|bool     $categorize       Whether to show links listed by category or in a single column.
 *                                          Accepts 1|true (by category) or 0|false (one column). Default 1|true.
 *     @type int|bool     $show_description Whether to show the bookmark descriptions. Accepts 1|true or 0|false.
 *                                          Default 0|false.
 *     @type string       $title_li         What to show before the links appear. Default 'Bookmarks'.
 *     @type string       $title_before     The HTML or text to prepend to the $title_li string. Default '<h2>'.
 *     @type string       $title_after      The HTML or text to append to the $title_li string. Default '</h2>'.
 *     @type string|array $class            The CSS class or an array of classes to use for the $title_li.
 *                                          Default 'linkcat'.
 *     @type string       $category_before  The HTML or text to prepend to $title_before if $categorize is true.
 *                                          String must contain '%id' and '%class' to inherit the category ID and
 *                                          the $class argument used for formatting in themes.
 *                                          Default '<li id="%id" class="%class">'.
 *     @type string       $category_after   The HTML or text to append to $title_after if $categorize is true.
 *                                          Default '</li>'.
 *     @type string       $category_orderby How to order the bookmark category based on term scheme if $categorize
 *                                          is true. Default 'name'.
 *     @type string       $category_order   Whether to order categories in ascending or descending order if
 *                                          $categorize is true. Accepts 'ASC' (ascending) or 'DESC' (descending).
 *                                          Default 'ASC'.
 * }
 * @return void|string Void if 'echo' argument is true, HTML list of bookmarks if 'echo' is false.
 */
function wp_list_bookmarks($args = '')
{
    $defaults = array('orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '', 'exclude_category' => '', 'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'echo' => 1, 'categorize' => 1, 'title_li' => __('Bookmarks'), 'title_before' => '<h2>', 'title_after' => '</h2>', 'category_orderby' => 'name', 'category_order' => 'ASC', 'class' => 'linkcat', 'category_before' => '<li id="%id" class="%class">', 'category_after' => '</li>');
    $parsed_args = wp_parse_args($args, $defaults);
    $output = '';
    if (!is_array($parsed_args['class'])) {
        $parsed_args['class'] = explode(' ', $parsed_args['class']);
    }
    $parsed_args['class'] = array_map('sanitize_html_class', $parsed_args['class']);
    $parsed_args['class'] = trim(implode(' ', $parsed_args['class']));
    if ($parsed_args['categorize']) {
        $cats = get_terms(array('taxonomy' => 'link_category', 'name__like' => $parsed_args['category_name'], 'include' => $parsed_args['category'], 'exclude' => $parsed_args['exclude_category'], 'orderby' => $parsed_args['category_orderby'], 'order' => $parsed_args['category_order'], 'hierarchical' => 0));
        if (empty($cats)) {
            $parsed_args['categorize'] = false;
        }
    }
    if ($parsed_args['categorize']) {
        // Split the bookmarks into ul's for each category.
        foreach ((array) $cats as $cat) {
            $params = array_merge($parsed_args, array('category' => $cat->term_id));
            $bookmarks = get_bookmarks($params);
            if (empty($bookmarks)) {
                continue;
            }
            $output .= str_replace(array('%id', '%class'), array("linkcat-{$cat->term_id}", $parsed_args['class']), $parsed_args['category_before']);
            /**
             * Filters the category name.
             *
             * @since 2.2.0
             *
             * @param string $cat_name The category name.
             */
            $catname = apply_filters('link_category', $cat->name);
            $output .= $parsed_args['title_before'];
            $output .= $catname;
            $output .= $parsed_args['title_after'];
            $output .= "\n\t<ul class='xoxo blogroll'>\n";
            $output .= _walk_bookmarks($bookmarks, $parsed_args);
            $output .= "\n\t</ul>\n";
            $output .= $parsed_args['category_after'] . "\n";
        }
    } else {
        // Output one single list using title_li for the title.
        $bookmarks = get_bookmarks($parsed_args);
        if (!empty($bookmarks)) {
            if (!empty($parsed_args['title_li'])) {
                $output .= str_replace(array('%id', '%class'), array('linkcat-' . $parsed_args['category'], $parsed_args['class']), $parsed_args['category_before']);
                $output .= $parsed_args['title_before'];
                $output .= $parsed_args['title_li'];
                $output .= $parsed_args['title_after'];
                $output .= "\n\t<ul class='xoxo blogroll'>\n";
                $output .= _walk_bookmarks($bookmarks, $parsed_args);
                $output .= "\n\t</ul>\n";
                $output .= $parsed_args['category_after'] . "\n";
            } else {
                $output .= _walk_bookmarks($bookmarks, $parsed_args);
            }
        }
    }
    /**
     * Filters the bookmarks list before it is echoed or returned.
     *
     * @since 2.5.0
     *
     * @param string $html The HTML list of bookmarks.
     */
    $html = apply_filters('wp_list_bookmarks', $output);
    if ($parsed_args['echo']) {
        echo $html;
    } else {
        return $html;
    }
}

WordPress Version: 5.7

/**
 * Retrieve or echo all of the bookmarks.
 *
 * List of default arguments are as follows:
 *
 * These options define how the Category name will appear before the category
 * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will
 * display for only the 'title_li' string and only if 'title_li' is not empty.
 *
 * @since 2.1.0
 *
 * @see _walk_bookmarks()
 *
 * @param string|array $args {
 *     Optional. String or array of arguments to list bookmarks.
 *
 *     @type string       $orderby          How to order the links by. Accepts post fields. Default 'name'.
 *     @type string       $order            Whether to order bookmarks in ascending or descending order.
 *                                          Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'.
 *     @type int          $limit            Amount of bookmarks to display. Accepts 1+ or -1 for all.
 *                                          Default -1.
 *     @type string       $category         Comma-separated list of category IDs to include links from.
 *                                          Default empty.
 *     @type string       $category_name    Category to retrieve links for by name. Default empty.
 *     @type int|bool     $hide_invisible   Whether to show or hide links marked as 'invisible'. Accepts
 *                                          1|true or 0|false. Default 1|true.
 *     @type int|bool     $show_updated     Whether to display the time the bookmark was last updated.
 *                                          Accepts 1|true or 0|false. Default 0|false.
 *     @type int|bool     $echo             Whether to echo or return the formatted bookmarks. Accepts
 *                                          1|true (echo) or 0|false (return). Default 1|true.
 *     @type int|bool     $categorize       Whether to show links listed by category or in a single column.
 *                                          Accepts 1|true (by category) or 0|false (one column). Default 1|true.
 *     @type int|bool     $show_description Whether to show the bookmark descriptions. Accepts 1|true or 0|false.
 *                                          Default 0|false.
 *     @type string       $title_li         What to show before the links appear. Default 'Bookmarks'.
 *     @type string       $title_before     The HTML or text to prepend to the $title_li string. Default '<h2>'.
 *     @type string       $title_after      The HTML or text to append to the $title_li string. Default '</h2>'.
 *     @type string|array $class            The CSS class or an array of classes to use for the $title_li.
 *                                          Default 'linkcat'.
 *     @type string       $category_before  The HTML or text to prepend to $title_before if $categorize is true.
 *                                          String must contain '%id' and '%class' to inherit the category ID and
 *                                          the $class argument used for formatting in themes.
 *                                          Default '<li id="%id" class="%class">'.
 *     @type string       $category_after   The HTML or text to append to $title_after if $categorize is true.
 *                                          Default '</li>'.
 *     @type string       $category_orderby How to order the bookmark category based on term scheme if $categorize
 *                                          is true. Default 'name'.
 *     @type string       $category_order   Whether to order categories in ascending or descending order if
 *                                          $categorize is true. Accepts 'ASC' (ascending) or 'DESC' (descending).
 *                                          Default 'ASC'.
 * }
 * @return void|string Void if 'echo' argument is true, HTML list of bookmarks if 'echo' is false.
 */
function wp_list_bookmarks($args = '')
{
    $defaults = array('orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '', 'exclude_category' => '', 'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'echo' => 1, 'categorize' => 1, 'title_li' => __('Bookmarks'), 'title_before' => '<h2>', 'title_after' => '</h2>', 'category_orderby' => 'name', 'category_order' => 'ASC', 'class' => 'linkcat', 'category_before' => '<li id="%id" class="%class">', 'category_after' => '</li>');
    $parsed_args = wp_parse_args($args, $defaults);
    $output = '';
    if (!is_array($parsed_args['class'])) {
        $parsed_args['class'] = explode(' ', $parsed_args['class']);
    }
    $parsed_args['class'] = array_map('sanitize_html_class', $parsed_args['class']);
    $parsed_args['class'] = trim(implode(' ', $parsed_args['class']));
    if ($parsed_args['categorize']) {
        $cats = get_terms(array('taxonomy' => 'link_category', 'name__like' => $parsed_args['category_name'], 'include' => $parsed_args['category'], 'exclude' => $parsed_args['exclude_category'], 'orderby' => $parsed_args['category_orderby'], 'order' => $parsed_args['category_order'], 'hierarchical' => 0));
        if (empty($cats)) {
            $parsed_args['categorize'] = false;
        }
    }
    if ($parsed_args['categorize']) {
        // Split the bookmarks into ul's for each category.
        foreach ((array) $cats as $cat) {
            $params = array_merge($parsed_args, array('category' => $cat->term_id));
            $bookmarks = get_bookmarks($params);
            if (empty($bookmarks)) {
                continue;
            }
            $output .= str_replace(array('%id', '%class'), array("linkcat-{$cat->term_id}", $parsed_args['class']), $parsed_args['category_before']);
            /**
             * Filters the category name.
             *
             * @since 2.2.0
             *
             * @param string $cat_name The category name.
             */
            $catname = apply_filters('link_category', $cat->name);
            $output .= $parsed_args['title_before'];
            $output .= $catname;
            $output .= $parsed_args['title_after'];
            $output .= "\n\t<ul class='xoxo blogroll'>\n";
            $output .= _walk_bookmarks($bookmarks, $parsed_args);
            $output .= "\n\t</ul>\n";
            $output .= $parsed_args['category_after'] . "\n";
        }
    } else {
        // Output one single list using title_li for the title.
        $bookmarks = get_bookmarks($parsed_args);
        if (!empty($bookmarks)) {
            if (!empty($parsed_args['title_li'])) {
                $output .= str_replace(array('%id', '%class'), array('linkcat-' . $parsed_args['category'], $parsed_args['class']), $parsed_args['category_before']);
                $output .= $parsed_args['title_before'];
                $output .= $parsed_args['title_li'];
                $output .= $parsed_args['title_after'];
                $output .= "\n\t<ul class='xoxo blogroll'>\n";
                $output .= _walk_bookmarks($bookmarks, $parsed_args);
                $output .= "\n\t</ul>\n";
                $output .= $parsed_args['category_after'] . "\n";
            } else {
                $output .= _walk_bookmarks($bookmarks, $parsed_args);
            }
        }
    }
    /**
     * Filters the bookmarks list before it is echoed or returned.
     *
     * @since 2.5.0
     *
     * @param string $html The HTML list of bookmarks.
     */
    $html = apply_filters('wp_list_bookmarks', $output);
    if ($parsed_args['echo']) {
        echo $html;
    } else {
        return $html;
    }
}

WordPress Version: 5.6

/**
 * Retrieve or echo all of the bookmarks.
 *
 * List of default arguments are as follows:
 *
 * These options define how the Category name will appear before the category
 * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will
 * display for only the 'title_li' string and only if 'title_li' is not empty.
 *
 * @since 2.1.0
 *
 * @see _walk_bookmarks()
 *
 * @param string|array $args {
 *     Optional. String or array of arguments to list bookmarks.
 *
 *     @type string   $orderby          How to order the links by. Accepts post fields. Default 'name'.
 *     @type string   $order            Whether to order bookmarks in ascending or descending order.
 *                                      Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'.
 *     @type int      $limit            Amount of bookmarks to display. Accepts 1+ or -1 for all.
 *                                      Default -1.
 *     @type string   $category         Comma-separated list of category IDs to include links from.
 *                                      Default empty.
 *     @type string   $category_name    Category to retrieve links for by name. Default empty.
 *     @type int|bool $hide_invisible   Whether to show or hide links marked as 'invisible'. Accepts
 *                                      1|true or 0|false. Default 1|true.
 *     @type int|bool $show_updated     Whether to display the time the bookmark was last updated.
 *                                      Accepts 1|true or 0|false. Default 0|false.
 *     @type int|bool $echo             Whether to echo or return the formatted bookmarks. Accepts
 *                                      1|true (echo) or 0|false (return). Default 1|true.
 *     @type int|bool $categorize       Whether to show links listed by category or in a single column.
 *                                      Accepts 1|true (by category) or 0|false (one column). Default 1|true.
 *     @type int|bool $show_description Whether to show the bookmark descriptions. Accepts 1|true or 0|false.
 *                                      Default 0|false.
 *     @type string   $title_li         What to show before the links appear. Default 'Bookmarks'.
 *     @type string   $title_before     The HTML or text to prepend to the $title_li string. Default '<h2>'.
 *     @type string   $title_after      The HTML or text to append to the $title_li string. Default '</h2>'.
 *     @type string   $class            The CSS class to use for the $title_li. Default 'linkcat'.
 *     @type string   $category_before  The HTML or text to prepend to $title_before if $categorize is true.
 *                                      String must contain '%id' and '%class' to inherit the category ID and
 *                                      the $class argument used for formatting in themes.
 *                                      Default '<li id="%id" class="%class">'.
 *     @type string   $category_after   The HTML or text to append to $title_after if $categorize is true.
 *                                      Default '</li>'.
 *     @type string   $category_orderby How to order the bookmark category based on term scheme if $categorize
 *                                      is true. Default 'name'.
 *     @type string   $category_order   Whether to order categories in ascending or descending order if
 *                                      $categorize is true. Accepts 'ASC' (ascending) or 'DESC' (descending).
 *                                      Default 'ASC'.
 * }
 * @return void|string Void if 'echo' argument is true, HTML list of bookmarks if 'echo' is false.
 */
function wp_list_bookmarks($args = '')
{
    $defaults = array('orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '', 'exclude_category' => '', 'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'echo' => 1, 'categorize' => 1, 'title_li' => __('Bookmarks'), 'title_before' => '<h2>', 'title_after' => '</h2>', 'category_orderby' => 'name', 'category_order' => 'ASC', 'class' => 'linkcat', 'category_before' => '<li id="%id" class="%class">', 'category_after' => '</li>');
    $parsed_args = wp_parse_args($args, $defaults);
    $output = '';
    if (!is_array($parsed_args['class'])) {
        $parsed_args['class'] = explode(' ', $parsed_args['class']);
    }
    $parsed_args['class'] = array_map('sanitize_html_class', $parsed_args['class']);
    $parsed_args['class'] = trim(implode(' ', $parsed_args['class']));
    if ($parsed_args['categorize']) {
        $cats = get_terms(array('taxonomy' => 'link_category', 'name__like' => $parsed_args['category_name'], 'include' => $parsed_args['category'], 'exclude' => $parsed_args['exclude_category'], 'orderby' => $parsed_args['category_orderby'], 'order' => $parsed_args['category_order'], 'hierarchical' => 0));
        if (empty($cats)) {
            $parsed_args['categorize'] = false;
        }
    }
    if ($parsed_args['categorize']) {
        // Split the bookmarks into ul's for each category.
        foreach ((array) $cats as $cat) {
            $params = array_merge($parsed_args, array('category' => $cat->term_id));
            $bookmarks = get_bookmarks($params);
            if (empty($bookmarks)) {
                continue;
            }
            $output .= str_replace(array('%id', '%class'), array("linkcat-{$cat->term_id}", $parsed_args['class']), $parsed_args['category_before']);
            /**
             * Filters the category name.
             *
             * @since 2.2.0
             *
             * @param string $cat_name The category name.
             */
            $catname = apply_filters('link_category', $cat->name);
            $output .= $parsed_args['title_before'];
            $output .= $catname;
            $output .= $parsed_args['title_after'];
            $output .= "\n\t<ul class='xoxo blogroll'>\n";
            $output .= _walk_bookmarks($bookmarks, $parsed_args);
            $output .= "\n\t</ul>\n";
            $output .= $parsed_args['category_after'] . "\n";
        }
    } else {
        // Output one single list using title_li for the title.
        $bookmarks = get_bookmarks($parsed_args);
        if (!empty($bookmarks)) {
            if (!empty($parsed_args['title_li'])) {
                $output .= str_replace(array('%id', '%class'), array('linkcat-' . $parsed_args['category'], $parsed_args['class']), $parsed_args['category_before']);
                $output .= $parsed_args['title_before'];
                $output .= $parsed_args['title_li'];
                $output .= $parsed_args['title_after'];
                $output .= "\n\t<ul class='xoxo blogroll'>\n";
                $output .= _walk_bookmarks($bookmarks, $parsed_args);
                $output .= "\n\t</ul>\n";
                $output .= $parsed_args['category_after'] . "\n";
            } else {
                $output .= _walk_bookmarks($bookmarks, $parsed_args);
            }
        }
    }
    /**
     * Filters the bookmarks list before it is echoed or returned.
     *
     * @since 2.5.0
     *
     * @param string $html The HTML list of bookmarks.
     */
    $html = apply_filters('wp_list_bookmarks', $output);
    if ($parsed_args['echo']) {
        echo $html;
    } else {
        return $html;
    }
}

WordPress Version: 5.5

/**
 * Retrieve or echo all of the bookmarks.
 *
 * List of default arguments are as follows:
 *
 * These options define how the Category name will appear before the category
 * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will
 * display for only the 'title_li' string and only if 'title_li' is not empty.
 *
 * @since 2.1.0
 *
 * @see _walk_bookmarks()
 *
 * @param string|array $args {
 *     Optional. String or array of arguments to list bookmarks.
 *
 *     @type string   $orderby          How to order the links by. Accepts post fields. Default 'name'.
 *     @type string   $order            Whether to order bookmarks in ascending or descending order.
 *                                      Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'.
 *     @type int      $limit            Amount of bookmarks to display. Accepts 1+ or -1 for all.
 *                                      Default -1.
 *     @type string   $category         Comma-separated list of category IDs to include links from.
 *                                      Default empty.
 *     @type string   $category_name    Category to retrieve links for by name. Default empty.
 *     @type int|bool $hide_invisible   Whether to show or hide links marked as 'invisible'. Accepts
 *                                      1|true or 0|false. Default 1|true.
 *     @type int|bool $show_updated     Whether to display the time the bookmark was last updated.
 *                                      Accepts 1|true or 0|false. Default 0|false.
 *     @type int|bool $echo             Whether to echo or return the formatted bookmarks. Accepts
 *                                      1|true (echo) or 0|false (return). Default 1|true.
 *     @type int|bool $categorize       Whether to show links listed by category or in a single column.
 *                                      Accepts 1|true (by category) or 0|false (one column). Default 1|true.
 *     @type int|bool $show_description Whether to show the bookmark descriptions. Accepts 1|true or 0|false.
 *                                      Default 0|false.
 *     @type string   $title_li         What to show before the links appear. Default 'Bookmarks'.
 *     @type string   $title_before     The HTML or text to prepend to the $title_li string. Default '<h2>'.
 *     @type string   $title_after      The HTML or text to append to the $title_li string. Default '</h2>'.
 *     @type string   $class            The CSS class to use for the $title_li. Default 'linkcat'.
 *     @type string   $category_before  The HTML or text to prepend to $title_before if $categorize is true.
 *                                      String must contain '%id' and '%class' to inherit the category ID and
 *                                      the $class argument used for formatting in themes.
 *                                      Default '<li id="%id" class="%class">'.
 *     @type string   $category_after   The HTML or text to append to $title_after if $categorize is true.
 *                                      Default '</li>'.
 *     @type string   $category_orderby How to order the bookmark category based on term scheme if $categorize
 *                                      is true. Default 'name'.
 *     @type string   $category_order   Whether to order categories in ascending or descending order if
 *                                      $categorize is true. Accepts 'ASC' (ascending) or 'DESC' (descending).
 *                                      Default 'ASC'.
 * }
 * @return void|string Void if 'echo' argument is true, HTML list of bookmarks if 'echo' is false.
 */
function wp_list_bookmarks($args = '')
{
    $defaults = array('orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '', 'exclude_category' => '', 'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'echo' => 1, 'categorize' => 1, 'title_li' => __('Bookmarks'), 'title_before' => '<h2>', 'title_after' => '</h2>', 'category_orderby' => 'name', 'category_order' => 'ASC', 'class' => 'linkcat', 'category_before' => '<li id="%id" class="%class">', 'category_after' => '</li>');
    $parsed_args = wp_parse_args($args, $defaults);
    $output = '';
    if (!is_array($parsed_args['class'])) {
        $parsed_args['class'] = explode(' ', $parsed_args['class']);
    }
    $parsed_args['class'] = array_map('sanitize_html_class', $parsed_args['class']);
    $parsed_args['class'] = trim(join(' ', $parsed_args['class']));
    if ($parsed_args['categorize']) {
        $cats = get_terms(array('taxonomy' => 'link_category', 'name__like' => $parsed_args['category_name'], 'include' => $parsed_args['category'], 'exclude' => $parsed_args['exclude_category'], 'orderby' => $parsed_args['category_orderby'], 'order' => $parsed_args['category_order'], 'hierarchical' => 0));
        if (empty($cats)) {
            $parsed_args['categorize'] = false;
        }
    }
    if ($parsed_args['categorize']) {
        // Split the bookmarks into ul's for each category.
        foreach ((array) $cats as $cat) {
            $params = array_merge($parsed_args, array('category' => $cat->term_id));
            $bookmarks = get_bookmarks($params);
            if (empty($bookmarks)) {
                continue;
            }
            $output .= str_replace(array('%id', '%class'), array("linkcat-{$cat->term_id}", $parsed_args['class']), $parsed_args['category_before']);
            /**
             * Filters the category name.
             *
             * @since 2.2.0
             *
             * @param string $cat_name The category name.
             */
            $catname = apply_filters('link_category', $cat->name);
            $output .= $parsed_args['title_before'];
            $output .= $catname;
            $output .= $parsed_args['title_after'];
            $output .= "\n\t<ul class='xoxo blogroll'>\n";
            $output .= _walk_bookmarks($bookmarks, $parsed_args);
            $output .= "\n\t</ul>\n";
            $output .= $parsed_args['category_after'] . "\n";
        }
    } else {
        // Output one single list using title_li for the title.
        $bookmarks = get_bookmarks($parsed_args);
        if (!empty($bookmarks)) {
            if (!empty($parsed_args['title_li'])) {
                $output .= str_replace(array('%id', '%class'), array('linkcat-' . $parsed_args['category'], $parsed_args['class']), $parsed_args['category_before']);
                $output .= $parsed_args['title_before'];
                $output .= $parsed_args['title_li'];
                $output .= $parsed_args['title_after'];
                $output .= "\n\t<ul class='xoxo blogroll'>\n";
                $output .= _walk_bookmarks($bookmarks, $parsed_args);
                $output .= "\n\t</ul>\n";
                $output .= $parsed_args['category_after'] . "\n";
            } else {
                $output .= _walk_bookmarks($bookmarks, $parsed_args);
            }
        }
    }
    /**
     * Filters the bookmarks list before it is echoed or returned.
     *
     * @since 2.5.0
     *
     * @param string $html The HTML list of bookmarks.
     */
    $html = apply_filters('wp_list_bookmarks', $output);
    if ($parsed_args['echo']) {
        echo $html;
    } else {
        return $html;
    }
}

WordPress Version: 5.4

/**
 * Retrieve or echo all of the bookmarks.
 *
 * List of default arguments are as follows:
 *
 * These options define how the Category name will appear before the category
 * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will
 * display for only the 'title_li' string and only if 'title_li' is not empty.
 *
 * @since 2.1.0
 *
 * @see _walk_bookmarks()
 *
 * @param string|array $args {
 *     Optional. String or array of arguments to list bookmarks.
 *
 *     @type string   $orderby          How to order the links by. Accepts post fields. Default 'name'.
 *     @type string   $order            Whether to order bookmarks in ascending or descending order.
 *                                      Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'.
 *     @type int      $limit            Amount of bookmarks to display. Accepts 1+ or -1 for all.
 *                                      Default -1.
 *     @type string   $category         Comma-separated list of category ids to include links from.
 *                                      Default empty.
 *     @type string   $category_name    Category to retrieve links for by name. Default empty.
 *     @type int|bool $hide_invisible   Whether to show or hide links marked as 'invisible'. Accepts
 *                                      1|true or 0|false. Default 1|true.
 *     @type int|bool $show_updated     Whether to display the time the bookmark was last updated.
 *                                      Accepts 1|true or 0|false. Default 0|false.
 *     @type int|bool $echo             Whether to echo or return the formatted bookmarks. Accepts
 *                                      1|true (echo) or 0|false (return). Default 1|true.
 *     @type int|bool $categorize       Whether to show links listed by category or in a single column.
 *                                      Accepts 1|true (by category) or 0|false (one column). Default 1|true.
 *     @type int|bool $show_description Whether to show the bookmark descriptions. Accepts 1|true or 0|false.
 *                                      Default 0|false.
 *     @type string   $title_li         What to show before the links appear. Default 'Bookmarks'.
 *     @type string   $title_before     The HTML or text to prepend to the $title_li string. Default '<h2>'.
 *     @type string   $title_after      The HTML or text to append to the $title_li string. Default '</h2>'.
 *     @type string   $class            The CSS class to use for the $title_li. Default 'linkcat'.
 *     @type string   $category_before  The HTML or text to prepend to $title_before if $categorize is true.
 *                                      String must contain '%id' and '%class' to inherit the category ID and
 *                                      the $class argument used for formatting in themes.
 *                                      Default '<li id="%id" class="%class">'.
 *     @type string   $category_after   The HTML or text to append to $title_after if $categorize is true.
 *                                      Default '</li>'.
 *     @type string   $category_orderby How to order the bookmark category based on term scheme if $categorize
 *                                      is true. Default 'name'.
 *     @type string   $category_order   Whether to order categories in ascending or descending order if
 *                                      $categorize is true. Accepts 'ASC' (ascending) or 'DESC' (descending).
 *                                      Default 'ASC'.
 * }
 * @return void|string Void if 'echo' argument is true, HTML list of bookmarks if 'echo' is false.
 */
function wp_list_bookmarks($args = '')
{
    $defaults = array('orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '', 'exclude_category' => '', 'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'echo' => 1, 'categorize' => 1, 'title_li' => __('Bookmarks'), 'title_before' => '<h2>', 'title_after' => '</h2>', 'category_orderby' => 'name', 'category_order' => 'ASC', 'class' => 'linkcat', 'category_before' => '<li id="%id" class="%class">', 'category_after' => '</li>');
    $parsed_args = wp_parse_args($args, $defaults);
    $output = '';
    if (!is_array($parsed_args['class'])) {
        $parsed_args['class'] = explode(' ', $parsed_args['class']);
    }
    $parsed_args['class'] = array_map('sanitize_html_class', $parsed_args['class']);
    $parsed_args['class'] = trim(join(' ', $parsed_args['class']));
    if ($parsed_args['categorize']) {
        $cats = get_terms(array('taxonomy' => 'link_category', 'name__like' => $parsed_args['category_name'], 'include' => $parsed_args['category'], 'exclude' => $parsed_args['exclude_category'], 'orderby' => $parsed_args['category_orderby'], 'order' => $parsed_args['category_order'], 'hierarchical' => 0));
        if (empty($cats)) {
            $parsed_args['categorize'] = false;
        }
    }
    if ($parsed_args['categorize']) {
        // Split the bookmarks into ul's for each category.
        foreach ((array) $cats as $cat) {
            $params = array_merge($parsed_args, array('category' => $cat->term_id));
            $bookmarks = get_bookmarks($params);
            if (empty($bookmarks)) {
                continue;
            }
            $output .= str_replace(array('%id', '%class'), array("linkcat-{$cat->term_id}", $parsed_args['class']), $parsed_args['category_before']);
            /**
             * Filters the category name.
             *
             * @since 2.2.0
             *
             * @param string $cat_name The category name.
             */
            $catname = apply_filters('link_category', $cat->name);
            $output .= $parsed_args['title_before'];
            $output .= $catname;
            $output .= $parsed_args['title_after'];
            $output .= "\n\t<ul class='xoxo blogroll'>\n";
            $output .= _walk_bookmarks($bookmarks, $parsed_args);
            $output .= "\n\t</ul>\n";
            $output .= $parsed_args['category_after'] . "\n";
        }
    } else {
        // Output one single list using title_li for the title.
        $bookmarks = get_bookmarks($parsed_args);
        if (!empty($bookmarks)) {
            if (!empty($parsed_args['title_li'])) {
                $output .= str_replace(array('%id', '%class'), array('linkcat-' . $parsed_args['category'], $parsed_args['class']), $parsed_args['category_before']);
                $output .= $parsed_args['title_before'];
                $output .= $parsed_args['title_li'];
                $output .= $parsed_args['title_after'];
                $output .= "\n\t<ul class='xoxo blogroll'>\n";
                $output .= _walk_bookmarks($bookmarks, $parsed_args);
                $output .= "\n\t</ul>\n";
                $output .= $parsed_args['category_after'] . "\n";
            } else {
                $output .= _walk_bookmarks($bookmarks, $parsed_args);
            }
        }
    }
    /**
     * Filters the bookmarks list before it is echoed or returned.
     *
     * @since 2.5.0
     *
     * @param string $html The HTML list of bookmarks.
     */
    $html = apply_filters('wp_list_bookmarks', $output);
    if ($parsed_args['echo']) {
        echo $html;
    } else {
        return $html;
    }
}

WordPress Version: 5.3

/**
 * Retrieve or echo all of the bookmarks.
 *
 * List of default arguments are as follows:
 *
 * These options define how the Category name will appear before the category
 * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will
 * display for only the 'title_li' string and only if 'title_li' is not empty.
 *
 * @since 2.1.0
 *
 * @see _walk_bookmarks()
 *
 * @param string|array $args {
 *     Optional. String or array of arguments to list bookmarks.
 *
 *     @type string   $orderby          How to order the links by. Accepts post fields. Default 'name'.
 *     @type string   $order            Whether to order bookmarks in ascending or descending order.
 *                                      Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'.
 *     @type int      $limit            Amount of bookmarks to display. Accepts 1+ or -1 for all.
 *                                      Default -1.
 *     @type string   $category         Comma-separated list of category ids to include links from.
 *                                      Default empty.
 *     @type string   $category_name    Category to retrieve links for by name. Default empty.
 *     @type int|bool $hide_invisible   Whether to show or hide links marked as 'invisible'. Accepts
 *                                      1|true or 0|false. Default 1|true.
 *     @type int|bool $show_updated     Whether to display the time the bookmark was last updated.
 *                                      Accepts 1|true or 0|false. Default 0|false.
 *     @type int|bool $echo             Whether to echo or return the formatted bookmarks. Accepts
 *                                      1|true (echo) or 0|false (return). Default 1|true.
 *     @type int|bool $categorize       Whether to show links listed by category or in a single column.
 *                                      Accepts 1|true (by category) or 0|false (one column). Default 1|true.
 *     @type int|bool $show_description Whether to show the bookmark descriptions. Accepts 1|true or 0|false.
 *                                      Default 0|false.
 *     @type string   $title_li         What to show before the links appear. Default 'Bookmarks'.
 *     @type string   $title_before     The HTML or text to prepend to the $title_li string. Default '<h2>'.
 *     @type string   $title_after      The HTML or text to append to the $title_li string. Default '</h2>'.
 *     @type string   $class            The CSS class to use for the $title_li. Default 'linkcat'.
 *     @type string   $category_before  The HTML or text to prepend to $title_before if $categorize is true.
 *                                      String must contain '%id' and '%class' to inherit the category ID and
 *                                      the $class argument used for formatting in themes.
 *                                      Default '<li id="%id" class="%class">'.
 *     @type string   $category_after   The HTML or text to append to $title_after if $categorize is true.
 *                                      Default '</li>'.
 *     @type string   $category_orderby How to order the bookmark category based on term scheme if $categorize
 *                                      is true. Default 'name'.
 *     @type string   $category_order   Whether to order categories in ascending or descending order if
 *                                      $categorize is true. Accepts 'ASC' (ascending) or 'DESC' (descending).
 *                                      Default 'ASC'.
 * }
 * @return string|void Will only return if echo option is set to not echo. Default is not return anything.
 */
function wp_list_bookmarks($args = '')
{
    $defaults = array('orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '', 'exclude_category' => '', 'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'echo' => 1, 'categorize' => 1, 'title_li' => __('Bookmarks'), 'title_before' => '<h2>', 'title_after' => '</h2>', 'category_orderby' => 'name', 'category_order' => 'ASC', 'class' => 'linkcat', 'category_before' => '<li id="%id" class="%class">', 'category_after' => '</li>');
    $parsed_args = wp_parse_args($args, $defaults);
    $output = '';
    if (!is_array($parsed_args['class'])) {
        $parsed_args['class'] = explode(' ', $parsed_args['class']);
    }
    $parsed_args['class'] = array_map('sanitize_html_class', $parsed_args['class']);
    $parsed_args['class'] = trim(join(' ', $parsed_args['class']));
    if ($parsed_args['categorize']) {
        $cats = get_terms(array('taxonomy' => 'link_category', 'name__like' => $parsed_args['category_name'], 'include' => $parsed_args['category'], 'exclude' => $parsed_args['exclude_category'], 'orderby' => $parsed_args['category_orderby'], 'order' => $parsed_args['category_order'], 'hierarchical' => 0));
        if (empty($cats)) {
            $parsed_args['categorize'] = false;
        }
    }
    if ($parsed_args['categorize']) {
        // Split the bookmarks into ul's for each category
        foreach ((array) $cats as $cat) {
            $params = array_merge($parsed_args, array('category' => $cat->term_id));
            $bookmarks = get_bookmarks($params);
            if (empty($bookmarks)) {
                continue;
            }
            $output .= str_replace(array('%id', '%class'), array("linkcat-{$cat->term_id}", $parsed_args['class']), $parsed_args['category_before']);
            /**
             * Filters the category name.
             *
             * @since 2.2.0
             *
             * @param string $cat_name The category name.
             */
            $catname = apply_filters('link_category', $cat->name);
            $output .= $parsed_args['title_before'];
            $output .= $catname;
            $output .= $parsed_args['title_after'];
            $output .= "\n\t<ul class='xoxo blogroll'>\n";
            $output .= _walk_bookmarks($bookmarks, $parsed_args);
            $output .= "\n\t</ul>\n";
            $output .= $parsed_args['category_after'] . "\n";
        }
    } else {
        //output one single list using title_li for the title
        $bookmarks = get_bookmarks($parsed_args);
        if (!empty($bookmarks)) {
            if (!empty($parsed_args['title_li'])) {
                $output .= str_replace(array('%id', '%class'), array('linkcat-' . $parsed_args['category'], $parsed_args['class']), $parsed_args['category_before']);
                $output .= $parsed_args['title_before'];
                $output .= $parsed_args['title_li'];
                $output .= $parsed_args['title_after'];
                $output .= "\n\t<ul class='xoxo blogroll'>\n";
                $output .= _walk_bookmarks($bookmarks, $parsed_args);
                $output .= "\n\t</ul>\n";
                $output .= $parsed_args['category_after'] . "\n";
            } else {
                $output .= _walk_bookmarks($bookmarks, $parsed_args);
            }
        }
    }
    /**
     * Filters the bookmarks list before it is echoed or returned.
     *
     * @since 2.5.0
     *
     * @param string $html The HTML list of bookmarks.
     */
    $html = apply_filters('wp_list_bookmarks', $output);
    if (!$parsed_args['echo']) {
        return $html;
    }
    echo $html;
}

WordPress Version: 5.1

/**
 * Retrieve or echo all of the bookmarks.
 *
 * List of default arguments are as follows:
 *
 * These options define how the Category name will appear before the category
 * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will
 * display for only the 'title_li' string and only if 'title_li' is not empty.
 *
 * @since 2.1.0
 *
 * @see _walk_bookmarks()
 *
 * @param string|array $args {
 *     Optional. String or array of arguments to list bookmarks.
 *
 *     @type string   $orderby          How to order the links by. Accepts post fields. Default 'name'.
 *     @type string   $order            Whether to order bookmarks in ascending or descending order.
 *                                      Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'.
 *     @type int      $limit            Amount of bookmarks to display. Accepts 1+ or -1 for all.
 *                                      Default -1.
 *     @type string   $category         Comma-separated list of category ids to include links from.
 *                                      Default empty.
 *     @type string   $category_name    Category to retrieve links for by name. Default empty.
 *     @type int|bool $hide_invisible   Whether to show or hide links marked as 'invisible'. Accepts
 *                                      1|true or 0|false. Default 1|true.
 *     @type int|bool $show_updated     Whether to display the time the bookmark was last updated.
 *                                      Accepts 1|true or 0|false. Default 0|false.
 *     @type int|bool $echo             Whether to echo or return the formatted bookmarks. Accepts
 *                                      1|true (echo) or 0|false (return). Default 1|true.
 *     @type int|bool $categorize       Whether to show links listed by category or in a single column.
 *                                      Accepts 1|true (by category) or 0|false (one column). Default 1|true.
 *     @type int|bool $show_description Whether to show the bookmark descriptions. Accepts 1|true or 0|false.
 *                                      Default 0|false.
 *     @type string   $title_li         What to show before the links appear. Default 'Bookmarks'.
 *     @type string   $title_before     The HTML or text to prepend to the $title_li string. Default '<h2>'.
 *     @type string   $title_after      The HTML or text to append to the $title_li string. Default '</h2>'.
 *     @type string   $class            The CSS class to use for the $title_li. Default 'linkcat'.
 *     @type string   $category_before  The HTML or text to prepend to $title_before if $categorize is true.
 *                                      String must contain '%id' and '%class' to inherit the category ID and
 *                                      the $class argument used for formatting in themes.
 *                                      Default '<li id="%id" class="%class">'.
 *     @type string   $category_after   The HTML or text to append to $title_after if $categorize is true.
 *                                      Default '</li>'.
 *     @type string   $category_orderby How to order the bookmark category based on term scheme if $categorize
 *                                      is true. Default 'name'.
 *     @type string   $category_order   Whether to order categories in ascending or descending order if
 *                                      $categorize is true. Accepts 'ASC' (ascending) or 'DESC' (descending).
 *                                      Default 'ASC'.
 * }
 * @return string|void Will only return if echo option is set to not echo. Default is not return anything.
 */
function wp_list_bookmarks($args = '')
{
    $defaults = array('orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '', 'exclude_category' => '', 'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'echo' => 1, 'categorize' => 1, 'title_li' => __('Bookmarks'), 'title_before' => '<h2>', 'title_after' => '</h2>', 'category_orderby' => 'name', 'category_order' => 'ASC', 'class' => 'linkcat', 'category_before' => '<li id="%id" class="%class">', 'category_after' => '</li>');
    $r = wp_parse_args($args, $defaults);
    $output = '';
    if (!is_array($r['class'])) {
        $r['class'] = explode(' ', $r['class']);
    }
    $r['class'] = array_map('sanitize_html_class', $r['class']);
    $r['class'] = trim(join(' ', $r['class']));
    if ($r['categorize']) {
        $cats = get_terms('link_category', array('name__like' => $r['category_name'], 'include' => $r['category'], 'exclude' => $r['exclude_category'], 'orderby' => $r['category_orderby'], 'order' => $r['category_order'], 'hierarchical' => 0));
        if (empty($cats)) {
            $r['categorize'] = false;
        }
    }
    if ($r['categorize']) {
        // Split the bookmarks into ul's for each category
        foreach ((array) $cats as $cat) {
            $params = array_merge($r, array('category' => $cat->term_id));
            $bookmarks = get_bookmarks($params);
            if (empty($bookmarks)) {
                continue;
            }
            $output .= str_replace(array('%id', '%class'), array("linkcat-{$cat->term_id}", $r['class']), $r['category_before']);
            /**
             * Filters the category name.
             *
             * @since 2.2.0
             *
             * @param string $cat_name The category name.
             */
            $catname = apply_filters('link_category', $cat->name);
            $output .= $r['title_before'];
            $output .= $catname;
            $output .= $r['title_after'];
            $output .= "\n\t<ul class='xoxo blogroll'>\n";
            $output .= _walk_bookmarks($bookmarks, $r);
            $output .= "\n\t</ul>\n";
            $output .= $r['category_after'] . "\n";
        }
    } else {
        //output one single list using title_li for the title
        $bookmarks = get_bookmarks($r);
        if (!empty($bookmarks)) {
            if (!empty($r['title_li'])) {
                $output .= str_replace(array('%id', '%class'), array('linkcat-' . $r['category'], $r['class']), $r['category_before']);
                $output .= $r['title_before'];
                $output .= $r['title_li'];
                $output .= $r['title_after'];
                $output .= "\n\t<ul class='xoxo blogroll'>\n";
                $output .= _walk_bookmarks($bookmarks, $r);
                $output .= "\n\t</ul>\n";
                $output .= $r['category_after'] . "\n";
            } else {
                $output .= _walk_bookmarks($bookmarks, $r);
            }
        }
    }
    /**
     * Filters the bookmarks list before it is echoed or returned.
     *
     * @since 2.5.0
     *
     * @param string $html The HTML list of bookmarks.
     */
    $html = apply_filters('wp_list_bookmarks', $output);
    if (!$r['echo']) {
        return $html;
    }
    echo $html;
}

WordPress Version: 4.6

/**
 * Retrieve or echo all of the bookmarks.
 *
 * List of default arguments are as follows:
 *
 * These options define how the Category name will appear before the category
 * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will
 * display for only the 'title_li' string and only if 'title_li' is not empty.
 *
 * @since 2.1.0
 *
 * @see _walk_bookmarks()
 *
 * @param string|array $args {
 *     Optional. String or array of arguments to list bookmarks.
 *
 *     @type string   $orderby          How to order the links by. Accepts post fields. Default 'name'.
 *     @type string   $order            Whether to order bookmarks in ascending or descending order.
 *                                      Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'.
 *     @type int      $limit            Amount of bookmarks to display. Accepts 1+ or -1 for all.
 *                                      Default -1.
 *     @type string   $category         Comma-separated list of category ids to include links from.
 *                                      Default empty.
 *     @type string   $category_name    Category to retrieve links for by name. Default empty.
 *     @type int|bool $hide_invisible   Whether to show or hide links marked as 'invisible'. Accepts
 *                                      1|true or 0|false. Default 1|true.
 *     @type int|bool $show_updated     Whether to display the time the bookmark was last updated.
 *                                      Accepts 1|true or 0|false. Default 0|false.
 *     @type int|bool $echo             Whether to echo or return the formatted bookmarks. Accepts
 *                                      1|true (echo) or 0|false (return). Default 1|true.
 *     @type int|bool $categorize       Whether to show links listed by category or in a single column.
 *                                      Accepts 1|true (by category) or 0|false (one column). Default 1|true.
 *     @type int|bool $show_description Whether to show the bookmark descriptions. Accepts 1|true or 0|false.
 *                                      Default 0|false.
 *     @type string   $title_li         What to show before the links appear. Default 'Bookmarks'.
 *     @type string   $title_before     The HTML or text to prepend to the $title_li string. Default '<h2>'.
 *     @type string   $title_after      The HTML or text to append to the $title_li string. Default '</h2>'.
 *     @type string   $class            The CSS class to use for the $title_li. Default 'linkcat'.
 *     @type string   $category_before  The HTML or text to prepend to $title_before if $categorize is true.
 *                                      String must contain '%id' and '%class' to inherit the category ID and
 *                                      the $class argument used for formatting in themes.
 *                                      Default '<li id="%id" class="%class">'.
 *     @type string   $category_after   The HTML or text to append to $title_after if $categorize is true.
 *                                      Default '</li>'.
 *     @type string   $category_orderby How to order the bookmark category based on term scheme if $categorize
 *                                      is true. Default 'name'.
 *     @type string   $category_order   Whether to order categories in ascending or descending order if
 *                                      $categorize is true. Accepts 'ASC' (ascending) or 'DESC' (descending).
 *                                      Default 'ASC'.
 * }
 * @return string|void Will only return if echo option is set to not echo. Default is not return anything.
 */
function wp_list_bookmarks($args = '')
{
    $defaults = array('orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '', 'exclude_category' => '', 'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'echo' => 1, 'categorize' => 1, 'title_li' => __('Bookmarks'), 'title_before' => '<h2>', 'title_after' => '</h2>', 'category_orderby' => 'name', 'category_order' => 'ASC', 'class' => 'linkcat', 'category_before' => '<li id="%id" class="%class">', 'category_after' => '</li>');
    $r = wp_parse_args($args, $defaults);
    $output = '';
    if (!is_array($r['class'])) {
        $r['class'] = explode(' ', $r['class']);
    }
    $r['class'] = array_map('sanitize_html_class', $r['class']);
    $r['class'] = trim(join(' ', $r['class']));
    if ($r['categorize']) {
        $cats = get_terms('link_category', array('name__like' => $r['category_name'], 'include' => $r['category'], 'exclude' => $r['exclude_category'], 'orderby' => $r['category_orderby'], 'order' => $r['category_order'], 'hierarchical' => 0));
        if (empty($cats)) {
            $r['categorize'] = false;
        }
    }
    if ($r['categorize']) {
        // Split the bookmarks into ul's for each category
        foreach ((array) $cats as $cat) {
            $params = array_merge($r, array('category' => $cat->term_id));
            $bookmarks = get_bookmarks($params);
            if (empty($bookmarks)) {
                continue;
            }
            $output .= str_replace(array('%id', '%class'), array("linkcat-{$cat->term_id}", $r['class']), $r['category_before']);
            /**
             * Filters the bookmarks category name.
             *
             * @since 2.2.0
             *
             * @param string $cat_name The category name of bookmarks.
             */
            $catname = apply_filters('link_category', $cat->name);
            $output .= $r['title_before'];
            $output .= $catname;
            $output .= $r['title_after'];
            $output .= "\n\t<ul class='xoxo blogroll'>\n";
            $output .= _walk_bookmarks($bookmarks, $r);
            $output .= "\n\t</ul>\n";
            $output .= $r['category_after'] . "\n";
        }
    } else {
        //output one single list using title_li for the title
        $bookmarks = get_bookmarks($r);
        if (!empty($bookmarks)) {
            if (!empty($r['title_li'])) {
                $output .= str_replace(array('%id', '%class'), array("linkcat-" . $r['category'], $r['class']), $r['category_before']);
                $output .= $r['title_before'];
                $output .= $r['title_li'];
                $output .= $r['title_after'];
                $output .= "\n\t<ul class='xoxo blogroll'>\n";
                $output .= _walk_bookmarks($bookmarks, $r);
                $output .= "\n\t</ul>\n";
                $output .= $r['category_after'] . "\n";
            } else {
                $output .= _walk_bookmarks($bookmarks, $r);
            }
        }
    }
    /**
     * Filters the bookmarks list before it is echoed or returned.
     *
     * @since 2.5.0
     *
     * @param string $html The HTML list of bookmarks.
     */
    $html = apply_filters('wp_list_bookmarks', $output);
    if (!$r['echo']) {
        return $html;
    }
    echo $html;
}

WordPress Version: 4.3

/**
 * Retrieve or echo all of the bookmarks.
 *
 * List of default arguments are as follows:
 *
 * These options define how the Category name will appear before the category
 * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will
 * display for only the 'title_li' string and only if 'title_li' is not empty.
 *
 * @since 2.1.0
 *
 * @see _walk_bookmarks()
 *
 * @param string|array $args {
 *     Optional. String or array of arguments to list bookmarks.
 *
 *     @type string   $orderby          How to order the links by. Accepts post fields. Default 'name'.
 *     @type string   $order            Whether to order bookmarks in ascending or descending order.
 *                                      Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'.
 *     @type int      $limit            Amount of bookmarks to display. Accepts 1+ or -1 for all.
 *                                      Default -1.
 *     @type string   $category         Comma-separated list of category ids to include links from.
 *                                      Default empty.
 *     @type string   $category_name    Category to retrieve links for by name. Default empty.
 *     @type int|bool $hide_invisible   Whether to show or hide links marked as 'invisible'. Accepts
 *                                      1|true or 0|false. Default 1|true.
 *     @type int|bool $show_updated     Whether to display the time the bookmark was last updated.
 *                                      Accepts 1|true or 0|false. Default 0|false.
 *     @type int|bool $echo             Whether to echo or return the formatted bookmarks. Accepts
 *                                      1|true (echo) or 0|false (return). Default 1|true.
 *     @type int|bool $categorize       Whether to show links listed by category or in a single column.
 *                                      Accepts 1|true (by category) or 0|false (one column). Default 1|true.
 *     @type int|bool $show_description Whether to show the bookmark descriptions. Accepts 1|true or 0|false.
 *                                      Default 0|false.
 *     @type string   $title_li         What to show before the links appear. Default 'Bookmarks'.
 *     @type string   $title_before     The HTML or text to prepend to the $title_li string. Default '<h2>'.
 *     @type string   $title_after      The HTML or text to append to the $title_li string. Default '</h2>'.
 *     @type string   $class            The CSS class to use for the $title_li. Default 'linkcat'.
 *     @type string   $category_before  The HTML or text to prepend to $title_before if $categorize is true.
 *                                      String must contain '%id' and '%class' to inherit the category ID and
 *                                      the $class argument used for formatting in themes.
 *                                      Default '<li id="%id" class="%class">'.
 *     @type string   $category_after   The HTML or text to append to $title_after if $categorize is true.
 *                                      Default '</li>'.
 *     @type string   $category_orderby How to order the bookmark category based on term scheme if $categorize
 *                                      is true. Default 'name'.
 *     @type string   $category_order   Whether to order categories in ascending or descending order if
 *                                      $categorize is true. Accepts 'ASC' (ascending) or 'DESC' (descending).
 *                                      Default 'ASC'.
 * }
 * @return string|void Will only return if echo option is set to not echo. Default is not return anything.
 */
function wp_list_bookmarks($args = '')
{
    $defaults = array('orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '', 'exclude_category' => '', 'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'echo' => 1, 'categorize' => 1, 'title_li' => __('Bookmarks'), 'title_before' => '<h2>', 'title_after' => '</h2>', 'category_orderby' => 'name', 'category_order' => 'ASC', 'class' => 'linkcat', 'category_before' => '<li id="%id" class="%class">', 'category_after' => '</li>');
    $r = wp_parse_args($args, $defaults);
    $output = '';
    if (!is_array($r['class'])) {
        $r['class'] = explode(' ', $r['class']);
    }
    $r['class'] = array_map('sanitize_html_class', $r['class']);
    $r['class'] = trim(join(' ', $r['class']));
    if ($r['categorize']) {
        $cats = get_terms('link_category', array('name__like' => $r['category_name'], 'include' => $r['category'], 'exclude' => $r['exclude_category'], 'orderby' => $r['category_orderby'], 'order' => $r['category_order'], 'hierarchical' => 0));
        if (empty($cats)) {
            $r['categorize'] = false;
        }
    }
    if ($r['categorize']) {
        // Split the bookmarks into ul's for each category
        foreach ((array) $cats as $cat) {
            $params = array_merge($r, array('category' => $cat->term_id));
            $bookmarks = get_bookmarks($params);
            if (empty($bookmarks)) {
                continue;
            }
            $output .= str_replace(array('%id', '%class'), array("linkcat-{$cat->term_id}", $r['class']), $r['category_before']);
            /**
             * Filter the bookmarks category name.
             *
             * @since 2.2.0
             *
             * @param string $cat_name The category name of bookmarks.
             */
            $catname = apply_filters('link_category', $cat->name);
            $output .= $r['title_before'];
            $output .= $catname;
            $output .= $r['title_after'];
            $output .= "\n\t<ul class='xoxo blogroll'>\n";
            $output .= _walk_bookmarks($bookmarks, $r);
            $output .= "\n\t</ul>\n";
            $output .= $r['category_after'] . "\n";
        }
    } else {
        //output one single list using title_li for the title
        $bookmarks = get_bookmarks($r);
        if (!empty($bookmarks)) {
            if (!empty($r['title_li'])) {
                $output .= str_replace(array('%id', '%class'), array("linkcat-" . $r['category'], $r['class']), $r['category_before']);
                $output .= $r['title_before'];
                $output .= $r['title_li'];
                $output .= $r['title_after'];
                $output .= "\n\t<ul class='xoxo blogroll'>\n";
                $output .= _walk_bookmarks($bookmarks, $r);
                $output .= "\n\t</ul>\n";
                $output .= $r['category_after'] . "\n";
            } else {
                $output .= _walk_bookmarks($bookmarks, $r);
            }
        }
    }
    /**
     * Filter the bookmarks list before it is echoed or returned.
     *
     * @since 2.5.0
     *
     * @param string $html The HTML list of bookmarks.
     */
    $html = apply_filters('wp_list_bookmarks', $output);
    if (!$r['echo']) {
        return $html;
    }
    echo $html;
}

WordPress Version: 4.0

/**
 * Retrieve or echo all of the bookmarks.
 *
 * List of default arguments are as follows:
 *
 * These options define how the Category name will appear before the category
 * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will
 * display for only the 'title_li' string and only if 'title_li' is not empty.
 *
 * @since 2.1.0
 *
 * @see _walk_bookmarks()
 *
 * @param string|array $args {
 *     Optional. String or array of arguments to list bookmarks.
 *
 *     @type string   $orderby          How to order the links by. Accepts post fields. Default 'name'.
 *     @type string   $order            Whether to order bookmarks in ascending or descending order.
 *                                      Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'.
 *     @type int      $limit            Amount of bookmarks to display. Accepts 1+ or -1 for all.
 *                                      Default -1.
 *     @type string   $category         Comma-separated list of category ids to include links from.
 *                                      Default empty.
 *     @type string   $category_name    Category to retrieve links for by name. Default empty.
 *     @type int|bool $hide_invisible   Whether to show or hide links marked as 'invisible'. Accepts
 *                                      1|true or 0|false. Default 1|true.
 *     @type int|bool $show_updated     Whether to display the time the bookmark was last updated.
 *                                      Accepts 1|true or 0|false. Default 0|false.
 *     @type int|bool $echo             Whether to echo or return the formatted bookmarks. Accepts
 *                                      1|true (echo) or 0|false (return). Default 1|true.
 *     @type int|bool $categorize       Whether to show links listed by category or in a single column.
 *                                      Accepts 1|true (by category) or 0|false (one column). Default 1|true.
 *     @type int|bool $show_description Whether to show the bookmark descriptions. Accepts 1|true or 0|false.
 *                                      Default 0|false.
 *     @type string   $title_li         What to show before the links appear. Default 'Bookmarks'.
 *     @type string   $title_before     The HTML or text to prepend to the $title_li string. Default '<h2>'.
 *     @type string   $title_after      The HTML or text to append to the $title_li string. Default '</h2>'.
 *     @type string   $class            The CSS class to use for the $title_li. Default 'linkcat'.
 *     @type string   $category_before  The HTML or text to prepend to $title_before if $categorize is true.
 *                                      String must contain '%id' and '%class' to inherit the category ID and
 *                                      the $class argument used for formatting in themes.
 *                                      Default '<li id="%id" class="%class">'.
 *     @type string   $category_after   The HTML or text to append to $title_after if $categorize is true.
 *                                      Default '</li>'.
 *     @type string   $category_orderby How to order the bookmark category based on term scheme if $categorize
 *                                      is true. Default 'name'.
 *     @type string   $category_order   Whether to order categories in ascending or descending order if
 *                                      $categorize is true. Accepts 'ASC' (ascending) or 'DESC' (descending).
 *                                      Default 'ASC'.
 * }
 * @return string|null Will only return if echo option is set to not echo. Default is not return anything.
 */
function wp_list_bookmarks($args = '')
{
    $defaults = array('orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '', 'exclude_category' => '', 'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'echo' => 1, 'categorize' => 1, 'title_li' => __('Bookmarks'), 'title_before' => '<h2>', 'title_after' => '</h2>', 'category_orderby' => 'name', 'category_order' => 'ASC', 'class' => 'linkcat', 'category_before' => '<li id="%id" class="%class">', 'category_after' => '</li>');
    $r = wp_parse_args($args, $defaults);
    $output = '';
    if ($r['categorize']) {
        $cats = get_terms('link_category', array('name__like' => $r['category_name'], 'include' => $r['category'], 'exclude' => $r['exclude_category'], 'orderby' => $r['category_orderby'], 'order' => $r['category_order'], 'hierarchical' => 0));
        if (empty($cats)) {
            $r['categorize'] = false;
        }
    }
    if ($r['categorize']) {
        // Split the bookmarks into ul's for each category
        foreach ((array) $cats as $cat) {
            $params = array_merge($r, array('category' => $cat->term_id));
            $bookmarks = get_bookmarks($params);
            if (empty($bookmarks)) {
                continue;
            }
            $output .= str_replace(array('%id', '%class'), array("linkcat-{$cat->term_id}", $r['class']), $r['category_before']);
            /**
             * Filter the bookmarks category name.
             *
             * @since 2.2.0
             *
             * @param string $cat_name The category name of bookmarks.
             */
            $catname = apply_filters('link_category', $cat->name);
            $output .= $r['title_before'];
            $output .= $catname;
            $output .= $r['title_after'];
            $output .= "\n\t<ul class='xoxo blogroll'>\n";
            $output .= _walk_bookmarks($bookmarks, $r);
            $output .= "\n\t</ul>\n";
            $output .= $r['category_after'] . "\n";
        }
    } else {
        //output one single list using title_li for the title
        $bookmarks = get_bookmarks($r);
        if (!empty($bookmarks)) {
            if (!empty($r['title_li'])) {
                $output .= str_replace(array('%id', '%class'), array("linkcat-" . $r['category'], $r['class']), $r['category_before']);
                $output .= $r['title_before'];
                $output .= $r['title_li'];
                $output .= $r['title_after'];
                $output .= "\n\t<ul class='xoxo blogroll'>\n";
                $output .= _walk_bookmarks($bookmarks, $r);
                $output .= "\n\t</ul>\n";
                $output .= $r['category_after'] . "\n";
            } else {
                $output .= _walk_bookmarks($bookmarks, $r);
            }
        }
    }
    /**
     * Filter the bookmarks list before it is echoed or returned.
     *
     * @since 2.5.0
     *
     * @param string $html The HTML list of bookmarks.
     */
    $html = apply_filters('wp_list_bookmarks', $output);
    if (!$r['echo']) {
        return $html;
    }
    echo $html;
}

WordPress Version: 3.9

/**
 * Retrieve or echo all of the bookmarks.
 *
 * List of default arguments are as follows:
 * 'orderby' - Default is 'name' (string). How to order the links by. String is
 *		based off of the bookmark scheme.
 * 'order' - Default is 'ASC' (string). Either 'ASC' or 'DESC'. Orders in either
 *		ascending or descending order.
 * 'limit' - Default is -1 (integer) or show all. The amount of bookmarks to
 *		display.
 * 'category' - Default is empty string (string). Include the links in what
 *		category ID(s).
 * 'category_name' - Default is empty string (string). Get links by category
 *		name.
 * 'hide_invisible' - Default is 1 (integer). Whether to show (default) or hide
 *		links marked as 'invisible'.
 * 'show_updated' - Default is 0 (integer). Will show the time of when the
 *		bookmark was last updated.
 * 'echo' - Default is 1 (integer). Whether to echo (default) or return the
 *		formatted bookmarks.
 * 'categorize' - Default is 1 (integer). Whether to show links listed by
 *		category (default) or show links in one column.
 * 'show_description' - Default is 0 (integer). Whether to show the description
 *		of the bookmark.
 *
 * These options define how the Category name will appear before the category
 * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will
 * display for only the 'title_li' string and only if 'title_li' is not empty.
 * 'title_li' - Default is 'Bookmarks' (translatable string). What to show
 *		before the links appear.
 * 'title_before' - Default is '<h2>' (string). The HTML or text to show before
 *		the 'title_li' string.
 * 'title_after' - Default is '</h2>' (string). The HTML or text to show after
 *		the 'title_li' string.
 * 'class' - Default is 'linkcat' (string). The CSS class to use for the
 *		'title_li'.
 *
 * 'category_before' - Default is '<li id="%id" class="%class">'. String must
 *		contain '%id' and '%class' to get
 * the id of the category and the 'class' argument. These are used for
 *		formatting in themes.
 * Argument will be displayed before the 'title_before' argument.
 * 'category_after' - Default is '</li>' (string). The HTML or text that will
 *		appear after the list of links.
 *
 * These are only used if 'categorize' is set to 1 or true.
 * 'category_orderby' - Default is 'name'. How to order the bookmark category
 *		based on term scheme.
 * 'category_order' - Default is 'ASC'. Set the order by either ASC (ascending)
 *		or DESC (descending).
 *
 * @see _walk_bookmarks() For other arguments that can be set in this function
 *		and passed to _walk_bookmarks().
 * @see get_bookmarks() For other arguments that can be set in this function and
 *		passed to get_bookmarks().
 * @link http://codex.wordpress.org/Template_Tags/wp_list_bookmarks
 *
 * @since 2.1.0
 * @uses _walk_bookmarks() Used to iterate over all of the bookmarks and return
 *		the html
 * @uses get_terms() Gets all of the categories that are for links.
 *
 * @param string|array $args Optional. Overwrite the defaults of the function
 * @return string|null Will only return if echo option is set to not echo.
 *		Default is not return anything.
 */
function wp_list_bookmarks($args = '')
{
    $defaults = array('orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '', 'exclude_category' => '', 'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'echo' => 1, 'categorize' => 1, 'title_li' => __('Bookmarks'), 'title_before' => '<h2>', 'title_after' => '</h2>', 'category_orderby' => 'name', 'category_order' => 'ASC', 'class' => 'linkcat', 'category_before' => '<li id="%id" class="%class">', 'category_after' => '</li>');
    $r = wp_parse_args($args, $defaults);
    extract($r, EXTR_SKIP);
    $output = '';
    if ($categorize) {
        $cats = get_terms('link_category', array('name__like' => $category_name, 'include' => $category, 'exclude' => $exclude_category, 'orderby' => $category_orderby, 'order' => $category_order, 'hierarchical' => 0));
        if (empty($cats)) {
            $categorize = false;
        }
    }
    if ($categorize) {
        // Split the bookmarks into ul's for each category
        foreach ((array) $cats as $cat) {
            $params = array_merge($r, array('category' => $cat->term_id));
            $bookmarks = get_bookmarks($params);
            if (empty($bookmarks)) {
                continue;
            }
            $output .= str_replace(array('%id', '%class'), array("linkcat-{$cat->term_id}", $class), $category_before);
            /**
             * Filter the bookmarks category name.
             *
             * @since 2.2.0
             *
             * @param string $cat_name The category name of bookmarks.
             */
            $catname = apply_filters('link_category', $cat->name);
            $output .= "{$title_before}{$catname}{$title_after}\n\t<ul class='xoxo blogroll'>\n";
            $output .= _walk_bookmarks($bookmarks, $r);
            $output .= "\n\t</ul>\n{$category_after}\n";
        }
    } else {
        //output one single list using title_li for the title
        $bookmarks = get_bookmarks($r);
        if (!empty($bookmarks)) {
            if (!empty($title_li)) {
                $output .= str_replace(array('%id', '%class'), array("linkcat-{$category}", $class), $category_before);
                $output .= "{$title_before}{$title_li}{$title_after}\n\t<ul class='xoxo blogroll'>\n";
                $output .= _walk_bookmarks($bookmarks, $r);
                $output .= "\n\t</ul>\n{$category_after}\n";
            } else {
                $output .= _walk_bookmarks($bookmarks, $r);
            }
        }
    }
    /**
     * Filter the bookmarks list before it is echoed or returned.
     *
     * @since 2.5.0
     *
     * @param string $output The HTML list of bookmarks.
     */
    $output = apply_filters('wp_list_bookmarks', $output);
    if (!$echo) {
        return $output;
    }
    echo $output;
}

WordPress Version: 3.7

/**
 * Retrieve or echo all of the bookmarks.
 *
 * List of default arguments are as follows:
 * 'orderby' - Default is 'name' (string). How to order the links by. String is
 *		based off of the bookmark scheme.
 * 'order' - Default is 'ASC' (string). Either 'ASC' or 'DESC'. Orders in either
 *		ascending or descending order.
 * 'limit' - Default is -1 (integer) or show all. The amount of bookmarks to
 *		display.
 * 'category' - Default is empty string (string). Include the links in what
 *		category ID(s).
 * 'category_name' - Default is empty string (string). Get links by category
 *		name.
 * 'hide_invisible' - Default is 1 (integer). Whether to show (default) or hide
 *		links marked as 'invisible'.
 * 'show_updated' - Default is 0 (integer). Will show the time of when the
 *		bookmark was last updated.
 * 'echo' - Default is 1 (integer). Whether to echo (default) or return the
 *		formatted bookmarks.
 * 'categorize' - Default is 1 (integer). Whether to show links listed by
 *		category (default) or show links in one column.
 * 'show_description' - Default is 0 (integer). Whether to show the description
 *		of the bookmark.
 *
 * These options define how the Category name will appear before the category
 * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will
 * display for only the 'title_li' string and only if 'title_li' is not empty.
 * 'title_li' - Default is 'Bookmarks' (translatable string). What to show
 *		before the links appear.
 * 'title_before' - Default is '<h2>' (string). The HTML or text to show before
 *		the 'title_li' string.
 * 'title_after' - Default is '</h2>' (string). The HTML or text to show after
 *		the 'title_li' string.
 * 'class' - Default is 'linkcat' (string). The CSS class to use for the
 *		'title_li'.
 *
 * 'category_before' - Default is '<li id="%id" class="%class">'. String must
 *		contain '%id' and '%class' to get
 * the id of the category and the 'class' argument. These are used for
 *		formatting in themes.
 * Argument will be displayed before the 'title_before' argument.
 * 'category_after' - Default is '</li>' (string). The HTML or text that will
 *		appear after the list of links.
 *
 * These are only used if 'categorize' is set to 1 or true.
 * 'category_orderby' - Default is 'name'. How to order the bookmark category
 *		based on term scheme.
 * 'category_order' - Default is 'ASC'. Set the order by either ASC (ascending)
 *		or DESC (descending).
 *
 * @see _walk_bookmarks() For other arguments that can be set in this function
 *		and passed to _walk_bookmarks().
 * @see get_bookmarks() For other arguments that can be set in this function and
 *		passed to get_bookmarks().
 * @link http://codex.wordpress.org/Template_Tags/wp_list_bookmarks
 *
 * @since 2.1.0
 * @uses _walk_bookmarks() Used to iterate over all of the bookmarks and return
 *		the html
 * @uses get_terms() Gets all of the categories that are for links.
 *
 * @param string|array $args Optional. Overwrite the defaults of the function
 * @return string|null Will only return if echo option is set to not echo.
 *		Default is not return anything.
 */
function wp_list_bookmarks($args = '')
{
    $defaults = array('orderby' => 'name', 'order' => 'ASC', 'limit' => -1, 'category' => '', 'exclude_category' => '', 'category_name' => '', 'hide_invisible' => 1, 'show_updated' => 0, 'echo' => 1, 'categorize' => 1, 'title_li' => __('Bookmarks'), 'title_before' => '<h2>', 'title_after' => '</h2>', 'category_orderby' => 'name', 'category_order' => 'ASC', 'class' => 'linkcat', 'category_before' => '<li id="%id" class="%class">', 'category_after' => '</li>');
    $r = wp_parse_args($args, $defaults);
    extract($r, EXTR_SKIP);
    $output = '';
    if ($categorize) {
        $cats = get_terms('link_category', array('name__like' => $category_name, 'include' => $category, 'exclude' => $exclude_category, 'orderby' => $category_orderby, 'order' => $category_order, 'hierarchical' => 0));
        if (empty($cats)) {
            $categorize = false;
        }
    }
    if ($categorize) {
        // Split the bookmarks into ul's for each category
        foreach ((array) $cats as $cat) {
            $params = array_merge($r, array('category' => $cat->term_id));
            $bookmarks = get_bookmarks($params);
            if (empty($bookmarks)) {
                continue;
            }
            $output .= str_replace(array('%id', '%class'), array("linkcat-{$cat->term_id}", $class), $category_before);
            /**
             * Filter the bookmarks category name.
             *
             * @since 2.2.0
             *
             * @param string $cat->name The category name of bookmarks.
             */
            $catname = apply_filters('link_category', $cat->name);
            $output .= "{$title_before}{$catname}{$title_after}\n\t<ul class='xoxo blogroll'>\n";
            $output .= _walk_bookmarks($bookmarks, $r);
            $output .= "\n\t</ul>\n{$category_after}\n";
        }
    } else {
        //output one single list using title_li for the title
        $bookmarks = get_bookmarks($r);
        if (!empty($bookmarks)) {
            if (!empty($title_li)) {
                $output .= str_replace(array('%id', '%class'), array("linkcat-{$category}", $class), $category_before);
                $output .= "{$title_before}{$title_li}{$title_after}\n\t<ul class='xoxo blogroll'>\n";
                $output .= _walk_bookmarks($bookmarks, $r);
                $output .= "\n\t</ul>\n{$category_after}\n";
            } else {
                $output .= _walk_bookmarks($bookmarks, $r);
            }
        }
    }
    /**
     * Filter the bookmarks list before it is echoed or returned.
     *
     * @since 2.5.0
     *
     * @param string $output The HTML list of bookmarks.
     */
    $output = apply_filters('wp_list_bookmarks', $output);
    if (!$echo) {
        return $output;
    }
    echo $output;
}