{
    "title": "WP-PageNavi",
    "seo_title": "WP-PageNavi: review, recommended settings and limits",
    "h1": "WP-PageNavi",
    "description": "WP-PageNavi: numbered pagination for classic themes. Who it suits, its limits (theme edits, PHP 8.2), recommended settings and the move to version 3.0.",
    "lead": "WP-PageNavi replaces your theme’s “Older posts” links with a numbered, configurable pagination bar. This sheet covers which sites it suits, its limitations (theme edits, PHP 8.2), the settings to pick and what version 3.0 changes.",
    "language": "en",
    "locale": "en-US",
    "type": "plugin-sheet",
    "url": "https://www.wp-masquerade.com/features/camouflaged-plugins/wp-pagenavi/",
    "canonical": "https://www.wp-masquerade.com/features/camouflaged-plugins/wp-pagenavi/",
    "markdown": "https://www.wp-masquerade.com/features/camouflaged-plugins/wp-pagenavi/index.md",
    "json": "https://www.wp-masquerade.com/features/camouflaged-plugins/wp-pagenavi/index.json",
    "published": "2026-11-05T08:00:00+00:00",
    "modified": "2026-11-05T21:32:42+00:00",
    "site": {
        "name": "WP Masquerade",
        "url": "https://www.wp-masquerade.com/"
    },
    "translations": [
        {
            "language": "en",
            "hreflang": "en-US",
            "title": "WP-PageNavi",
            "url": "https://www.wp-masquerade.com/features/camouflaged-plugins/wp-pagenavi/",
            "markdown": "https://www.wp-masquerade.com/features/camouflaged-plugins/wp-pagenavi/index.md",
            "json": "https://www.wp-masquerade.com/features/camouflaged-plugins/wp-pagenavi/index.json"
        },
        {
            "language": "fr",
            "hreflang": "fr-FR",
            "title": "WP-PageNavi",
            "url": "https://www.wp-masquerade.com/fr/fonctionnalites/extensions-camouflees/wp-pagenavi/",
            "markdown": "https://www.wp-masquerade.com/fr/fonctionnalites/extensions-camouflees/wp-pagenavi/index.md",
            "json": "https://www.wp-masquerade.com/fr/fonctionnalites/extensions-camouflees/wp-pagenavi/index.json"
        },
        {
            "language": "es",
            "hreflang": "es-ES",
            "title": "WP-PageNavi",
            "url": "https://www.wp-masquerade.com/es/funcionalidades/plugins-camuflados/wp-pagenavi/",
            "markdown": "https://www.wp-masquerade.com/es/funcionalidades/plugins-camuflados/wp-pagenavi/index.md",
            "json": "https://www.wp-masquerade.com/es/funcionalidades/plugins-camuflados/wp-pagenavi/index.json"
        },
        {
            "language": "de",
            "hreflang": "de-DE",
            "title": "WP-PageNavi",
            "url": "https://www.wp-masquerade.com/de/funktionen/getarnte-plugins/wp-pagenavi/",
            "markdown": "https://www.wp-masquerade.com/de/funktionen/getarnte-plugins/wp-pagenavi/index.md",
            "json": "https://www.wp-masquerade.com/de/funktionen/getarnte-plugins/wp-pagenavi/index.json"
        },
        {
            "language": "it",
            "hreflang": "it-IT",
            "title": "WP-PageNavi",
            "url": "https://www.wp-masquerade.com/it/funzionalita/plugin-camuffati/wp-pagenavi/",
            "markdown": "https://www.wp-masquerade.com/it/funzionalita/plugin-camuffati/wp-pagenavi/index.md",
            "json": "https://www.wp-masquerade.com/it/funzionalita/plugin-camuffati/wp-pagenavi/index.json"
        },
        {
            "language": "pt",
            "hreflang": "pt-BR",
            "title": "WP-PageNavi",
            "url": "https://www.wp-masquerade.com/pt/recursos/plugins-wordpress-camuflados/wp-pagenavi/",
            "markdown": "https://www.wp-masquerade.com/pt/recursos/plugins-wordpress-camuflados/wp-pagenavi/index.md",
            "json": "https://www.wp-masquerade.com/pt/recursos/plugins-wordpress-camuflados/wp-pagenavi/index.json"
        },
        {
            "language": "nl",
            "hreflang": "nl-NL",
            "title": "WP-PageNavi",
            "url": "https://www.wp-masquerade.com/nl/functies/gecamoufleerde-plugins/wp-pagenavi/",
            "markdown": "https://www.wp-masquerade.com/nl/functies/gecamoufleerde-plugins/wp-pagenavi/index.md",
            "json": "https://www.wp-masquerade.com/nl/functies/gecamoufleerde-plugins/wp-pagenavi/index.json"
        }
    ],
    "headings": [
        {
            "level": 1,
            "text": "WP-PageNavi"
        },
        {
            "level": 2,
            "text": "What WP-PageNavi does on your site"
        },
        {
            "level": 2,
            "text": "Which sites WP-PageNavi suits"
        },
        {
            "level": 2,
            "text": "WP-PageNavi strengths and limitations"
        },
        {
            "level": 3,
            "text": "Strengths"
        },
        {
            "level": 3,
            "text": "Limitations"
        },
        {
            "level": 2,
            "text": "The WP-PageNavi settings we recommend"
        },
        {
            "level": 2,
            "text": "How secure WP-PageNavi is"
        },
        {
            "level": 2,
            "text": "WP-PageNavi FAQ",
            "id": "faq"
        }
    ],
    "body": "## The essentials\n\n- Best for a blog with deep archives on a classic PHP theme that you are able to edit.\n- Main caveat: nothing shows until the theme calls wp_pagenavi(), so it is a poor fit for block themes.\n- Free, with no paid edition; requires WordPress 6.8 and PHP 8.2 since version 3.0.\n\n## What WP-PageNavi does on your site\n\nWP-PageNavi swaps the “Older posts” and “Newer posts” links on your archives for a real pagination bar: page numbers, first and last page, previous and next, and a label such as “Page 3 of 12”. It is built by Lester Chan, has been maintained for about twenty years, and is completely free, with no paid edition.\n\nThe plugin does nothing on its own: it provides the `wp_pagenavi()` template tag, which your theme has to call instead of `next_posts_link()` and `previous_posts_link()`. The same function can also paginate a post split into several pages (`'type' => 'multipart'`) or a secondary query passed through the `query` argument. Wording, number of links and style are set under Settings > WP-PageNavi.\n\nOn the front end, it adds one stylesheet, `css/wp-pagenavi.css`, and the navigation markup, wrapped in an element with the `wp-pagenavi` class. Version 3.0 dropped the bundled SCB framework, so the plugin now runs on WordPress core APIs alone, but it now requires WordPress 6.8 and PHP 8.2.\n\n![Diagram: WP-PageNavi works on visitors and bots, wordpress, database and files. Public traces: folder name (hidden with Pro); tag IDs (hidden with Pro); CSS classes (still visible).](https://www.wp-masquerade.com/media/wpm-sheets/wp-pagenavi/diagram-en.svg?v=e207d9b9)\n\n## Which sites WP-PageNavi suits\n\n- **Blogs and magazines with deep archives**, where readers want to jump straight to page 10 instead of clicking “Older posts” ten times.\n- **Classic PHP themes**, child or custom, where you can edit `index.php`, `archive.php` or `search.php`.\n- **Developers** who want configurable pagination without writing it: class names you can change through filters, a choice of wrapper tag, colors as CSS custom properties.\n\nIt is the wrong pick for a block theme, whose templates contain no PHP to call `wp_pagenavi()` from; the WordPress pagination block does the same job there. It is not an infinite scroll or “Load more” plugin either: every link opens a new page. And if your host still runs PHP 8.1 or older, you will not be offered the current version; our article on [end-of-life PHP versions](https://www.wp-masquerade.com/end-of-life-php-versions/) helps you plan the upgrade.\n\n## WP-PageNavi strengths and limitations\n\n### Strengths\n\n- **Very lightweight.** One stylesheet, no script in Normal style, and no third-party library since version 3.0.\n- **Easy to fit into a design.** Ten filters rename the classes, the stylesheet inherits the theme’s font, and its two border colors are CSS custom properties.\n- **Careful accessibility.** The current page carries `aria-current`, and the first, previous, next and last links reuse WordPress’s own translated labels.\n- **Beyond archives.** It paginates secondary queries, multi-page posts and user lists.\n- **Clean uninstall.** Deleting the plugin removes its settings, on every site of a multisite network.\n\n### Limitations\n\n- **Theme edits required.** Nothing appears until the theme calls `wp_pagenavi()`, and block themes do not lend themselves to it.\n- **Recent requirements.** Since version 3.0 you need WordPress 6.8 and PHP 8.2.\n- **Stylesheet loaded everywhere.** While the option is on, it is added to every public page, even pages without pagination.\n- **Drop-down style relies on JavaScript.** It changes page through an `onchange` attribute written into the HTML, with no fallback button.\n- **Version 3.0 needs attention.** A `pagenavi-css.css` copy in the theme must be renamed, and code calling the old `PageNavi_*` classes must be updated.\n\n## The WP-PageNavi settings we recommend\n\nEvery setting lives on one screen, Settings > WP-PageNavi, open only to accounts with the `manage_options` capability.\n\n| Setting | Recommended value | Why |\n| --- | --- | --- |\n| **Page Navigation Style**  Settings > WP-PageNavi | Normal | The Drop-down List does not work without JavaScript, and its `onchange` attribute is blocked by a strict CSP. |\n| **Use wp-pagenavi.css**  Settings > WP-PageNavi | Yes if your theme does not style pagination; No if it already does | With No, every public page loads one stylesheet less. |\n| **Number Of Pages To Show**  Settings > WP-PageNavi | 5 (the default), fewer if the bar wraps onto two lines on phones | A short bar stays readable on a small screen. |\n| **Number Of Larger Page Numbers To Show**  Settings > WP-PageNavi | 3 on a large archive, 0 on a small blog | Jumps such as 10, 20, 30 only help when there are many pages; 0 turns them off. |\n| **Show Larger Page Numbers In Multiples Of**  Settings > WP-PageNavi | 10 (the default) | A regular step that readers grasp at once. |\n| **Always Show Page Navigation**  Settings > WP-PageNavi | No | Avoids a pointless bar on an archive that fits on a single page. |\n| **Text For Previous Page and Text For Next Page**  Settings > WP-PageNavi | The default arrows, or an SVG icon | SVG icons are accepted since version 3.0; leaving a field blank hides that part of the navigation. |\n| **Updates**  Plugins > Installed Plugins | Auto-updates on, once the move to version 3.0 has been tested | Future fixes then install without any action on your part. |\n\n- Open page 2 of an archive and check that it shows different posts from page 1; if not, the theme is misusing `query_posts()`.\n- If your theme holds a `pagenavi-css.css` copy, rename it `wp-pagenavi.css`: since version 3.0 the old name is ignored.\n- Search your code for `PageNavi_Core::$options` or `scb_*` functions and replace them with `WP_PageNavi_Options::get()` or `WP_PageNavi_Options::defaults()`.\n- Tab through the bar with the keyboard, and check on a phone that it does not overflow the screen.\n\nTo help visitors find their way beyond pagination, WP-PageNavi pairs well with a breadcrumb trail such as [Breadcrumb NavXT](https://www.wp-masquerade.com/features/camouflaged-plugins/breadcrumb-navxt/). If you are rolling out a CSP, our guide to [HTTP security headers](https://www.wp-masquerade.com/http-security-headers-wordpress/) explains why event handlers written into the HTML cause trouble.\n\n## How secure WP-PageNavi is\n\nAt the time of writing, the WPScan and Patchstack vulnerability databases list no published vulnerability for WP-PageNavi. Its attack surface is small: a single settings screen restricted to administrators, no AJAX requests, no public form.\n\nVersion 3.0 tightened the code further: link URLs go through `esc_url()`, navigation text is filtered both on save and on output (`script` tags and event attributes are stripped, SVG icons included), and unknown setting keys are no longer stored. The capability required for the settings screen can be changed with the `wp_pagenavi_capability` filter.\n\nThe step that matters is still updating (see our guide to plugin auto-updates). WP Masquerade Pro renames the `wp-pagenavi` folder in file addresses and in the ID of its stylesheet tag, which makes the plugin harder for bots to spot without replacing updates; the `wp-pagenavi` class stays visible in the code of archives that show the bar.\n\n## WP-PageNavi FAQ\n\n**I activated WP-PageNavi but nothing changed. Why?**\n\nThe plugin displays nothing by itself: your theme has to call `wp_pagenavi()` in place of the “Older posts” and “Newer posts” links. Make the change in a child theme so it survives theme updates.\n\n**Can I use it with a custom WP_Query?**\n\nYes. Pass your query in the `query` argument: `wp_pagenavi( array( 'query' => $my_query ) )`. If page 2 shows the same posts as page 1, the theme is usually misusing `query_posts()`.\n\n**Are my settings kept when moving to version 3.0?**\n\nYes. The old `pagenavi_options` option is copied into `wp_pagenavi_options` and then deleted automatically; since version 3.0.1 this migration runs on every request, even if nobody opens the dashboard.\n\n**How do I change the colors without copying the stylesheet?**\n\nSet the `--wp-pagenavi-border-color` and `--wp-pagenavi-border-color-current` properties on `.wp-pagenavi` in your theme’s CSS. For deeper changes, copy `css/wp-pagenavi.css` into the theme folder as `wp-pagenavi.css`.\n\n**Does deleting WP-PageNavi leave data in the database?**\n\nNo. Uninstalling removes its two options, plus the old one if it still exists, on every site of a multisite network. Do remove the `wp_pagenavi()` call from the theme, or wrap it in `function_exists()`, before deleting the plugin.\n\n## Key facts\n\n- Category: Utilities\n- Vendor: Lester Chan\n- Price: Free, with no paid edition\n- Active installations (wordpress.org): 400 000+\n- Version: 3.0.1\n- Official page: https://wordpress.org/plugins/wp-pagenavi/\n\n## What WP Masquerade hides\n\n- Handled by WP Masquerade Pro only\n- With Pro: folder name, tag IDs\n- Still visible: CSS classes",
    "catalog": "wp-pagenavi",
    "essentials": [
        "Best for a blog with deep archives on a classic PHP theme that you are able to edit.",
        "Main caveat: nothing shows until the theme calls wp_pagenavi(), so it is a poor fit for block themes.",
        "Free, with no paid edition; requires WordPress 6.8 and PHP 8.2 since version 3.0."
    ],
    "format": "application/json"
}