BLACK FRIDAY
Save 59% on PageForge Annual $191/year $485/year
Claim 59% Off →
Loop Post Navigation Links icon
Possibly abandoned Tested up to 5.5.22 #42 in links

Loop Post Navigation Links

This plugin provides two template tags for use in single.php to create a post navigation loop, whereby previous to the first post is the last post, and after the last post is first post. Basically, when you’re on the…

Active installs500+100+ tier
Downloads · 30d149▲ +52% vs prev. 30d
Rating5/512 reviews
Health score39/100At risk
All-time downloads23KSince Jul 2009
Support resolved—No recent threads
RequiresWP 4.9PHP any
Downloads · 7d47▲ +27% week over week
Our verdict

Consider an alternative

Loop Post Navigation Links shows warning signs in 2026 — compare the alternatives below before installing. It runs on 500+ sites, is rated 5/5 and was last updated 6 years ago, and scores 39/100 on our health check.

  • Small user base (500+ active installs)
  • No update in 6 years
  • Only tested up to WordPress 5.5 (latest is 7.1)

How does it stack up?

Side-by-side on installs, updates, ratings & support

Daily downloads

3710Jul 8Aug 21Oct 5
Yesterday7
Daily average (1y)3
Peak day14Sep 28, 2026
Last 12 months934

Download spikes usually follow a new release — each site that auto-updates counts as a download.

Rankings

Where Loop Post Navigation Links stands today

WordPress.org search rankings

Live position in the plugin search, top 100
KeywordPositionCompeting pluginsCategory
links >100 10,000 Best links plugins →
navigation >100 6,124 Best navigation plugins →
next >100 9,515 Best next plugins →
posts >100 10,000 Best posts plugins →
previous >100 5,534 Best previous plugins →

Version adoption

Share of active sites per release.

  • 3.088.9%
  • 2.611.1%

Rating breakdown

★★★★★★★★★★ 5 from 12 reviews

  • 5★100.0%
  • 4★0.00%
  • 3★0.00%
  • 2★0.00%
  • 1★0.00%

About Loop Post Navigation Links

From the official readme · v3.0.2

Description

This plugin provides two template tags for use in single.php to create a post navigation loop, whereby previous to the first post is the last post, and after the last post is first post. Basically, when you’re on the last post and you click to go to the next post, the link takes you to the first post. Likewise, if you’re on the first post and click to go to the previous post, the link takes you to the last post.

The function c2c_next_or_loop_post_link() is identical to WordPress’s next_post_link() in every way except when called on the last post in the navigation sequence, in which case it links back to the first post in the navigation sequence.

The function c2c_previous_or_loop_post_link() is identical to WordPress’s previous_post_link() in every way except when called on the first post in the navigation sequence, in which case it links back to the last post in the navigation sequence.

Useful for providing a looping link of posts, such as for a portfolio, or to continually present pertinent posts for visitors to continue reading.

If you are interested in getting the post itself and not just a link to the post, you can use the c2c_get_next_or_loop_post() and c2c_get_previous_or_loop_post() functions. If you just want the URL to the post, you can use c2c_get_next_or_loop_post_url() and c2c_get_previous_or_loop_post_url().

Links: Plugin Homepage | Plugin Directory Page | GitHub | Author Homepage

Template Tags

The plugin provides four template tags for use in your single-post theme templates.

