A monumental release series transforming the theme options framework, multilingual engine, Page Builder storage model, and admin architecture into a unified, object-oriented system.
Version 2.5.0 – Core Stabilization & Feature Completion
- Options Translation by Default: Removed the
$translatedparameter fromget_option(); translated option values are now loaded by default, eliminating the need for a separate translation-aware call. - Translated Theme Options Fields: Added translatable fields in Theme Options (Site Title, Site Description, and others); translated data is filtered and rendered inline on the relevant settings tabs.
- CTA Button in Navigation: Added a Call-to-Action button option to Theme Options, rendered in both the top navigation bar and the hamburger menu with a dedicated hookable
Modalsrefactor. - Administration Tab in Theme Options: Added a new Administration tab in Theme Options with an option to restrict access to the Theme Options panel to specific user roles.
- Ads System: Introduced a hookable
Adsclass with arender_ads()method and abisteinoff_adaction hook for flexible ad placement. - Socials Expansion: Added LinkedIn and TikTok to the socials configuration; refactored the
Socialshookable class with improved security and added thebisteinoff_socials_configfilter. - Copyright Menu Class: Added the
bst-copyright-menuCSS class to the copyright navigation menu output. - Sitemap Architecture Overhaul: Refactored XML sitemap rendering to a smart deferred architecture; made
Sitemap::store_term_lastmod()public; added full sitemap XML render mode accessible only in admin; added support for Tribe Events posts. - CSS Dependency Chaining: Chained CSS script dependencies in the enqueue order to ensure correct load sequence.
- WooCommerce Updates: Updated
single-product/product-image.phpto removewp_is_mobile()logic and use.bst-carouselfor product thumbnails; added recently viewed products rendering; updated styling to WooCommerce 10.6.1. Fixed a fatal error caused by$attachment_idreceiving an empty string instead of an integer when a featured image is not set. - Layout Width Limit: Added a maximum layout width and block height constraint for screens wider than 1920px.
- Page Layout Alignment: Adjusted page header, page content, page body, and single post comments to align with the content block width.
- Footer Background Refactor: Corrected layout for footer sections with background images and refactored the
Footerhookable class. - FAQ Translations: Added post translation support and content translation to the FAQ component.
- Multilingual Admin Check: Added a multilingual status check in the admin Page Builder to prevent incorrect language tab rendering when multilingual is not active.
- Maintenance Mode Refactor: Refactored the maintenance mode template, options, and hookable class; made maintenance pages accessible to both administrators and editors.
- Security Hardening: Added a nonce to the
bisteinoff-testimonialsscript localization; fixed CSP header output; corrected inline script nonces; disabled Gutenberg’s inlineglobal-styleinjection. - Options Panel Security: Fixed saving of empty fields and resolved additional security issues in the options panel save path.
- Language Name Capitalization: Applied forced first-capital formatting to language names in the Choose Language modal.
- SEO Filters: Added new filters for customizing SEO template tags; removed sanitization on SEO meta output to prevent double-escaping.
- Weather API Stability: Refactored the remote weather API connection for improved reliability.
- Options Migration: Migrated internal option keys from
page_on_{type}topage_for_bisteinoff_{type}andbst_openweather_{type}tobisteinoff_openweather_{newtype}.
Version 2.5.1 – Admin Form Scaffolding
- Isolated Field Rendering Modules: Consolidated admin field sets into self-contained rendering classes, replacing scattered procedural HTML output.
- Options Panel Layout: Refactored panel spacing using CSS Flexbox to resolve display clipping under multi-tab configurations.
- Conditional Asset Enqueuing: Scoped media uploader dependencies to load only on Theme Options, Theme Design, and Page Builder admin pages, reducing unnecessary resource loading.
Version 2.5.2 – Design Kit Color System & Theme Design Overhaul
- AbstractOptionsPanel Base Class: Introduced
AbstractOptionsPanelas a shared base class forThemeOptionsandThemeDesign; migrated to aDIV-based Settings API layout, replacing the legacyTABLEstructure. - Brand Colors & Bootstrap 5 Colors Tabs: Added a new Brand Colors tab to Theme Design and renamed the Semantic Colors tab to Bootstrap 5 Colors.
- Color Palette Field: Introduced a new
color_palettefield type with a pop-up Color Palette picker,get_theme_colors()andget_theme_gradients()methods, CSS custom property and token output, and live swatch synchronization when primitive colors change. - Gradient Palette Field: Added a gradient palette field with a dedicated
render_gradient_palette_field()method and reusablerender_color_palette_field_by_type(); removed the old<select>-based color and gradient field methods. - Buttons Tab: Added a Buttons tab in Theme Design with controls for border width, border radius, and X/Y padding for all button types. Replaced the
bst-btnclass withbst-primaryas the primary button class. - Sections Tab: Added gradient palette fields to the Sections tab in Theme Design.
- Heading Field: Added a
headingfield type to the options panel for section group titles. - JSON Config in JavaScript: Added support for passing configuration JSON data from PHP to JavaScript via a localized variable.
- SVG Icon System: Introduced a hookable
SVG_Iconsclass for outputting and referencing the SVG sprite; switched from footer inline SVG sprites to a cached external SVG sprite file for improved browser caching. - SVG Sprite Build Pipeline: Added
package.json,package-lock.json, andgulpfile.mjswith/src/asset source folders; resolved CSS compilation errors and SVG sprite ID conflicts in the build. - Media Uploader Fix: Fixed media uploader enqueuing on
post.phppages where it was previously missing. - CSS Builder Compatibility: Updated
base.min.cssgeneration logic for compatibility with the new Design Kit color system; updated legacy CSS variables.
Version 2.5.3 – Theme Options Panel UI Rebuild
- Options Panel Brand Styling: Added the Bisteinoff brand logo, applied the Sora Google Font to the options panel H1, and rebuilt the panel header styling.
- Tab Group Titles & Styling: Added tab group title support; rebuilt tab styling with new primitive colors, borders, and panel body and footer layout.
- WP Admin Bar Contact Link: Added a direct contact link to the WordPress admin bar.
- Button & Border Radius Codex: Added ghost buttons, danger buttons, ghost danger buttons, and a border radius codex section to the Theme Options styling reference.
- Color Tokens: Added checkbox, radio, and contextual color tokens to the options panel.
- SVG Icons Update: Updated SVG icon definitions across Theme Options and Theme Design to use SVG sprite IDs via the new
get_admin_icon()method. - Admin Icon Class: Added the
bst-iconCSS class for SVG icon elements in the admin panel. - SVG Fill Attribute Preservation: Corrected SVG sprite build to preserve
fillandstrokeattributes. - Help & News Widgets: Added Help and Latest News sidebar widgets to the Theme Options panel.
- Notice Styling: Added admin notice styling and split the template render method into sub-methods.
Version 2.5.4 – Admin Form Engine Hardening
- FormComponents Namespace Migration: Moved
FormComponentsto theBisteinoff\Adminnamespace to make it reusable across metabox, options panel, testimonials, and other admin contexts. - FormComponents API Standardisation: Standardised all
FormComponentsmethod signatures to( $id, $value, $args = [] ); added optionalnameanddescriptionparameters; added new methods for form controls used in the options panel. - Checkbox and Radio Fieldset Extraction: Moved
checkbox_fieldsetandradio_fieldsetrendering fromOptionsPanelintoFormComponents, making them available as shared, reusable components. - FormComponents Method Renames: Renamed
select_cat()→taxonomy_select(),select_form()→cf7_select(), andselect_modal()→modal_select()for clarity. - OptionsPanel Delegated to FormComponents: Refactored
OptionsPanelfield rendering methods to delegate output toFormComponents; sorted field rendering methods alphabetically. - BEM Classes in Options Panel: Applied BEM naming to HTML classes in the options panel, language labels, and tab elements.
- Security Improvements: Fixed multiple security issues in Theme Options save and render paths.
- Checkbox Hidden Input Fix: Fixed a bug where a
checkbox_fieldsetwas incorrectly reading its value from a hidden input. - Multilingual URL Fixes: Fixed a broken
home_urlfilter and incorrect link generation in language versions. - Media Uploader Enqueue Fix: Fixed media uploader not being enqueued on
post-new.phppages; applied correct button styling in the metabox. - Theme Check Plugin Compliance: Resolved all issues flagged by the Theme Check plugin.
Version 2.5.5 – WooCommerce Metabox & Admin Script Isolation
- WooCommerce MetaboxRenderer Integration: Refactored the WooCommerce video gallery metabox to use
MetaboxRenderer; moved video gallery JavaScript logic fromwoo-product-video-gallery.jsintomedia-uploader.js; updated video gallery component HTML classes to follow BEM naming. - Product Video Gallery Migration: Added a database migration renaming the
_product_video_gallerymeta key to_bst_product_video_gallery_ids; moved all migrations to the/admin/migrations/directory. - WooCommerce Video PHP Class Refactor: Refactored the
VideoPHP class within the WooCommerce module. - Admin Testimonials Module: Added
Bisteinoff\Admin\Modules\Testimonialsto isolate admin-only testimonials logic; movedget_default_settings()to the front-end testimonials class. - Testimonials Metabox Classes: Added the
postboxCSS class to Testimonials and Media Gallery metaboxes; added a layout icon to the SVG sprite and rendered it in the Page Builder metabox header. - Metabox Status Class Rename: Renamed the element status CSS class from
bst-section-statustobst-metabox__status. - Page Builder Admin SCSS Build: Added Page Builder admin SCSS to the CSS render rules.
- SEO Module Isolation: Moved SEO admin-only logic to
Admin\Moduleswith a separately enqueued JavaScript file and corrected script localisation.
Version 2.5.6 – Metabox Architecture & Field Rendering Refactor
- MetaboxRenderer Refactor: Refactored the
MetaboxRendererclass with full PHPDoc coverage; introduced aMetaboxRenderer::register()static method; removed stale per-user metabox ordering options. - FieldsManager Refactor: Renamed the
post_metabox_field()method torender_field(); simplified field rendering logic inFieldsManager::render_field_inner(); removed the redundanthide-sectionfield type. - MetaboxSaver Extraction: Separated save logic into an abstract
MetaboxSaverclass and a concretePostMetaboxSaverclass. - MetaboxData Class: Introduced
MetaboxDataas a centralised, extendable class for retrieving metabox field configuration arrays; updatedMetaboxHandlerandTermMetaboxHandlerto retrieve fields data viaMetaboxDatamethods. - Term Metabox System: Added term metabox handler, renderer, and saver; extended
FieldsManagerwith a$contextparameter (alongside a renamed$object_id) to support both post and term metabox contexts; deprecated the legacybisteinoff_seo_taxonomiesfilter. - SEO Class Consolidation: Removed the now-empty
SEOclass shell; renamedSEO_Tags→SEO; removed themetabox-seo.phptemplate (retained only for term metaboxes). - Centralised SEO & Slide/Feature Metaboxes: Moved SEO, Slide, and Feature metabox rendering into
MetaboxHandler; addedcheckbox-fieldsetfield type to the metabox system; migrated contact page data to the new field structure. - SVG Icons in Metaboxes: Added SVG sprite icon search and translation in metaboxes; applied BEM naming to the SEO metabox snippet preview block; removed redundant sanitize calls on
get_post_meta()/get_term_meta()output. - Sitemap Fix: Made
Sitemap::store_term_lastmod()public to allow correct invocation from term hooks. - Double-Escaping Removal: Removed unnecessary escape function wrapping in Theme Options to prevent
esc_html(esc_html())double-encoding. - PHPDoc Cleanup: Removed
@accessand redundant@finaltags; normalised spacing in PHPDoc blocks across the codebase.
Version 2.5.7 – Admin UI & Metabox Styling
- WP 7.0 Compatibility: Verified and confirmed compatibility with WordPress 7.0.
- Updated Admin Color Palette: Updated the admin color palette; applied correct button styling to the metabox via
MetaboxRenderer; updated media uploader HTML classes andbst-formcontrol classes. Updated options panel styling for compatibility with WordPress 7.0. - News Widget Styling: Updated the News sidebar widget styling in the options panel with a gradient treatment.
- Options Panel Final Styling: Applied final styling pass to the options panel layout and SCSS structure.
- Tab-Switching Flexbox Preservation: Added
bst-metabox__field-wrapperto maintain Flexbox display state correctly when switching between metabox tabs. - BEM Metabox Classes: Applied BEM naming conventions to all metabox HTML class attributes.
- Metabox Conditional Tabs: Added conditional tab output logic — tabs are suppressed when only one unique tab slug exists across all rendered fields.
- Translated Button in Metabox & Options Panel: Centralised translated field button rendering into a shared method used by both the metabox and options panel.
- Language Flags in Fields: Added language flag indicators to translated text, textarea, and WYSIWYG (TinyMCE) fields in the metabox and options panel; added input group styling for translated field groups; moved flags from
<label>elements to the input group wrappers; moved language-related CSS to a separate file loaded only on multilingual sites. - Admin Form ARIA Compliance: Added
bst_prefix to field IDs in the options panel; addedaria-labelto translated text and textarea fields lacking a visible<label>; removed theforattribute from<label>elements where it is not applicable. - Testimonials Name & City Translation: Added translatable output of testimonial name and city on the front end.
- Theme Helper Methods: Added
is_default_language()andis_multilingual()methods to the core theme class. - Admin Assets Class Split: Moved admin assets from
Bisteinoff\Assetsto a dedicatedBisteinoff\Admin\Assetsclass; addedenqueue_theme_core_scripts()method. - Metabox HTML Optimisation: Removed redundant styling rules; optimised post and gallery container HTML class output.
- Builder Layout Icon Fix: Fixed icon fieldset grid layout in the Page Builder; updated builder admin to use standard WordPress UI buttons and applied the updated color palette.
Version 2.5.8 – Admin Form Video Gallery & Display Field Types
- Video Gallery Form Component: Added a
video_galleryfield type toFormComponentsfor configuring video gallery inputs in metaboxes. - Display Field Output Formats: Added
display,display-email, anddisplay-urloutput format modes to the metabox field renderer for read-only field presentation. - MetaboxRenderer Screen Detection Caching: Added in-memory caching of screen type data in
MetaboxRenderer::is_applicable_screen()to avoid redundantget_current_screen()calls. - CPT Data Caching: Added in-memory caching of custom page type and template data in the CPT class.
- Theme Options HTML Entities Fix: Fixed use of raw
<and>inside__()translation strings, replacing them with<and>.
Version 2.5.9 – Consolidated Taxonomy Handlers
- Object-Oriented Term Metabox System: Introduced type-safe abstract metabox controllers for unified handling of rendering, saving, and field configuration across both post and term metabox contexts.
- Redundant Escaping Elimination: Removed stacked, duplicate sanitization calls from theme option output paths.
- Legacy Hook Deprecation: Permanently retired the
bisteinoff_seo_taxonomiesfilter and other obsolete structural filtering functions.
Version 2.5.10 – Dynamic Media Gallery Extensions
- Extensible MetaboxData: Made
MetaboxDataextendable by child classes, enabling child themes to customise or extend metabox field configuration without modifying core files. - Theme Options HTML Entities Fix: Corrected use of raw angle brackets inside translatable strings, replacing them with HTML entities to prevent rendering issues.
- Video Gallery Form Component: Added the
video_galleryform component toFormComponentsfor use in WooCommerce product video gallery metaboxes.
Version 2.5.11 – WooCommerce Integration & Metabox Refinements
- WooCommerce MetaboxRenderer Integration: Refactored the WooCommerce product video gallery metabox to use the shared
MetaboxRendererclass; migrated video gallery JavaScript from a dedicated file intomedia-uploader.js; updated HTML classes to BEM naming. - Product Video Gallery Meta Key Migration: Added a database migration renaming
_product_video_galleryto_bst_product_video_gallery_ids; consolidated all migration files under/admin/migrations/. - Admin Testimonials Module: Extracted admin-only testimonials logic into
Bisteinoff\Admin\Modules\Testimonials; movedget_default_settings()to the front-end testimonials class. - Screen Detection Caching: Added in-memory caching in
MetaboxRenderer::is_applicable_screen()to prevent redundantget_current_screen()lookups during metabox registration. - CPT Data Caching: Cached custom page type and template data within the CPT class to avoid repeated filesystem reads.
Version 2.5.12 – Admin Form Label & Flag Refinements
- Centralised Label & ARIA Output: Refactored label and
aria-labelrendering in the metabox to use centralisedFormComponentsmethods. - Field ID Prefix: Added the
bst_prefix to all field IDs in the options panel for namespacing consistency. - Flag Indicators on Translated Fields: Added language flag indicators to translated textarea and WYSIWYG (TinyMCE) fields; implemented input group styling for translated field groups; moved flag output from
<label>elements to the input group wrapper; corrected.bst-lang-flagstyling and separated it into a deprecated legacy block. - Blogname & Blogdescription Flags: Added language flag indicators to the Site Title (
blogname) and Site Description (blogdescription) fields in the multilingual settings. - Metabox Field Wrapper: Added
bst-metabox__field-wrapperto maintain Flexbox display state when switching between metabox tabs. - BEM Metabox Classes: Applied BEM naming conventions throughout the metabox HTML output.
- Conditional Metabox Tabs: Implemented conditional tab suppression — tabs are hidden when all rendered fields share a single tab slug.
- Testimonials Name & City Translation: Added translatable front-end output for testimonial name and city fields.
- Theme Helper Methods: Added
is_default_language()andis_multilingual()to the core theme class. - Admin Assets Split: Moved admin asset enqueuing from
Bisteinoff\Assetsto a dedicatedBisteinoff\Admin\Assetsclass; introduced anenqueue_theme_core_scripts()method. Language-related CSS is now loaded in a separate file, enqueued only on multilingual sites. - Metabox HTML Optimisation: Removed redundant CSS rules; optimised post and gallery container HTML classes.
- Admin CSS Fixes: Fixed options panel top margin after WP admin notices; standardised
.labelstyling to match the native<label>element; used SCSS$breakpointsmap for all@mediaqueries in admin SCSS.
Version 2.5.13 – Asynchronous Workspace Stabilization
- Builder UI Buttons: Replaced custom-styled builder interface buttons with standard WordPress UI buttons and applied the updated admin color palette.
- Builder Layout Icon Grid Fix: Fixed the icon fieldset grid layout in the Page Builder admin workspace.
- SEO Module Scoping: Moved SEO admin-only logic to
Bisteinoff\Admin\Moduleswith a separately enqueued JavaScript file; corrected script localisation. - Testimonials Default Settings: Moved the
get_default_settings()method to the front-end testimonials class, removing it from the admin module. - Media Uploader & WYSIWYG Styling: Fixed metabox media uploader and WYSIWYG (TinyMCE) field styling.
- Translated Field Flexbox Fix: Fixed Flexbox layout of translated fields in Theme Options.
Version 2.5.14 – PHP 8.2 Alignment & Multilingual Engine (Major Milestone)
- PHP 8.2+ Compatibility: Completed a comprehensive refactor of the theme’s core engine, replacing legacy constant-based patterns with type-safe, method-driven equivalents throughout.
- Core Class Rename: Renamed
Bisteinoff\ThemetoBisteinoff\Coreand its file accordingly; added__unserialize()method and improved error loading messages. - Sub-Theme Removal: Removed the
BISTEINOFF_SUB_THEMEconstant, theBisteinoff\SubThemeclass, the deprecatedbisteinoff_template_part_path()function, and all sub-theme template files. - Public require_once(): Made
Core::require_once()public, replacing the equivalent method inAdminLoader. - Admin Page Folder Structure: Renamed admin panel classes —
AbstractOptionsPanel→AbstractSettingsPanel,ThemeOptions→WebsiteSettings,ThemeDesign→DesignSettings— and moved them to theBisteinoff\Admin\Pagesnamespace. Renamed admin folders (theme-options→website-settings,theme-design→design-settings) and updated page slugs accordingly. - Languages Settings Page: Added a dedicated Languages Settings page in Theme Options for managing configured languages from the admin panel.
- Decoupled Translation Modules: Separated the multilingual system into independent
LoadandContextclasses under theBisteinoff\Multilingualnamespace, each with single-responsibility scope. Moved multilingual navigation to a dedicatedBisteinoff\Multilingual\Hooks\Navclass. - Database-Tracked Locale Tables: Migrated locale context from hard-coded runtime files to dynamic database-driven tracking;
create_language_tables()now relies on the Languages Settings rather than the removedBISTEINOFF_SITE_LANGUAGESconstant. - Legacy Constants Removed: Removed
BISTEINOFF_LANG_CODE,BISTEINOFF_LANG_PREFIX,BISTEINOFF_LANG_DIR,BISTEINOFF_LANG_SLUGS,BISTEINOFF_DEFAULT_LANG_SLUG, andBISTEINOFF_LANG_SLUG; replaced with static methods on theContextclass (get_current_locale(),get_current_lang_dir(),current_slug(),primary_language(),all_languages(),secondary_languages()). - Locale-Based Table Key Method: Replaced the
BISTEINOFF_LANG_PREFIXconstant with acurrent_table_key()private method in theDatabasehooks class; addedpreg_quote()around locale slugs in regex patterns to support hyphenated locales such asfr-ca. - Locale-Aware Menu Mapping: Added
Bisteinoff\Multilingual\Hooks\Nav; removed multilingual navigation logic fromBisteinoff\Hooks\Nav. - Translated Field Attribute Rename: Replaced the
langHTML attribute on translated fields withlocalethroughoutOptionsPanelfield registration methods andFormComponentstext, textarea, and WYSIWYG methods. - Published Language Support: Added a Published checkbox to the Add Language widget UI; added
Core::is_admin_or_editor()method;Context::$published_onlyis now set based on this check; language output differentiates between enabled/disabled and published/unpublished states. - LanguageData from WordPress API: Refactored
LanguageDatato fetch base language data from the WordPress translations API; added country variants to previously existing languages. - Translation Prefix Rename: Renamed the
bst_translated_field prefix tobst_t_; removed thebisteinoff_replace_prefix()helper function. - Dynamic Lang CSS Generation: Removed static
lang.scss/lang.cssfiles; added PHP-based minified CSS generation includinglang.min.csswith flag icons for all enabled/disabled and published/unpublished language states. Addedlang.min.cssto.gitignore. - Activation Environment Guards: Added pre-activation checks enforcing minimum PHP and WordPress version requirements, blocking installation on incompatible server environments.
- Default Checkbox & Radio Values: Added default value support for
checkbox_fieldsetandradio_fieldsetfields when no data exists in the database yet. - Single Tab Suppression: Added logic to hide the tab wrapper in the options panel when only one tab is present.
- Testimonials Settings Rendering: Updated Testimonials Settings page to render fields via the centralised options panel render methods.
- Language Settings UI Fixes: Corrected flag rendering for the primary language default; fixed metabox field rendering and saving for language-related fields; resolved layout issues in the language settings data table including proper class assignment on row addition.
Version 2.5.15 – Centralised API & Asset Architecture
- API Directory Consolidation: Moved all API-related functionality into a unified
/inc/api/directory, replacing dispersed module references with a single orchestration entry point. - Centralised Widget Rendering: Refactored SEO, Socials, and Security admin widgets into a shared rendering system with standardised output and updated styling.
- Theme Constants Restructure: Renamed
BISTEINOFF_TEMPLATEPATHtoBISTEINOFF_TEMPLATE_DIRand introduced six additional path and URI constants (BISTEINOFF_TEMPLATE_URI,BISTEINOFF_ASSETS_DIR,BISTEINOFF_ASSETS_URI,BISTEINOFF_ADMIN_ASSETS_DIR,BISTEINOFF_ADMIN_ASSETS_URI), replacing ambiguous legacy definitions and removing the unusedBISTEINOFF_THEME_DEV_MODEconstant. - Assets Class Refactor: Consolidated asset enqueuing logic into a new
Assetsorchestrator class, distributing related responsibilities acrossOptimizer,Scripts, andThemeLoader. AddedThemeLoader::debug_component_names()for future diagnostic use. - Metabox Layout Defaults: Changed the default metabox layout to single-column, retaining two-column layout for advanced, normal, and Template Settings metaboxes only.
Version 2.5.16 – Interface Animations, Sanitization & Builder Parity
- Skeleton Loading Animation: Added CSS skeleton animation to Page Builder modal content while field data loads, improving perceived responsiveness.
- Modal Blur Effect: Applied a CSS blur treatment to the background when a Page Builder modal is open, visually focusing attention on the active configuration overlay.
- Centralised CSS Class Sanitizer: Introduced
Bisteinoff\Helpers\Sanitizerwithcss_class()andcss_classes()methods for consistent, reusable class name sanitization across the codebase. - Page Builder Field Parity: Aligned translated text, URL, and number fields in the Page Builder with the rendering and saving behaviour of equivalent post and term metabox fields, including WYSIWYG (TinyMCE) field parity.
- FormComponents Integration: Refactored Page Builder input rendering for text, number, and URL fields to use shared
FormComponentsmethods, eliminating duplicated field markup. - Section Component Refactor: Renamed internal builder component properties (
label → title,dashicon → icon) and refactored theSectioncomponent for consistency with the updated interface contract. - Admin Panel Color Fixes: Removed redundant SCSS color variables from the options panel and corrected dark grey to black for improved visual hierarchy.
- Unpublished Language Border Indicator: Newly added languages in Language Settings now display with a yellow border to indicate unpublished status.
Version 2.5.17 – Design Settings & Child Theme Stability
- Color Helper Relocation: Moved color utility methods into
Bisteinoff\Admin\Pages\DesignSettings, consolidating color-related logic within the appropriate admin page class. - Child Theme Fatal Error Fix: Resolved a fatal error occurring on parent-to-child theme switch caused by premature class initialisation in the multilingual bootstrap sequence.
Version 2.5.18 – Page Builder Storage Overhaul (Major Milestone)
- New Storage Model: Replaced the previous mixed-blob metadata approach with a unified, direct class string architecture. All Page Builder layout data is now stored and retrieved through a single structured metadata key, eliminating the
bst_builder_countersmeta key, thebst_builder_edited_elementsandbst_builder_remove_elementshidden fields, and all associated JavaScript tracking logic. - Frontend Output Updates: Updated front-end rendering methods for section, row, column, and block elements to read from the new metadata structure.
- Centralised AdminTemplates Class: Replaced multiple small PHP template files with a single
AdminTemplatesclass responsible for all metabox and modal HTML output, and refactored the AJAX handler accordingly. - Admin Data Flow Refactor: Refactored admin PHP scripts for load, templates, assets, metabox, save, and AJAX into a clear pipeline where page data is fetched via
Admin::get_admin_page_data(), passed to the metabox, and forwarded to section render templates. - Builder Bug Fixes: Fixed a PHP type coercion bug with the hidden element status in
render_element_data(); corrected wrong callback references inAdminAjax::render_element_data(); fixed thebst_builder_modal_idhidden field in the standard modal form; resolved doublewp_unslash()application inload_modalthat corrupted escape sequences; fixed block ID collection for unique ID validation; and corrected thenameattribute on language-related builder fields. - AJAX Simplification: Simplified
AdminAjax::render_element()and moved parent ID validation into this AJAX method, reducing duplication with the save path. - Component Refactors: Refactored shortcode, slider, title, WYSIWYG (TinyMCE), Code, and Embed components; updated Code and Embed with proper sanitization and PHPDoc.
- Unpublished Preview Access: Unpublished language versions of a page are now accessible to administrators and editors; all other users receive a 302 redirect.
- Multilingual Migration: Added a database migration to transform and remap Page Builder data for all existing locale versions, including unpublished and non-enabled locales. Migration correctly handles empty builders and removes stale metadata after migration.
- JavaScript Build: Added minified production builds of Page Builder JavaScript bundles.
Version 2.5.19 – Multilingual Database Integrity & Builder Refinements
- Foreign Key Constraints on Locale Tables: Added foreign key constraints to locale
postmetaandtermmetatables, enforcing referential integrity between locale metadata and their parent post or term records. - Locale Table Cleanup on Removal: Implemented automatic removal of locale database tables when a locale is confirmed as removed. Additionally, orphaned
postmetaandtermmetarows are now deleted when their associated post ID or term ID is removed. - Page Builder & Code Formatting Options: Replaced the
BISTEINOFF_PAGE_BUILDER_SCREENSandBISTEINOFF_CODE_FORMATTINGconstants with database-backed theme options, allowing these features to be toggled from the admin panel without code changes. - Code and Embed Component Refactor: Refactored the
CodeandEmbedPage Builder components with improved sanitization logic and complete PHPDoc coverage. - Content List Template Part: Added the
content-list-item.phptemplate part for use in list-style content layouts. - Language Navigation Fix: Corrected URL generation for language version navigation links; refactored URL parsing utilities used by the language switcher.
- Modal Double Unslash Fix: Resolved a data corruption bug where
wp_unslash()was applied twice during modal load, corrupting newline and quote characters in stored content.
Version 2.5.20 – Post Duplication & Database Migration Hardening
- Duplicate Post Across All Languages: Added a new admin action to duplicate a post simultaneously across all configured language versions, creating locale-specific copies in a single operation.
- Trash State Duplication Guard: Prevented the duplicate post action link from appearing for posts in the Trash, avoiding unintended duplication of discarded content.
- Orphaned Row Purge on Migration: Extended the locale
postmetaandtermmetamigration to purge orphaned rows from existing tables before applying foreign key constraints, ensuring constraint addition succeeds on pre-existing data. - Idempotent Foreign Key Migration: Refactored the foreign key migration method to be safely re-runnable, checking for existing constraints before attempting to add them to avoid errors on repeated execution.
Version 2.5.21 – WooCommerce Translation Support
- Post Excerpt in Locale Tables: Added the
post_excerptfield to locale post database tables, enabling translation of post excerpts alongside other translatable post fields. - WooCommerce Translations Metabox: Introduced a dedicated metabox for managing WooCommerce product field translations within the multilingual admin interface.