Beskrivelse
Woo Webalive Product Load Premium is the Webalive edition of the "Load More Products for WooCommerce" engine, wrapped in a WebAlive PSR-4 plugin shell. It replaces the numbered pagination on shop and product-taxonomy pages with a smooth AJAX-based flow, adds a Webalive-specific subcategory layout, and ships all previously paid-tier features unlocked out of the box.
Core loading behaviors
- AJAX "Load More" button on shop, product category and product tag pages.
- Infinite scroll with configurable trigger buffer (in pixels from the bottom of the viewport).
- Previous-page button to load the page that comes before the currently visible one when a visitor lands mid-catalogue.
- Multiple loading animations / spinner themes for the Load-More button and lazy-loaded images.
- Lazy-load for product images (using
jquery.lazyloadxt) so long product lists don't hammer the browser or the shop's bandwidth. - Optional different loading strategy on mobile (e.g. Load-More button on desktop, infinite scroll on mobile, or vice-versa).
- Customisable button labels, colors, borders, radius, padding, margins, and hover states.
- JavaScript hooks (
before_update/after_update) so themes and other plugins can react to newly-injected products \u2014 useful for re-initializing sliders, tooltips, wishlist buttons, quick-view popups, etc. - Support for custom product-loop selectors for themes that render the product grid with non-standard markup.
Webalive additions
- Subcategories rendered separately from products on the shop and product-taxonomy pages. Subcategory tiles are lifted out of the product loop and printed in their own
<ul class="products subcategories">block above the product grid, giving stores a clean two-tier browse experience. Toggle from WooCommerce \u2192 Product Load Options, or programmatically via optionwwplp_separate_subcategories/ filterwwplp_separate_subcategories. - All engine features unlocked \u2014 every setting that was gated behind the upstream "Premium" / "Business" tier is available with no license key, no upsell prompts, no marketing banners.
- Own settings screens \u2014 the engine's own AJAX / Load-More / Infinite-scroll settings live under WooCommerce \u2192 Webalive Product Load, and Webalive-owned toggles live under WooCommerce \u2192 Product Load Options.
- Update delivery via updates.webalive.dk \u2014 the plugin honours WordPress's standard
Update URI:header and pulls new versions from the Webalive update server. - WooCommerce compatibility declarations for High-Performance Order Storage (HPOS) and Cart / Checkout Blocks.
- WPML admin-text config for the plugin's own option schema so multilingual sites can translate button texts, loading messages and end-of-list messages via WPML.
Simple migration from "Load More Products for WooCommerce"
If the free upstream Load More Products for WooCommerce plugin is installed on the site, this plugin detects it and guides the site owner through a clean take-over:
- If the upstream plugin is active, a red admin notice appears; a single button click deactivates it. Existing settings are migrated automatically to the new option schema on the first
admin_initafter activation \u2014 no fields are lost. - If the upstream plugin is installed but inactive, a yellow admin notice appears with a link to the inactive-plugins list, so the site owner can delete the old plugin and prevent accidental reactivation.
- If the upstream plugin is absent, no migration UI is shown.
The migration is idempotent (uses a wwplp_migrated_v1 marker) and covers the main settings option, wizard status and account bookkeeping keys.
Ændringslog
1.1.3
- Fix: subcategory tiles were leaking back into the shared
<ul class="products">on AJAX Load-More / infinite-scroll responses, which caused theme-level "equal height" grid styles to stretch the category card to the height of the tallest product card in the same row.SubcategorySeparatornow runsremove_filter( 'woocommerce_product_loop_start', 'woocommerce_maybe_show_product_subcategories' )oninitpriority 20 instead of on thewpaction.wpdoes not fire on admin-ajax requests, so the removal was only effective on the initial page render — subsequent AJAX-paginated fragments still contained inline subcategories. The separated-block renderer stays onwoocommerce_before_shop_loop, which only fires on real front-end shop renders, so the subcategory strip continues to appear exactly once above the initial product grid.
1.1.2
- New WA-owned settings page at WooCommerce → Product Load Options (
admin.php?page=wwplp-options). Currently exposes a single toggle: "Separate subcategories from products" (persisted in optionwwplp_separate_subcategories). Uses standard WP Settings API. The bundled engine's own AJAX / Load-More / Infinite-scroll settings stay under WooCommerce → Webalive Product Load as before. - Removed
src/Admin/BrandingFilter.php. The runtimegettextcatch-all that swapped residual "BeRocket" strings to "Webalive" was made redundant by the full source-level rebrand in 1.0.6+. Removing the always-ongettext/ngettext/gettext_with_contextfilters also removes their per-string overhead. - Neutered
WebAlive_PLP_Framework::plugin_row_meta()— the upstream method keyed offplugin_basename( engine/main.php )which never matches the real plugin basename (woo-wa-product-load-premium/woo-wa-product-load-premium.php), so the Docs / Premium / Support links it tried to add never rendered on our plugin row anyway. Method is now a purereturn $links;passthrough. - Related-plugins sidebar promo image URLs now point at the Webalive CDN pattern
https://updates.webalive.dk/package-assets/icons/{slug}.svgfor the two promoted plugins (woo-wa-product-sort-option,woo-wa-product-ghs) instead of the local duck SVG. - Guarded the
desc_toptemplate-substitution loop inget_plugin_data()with anisset()check to avoidUndefined array key "desc_top"warnings when the promoted-plugin entries don't include a top-banner variant (our current two entries don't).
1.1.1
- Related-plugins sidebar now promotes Webalive plugins instead of the upstream BeRocket catalog.
get_plugin_data()inengine/webalive_plp/includes/admin_notices.phprewritten to return two entries:- Woo Webalive Product Sort Options →
https://webalive.dk/plugins/woo-wa-product-sort-option/ - Woo Webalive Product GHS →
https://webalive.dk/plugins/woo-wa-product-ghs/Both are shown with the plugin's duck SVG as banner image and a "Download free" CTA (the sidebar template now prints "Download free" whenpriceis empty, falling back to the original "From: $XX" only when a price is set).
- Woo Webalive Product Sort Options →
- Fixed wrong URL slug in
engine/webalive_plp/framework.php:webalive.dk/plugin/→webalive.dk/plugins/in the two remaining plugin_row_meta and admin-settings header link constructors.
1.1.0
- All premium / paid features unlocked in the Webalive fork. Registered a
waplp_get_plugin_version_capability_WebAlive_PLPfilter inPlugin::boot()that returns100. Inside the engine'spost_base::is_paid()/is_premium()/is_locked()gating logic this makes every feature unlocked (paidtrue, premiumfalse, sois_lockedis alwaysfalsefor every feature regardless oflicensetier). The engine's own "Upgrade" / "Buy Premium" / "Go Premium" sidebar CTA now never renders because theplugin_version_capability <= 5gate intemplates/premium.phpis false. - Deleted the paid include block from
engine/main.php(if ( ... && file_exists( __DIR__ . "/paid/paid.php" ) ) { include tripwire.php; include paid.php; }). Thepaid/directory has never existed in this fork — the block was dead code left over from the upstream's licensing split. - Removed the corresponding
BLMP_VER_PAID_DISABLEdefine fromPlugin::load_engine()since there is no longer a paid include block to gate. - Note: internal
paid/licenseidentifiers still exist inside engine internals (e.g.plugin-variation.php's$license_name = 'paid', updater bookkeeping, addonspaidflags) — these are internal metadata that only affect the capability gate we now short-circuit. They are not user-visible.
1.0.9
- Removed leftover upstream files from
engine/that were dead but branded:engine/readme.txt(BeRocket's upstream readme withberocket.comdonate/UTM links, contributors, and paid-feature marketing) andengine/load-more-products.php(BeRocket's original plugin-header stub that only didrequire_once main.php— never loaded by WordPress since it's two levels deep, and we require the engine'smain.phpdirectly fromPlugin::load_engine()).
1.0.8
- Hotfix: Fatal error after activating 1.0.6/1.0.7 (
Uncaught Error: Undefined constant "WebAlive_PLP_Version"inengine/main.php:52). The 1.0.6 deep-rebrand renamed the engine's version constant fromBeRocket_Load_More_Products_versiontoWebAlive_PLP_Version, butPlugin::load_engine()only defined the old name. Now defines BOTH constants before requiring the engine so both new and legacy references resolve.
1.0.7
- Rebranded
engine/loco.xml(Loco Translate bundle config): collapsed to a singlewoo-wa-product-load-premiumdomain, project name "Woo Webalive Product Load Premium", source.(the whole engine directory), target../languages(the plugin-root languages folder that ourI18nloader reads from). The old two-domain (BeRocket_LMP_domain+BeRocket_domain) config is gone. - Rebranded
engine/wpml-config.xml: option keybr_load_more_products→wa_product_load_premium, sub-keysbr_lmp_button_settings/br_lmp_prev_settings/br_lmp_messages_settings→wa_plp_button_settings/wa_plp_prev_settings/wa_plp_messages_settings. WPML admin-text translation now targets the new option schema.
1.0.6
- Full deep rebrand of the bundled engine. All upstream identifiers renamed at source level (~3000 replacements across 68 files):
- Classes:
BeRocket_LMP→WebAlive_PLP,BeRocket_Framework→WebAlive_PLP_Framework,BeRocket_updater→WebAlive_PLP_updater, and all otherBeRocket_*classes prefixed toWebAlive_PLP_*. - Hook / filter names: all
berocket_*→webalive_plp_*(including admin bar, admin notices, wizard, rate-stars, subscribe, feature-request, related-plugins, above-admin-settings, updater filters, etc.). - Option key prefix:
br_lmp_*→wa_plp_*. - Main option key:
br_load_more_products→wa_product_load_premium(existing data auto-migrated onadmin_init; see below). - Capabilities:
manage_berocket→manage_webalive_plp,manage_berocket_account→manage_webalive_plp_account. - JS / CSS prefixes:
brlmp_,brfr_,bapf_→waplp_;br_*CSS classes →wa_*. - Constants:
BeRocket_Load_More_Products_version→WebAlive_PLP_Version,BeRocket_cdn_path→WebAlive_PLP_cdn_path. - External domain rewrites:
apicdn.berocket.com→assets.webalive.dk,docs.berocket.com→webalive.dk,berocket.com→webalive.dk. - JS trigger events:
berocket:filters:*→webalive:filters:*. - Directory:
engine/berocket/→engine/webalive_plp/.
- Classes:
- Added
OptionMigrationservice that copies data from the old option keys (br_load_more_products,BeRocket_account_option,BeRocket_selector_wizard_status) to the new keys onadmin_initif the new key is empty. Idempotent viawwplp_migrated_v1marker. - Replaced
BeRocketUpdaterStubwithWebAlivePLPUpdaterStubthat declares BOTHWebAlive_PLP_updater(new) andBeRocket_updater(backward-compat alias) as empty classes, so both name-checks return true and the engine's updater bootstrap is skipped in both old and new lookup paths. - Note: internal
berocketstring still appears insrc/Admin/BrandingFilter.php(as the target of the runtimegettextcatch-all) and in comment references to the upstream plugin insrc/Admin/MigrationController.php— both intentional.
1.0.5
- Removed the
berocket-above-settings-bannerpromo banner from the settings page. Thedo_action('berocket_above_admin_settings', ...)dispatch inengine/berocket/templates/settings.phphas been removed, which was the sole trigger forberocket_admin_notices_rate_stars::show_ad_above_admin_settings(the only consumer of that hook).
1.0.4
- Visual rebrand of the settings page and premium-feature UI to the WebAlive duck SVG (
assets/images/wwplp-duck.svg):- Settings-page header logo (
engine/berocket/framework.php): replaced the BeRocket white-logobr_logo_white.webpimage and itsberocket.comlink with the duck SVG linked towebalive.dk. - Settings-page h2 title (
engine/berocket/templates/settings.php): now shows the duck SVG icon next to the plugin name. - Settings-page footer (
engine/berocket/templates/settings_footer.php): rewritten to show " — developed by WebAlive" with the duck SVG. Removed
- Settings-page header logo (
1.0.3
- Full user-visible rebrand — no more "BeRocket" surface in the admin UI:
- The engine's own updater / license / account system is disabled via a stub
BeRocket_updaterclass loaded before the engine boots. This removes the top-level "BeRocket" admin menu that previously appeared for admins with themanage_berocketcapability. - With the stub in place, the settings submenu is now correctly routed under WooCommerce → Webalive Product Load (
admin.php?page=wwplp), not underberocket_account. - BeRocket marketing / upsell funnels (
engine/includes/admin/funnels.php) are no longer loaded. - The bundled paid tripwire is skipped by defining
BLMP_VER_PAID_DISABLEbefore the engine boots. - Added
BrandingFilterservice: runtimegettext/ngettextfilter that rewrites residual "BeRocket" phrases to their Webalive equivalents in any translated string that reaches the UI, plus a belt-and-suspenders sweep ofberocket_*/brlmp_*admin bar nodes. - Menu label and settings-page title changed from "Load More Products" to "Webalive Product Load" via
info['norm_name']/info['full_name'].
- The engine's own updater / license / account system is disabled via a stub
- Fixed a broken
define()inengine/main.phpleft over from the 1.0.1 text-domain sweep (identifier contained hyphens). - Note: internal class names (
BeRocket_LMP,BeRocket_Framework, framework filter/hook names) are intentionally NOT renamed. They are internal, non-visible, and touch 2000+ occurrences across the engine — renaming would break third-party integrations and add no user-facing benefit. - Plugin file structure additions:
src/Admin/BrandingFilter.php,src/Compat/BeRocketUpdaterStub.php.
1.0.2
- Migration notice: expanded to detect three states of the upstream BeRocket plugin (active / installed-inactive / absent). When the upstream plugin is merely installed but inactive, a warning notice now instructs the site owner to delete it so it cannot be re-enabled by accident and clash with the bundled engine. When active, the notice is stronger (error style) and instructs both deactivation and subsequent deletion.
1.0.1
- Text domain unified: all bundled engine strings now use the plugin's own text domain
woo-wa-product-load-premium(previously mixed withBeRocket_LMP_domain,BeRocket_domain,BeRocket_AJAX_domain,BeRocket_products_label_domain). All engine strings are now owned by the plugin's translation workflow. - Fixed Poedit warnings: removed empty-msgid calls (
esc_html__($var ?? '', ...)) inlocked_features.phpandpost_label.phpwhere the msgid was a dynamic variable; replaced with plainesc_html(). - Fixed Poedit warning in
engine/main.php: unified the singular "Showing the single result" WooCommerce string usage to always use_n()so gettext no longer flags dual singular/plural usage of the same msgid.
1.0.0
- Initial release.
- Bundled BeRocket Load More Products engine (v3.2.2 fork) under
engine/. - Webalive PSR-4 shell (namespace
WebAlive\WWPLP). - New feature: subcategories rendered separately from products on shop / product taxonomy pages.
- Migration notice + one-click deactivation of the upstream BeRocket plugin.
- Update URI wired to
updates.webalive.dk.