Functions

  • function c2c_next_or_loop_post_link( $format='%link »', $link='%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' )
    Like WordPress’s next_post_link(), this function displays a link to the next chronological post (among all published posts, those in the same category, or those not in certain categories). Unlink next_post_link(), when on the last post in the sequence this function will link back to the first post in the sequence, creating a circular loop.

  • function c2c_get_next_or_loop_post_link( $format='%link »', $link='%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' )
    Like `c2c_next_or_loop_post_link(), but returns the value without echoing it.

  • function c2c_previous_or_loop_post_link( $format='« %link', $link='%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' )
    Like WordPress’s previous_post_link(), this function displays a link to the previous chronological post (among all published posts, those in the same category, or those not in certain categories). Unlink previous_post_link(), when on the first post in the sequence this function will link to the last post in the sequence, creating a circular loop.

  • function c2c_get_previous_or_loop_post_link( $format='« %link', $link='%title', $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' )
    Like `c2c_get_previous_or_loop_post_link(), but returns the value without echoing it.

  • function c2c_get_next_or_loop_post( $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' )
    Like WordPress’s get_adjacent_post() when used to find the next post, except when on the last post in the sequence this function will return the first post in the sequence, creating a circular loop.

  • function c2c_get_previous_or_loop_post( $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' )
    Like WordPress’s get_adjacent_post() when used to find the previous post, except when on the first post in the sequence this function will return the last post in the sequence, creating a circular loop.

  • function c2c_get_next_or_loop_post_url( $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' )
    Returns the URL for the next post or the post at the beginning of the series.

  • function c2c_get_previous_or_loop_post_url( $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' )
    Returns the URL for the previous post or the post at the end of the series.

Arguments

  • $format
    (optional) A percent-substitution string indicating the format of the entire output string. Use %link to represent the next/previous post being linked, or %title to represent the title of the next/previous post.

  • $link
    (optional) A percent-substitution string indicating the format of the link itself that gets created for the next/previous post. Use %link to represent the next/previous post being linked, or %title to represent the title of the next/previous post.

  • $in_same_term
    (optional) A boolean value (either true or false) indicating if the next/previous post should be in the current post’s same taxonomy term.

  • $excluded_terms
    (optional) An array or comma-separated string of category or term IDs to which posts cannot belong.

  • $taxonomy
    (optional) Taxonomy, if $in_same_term is true. Default ‘category’.

Examples

<div class="loop-navigation">
    <div class="alignleft"><?php c2c_previous_or_loop_post_link(); ?></div>
    <div class="alignright"><?php c2c_next_or_loop_post_link(); ?></div>
</div><h3>Hooks</h3>

The plugin is further customizable via eleven hooks. Typically, code making use of hooks should ideally be put into a mu-plugin, a site-specific plugin (which is beyond the scope of this readme to explain), or in theme template files. Many of these filters are likely only of interest to advanced users able to code.

c2c_previous_or_loop_post_link_output, c2c_next_or_loop_post_link_output (filters)

The ‘c2c_previous_or_loop_post_link_output’ and ‘c2c_next_or_loop_post_link_output’ filters allow you to customize the link markup generated for previous and next looping links, respectively.

Arguments:

  • $format (string): Link anchor format.
  • $link (string): Link permalink format.
  • $in_same_term (bool): Optional. Whether link should be in a same taxonomy term. Default is false.
  • $excluded_terms (array|string): Optional. Array or comma-separated list of excluded term IDs. Default is ”.
  • $previous (bool): Optional. Whether to display link to previous or next post. Default is true.
  • $taxonomy (string): Optional. Taxonomy, if $in_same_term is true. Default ‘category’.
  • $adjacent (string): Whether the post is previous or next.

Example:

  <?php
      // Prepend "Prev:" to previous link markup.
      function my_custom_previous_or_loop_link_output( $output, $format, $link, $post, $in_same_term, $excluded_terms, $taxonomy ) {
        return 'Prev: ' . $output;
      }
      add_filter( 'c2c_previous_or_loop_post_link_output', 'my_custom_previous_or_loop_link_output', 10, 4 );
    ?>

c2c_previous_or_loop_post_link_get, c2c_next_or_loop_post_link_get (filters)

The ‘c2c_previous_or_loop_post_link_get’ and ‘c2c_next_or_loop_post_link_get’ filters allow you to customize the link markups generated for previous and next looping links, respectively, but in the non-echoing functions.

Arguments:

  • $output (string): The adjacent post link.
  • $format (string): Link anchor format.
  • $link (string): Link permalink format.
  • $post (WP_Post): The adjacent post.
  • $in_same_term (bool): Optional. Whether link should be in a same taxonomy term. Default is false.
  • $excluded_terms (array|string): Optional. Array or comma-separated list of excluded term IDs. Default is ”.
  • $previous (bool): Optional. Whether to display link to previous or next post. Default is true.
  • $taxonomy (string): Optional. Taxonomy, if $in_same_term is true. Default ‘category’.
  • $adjacent (string): Whether the post is previous or next.

c2c_previous_or_loop_post_link, c2c_next_or_loop_post_link, c2c_get_previous_or_loop_post_link, c2c_get_next_or_loop_post_link, c2c_get_adjacent_or_loop_post, c2c_get_previous_or_loop_post, c2c_get_previous_or_loop_post (actions)

The ‘c2c_previous_or_loop_post_link’ and ‘c2c_next_or_loop_post_link’ actions allow you to use an alternative approach to safely invoke c2c_previous_or_loop_post_link() and c2c_next_or_loop_post_link(), respectively, in such a way that if the plugin were deactivated or deleted, then your calls to the functions won’t cause errors in your site. The ‘c2c_get_previous_or_loop_post_link’ and ‘c2c_get_next_or_loop_post_link’ filters do the same for the non-echoing c2c_previous_or_loop_post_link() and c2c_next_or_loop_post_link().

Arguments:

  • Same as for for c2c_previous_or_loop_post_link() and c2c_next_or_loop_post_link()

Example:

Instead of:

<?php c2c_previous_or_loop_post_link( '<span class="prev-or-loop-link">&laquo; %link</span>' ); ?>

Do:

<?php do_action( 'c2c_previous_or_loop_post_link', '<span class="prev-or-loop-link">&laquo; %link</span>' ); ?>

Installation

  1. Install via the built-in WordPress plugin installer. Or install the plugin code inside the plugins directory for your site (typically wp-content/plugins/).
  2. Activate the plugin through the ‘Plugins’ admin menu in WordPress.
  3. Use c2c_next_or_loop_post_link() template tag instead of next_post_link(), and/or c2c_previous_or_loop_post_link() template tag instead of previous_post_link(), in your single-post template (e.g. single.php).

Changelog

Trivial update:minor tweaks that should go unnoticed, restructured unit test file structure, added a TODO.md file, and noted compatibility through WP 5.5+.

3.0.2 (2020-08-26)

Highlights:

This minor update has some minor tweaks that should go unnoticed, restructures unit test file structure, adds a TODO.md file, and notes compatibility through WP 5.5+.

Details:

  • Change: Unset loop flag in class just after it’s used to ensure it gets reset
  • Change: Escape URL for post before being output in link (hardening)
  • Change: Restructure unit test file structure
    • New: Create new subdirectory phpunit/ to house all files related to unit testing
    • Change: Move bin/ to phpunit/bin/
    • Change: Move tests/bootstrap.php to phpunit/
    • Change: Move tests/ to phpunit/tests/
    • Change: Rename phpunit.xml to phpunit.xml.dist per best practices
  • Change: Note compatibility through WP 5.5+
  • Unit tests:
    • New: Add test for hook registrations
    • New: Add tests for modify_nextprevious_post_where()

3.0.1 (2020-05-10)

  • Change: Use HTTPS for link to WP SVN repository in bin script for configuring unit tests
  • Change: Note compatibility through WP 5.4+
  • Change: Update links to coffee2code.com to be HTTPS

3.0 (2020-01-28)

Highlights:

  • Significant update after a long hiatus! Adds functions for getting the URL of the previous/next post, modernizes unit tests, adds CHANGELOG.md, adds plugin to GitHub, changes plugin initialization, updates compatibility to be for WP 4.9-5.3+, and many other documentation and behind-the-scenes changes.
  • Note that there is an incompatible fix for missing and incorrect arguments for the c2c_{$adjacent}_or_loop_post_link_output filter. This change won’t affect you unless you have custom code making use of the filter, which is unlikely for almost all users.

Details:

  • New: Add c2c_get_next_or_loop_post_url() and c2c_get_previous_or_loop_post_url() to get URL of adjacent/looped post
  • New: Add CHANGELOG.md file and move all but most recent changelog entries into it
  • New: Add README.md file
  • New: Add TODO.md and move existing TODO list from top of main plugin file into it (and add more items to the list)
  • New: Add inline documentation for hooks
  • New: Add GitHub link to readme.txt
  • Fix: Add missing argument $previous and remove argument $post from c2c_{$adjacent}_or_loop_post_link_output hook invocation
  • Change: Add $adjacent argument to a number of filters, to sync with WP core
    • Adds to {$adjacent}_post_link, {$adjacent}_or_loop_post_link, c2c_{$adjacent}_or_loop_post_link_get, and c2c_{$adjacent}_or_loop_post_link_output
  • Change: Use c2c_get_adjacent_or_loop_post() to obtain post, rather than duplicating its functionality in c2c_get_adjacent_or_loop_post_link()
  • Change: Remove unnecessary (and incorrect) determination of adjacent post in c2c_adjacent_or_loop_post_link()
  • Change: Use a different variable name to avoid changing variable sent as function argument and later passed as argument to filter
  • Change: Initialize plugin on ‘plugins_loaded’ action instead of on load
  • Change: Use apply_filters_deprecated() to formally deprecate the {$adjacent}_or_loop_post_link filter
  • Change: Update code formatting to match modern WordPress standards
  • Change: Remove load_textdomain() and just load the textdomain within init()
  • Unit tests:
    • Change: Change expected() to optionally not include arrow quotes
    • Change: Update unit test install script and bootstrap to use latest WP unit test repo
    • Change: Enable more error output for unit tests
    • Change: Comment out unit tests that weren’t actually testing anything
    • Fix: Don’t declare $posts as being static since it’s never referenced as if it was
    • New: Add tests for hooks
  • Change: Note compatibility through WP 5.3+
  • Change: Drop compatibility with versions of WP older than 4.9
  • Change: Include documentation on filter arguments
  • Change: Tweak formatting for installation instructions
  • Change: Remove documentation for non-existent parameters of modify_nextprevious_post_where()
  • Change: Remove unnecessary echo in code example
  • Change: Modify formatting of hook name in readme to prevent being uppercased when shown in the Plugin Directory
  • Change: Rename readme.txt section from ‘Filters’ to ‘Hooks’ and provide a better section intro
  • Change: Update License URI to be HTTPS
  • Change: Update copyright date (2020)
  • Change: Update installation instruction to prefer built-in installer over .zip file

Full changelog is available in CHANGELOG.md.

Full changelog on WordPress.org →

For developers

Is this your plugin? Show off the numbers.

Add a live badge to your site, docs or GitHub README. It updates on its own — no account needed.

Active installs badge Rating badge Health score badge

Best Loop Post Navigation Links alternatives

All links plugins →
Alternatives
Rank Plugin Active installs Rating Updated Health
1 Broken Link Checker Broken Link Checker Broken Link Checker helps you catch broken links & images fast, before they hurt your SEO… by WPMU DEV 500K+ ★★★★★★★★★★ 3.8 (604) 1 month ago 86
2 LuckyWP Table of Contents LuckyWP Table of Contents Creates SEO-friendly table of contents for your posts/pages. Works automatically or… by LuckyWP 100K+ ★★★★★★★★★★ 4.9 (884) 1 year ago 41
3 Export All URLs Export All URLs Export post, page and custom post type data to CSV or JSON, and snapshot your site to… by Atlas Gondal 50K+ ★★★★★★★★★★ 4.6 (94) 3 months ago 78
4 AutoConvert Greeklish Permalinks AutoConvert Greeklish Permalinks Convert Greek characters to Latin on all your site's permalinks instantly. by Dimitris Mavroudis 30K+ ★★★★★★★★★★ 4.9 (26) 8 months ago 63
5 Gallery Custom Links Gallery Custom Links Gallery Custom Links allows you to link images to a specified URL. Tested with WordPress… by Jordy Meow 30K+ ★★★★★★★★★★ 4.7 (206) 2 months ago 90
6 Link Whisper Free Link Whisper Free The AI-powered internal linking plugin for WordPress. Build internal links faster, find… by Spencer Haws 30K+ ★★★★★★★★★★ 4.1 (147) 2 months ago 67
7 External Links in New Window / New Tab External Links in New Window / New Tab Open external links in a new window or new tab. SEO optimized and XHTML Strict compliant. by WebFactory 30K+ ★★★★★★★★★★ 4.5 (77) 2 months ago 85
8 Link Manager Link Manager Enables the Link Manager that existed in WordPress until version 3.5. by Andrew Nacin 20K+ ★★★★★★★★★★ 4.5 (33) 9 years ago 45
9 Disable Author Archives Disable Author Archives Disable Author Archives completely removes author archives and makes the web server return… by freemp 10K+ ★★★★★★★★★★ 4.4 (7) 2 months ago 79
10 Title and Nofollow For Links (Classic Editor) Title and Nofollow For Links (Classic Editor) The plugin adds a title and a rel="nofollow" checkbox to the insert link popup box. Only… by WPKube 10K+ ★★★★★★★★★★ 4.5 (23) 2 months ago 68

FAQ

Loop Post Navigation Links: quick answers

Straight answers, pulled from live WordPress.org data.

Live data from WordPress.org · checked Oct 6, 2026

Is Loop Post Navigation Links free?

Yes. Loop Post Navigation Links is free to download and use from the official WordPress.org plugin directory.

Is Loop Post Navigation Links safe to use in 2026?

Loop Post Navigation Links shows warning signs in 2026 — compare the alternatives below before installing. It runs on 500+ sites, is rated 5/5 and was last updated 6 years ago, and scores 39/100 on our health check.

How many websites use Loop Post Navigation Links?

Loop Post Navigation Links is active on 500+ WordPress websites and has been downloaded 22,962 times since it launched in July 2009. It was downloaded 149 times in the last 30 days.

Does Loop Post Navigation Links work with WordPress 7.1?

Loop Post Navigation Links is officially tested up to WordPress 5.5.22, while the latest release is 7.1.2. It may still work, but try it on a staging site first.

When was Loop Post Navigation Links last updated?

The latest version, 3.0.2, was released on August 27, 2020 (6 years ago).

Who makes Loop Post Navigation Links?

Loop Post Navigation Links is developed and maintained by Scott Reilly.

What are the best alternatives to Loop Post Navigation Links?

The most popular alternatives to Loop Post Navigation Links are Broken Link Checker (500K+ installs), LuckyWP Table of Contents (100K+ installs) and Export All URLs (50K+ installs).

Powered by PageForge

Want thousands of pages that rank like these? Build them in an afternoon.

This directory runs on the same engine as PageForge. Turn any spreadsheet, CSV or API into thousands of fast, SEO-ready WordPress pages — with schema, internal links and AI-written copy baked in.

  • CSV, Google Sheets & API data sources
  • AI content, schema & internal links per page
  • Works with Elementor, Gutenberg, Yoast & Rank Math
  • Free on WordPress.org — no credit card
Sarah is here to help!
Hi there! 👋 Need help finding what you're looking for?
Sarah
Sarah
Online & Ready to Help
Hi there! 👋 Need help finding what you're looking for?

We'll use this to continue our conversation

Just now ✓ Verified

Join 500+ SEO Pros Scaling Their Strategy

Get exclusive programmatic SEO tactics, AI content workflows, and the latest PageForge updates delivered straight to your inbox. Stay ahead of the algorithm.

We care about your data in our privacy policy.