PHPackages                             arraypress/wp-register-addons - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. arraypress/wp-register-addons

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

arraypress/wp-register-addons
=============================

A declarative WordPress add-ons page registration system for showcasing pro extensions and features

18PHP

Since Mar 2Pushed 2mo agoCompare

[ Source](https://github.com/arraypress/wp-register-addons)[ Packagist](https://packagist.org/packages/arraypress/wp-register-addons)[ RSS](/packages/arraypress-wp-register-addons/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

WordPress Add-ons Page
======================

[](#wordpress-add-ons-page)

A declarative system for registering WordPress admin add-ons showcase pages. Display available extensions, pro features, and premium add-ons in a responsive card grid with automatic plugin status detection.

Installation
------------

[](#installation)

```
composer require arraypress/wp-register-addons
```

Quick Start
-----------

[](#quick-start)

```
register_addons_page( 'my-plugin-addons', [
    'page_title'  => __( 'Add-ons', 'myplugin' ),
    'menu_title'  => __( 'Add-ons', 'myplugin' ),
    'menu_slug'   => 'my-plugin-addons',
    'parent_slug' => 'my-plugin',
    'capability'  => 'manage_options',
    'logo'        => plugin_dir_url( __FILE__ ) . 'assets/logo.png',
    'pricing_url' => 'https://yoursite.com/pricing/',

    'categories' => [
        'payments'  => __( 'Payments', 'myplugin' ),
        'marketing' => __( 'Marketing', 'myplugin' ),
    ],

    'addons' => [
        'stripe' => [
            'title'       => __( 'Stripe Connect', 'myplugin' ),
            'description' => __( 'Accept payments with Stripe Connect.', 'myplugin' ),
            'image'       => plugin_dir_url( __FILE__ ) . 'assets/addons/stripe.png',
            'plugin'      => 'myplugin-stripe/myplugin-stripe.php',
            'url'         => 'https://yoursite.com/addons/stripe/',
            'category'    => 'payments',
            'badge'       => 'popular',
        ],
    ],
] );
```

That's it — the menu page, card grid, category filters, search, and plugin status detection are handled automatically.

Configuration Reference
-----------------------

[](#configuration-reference)

```
register_addons_page( 'page_id', [
    // Menu Registration
    'page_title'  => 'Add-ons',              // Page title tag text
    'menu_title'  => 'Add-ons',              // Menu item text
    'menu_slug'   => 'my-addons',            // Admin page slug
    'parent_slug' => '',                     // Parent menu slug (empty = top-level)
    'capability'  => 'manage_options',       // Capability required to view
    'icon'        => 'dashicons-admin-plugins', // Dashicon (top-level only)
    'position'    => null,                   // Menu position (top-level only)

    // Conditional Display
    'show_if' => callable|null,              // Return false to hide the menu entirely

    // Header
    'logo'         => '',                    // URL to logo image
    'header_title' => '',                    // Override header title
    'header_badge' => '',                    // Badge next to title

    // Pro Upsell Banner
    'pricing_url'         => '',             // URL to pricing page (empty = no banner)
    'pricing_text'        => '',             // Banner headline
    'pricing_description' => '',             // Banner subtext

    // Categories
    'categories' => [],                      // key => label pairs for filter tabs

    // Add-ons
    'addons' => [],                          // Add-on definitions (see below)

    // Display
    'searchable' => true,                    // Show search box
    'columns'    => 3,                       // Grid columns (2, 3, or 4)
    'body_class' => '',                      // Additional CSS body class

    // Colors (override any CSS custom property)
    'colors' => [],                          // key => value pairs (see Colors section)

    // Labels
    'labels' => [
        'search'    => 'Search add-ons...',
        'all'       => 'All',
        'active'    => 'Active',
        'installed' => 'Activate',
        'available' => 'Get This Add-on',
        'feature'   => 'Learn More',
        'not_found' => 'No add-ons found matching your search.',
    ],
] );
```

Conditional Visibility
----------------------

[](#conditional-visibility)

Hide the add-ons page when a pro license is active:

```
register_addons_page( 'my-plugin-addons', [
    'show_if' => function() {
        return ! my_plugin_has_pro_license();
    },
    // ...
] );
```

When the callback returns `false`, the menu page is never registered.

Add-on Definitions
------------------

[](#add-on-definitions)

Each add-on supports the following options:

```
'addons' => [
    'stripe-connect' => [
        'title'       => 'Stripe Connect',              // Display name (required)
        'description' => 'Accept marketplace payments.', // Card description
        'image'       => 'https://.../stripe.png',       // Card image URL
        'background'  => '#f0f0ff',                      // Image area background (color or gradient)
        'icon'        => 'dashicons-cart',                // Fallback dashicon (if no image)
        'plugin'      => 'my-stripe/my-stripe.php',       // Plugin basename for auto-detection
        'url'         => 'https://yoursite.com/...',       // Purchase/info URL
        'category'    => 'payments',                      // Category key for filtering
        'badge'       => 'popular',                       // Badge label (see Badges)
        'type'        => 'plugin',                        // 'plugin' or 'feature'
        'status'      => null,                            // Override: 'active', 'installed', 'available'
    ],
],
```

### Auto-Detection

[](#auto-detection)

When a `plugin` basename is provided, the library automatically detects the add-on's status:

StatusConditionCard Action**Active**Plugin is installed and activatedGreen checkmark**Installed**Plugin exists but is not active"Activate" button**Available**Plugin is not installed"Get This Add-on"The "Activate" button works directly from the add-ons page with nonce verification.

### Feature Type

[](#feature-type)

For pro features gated within the core plugin (not separate plugins):

```
'advanced-reporting' => [
    'title'       => __( 'Advanced Reporting', 'myplugin' ),
    'description' => __( 'Unlock detailed analytics.', 'myplugin' ),
    'type'        => 'feature',
    'url'         => 'https://yoursite.com/pricing/',
    'category'    => 'reporting',
],
```

Feature-type add-ons always show as "available" with a "Learn More" link.

### Status Override

[](#status-override)

Force a specific status regardless of plugin detection:

```
'coming-soon-addon' => [
    'title'  => __( 'Coming Soon', 'myplugin' ),
    'status' => 'available',
    'badge'  => 'coming_soon',
],
```

Badges
------

[](#badges)

Badges appear in the top-right corner of add-on cards:

Badge KeyDisplay TextColor`popular`PopularAmber`new`NewGreen`recommended`RecommendedBlue`coming_soon`Coming SoonGrayCustom stringAuto-labeledGrayCategories
----------

[](#categories)

Categories render as pill-shaped filter buttons above the grid:

```
'categories' => [
    'payments'  => __( 'Payments', 'myplugin' ),
    'marketing' => __( 'Marketing', 'myplugin' ),
    'reporting' => __( 'Reporting', 'myplugin' ),
],
```

An "All" button is automatically included. Categories with zero add-ons are hidden. Filtering is instant (client-side) with no page reload.

Search
------

[](#search)

When `searchable` is enabled (default), a search box appears in the toolbar. Search is client-side with debounce and matches against add-on titles, descriptions, category labels, and badge text. Multi-word queries require all words to match. Press Escape to clear.

Both category and search state are preserved in the URL (`?category=payments&s=stripe`) so filtered views are shareable and survive page refreshes.

Pro Banner
----------

[](#pro-banner)

The pro upsell banner displays at the top when `pricing_url` is configured:

```
register_addons_page( 'my-plugin-addons', [
    'pricing_url'         => 'https://yoursite.com/pricing/',
    'pricing_text'        => __( 'Unlock Everything with Pro', 'myplugin' ),
    'pricing_description' => __( 'Get every add-on and priority support.', 'myplugin' ),
] );
```

Omit `pricing_url` to hide the banner entirely.

Grid Columns
------------

[](#grid-columns)

```
'columns' => 3,  // 2, 3, or 4
```

The grid is responsive — columns reduce automatically on smaller screens.

Header
------

[](#header)

Uses the same EDD-style header as [wp-register-tables](https://github.com/arraypress/wp-register-tables):

```
register_addons_page( 'my-plugin-addons', [
    'logo'         => plugin_dir_url( __FILE__ ) . 'assets/logo.png',
    'header_title' => __( 'Extensions', 'myplugin' ),
    'header_badge' => [
        'text'  => 'Beta',
        'class' => 'badge-warning',
    ],
] );
```

Colors
------

[](#colors)

Override any CSS custom property via the `colors` config. Only the keys you set are output as inline styles — everything else falls back to the built-in defaults.

```
register_addons_page( 'my-plugin-addons', [
    'colors' => [
        'accent'       => '#6366f1',
        'accent_hover' => '#4f46e5',
        'pro_bg'       => 'linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%)',
    ],
] );
```

Available keys:

KeyCSS VariableDefault`accent``--ao-accent``#2271b1``accent_hover``--ao-accent-hover``#135e96``success``--ao-success``#00a32a``text_primary``--ao-text-primary``#1d2327``text_secondary``--ao-text-secondary``#646970``text_muted``--ao-text-muted``#a7aaad``border``--ao-border``#c3c4c7``border_light``--ao-border-light``#e0e0e0``bg_white``--ao-bg-white``#fff``bg_subtle``--ao-bg-subtle``#f6f7f7``image_bg``--ao-image-bg``#f6f7f7``pro_bg``--ao-pro-bg`Gradient (blue)`pro_text``--ao-pro-text``#fff``badge_popular_bg``--ao-badge-popular-bg``#fcf0e3``badge_popular_text``--ao-badge-popular-text``#9a6700``badge_new_bg``--ao-badge-new-bg``#edfaef``badge_new_text``--ao-badge-new-text``#1a7a2e``badge_recommended_bg``--ao-badge-recommended-bg``#e5f0fa``badge_recommended_text``--ao-badge-recommended-text``#1d4ed8``badge_coming_soon_bg``--ao-badge-coming-soon-bg``#f0f0f1``badge_coming_soon_text``--ao-badge-coming-soon-text``#50575e``radius``--ao-radius``6px``radius_lg``--ao-radius-lg``8px`Values accept any valid CSS — colors, gradients, or size units depending on the property.

Body Classes
------------

[](#body-classes)

- `addons-page` — added to all add-ons pages
- `addons-page-{id}` — page-specific class
- Custom class from the `body_class` config option

Hooks
-----

[](#hooks)

### Actions

[](#actions)

```
// Before/after grid renders
add_action( 'arraypress_before_render_addons', fn( $id, $config ) => null, 10, 2 );
add_action( 'arraypress_before_render_addons_{page_id}', fn( $config ) => null, 10, 1 );
add_action( 'arraypress_after_render_addons', fn( $id, $config ) => null, 10, 2 );
add_action( 'arraypress_after_render_addons_{page_id}', fn( $config ) => null, 10, 1 );
```

Complete Example
----------------

[](#complete-example)

```
register_addons_page( 'sugarcart-addons', [
    // Menu
    'page_title'  => __( 'Add-ons', 'sugarcart' ),
    'menu_title'  => __( 'Add-ons', 'sugarcart' ),
    'parent_slug' => 'sugarcart',
    'capability'  => 'manage_options',

    // Conditional visibility
    'show_if' => function() {
        return ! sugarcart_has_pro_license();
    },

    // Header
    'logo'         => plugin_dir_url( __FILE__ ) . 'assets/logo.png',
    'header_title' => __( 'Add-ons', 'sugarcart' ),

    // Pro banner
    'pricing_url'         => 'https://sugarcart.com/pricing/',
    'pricing_text'        => __( 'Get All Add-ons with SugarCart Pro', 'sugarcart' ),
    'pricing_description' => __( 'Every add-on, priority support, and all future extensions.', 'sugarcart' ),

    // Categories
    'categories' => [
        'payments' => __( 'Payments', 'sugarcart' ),
        'emails'   => __( 'Email', 'sugarcart' ),
        'tools'    => __( 'Tools', 'sugarcart' ),
    ],

    // Add-ons
    'addons' => [
        'stripe-connect' => [
            'title'       => __( 'Stripe Connect', 'sugarcart' ),
            'description' => __( 'Accept marketplace payments and split revenue.', 'sugarcart' ),
            'image'       => plugin_dir_url( __FILE__ ) . 'assets/addons/stripe-connect.png',
            'plugin'      => 'sugarcart-stripe-connect/sugarcart-stripe-connect.php',
            'url'         => 'https://sugarcart.com/addons/stripe-connect/',
            'category'    => 'payments',
            'badge'       => 'popular',
        ],
        'mailchimp' => [
            'title'       => __( 'Mailchimp', 'sugarcart' ),
            'description' => __( 'Sync customers with your Mailchimp audience.', 'sugarcart' ),
            'image'       => plugin_dir_url( __FILE__ ) . 'assets/addons/mailchimp.png',
            'plugin'      => 'sugarcart-mailchimp/sugarcart-mailchimp.php',
            'url'         => 'https://sugarcart.com/addons/mailchimp/',
            'category'    => 'emails',
            'badge'       => 'new',
        ],
        'pdf-invoices' => [
            'title'       => __( 'PDF Invoices', 'sugarcart' ),
            'description' => __( 'Generate and attach PDF invoices to order emails.', 'sugarcart' ),
            'image'       => plugin_dir_url( __FILE__ ) . 'assets/addons/pdf-invoices.png',
            'plugin'      => 'sugarcart-pdf-invoices/sugarcart-pdf-invoices.php',
            'url'         => 'https://sugarcart.com/addons/pdf-invoices/',
            'category'    => 'tools',
        ],
        'advanced-analytics' => [
            'title'       => __( 'Advanced Analytics', 'sugarcart' ),
            'description' => __( 'Detailed revenue charts, customer insights, and exports.', 'sugarcart' ),
            'type'        => 'feature',
            'url'         => 'https://sugarcart.com/pricing/',
            'category'    => 'tools',
            'image'       => plugin_dir_url( __FILE__ ) . 'assets/addons/analytics.png',
            'badge'       => 'recommended',
        ],
    ],
] );
```

Requirements
------------

[](#requirements)

- PHP 7.4+
- WordPress 5.0+
- arraypress/wp-composer-assets

License
-------

[](#license)

GPL-2.0-or-later

Credits
-------

[](#credits)

Created by [David Sherlock](https://davidsherlock.com) at [ArrayPress](https://arraypress.com).

###  Health Score

21

—

LowBetter than 19% of packages

Maintenance57

Moderate activity, may be stable

Popularity6

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity12

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/cd6eb8aff0903d87eb674d1ba3c5f3653899c0d7661504eb0deb7798ed86b643?d=identicon)[arraypress](/maintainers/arraypress)

---

Top Contributors

[![arraypress](https://avatars.githubusercontent.com/u/22668877?v=4)](https://github.com/arraypress "arraypress (8 commits)")

### Embed Badge

![Health badge](/badges/arraypress-wp-register-addons/health.svg)

```
[![Health](https://phpackages.com/badges/arraypress-wp-register-addons/health.svg)](https://phpackages.com/packages/arraypress-wp-register-addons)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
