⏲️ Estimated reading time: 7 min
Learn what a blogroll is, why it still matters for UX and SEO, and how to add one to WordPress without plugins. Use a custom menu, enable the legacy Links Manager, or roll your own shortcode clean, fast, and fully controllable.
How to Add a Blogroll in Your WordPress Site (Without a Plugin)
A classic of early blogging, the blogroll is simply a curated list of links to blogs or resources you recommend. Although it fell out of fashion for a few years, it’s making a comeback thanks to the indie‑web, newsletters, and creators who want to share the love and send readers to trusted sources. The good news: you don’t need a plugin to add one. Below you’ll learn exactly what a blogroll is, why it helps, and several plug‑in‑free ways to implement it ranging from zero‑code to lightweight theme snippets.
What Is a Blogroll?
A blogroll is a public list of outbound links usually other blogs, creators, or tools curated by you. It often appears in a sidebar, footer, or on a dedicated page. At minimum it includes the site name and URL; more polished versions add a short description, favicon, or category.
Typical placements:
- Sidebar widget on posts
- Footer column site‑wide
- A standalone “Friends / Resources” page

Why Add a Blogroll in WordPress?
1) Reader Value & Community
A blogroll signals your niche and introduces readers to related voices. It builds goodwill and can start mutually beneficial relationships.
2) UX & Discovery
It’s a human‑curated discovery surface. Readers get a vetted path to “what to read next,” which boosts time on site and return visits.
3) Light SEO Benefits (Used Carefully)
Outbound links to authoritative, relevant sites help search engines understand your content’s neighborhood. Keep it relevant, non‑spammy, and avoid massive link dumps. Quality > quantity.
4) Zero‑Maintenance Option
If you implement it with menus or a shortcode, you can update links without touching templates again.
Approaches (No Plugin Required)
- Use a Custom Menu as a Blogroll (fastest, theme‑agnostic)
- Re‑enable the legacy Links Manager (native, simple lists)
- Create a tiny shortcode in
functions.php
(ultimate control, still simple)
You can use any single method or mix them for example, use a menu for your sidebar and a shortcode for a dedicated page.
Method 1: Use a Custom Menu as Your Blogroll (Recommended)
This method uses WordPress’ built‑in Menus plus a small shortcode so you can drop the blogroll anywhere (page, post, widget, or template).
Step A – Create the Menu
- Go to Appearance → Menus (or Appearance → Editor → Navigation in block themes).
- Create a new menu named Blogroll.
- Add Custom Links for each site (URL + Link Text). Save.
Step B – Add the Shortcode to functions.php
Place this code in your child theme’s functions.php
or a site‑specific snippet (no plugin builder needed if you’re comfy editing the theme):
// Shortcode: [blogroll menu="Blogroll"]
function hz_blogroll_menu_shortcode( $atts ) {
$atts = shortcode_atts( array(
'menu' => 'Blogroll', // menu name or ID
'class' => 'hz-blogroll',
'depth' => 1,
), $atts, 'blogroll' );
$menu = wp_get_nav_menu_object( $atts['menu'] );
if ( ! $menu ) return '';
$items = wp_get_nav_menu_items( $menu->term_id );
if ( ! $items ) return '';
$output = '<ul class="'. esc_attr( $atts['class'] ) .'">';
foreach ( $items as $item ) {
$title = esc_html( $item->title );
$url = esc_url( $item->url );
$desc = isset( $item->description ) ? trim( $item->description ) : '';
$output .= '<li><a href="'. $url .'" rel="nofollow noopener" target="_blank">'. $title .'</a>';
if ( $desc !== '' ) {
$output .= '<small class="hz-desc"> - '. esc_html( $desc ) .'</small>';
}
$output .= '</li>';
}
$output .= '</ul>';
return $output;
}
add_shortcode( 'blogroll', 'hz_blogroll_menu_shortcode' );
Step C – Display It Anywhere
- In a page or post: add a Shortcode block and paste
[blogroll]
. - In a template (PHP):
echo do_shortcode('[blogroll]');
- In a widget area: use a Shortcode or Custom HTML block.
Optional CSS (drop into Appearance → Customize → Additional CSS)
.hz-blogroll { list-style: none; margin: 0; padding: 0; }
.hz-blogroll li { margin: 0 0 .5rem; }
.hz-blogroll a { text-decoration: none; }
.hz-blogroll a:hover { text-decoration: underline; }
.hz-blogroll .hz-desc { color: #666; margin-left: .25rem; }
Pros: dead simple edits via Menus, no database changes, works with any theme.
Cons: per‑link descriptions rely on menu item “Description” (sometimes hidden in Screen Options / Advanced for classic WP).
Method 2: Use WordPress’ Legacy Links Manager (Still Built‑In)
WordPress still ships the Links Manager code just disabled by default. You can re‑enable it with one line and then manage links at Links → Add New.
Enable Links Manager
Add this to functions.php
:
// Turn on the classic Links Manager (for wp_list_bookmarks).
add_filter( 'pre_option_link_manager_enabled', '__return_true' );
Add Links
- Go to Links → Add New, fill Name, Web Address, and Description.
- Organize links with Link Categories.
Display the Blogroll
Use this template tag where you want the list:
// In a PHP template
wp_list_bookmarks( array(
'title_before' => '<h2>',
'title_after' => '</h2>',
'category' => '', // or a category ID/name
'categorize' => false, // set true to group by category
'show_description' => true,
'orderby' => 'name',
'order' => 'ASC',
) );
Or use the Links widget (classic themes) / block (if available).
Pros: native UI for descriptions, categories, XFN.
Cons: older UI, not block‑first; some themes hide links widgets by default.
Method 3: A Lightweight Custom Shortcode (Array‑Driven)
Prefer a hard‑coded, super‑light approach (no menus, no legacy manager)? Define your links in code and render a list via shortcode.
// Shortcode: [blogroll_simple]
function hz_blogroll_simple_shortcode() {
$links = array(
array( 'name' => 'HelpZone Blog', 'url' => 'https://helpzone.blog', 'desc' => 'WordPress tips & tutorials' ),
array( 'name' => 'Make WordPress', 'url' => 'https://make.wordpress.org', 'desc' => 'Core and community' ),
array( 'name' => 'WordPress.org', 'url' => 'https://wordpress.org', 'desc' => 'Plugins, themes, docs' ),
);
$out = '<ul class="hz-blogroll">';
foreach ( $links as $l ) {
$out .= '<li><a href="'. esc_url( $l['url'] ) .'" target="_blank" rel="nofollow noopener">'
. esc_html( $l['name'] ) . '</a>';
if ( ! empty( $l['desc'] ) ) {
$out .= '<small class="hz-desc">- '. esc_html( $l['desc'] ) .'</small>';
}
$out .= '</li>';
}
$out .= '</ul>';
return $out;
}
add_shortcode( 'blogroll_simple', 'hz_blogroll_simple_shortcode' );
Use [blogroll_simple]
anywhere.
Pros: zero UI overhead, fastest render.
Cons: editing requires changing code.
Bonus: Register a Sidebar Widget Area for the Blogroll
If your theme doesn’t have a convenient spot, register one:
function hz_register_blogroll_sidebar() {
register_sidebar( array(
'name' => 'Blogroll Sidebar',
'id' => 'hz-blogroll-sidebar',
'before_widget' => '<section class="widget %2$s">',
'after_widget' => '</section>',
'before_title' => '<h2 class="widget-title">',
'after_title' => '</h2>',
) );
}
add_action( 'widgets_init', 'hz_register_blogroll_sidebar' );
Then add a Shortcode block with [blogroll]
or [blogroll_simple]
to that widget area.
Best Practices (SEO, UX, and Maintenance)
- Keep it focused: 8–20 links is a sweet spot. Too many looks spammy.
- Use descriptions: 6–12 words clarifying why a link matters.
- Open in new tab + rel attributes:
target="_blank"
withrel="noopener nofollow"
is standard for external links. - Check for rot: audit quarterly; remove dead sites.
- Order matters: alphabetically or by relevance; avoid random ordering.
- Design lightly: small text, compact spacing; don’t overshadow your main CTAs.
- Measure clicks: if you must, wrap with an internal redirect (e.g.,
/go/…
) or track with analytics do it sparingly.
Conclusion
A blogroll is a small feature with big community impact. Whether you pick a Menu‑based approach for convenience, Links Manager for a classic workflow, or a code‑first shortcode for total control, you can add a clean, fast, plugin‑free blogroll in minutes and update it in seconds. Start with the menu method, ship it in your sidebar or footer, and iterate later with descriptions, categories, and a dedicated “Friends” page.
🔔 For more tutorials like this, consider subscribing to our blog.
📩 Do you have questions or suggestions? Leave a comment or contact us!
🏷️ Tags: WordPress, Blogroll, Links Manager, functions.php, Shortcode, WordPress Menus, Theme Development, SEO, UX, Tutorials
📢 Hashtags: #WordPress, #Blogroll, #NoPlugin, #Shortcode, #ThemeDev, #WPMenus, #SEOTips, #UXDesign, #WebDev, #Tutorials
Only logged-in users can submit reports.
Discover more from HelpZone
Subscribe to get the latest posts sent to your email.