Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/wildan-m/wp-recipes-membership-platform/archive/refs/heads/main.zipA WordPress plugin that turns a WooCommerce-backed recipe site into a membership platform with high-performance search, a custom subscriber dashboard, and signed-URL delivery for premium video content.
Built for a culinary education site with paid subscribers who access recipe collections, technique videos, and downloadable guides. The native WooCommerce "My Account" pages were replaced with a focused dashboard and the search layer was decoupled from the page builder so result render times stay under 100ms regardless of how heavy the page template is.
What it does
Custom Recipe CPT. Recipes are stored as a custom post type with ACF fields for cuisine, technique, difficulty, ingredient list, and a video attachment URL. Categories and meta sync to Algolia on save_post so the index is always fresh.
Algolia search, decoupled from the theme. InstantSearch.js runs as a standalone client-side layer mounted to a plain <div id="recipe-search"> container. No page builder DOM dependencies, so the search UI is portable and fast. Faceted filters cover cuisine, difficulty, technique, and time-to-prepare.
Membership dashboard. Subscribers see their own dashboard at /my-kitchen/ with their saved recipes, recently viewed, and the videos they have access to based on their active WooCommerce subscription. Renders mobile-first.
BunnyCDN with signed URLs. Premium recipe videos and PDF technique cards are offloaded to BunnyCDN Storage. URLs served to subscribers are signed with a short TTL and tied to their subscription status, so a copy-pasted link expires and cannot be shared.
Client-side PDF export. Logged-in subscribers can export any recipe as a branded PDF using html2pdf.js, generated in the browser without hitting the server.
Redis object cache is configured for session and query caching to keep response times steady during traffic spikes.
Architecture
includes/
class-recipe-cpt.php # Recipe custom post type + ACF field group
class-algolia-sync.php # save_post hook -> Algolia index
class-membership-dashboard.php # /my-kitchen/ dashboard endpoint
class-bunnycdn-signed-urls.php # Signed URL generator for premium media
class-recipe-pdf.php # html2pdf.js bridge for client-side export
assets/
js/instantsearch.js # InstantSearch.js initialization
js/dashboard.js # Dashboard interactions
css/dashboard.css # Mobile-first dashboard styles
templates/
dashboard-page.php # Dashboard template
search-page.php # Search page template (page-builder-free)
recipes-membership.php # Plugin bootstrap
Required services
- WordPress 6.4+ with WooCommerce and WooCommerce Subscriptions
- ACF Pro (for the recipe field group)
- Algolia account and application
- BunnyCDN Storage zone with signed URL token configured
- Redis available to the host (Object Cache Pro or the free Redis Object Cache plugin)
- PHP 8.1+
Configuration
Define these constants in wp-config.php:
define('ALGOLIA_APPLICATION_ID', '...');
define('ALGOLIA_ADMIN_API_KEY', '...');
define('ALGOLIA_INDEX_NAME', 'recipes_production');
define('BUNNYCDN_PULL_ZONE', 'recipes-cdn.b-cdn.net');
define('BUNNYCDN_SIGNING_KEY', '...');
define('BUNNYCDN_TOKEN_TTL', 600);
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
Why this layout
The two patterns that matter for performance:
-
Search outside the page builder. Page builders rebuild the DOM on every render and inject inline styles. Mounting InstantSearch.js to a plain container that lives outside the builder's tree means the search component has zero theme-rebuild overhead and ships only the JS it needs.
-
Files off the origin server. Premium media never touches the application server in production. Subscriber requests hit the WordPress dashboard, which authorizes against the WooCommerce subscription, generates a signed BunnyCDN URL, and 302s the browser to the CDN. The application server only serves logic.
Sync behavior
The Algolia sync runs on:
save_post_recipe(post create / update)delete_post(removes the record)woocommerce_subscription_status_changed(recomputes which subscribers can access a recipe)
A wp recipes:reindex WP-CLI command exists for full reindexes after taxonomy changes.