BioLink Pro v0.5.0
Feature-complete release covering Phases 5–10 of the original roadmap.
Added — Phase 5: Analytics
Analytics\Tracker— async event recorder (useswp_schedule_single_eventto keep the click redirect fast).Analytics\LinkSync— mirrors LinkBlock entries intowp_biolink_linkson every page save so per-link analytics can join on a stable BIGINT id; deactivates removed rows instead of deleting (preserves historical clicks).Api\ClickController—GET /biolink/v1/click/{id}?ref=...rate-limited (10/min/IP), applies UTM, 302 redirects.Api\TrackController—POST /biolink/v1/track/view(rate-limited, bot-filtered).LinkBlocknow routes its href through/click/{id}once the link has been synced.- Frontend
biolink.jsfires a view beacon vianavigator.sendBeaconon DOMContentLoaded. Analytics\Reporter— summary, daily timeseries (gap-filled), top links, devices, geo, referrers.Api\AnalyticsController—summary | timeseries | links | devices | geo | referrers | export.csvunder/analytics/pages/{id}/.Cron\Pruner— daily job that drops expired rate-limit buckets + analytics events older thananalytics_retention_days(default 365).- React Analytics page with summary cards, custom SVG dual-line sparkline, top-links table, device/country/referrer bar lists, range picker (7d/30d/90d/365d), CSV export link.
Added — Phase 6: QR codes + SEO
Qr\Generatorusingendroid/qr-code5.x with on-disk cache keyed by a style hash; PNG or SVG output.Api\QrController—GET /biolink/v1/pages/{id}/qr?format=png&fg=#000&bg=#FFF&size=512.- QR quick-link in the PageDetail topbar.
Seo\MetaTags— title, description, robots, canonical, og:(type|title|description|url|site_name|locale|image), twitter:(card|title|description|image|site). Per-page SEO override fields (custom_title,custom_description,og_image_id,no_index,twitter_site).Seo\StructuredData— emits JSON-LDPerson(withsameAsaggregated from social_icons blocks) +WebPage. FaqBlock continues to emit its ownFAQPagegraph.Seo\Sitemap— registersbiolink_pageCPT withwp_sitemaps.
Added — Phase 7: Integrations + settings
Core\Crypto— symmetric encrypt/decrypt for at-rest secrets usingsodium_crypto_secretbox(key derived fromAUTH_KEY); base64 fallback when sodium is unavailable.Api\SettingsController—GET /settings,PATCH /settings. Secrets stored encrypted and returned masked (last 4 visible).Api\WebhookController—POST /biolink/v1/webhooks/{provider}generic receiver withbiolink/webhook/{provider}/verifyfilter +biolink/webhook/{provider}action.- Settings page (React): General tab (analytics retention, credit toggle, tracking toggle, AI toggle) + Integrations tab (OpenAI key, Stripe secret). SecretField shows masked, has Replace + Remove.
Added — Phase 8: AI
Ai\Providerinterface +Ai\ProviderRegistry+Ai\OpenAiProvider(gpt-4o-mini viawp_remote_postto/v1/chat/completions, reads encrypted key from settings).Api\AiController—POST /ai/{bio|cta|theme}with per-user 10-per-minute rate limit. Returns{ suggestions: string[] }.- "✨ Suggest" button on the page subtitle in PageHeaderEditor.
Added — Phase 9: Templates + onboarding
Templates\TemplateLibrary— loads JSON files fromtemplates/data/and creates new draft pages from them.Api\TemplatesController—GET /templates,POST /templates/{slug}/apply.- 6 starter templates:
creator,agency,musician,restaurant,photographer,developer. - First-run
OnboardingOverlay(React) shown until dismissed (per-browser localStorage + server-sideonboarding_completesetting). Pick a template to start, or "Start from scratch".
Added — Phase 10 scaffolding
docs/EXTENSIONS.mddocuments the public hook surface for licensing, multi-tenant SaaS mode, A/B testing, custom-domain mapping, team workspaces, automation workflows, and white-label branding. No core implementation — premium add-ons hook in here.
Dependencies
endroid/qr-code ^5.0(PHP production dep) — pure-PHP QR code generator.
Install: download biolink-pro-v0.5.0.zip below and upload via Plugins → Add New → Upload Plugin.
Auto-update: if you already have BioLink Pro installed, this release will appear under Dashboard → Updates within ~12 hours (or click "Check Again" to force a refresh).