5.0.0
22-08-2026Breaking
- The MetForm form styler has been removed. MetForm builds its forms for Elementor rather than Divi: a MetForm form placed in a Divi page is an Elementor document rendered by Elementor, which writes its own CSS for each field scoped to that page and widget — four classes deep, with ids that differ per form — so the styler's colours and fonts lost to it every time and could not be made to win. Its fields are Elementor widgets too, which left the select-field settings with nothing to style. The module had also stopped registering: the class it detects MetForm by does not exist in current MetForm, so it was unreachable in the builder. A page still using the module will show it missing; the module was off by default, so this reaches only sites that turned it on and built with it.
New
- A button icon can be kept out of sight until the button is hovered in Divi 5, on Flip Box's two slide buttons, Dual Button's pair and Post Grid's Load More, with the choice of revealing it on its own or letting the text move with it. Both settings exist in the classic builder and had nothing to convert to.
- A button can show an image in place of its icon in Divi 5, on Flip Box's two slide buttons, Dual Button's pair and Post Grid's Load More. All three offer the choice in the classic builder and rendered only the icon, so an image chosen there arrived with nothing to show it.
- Post Carousel can space the parts inside each slide and align their text in Divi 5. The spacing settings the classic builder offers for a slide's element wrapper and its individual elements had no counterpart, and a converted page dropped them.
- Seven more form stylers can style the message shown against a field that failed validation: WPForms, SureForms, Fluent Forms, Formidable, Everest Forms, Happyforms and weForms. Only Gravity Forms and Ninja Forms had settings for it, so on the others the classic builder's spacing for that message arrived with nowhere to go.
- Business Hours can draw its divider between each day and its hours in Divi 5. The line's colour, style, thickness, length and corner rounding are settings the classic builder has; the Divi 5 module styled the line but never rendered it.
- Post Reading Time can draw its divider line in Divi 5. The line's colour, style, thickness, length, corner rounding and position are all settings the classic builder has; the Divi 5 module styled the line but never rendered it, so none of them had anything to apply to.
- Three last settings from the classic builder now work in Divi 5: the spacing around a Flip Box slide's icon, the colour of a label beside a checked Gravity Forms choice, and the space above and below a Gravity Forms footer. Each needed writing directly — a checked label is a state rather than an element, and the footer's spacing comes from the form plugin's own variables.
- The Load More button on Post Grid can be styled in Divi 5: the icon's colour and size, the gap between icon and text, a width of the button's own, how its contents sit within it, where it sits across the grid, and the colour and size of the spinner shown while the next set loads. Divi styled the button but none of what is inside it.
- The Ninja Forms styler gained its form title, its per-field validation message and its field heights in Divi 5. The title and the validation message had no settings of their own, and the height of a field could not be set at all — Divi styles these fields natively, which covers everything about them except how tall they are. All three are settings the classic builder has.
- The Divider can fill, outline and clip its own text in Divi 5, the same way Typing Text now can: a fill colour inside the letters, a stroke around them, and the module's background showing through them rather than behind. The classic builder has offered this on the divider's text since it shipped.
- Every form styler can colour and size its checkboxes and radios in Divi 5. All eleven offered both settings and neither did anything: browsers draw these two controls themselves and honour only one colour property, which Divi has no setting for, and the size had to be applied to the inputs alone rather than to the labels beside them. Both work now, in all eleven, and a page converted from the classic builder keeps what it set.
- Typing Text can fill, outline and clip each piece of its text in Divi 5. The prefix, the typed text and the suffix each take a fill colour inside the letters and a stroke around them, and can show the module's background through the letters rather than behind them. The classic builder has offered all of this on all three pieces; Divi 5 had none of it, so a heading built this way converted to plain text.
- Each button in a Dual Button can be styled on its own in Divi 5: the icon's colour and size, the gap between icon and text, whether the icon leads or follows, a width of the button's own rather than one that fits its text, and how its contents sit within it. The separator between them has offered all of this since it shipped; the two buttons had only their text, link and icon, so a page that styled them in the classic builder arrived unstyled.
- A Flip Box button can be laid out and given its own icon styling in Divi 5, on each side independently: the icon's colour and size, the gap between icon and text, whether the icon leads or follows, a width of the button's own rather than one that fits its text, how its contents sit within it, and where the button sits across the slide. All eight are settings the classic builder has, and a converted page keeps them.
- A Flip Box slide can arrange what it holds in Divi 5: where the icon sits relative to the text and how much room it takes, how the icon lines up within that room, how large an image used in place of an icon is, how the text is aligned, and the space between the slide's parts — each side on its own. All nine have been in the classic builder since it shipped and a converted page keeps them.
- Flip Box slides can be arranged, layered and timed in Divi 5. The parts of a slide — icon, title, sub-title, body and button — can be reordered within it and lifted above one another where they overlap, on each side independently, and the flip's own duration, delay and speed curve are settable rather than whatever the stylesheet happened to say. All three have been in the classic builder since it shipped, and a converted page now keeps the arrangement it had.
- Each side of a Flip Box can be styled on its own in Divi 5. The module carried no per-element design settings at all, so a background, a title colour or a button style applied to both faces at once or to neither — an odd limitation for a module whose whole point is two different faces, and the reason 91 of the classic builder's settings had nowhere to go. The slide, icon, title, sub-title, body and button are now separately styleable on each side, and a page converted from the classic builder keeps the typography, icon colour and size, and slide spacing it already had.
- Post Grid and Post Carousel let you pick categories and tags from a list in Divi 5. Both settings were text boxes asking for comma-separated term ids, which meant looking each one up by hand, and the classic builder's "All Categories" and "Current Category" choices could not be expressed at all — they are words rather than ids. Both now show the site's own terms as a checkbox list, with those two choices at the top of the categories one, and start on All Categories rather than on nothing. The terms come from the list Divi already publishes to the builder, so no extra request is made for them.
- A form styler for weForms, in both builders. weForms is the one form plugin the big Elementor add-on packs style that this library did not — Essential Addons and Happy Addons both ship a widget for it — and it renders in PHP through
[weforms id="…"], so the same twelve design groups apply. It is built on WP User Frontend and keeps that vocabulary: the form is aofitems, each holding a.wpuf-labeland a.wpuf-fields, with help text inspan.wpuf-helpand the submit button in its own ``. The submit button is matched by position rather than class, because weForms swaps its classes depending on the form's "use theme CSS" setting and the only stable one carries the form id. - A form styler for Happyforms, in both builders. Happyforms renders in PHP through
[happyforms id="…"], so the same twelve design groups apply as on the other stylers — wrapper, fields, select, labels, description, placeholder, checkbox and radio, footer, submit button and the error and success notices. Its markup is its own: parts rather than fields, with the label text in a nested span and the submit button living inside its own part. Happyforms is also the first styled plugin that marks its own CSS!important— the submit button's border and radius, and the radius on a prefixed or suffixed input — and no selector, at any length, beats!important. Those groups answer withimportantof their own through Divi's style engine, which is the only thing that can win. - A form styler for Everest Forms, in both builders. It joins the eight that were already here, and with Happyforms and weForms behind it the free library is 67 modules and eleven of the form plugins a Divi site is likely to be running can be styled from the builder rather than from a stylesheet. Everest Forms renders its form in PHP through the
[everest_form]shortcode, which is what makes it stylable at all — the design groups target the markup its own renderer emits, so they hold for a form built out of any field types. Alongside the wrapper, fields, labels, placeholder, checkbox and radio, submit button and the error and success notices, it adds a Field Description group: Everest Forms renders per-field help text that none of the sibling stylers has an equivalent for. Everest Forms also ships an opt-in per-form theme stylesheet whose rules run seven classes deep, so the field, label, checkbox, footer and submit-button styles are marked important through Divi's own style engine rather than answered with a longer selector that a markup change would break. - Charts are now authored in a data table rather than three text boxes that had to agree with each other. Categories, values and series are typed into a grid, each row and column can carry its own colour, and the module reads it the same way Divi's own Charts module reads its table — so a chart set up in one is understood by the other. Five chart types join the original four: Area, Radar, Polar Area, Scatter and Bubble. Scatter and Bubble are Divi 5 only, because they plot two or three numbers per row and the classic builder's text boxes cannot express that. Charts saved before this release keep rendering from their text boxes until the table is filled in.
- Every module now carries an icon drawn for it. The eleven form stylers show their plugin's own brand mark — Contact Form 7, WPForms, Gravity Forms, Fluent Forms, Formidable, Ninja Forms, SureForms, Forminator, Everest Forms, Happyforms and weForms — and the rest have a glyph drawn to depict what the module actually does rather than the nearest generic shape from a stock icon library: the data table has sortable columns, Image Hotspots has pins on an image, Pricing Table has tiers. The same drawing is used everywhere a module appears, so the module palette, the classic builder and the Visual Builder no longer show three different pictures of the same thing.
- Divi 5 modules gained four option groups they had never offered, all of which Divi provides for its own modules: Interactions, so a module can respond to a click or hover; Custom HTML Attributes, for adding your own
data-oraria-attributes; the wrapper Element Type together with the HTML Before and HTML After fields; and the Loop option. Each of these is something Divi implements centrally and offers to any module that asks for it — ours never asked, so the panels simply were not there. Available on all 68 parent modules. Post Grid and Post Carousel do not take the Loop option, for the same reason Divi withholds it from its own Blog and Portfolio: those modules already run a query of their own. - Divi 5 modules gained the module-level Link option, which turns the whole module into a link. It is offered on 39 modules. The ones left out are those that already carry a link of their own — Advanced Button, Dual Button, Icon Box, Video Popup and the like — along with the form stylers, where an outer link would swallow the form's own submit, and Breadcrumbs and Table of Contents, which are lists of links already. Divi makes the same exclusions for the same reasons.
- Post Grid and Post Carousel now show real posts while you edit. The builder used to draw one placeholder item whose parts were labelled with their own names — "Post Title", "Featured Image", "Post Content" — so columns, gaps, image ratios and excerpt lengths could not be judged against anything. Up to four of your own posts are now drawn by the same code that renders them on the page, and they update as you change the query or the layout.
- The form stylers now show the real form in the Visual Builder, drawn by the same code that renders it on the page. The builder previously took the markup from an internal value Divi keeps for shortcode modules, which is why a preview could disagree with the published page.
- The Checkbox and Radio size setting now actually resizes the control. Browsers draw native checkboxes and radios themselves and ignore width and height, so the field appeared to work and did nothing on every form styler. The control is now taken over when a size is set — which also means this plugin draws the tick and the dot the browser stops drawing, and carries the chosen colour through to the border and the checked state, so a form styled with both fields looks the way it did.
- The classic builder gained design fields for parts of a Gravity Forms form that only Divi 5 could style: the section break and its title and description, list fields and their column headers and cells, the buttons that add and remove a list row, field sub-labels, and the required marker. The selectors for these had been in place since 3.2.0 with no fields behind them.
- The Forgot Password and Reset Password switches on the Extensions page now do something. They have always been listed there, but nothing was wired to them: with Login Experience enabled, the lost-password and reset-password screens were replaced by your Divi pages whether those two switches were on or off. Each now decides its own screen, so you can hand either flow back to WordPress's own form while keeping your custom login and register pages. Sites already using Login Experience keep every screen they had — both switches are turned on for them, so nothing changes until you decide otherwise.
Bug fixes
- Both carousels drew none of their own controls in the Visual Builder — the arrows, the pagination and its bullets, the Image Carousel's progress bar and the Logo Carousel's slide wrapper. Each carries a design group, so each had nothing to style there while a saved page styled it. The bullets are drawn statically: Swiper builds the real ones and does not run in the builder, and running it there would have it fighting the builder for control of the markup.
- Seventeen more modules styled every one of their design groups on a published page and only some of them in the Visual Builder — the builder half of the same split that left thirteen modules' settings off the page, further down this list: Chat Button's panel, Data Table's rows, Timeline's track, the four auth forms' inputs and labels, Skill Bar's title, Pricing Table's, Team Member's and Testimonial's containers, Image Hotspots' pins and Step Flow's marker. Post Grid's Load More button is also drawn on the canvas now, so its design group has something to style there.
- Advanced Button and Hover Box could not be used in the Visual Builder at all. Both rendered a
ScriptDataContainerthat Divi does not export, so the module was replaced by Divi's "Oops! An Error Has Occurred" and could not be placed, selected or edited — while a saved page rendered both correctly. - A form styler's Visual Builder preview ignored the Content tab's display settings. The builder asked the server for the form by id alone, so every styler previewed with the form plugin's own defaults — a Gravity Forms title and description switched on appeared on a saved page and not on the canvas.
- Every form styler's Design tab did nothing in the Visual Builder. The canvas and a saved page render their CSS through separate code paths, and the canvas rendered only the module's own group — so of Gravity Forms' 33 groups the builder drew 1, and field colours, label typography, placeholders, buttons and messages were visible only after saving. Also fixed: a Gravity Forms field-grid gap silently gated the checked-label colour and the footer's spacing, and Glitch Text and Scrolling Text were each a group short on the canvas.
- Four Divi 5 style rules never reached a published page: the button images on Flip Box's two slides and on Post Grid's Load More had no width or height, and the divider between Post Reading Time's text pieces was not drawn. Each was declared inside another rule rather than beside it, so Divi never saw it — while the builder, which draws its own preview, showed all four working.
- A form styler showed a form in its settings panel that the page did not render. The form picker filled itself in with the first form it had been given whenever nothing was chosen, so a module added to a page read "Contact form 1" while its own setting was still empty and the canvas drew no form at all. That first form could not be selected either: the picker already displayed it, so choosing it changed nothing, and it took selecting a second form and coming back. Nothing chosen is now a state of its own — the picker says "Select a form" until one is, offers to clear the selection afterwards, and says which of loading, none installed, or nothing chosen is actually true rather than reporting no forms found while the list is still on its way.
- The Ninja Forms styler showed an empty box in the Divi 5 builder, so its design settings had nothing to be judged against while editing. Ninja Forms is the one styled plugin that builds its form in the browser: what its shortcode returns is a container and a block of form data, with none of the fields, labels or buttons a styler exists to style. The Divi 5 builder now draws the form from that data, the way the classic builder always has — the two share one renderer, so a form previews the same in both. Where the data cannot be read, the builder shows what the server sent rather than nothing. Nothing changed for visitors.
- A form styler previewed as an empty box in the Divi 5 builder whenever its form plugin ships the form's data as an inline
inside the markup its shortcode returns. React inserts awritten that way into the page without ever running it, so the assignment the form needs never happened, and a form that builds itself in the browser had nothing to build from. All eleven stylers now share one preview that re-creates each inline script so the browser runs it. A script with asrcis left alone: the module's own render has already enqueued those bundles, and re-fetching one would at best duplicate work. The markup still comes from this plugin's own preview route, which is gated onedit_postsand renders the same shortcode the published page renders, so nothing runs in the builder that does not already run for every visitor. - Seven settings changed nothing on the published page in either builder: Table of Contents' nested indent and link spacing, Number Counter's media size, media spacing and content alignment, and Post Reading Time's alignment and gap between its text pieces. All seven were drawn on the builder canvas and had no frontend CSS behind them, so a page looked right while being edited and ignored the settings once visited.
- Thirteen Divi 5 modules offered design settings that did nothing. Chat Button's panel and toggle, Data Table's header and rows, Pricing Table's container, Skill Bar's title and bar, Team Member's and Testimonial's containers, Timeline's track and line, Step Flow's and Timeline's item markers, and Image Hotspots' image and pins each had a full set of colour, border, spacing and typography fields in the Design tab, and none of it reached the page. The settings looked correct while editing, because the builder draws its own preview rather than reading the stylesheet the page is served with.
- Forms styled by this plugin reached visitors unstyled. The form plugin's own stylesheet was loaded only while the Visual Builder was open, so a Contact Form 7 or WPForms embed looked right to whoever built the page and broken to everyone who visited it. The stylesheet now loads whenever a styled form renders, in the builder and on the page alike.
- A form styler that hit an error vanished from the Visual Builder with no explanation, leaving an empty space where the module had been. It now reports what went wrong while you are editing; on the published page it still renders nothing rather than taking the page down.
- Four modules drew something other than their content on the Visual Builder canvas: Before After Image Slider appeared as an empty box because both images were hidden, Countdown Timer showed 00:00:00:00 whatever date was chosen, Charts showed a placeholder card rather than the authored series, and Breadcrumbs left out the Before Text the frontend prepends to the trail. All four now draw what the page will show.
- Dynamic content set on a Divi 5 module — a post title in a button, an author name in a heading — printed its raw placeholder text instead of the value, both on the Visual Builder canvas and anywhere the page was rendered outside the normal front-end path. Divi resolves these placeholders for the document as a whole while a page is being displayed, which is why the published page always looked right; nothing resolved them for a module drawn in the builder or produced through the builder's own preview route. Both paths now resolve them, and they resolve per post, so a module repeated across a loop or an archive shows each entry's own values rather than the first one's.
- Dynamic content in a Divi 5 module still showed its raw placeholder while you were editing, even after the page itself rendered correctly. Modules are drawn in the builder by their own editing components, which read the stored value directly, so the placeholder was printed as written. The value is now resolved for the canvas too — the field appears briefly empty and then filled, rather than showing the placeholder text.
- "Checkbox & Radio Checked Color" is no longer offered by the ten form stylers that cannot apply it. It colours the label beside a checked choice and only the Gravity Forms styler defines a selector for that state, so in the other ten it was a colour picker that changed nothing.
- Five of the eleven form stylers rendered a Divi 4 form with no base styling. The shared stylesheet applies its form normalisation per plugin, and Formidable, SureForms, Everest Forms, Happyforms and weForms had no entry — they picked up the shared colour and spacing variables and none of the field, label, button, error or success rules those variables feed. The Divi 5 stylesheet had been extended each time a styler was added and the Divi 4 one had not.
- Several design settings emitted their rule, carried the right value, and lost the cascade — which looks the same as a setting that does nothing until you ask the browser which declaration won. The Submit Button colour on the WPForms styler, the wrapper background and field label colours on WPForms and SureForms, Post Carousel's pagination dots, Post Grid's Load More button, and the Author Box "view all posts" and website link colours all reached the page as whatever the form plugin, Swiper or the module's own stylesheet had set. The Author Box links could not be won by a selector at all, because the shared module stylesheet marked links
color: inherit !important— a sensible default and an impossible ceiling. That reset has since been scoped to links typed into content, so the ceiling is gone and the two groups win with a plain selector. - Ninja Forms' Submit Button settings had no element to style. Ninja Forms builds its form in the browser and renders
input[type="submit"]; the module looked only forinput[type="button"], so nothing matched. Both are matched now, since older Ninja Forms did render a button. - The Submit Button colour set on the Gravity Forms and Fluent Forms stylers never appeared on the page. Both form plugins style their own submit button — Gravity Forms through its theme framework, Fluent Forms through a stylesheet written per form — and both outranked the setting, so the button kept the plugin's colour however the Design tab was filled in. The setting now wins.
- Twenty-two of the Gravity Forms styler's thirty-one design sections produced no CSS at all. Section breaks, list fields, the required marker, consent text, the page-step and progress-bar controls, and every button except Submit had a full set of controls in the Design tab that changed nothing on the page. The same fault affected the Login, Register, Lost Password and Reset Password forms, where six of seven sections were similarly inert. Every declared section now emits its styling.
- Design settings on the form stylers were being overruled by the plugin's own default styling. A colour set on a field description, a sub-label, a select or the required marker was generated correctly and then lost to a more specific default, so the setting appeared to do nothing. The defaults now sit below anything you set, on all nine stylers and in both builders.
- Two Gravity Forms design sections painted elements belonging to other sections: Field Description also coloured the section-break and consent descriptions, and Field Label also coloured sub-labels. Setting one colour silently changed another.
- Gravity Forms labels sat on their own line above the field in the classic builder's styler, ignoring the inline layout the form asked for. They now sit beside the field.
- Eight of the nine form stylers that existed at the time offered an "Enable AJAX Submission" switch that could not do anything. Only Gravity Forms accepts that instruction from a module; the rest are embedded by a shortcode that takes nothing but a form id, so the switch has been removed from them rather than left there implying it works. The three stylers added since were built without it. AJAX submission is still available in those plugins' own settings.
- A preset saved from a form styler applied its button styling twice, so a preset could come back with heavier borders, padding and shadows than it was saved with.
- Converting a Divi 4 page kept which form a styler showed and dropped every design choice made about it. The conversion outline mapped two fields and nothing else, so field and label typography, the placeholder, the error and success message styling, and the borders and box-shadows on the field, the submit button and both messages all arrived in Divi 5 unset — the module looked freshly added. 373 mappings across the eleven stylers close it, covering typography, borders, box-shadows, backgrounds and spacing. The two Divi 4 fields with no Divi 5 equivalent are deliberately left alone rather than mapped to a destination that does not exist.
- Post Grid and Post Carousel filtered by one tag when several were chosen, and showed every post on the site when set to the current category. Both modules keep the selection as a list of term ids and handed it to WordPress in a shape it reads differently: a list of tags arrived as a single value and was rounded down to the first one, and the classic builder's "All Categories" and "Current Category" options — which are words rather than ids — were read as zero and dropped the filter altogether, so the module ignored the setting instead of honouring it. A page converted to Divi 5 carried the same words into the same gap. Every chosen tag now counts, "All Categories" means no filtering, and "Current Category" means the category archive being viewed or the categories of the post being viewed.
- Seventeen modules offered far less in Divi 5 than in the classic builder. Advanced Divider was the worst of it: line style, multiple lines, per-side colours and widths, max width, corner radius, the element's placement and spacing, icon and image colour, size and spacing, and all sixteen Lottie settings existed in the classic builder and simply were not there in Divi 5 — and Line Colour and Divider Weight, which the Divi 5 module did offer, produced no CSS at all. Star Rating regained its title tag, stars size, gap and alignment, the gap between title and stars, and its schema.org support, so a converted rating keeps the structured data search engines were reading. Post Element regained the whole element-icon feature — the icon can be a glyph, an image or text again, with its own colour, background, size, spacing and alignment, a second icon beside the title, and the reveal-on-hover behaviour — plus per-element text alignment, full-width featured images, and the choice to sit outside the element wrapper. Post Grid regained its pagination design entirely: alignment, gaps, arrow colour and size, and the spacing of the row, each link and the current one. Video Popup regained its play-icon and text-box styling, the popup backdrop and close-button colours, the overlay image height and the trigger's accessible name. Typing Text regained its custom cursor icon with colour, size and gap, its alignment and text gaps, and the display type of each of its three text pieces. Dual Button regained its separator image, icon colour and size, custom width and content alignment, and its wrapper alignment, layout and gap. Also restored: Business Hours' row and title spacing, day and time column widths and gaps; Breadcrumbs' before-icon; Drop Cap Text's letter margin and padding; Business Day's row alignment, margin and padding; Number Counter's image alt text, media size and spacing and content alignment; Table of Contents' nested indent and link spacing; Step Flow's marker size, glyph colour and background; and Post Reading Time's alignment, the gap between its text pieces, and the margin and padding of the time itself.
- Converting a page from the classic builder dropped settings the modules already had. A conversion outline maps each classic-builder field onto its Divi 5 counterpart, and more than two hundred of them were never listed, so the value was read off the page and then thrown away — Post Grid's column count, column gap and its whole pagination and load-more setup among them. Every classic-builder field on every module is now accounted for: either mapped, or recorded as deliberately retired where Divi 5 has genuinely moved on.
- Icons and spacings converted into a shape Divi 5 does not read. An icon is a packed
N||divi||400string in the classic builder and a{ unicode, type, weight }value in Divi 5; a margin or padding is a packedtop|right|bottom|leftstring against an object of the same four sides. Both were being copied across verbatim, so a converted icon silently fell back to its module's default glyph and a converted margin was ignored outright. Both are now translated on the way across, on the server and in the browser alike. - A converted Star Rating could come back showing the wrong number. The classic builder keeps a separate rating for the 0-5 and 0-10 scales, and a separate title position for the inline and stacked layouts; Divi 5 keeps one of each. Both classic-builder fields were being written to the same Divi 5 setting, so whichever was processed last won — often the scale or layout the page was not using, which is how a 4.2 out of 5 arrived as 10. Only the field the page actually renders is converted now.
- A converted Glitch Text came back in the wrong colours unless it was using the first effect. The classic builder stores a primary and secondary colour for each of its five glitch effects; only the first pair was ever mapped, so a layout on effects two through five arrived with defaults. All ten now convert, with the nine belonging to effects the layout does not render skipped rather than overwriting the pair it does.
- A converted Flip Box could face the wrong way. The classic builder offers a different set of directions per animation type and stores each set separately; only the rotate/slide set was mapped, so a Diagonal or Open flip box lost its direction. Each set now converts under the animation type that owns it.
- A converted Breadcrumbs lost its separator icon and fell back to the default chevron, because the icon was copied across as text rather than translated into the value the Divi 5 icon picker reads.
- A module's own links ignored every typography and colour setting. A shared reset marked the font family, size, weight, line height, colour, text transform and text shadow of every `
inside a module as!important`, which beats specificity — so on the 13 modules that use it, any setting for a link-based element did nothing. The reset now applies only to links typed into content, which is what it was for. - Post Grid's Load More button never appeared, whatever the setting said, because the module read the load-more options from the wrong attribute group.
- Divi 5 never drew the element wrapper the classic builder puts around a post's parts, so every design setting aimed at it — background, border, spacing — was pointed at an element that did not exist, and the Place Outside The Wrapper switch had nothing to mean. The wrapper is now drawn, and an element set to sit outside it does.
- Ninety-nine design settings across twenty-nine modules were filed as content rather than design, so a style preset and Divi's Copy Module Styles carried everything about the module except the design settings being copied. Colours, sizes, gaps and alignments are now filed by what they actually drive — the page's CSS, its markup, or the frontend script — matching how Divi files its own.
- Eight classic-builder modules — Before After Image Slider, Business Hours, Divider, Drop Cap Text, Dual Button, Flip Box, Post Reading Time and Typing Text — rebuilt Divi's entire module registry every time they drew a background, once per background style per render. On a page with several of them this was enough to exhaust memory outright. They now hand Divi the module they already have.
- Images, Lottie files, videos and icons chosen in a Divi 5 module could render as the literal word "Array" — a broken image, a missing icon, a video that would not load — and left a warning in the log. Seven modules read those pickers as plain text when Divi stores each as a set of values. Affected the Icon Box image and Lottie source, the Inline Content icon, the Advanced Video file and poster, the Team Member image, the Testimonial avatar, the Text Effects mask image, and all three Comparison List status icons.
- Font Awesome icons chosen in a Divi 5 module never loaded their font, so the icon was missing or fell back to another glyph. The check that decides whether a Font Awesome stylesheet is needed only understood how Divi 4 stores an icon, so every Divi 5 icon failed it. Divi 4 modules were never affected.
- Applying a saved preset to a Divi 5 module could overwrite text, links and images on the module you applied it to. Divi sorts a module's settings into groups so that a style preset carries only styling — but a setting that does not say which group it belongs to is treated as styling, and none of ours said. All 852 content settings across 76 modules now declare themselves, so a style preset carries styling alone.
- Uploading an SVG that consists only of a DOCTYPE declaration reached the XML parser as an empty string. The sanitiser checks for empty input before stripping DOCTYPE and ENTITY declarations, and that strip can empty a file that had content a moment earlier.
- The Divi 5 Star Rating ignored the Title Tag setting and always wrote an ``, so a rating placed inside a page's content broke the heading order screen readers and search engines rely on.
- The Divi 5 Number Counter gave its image an empty alt attribute with no way to set one, leaving the image unannounced to screen readers even when the classic builder had alt text for it.
- Duplicating a post kept only the first value of any meta field stored across several rows — a repeater, a gallery, anything WordPress saves as more than one row under the same key. The copy still succeeded, so the loss was silent: the duplicate came back with one item where the original had several. Every row is copied now.
- An error raised while the JSON, SVG, Font Upload or Divi Library Shortcode extension was starting up escaped instead of being recorded, so the only symptom was a feature quietly not working with nothing in the log to say why. Each now reports the failure against the extension that caused it, matching how the other extensions already behaved.
- The Divi 5 Advanced Divider read the wrong setting for its element placement, so choosing "Top" or "Bottom" for the line position moved the text or icon sideways instead. It also ignored every Lottie playback setting — interaction, loop, speed, delay, direction, renderer and the rest were fixed at their defaults — and used an uploaded Lottie file's raw attribute rather than its URL, so a locally uploaded animation never loaded.
- Two REST methods on the v2 dashboard controller instantiated a class that has never existed in this plugin. Neither is reachable through a registered route, so nothing has hit it, but anything that called them — the filter the controller offers for adding routes, or third-party code — would have stopped with a fatal error. Both are gone.
- Sites or third-party code still using the old
Base\DiviBuilder\Utilshelpers hit a "class not found" error, and the plugin logged one on every page load. Two of those helpers, breadcrumbs and mask shapes, had been moved to a shared location without updating the compatibility layer that points at them, so it referenced classes that no longer existed. Reading the breadcrumbs helper through the old name failed outright rather than forwarding to the new one.
Internal
- The Author Box's two link groups no longer mark their own typography
!important, nor raise their selector with abodyprefix and a doubled class. Both were there to beat the module's own link reset; with that reset scoped to unclassed links, keeping them would have meant these two groups outranking a site's theme where Divi's own modules do not. - Third-party deprecation notices no longer fail the test suite. Two suites run each test in its own process, and anything those processes print is treated as a failure — so a single
(double)cast deprecated by PHP 8.5, in the Divi theme's own code, produced 56 errors on every run and stopped 55 tests before they finished asserting. A handler installed before WordPress loads now ignores deprecations and leaves every other error alone: a real warning still fails.SQUAD_TESTS_SHOW_DEPRECATIONS=1puts them back. The suite reports no errors for the first time, and 69 more assertions than before, because those tests now run to the end. Modules::enable_module()could not enable anything. It looked a module up by name in a list that is keyed by position, so the lookup never matched and the method returned false for every module ever passed to it;get_module_info()returned null for the same reason, and the enable and disable actions fired with no module data. The dashboard was unaffected — it writes the settings directly — so this was public API that no internal caller used, which is exactly the kind a pro add-on reaches for. The annotation that described the list as a map is corrected too, which is what had kept static analysis quiet about it.- The static analyser was told to ignore every "class not found" and "constant not found" result, and one of the things that hid was real: the two v2 dashboard methods recorded under Bug fixes, calling a class that does not exist. The constant rule now names the three runtime constants it is there for — Fluent Forms' version, and WordPress's own
DB_NAMEandWPINC— so a mistyped constant fails again, and the class rule is gone entirely. - Fluent Forms is the one form integration with no WordPress API behind it, so its form list is read straight from the plugin's own table — the only direct query in the plugin without a note saying why. It now carries that note. It stays uncached on purpose: the caller already holds the result for the request, and Fluent Forms offers no hook to invalidate on, so a longer-lived cache would leave a newly created form missing from the picker with no way to clear it.
- The builder-parity helper script read each module's
edit.tsxalone and reported fields as undrawn that the canvas does draw one file over — Charts resolves its palette inchart-data.ts. It now reads the whole module directory, matching what the test beside it already did, and reports nothing where there is nothing to report. - One classic-builder field can now convert into a Divi 5 field it shares with a sibling. Star Rating keeps a rating per scale, Glitch Text a colour pair per effect, and Flip Box a direction per animation type, while Divi 5 keeps one of each — so every member of a set converted to the same destination and the last one processed won, whichever the page was actually using. A small conversion class decides which member owns the destination for the layout being converted and tells Divi to skip the rest. It is written twice on purpose: Divi runs the server-side conversion from a JSON file that cannot hold a function, and the browser-side one from a module's registration, which cannot hold a name. Twenty-seven tests pin the choice for every scale, effect and animation type, including the case where the deciding field was left at its default and so is absent from the layout altogether.
- Four places in the Divi 5 code caught an error, carried on without the value, and recorded nothing. Dropping one field rather than the whole module is the right thing to do — but done silently, a broken custom-field integration looked exactly like an empty field, and a failed icon looked like an icon nobody chose. All four now leave a record. The one that mattered most decodes every module's icons, so a failure there meant icons disappearing site-wide with nothing to explain it.
- Building a Divi 5 form styler on PHP 7.4 stopped the page with an undefined-function error. A PHP 8 string function had been introduced into a file the plugin loads on 7.4 earlier in this same release, so no published version carried it. It is recorded here because the rule added to stop it happening again is what remains.
- Five rules now hold this work in place rather than five fixes: no module may read an image or icon picker as plain text; no error may be caught without a record; every content setting must declare its group; every parent module must offer the option groups Divi offers; and dynamic content must resolve per post. Three read the module definitions as shipped, so a module added later is covered from the day it is written.
- The Divi Library Shortcode extension answered to three different names — one in the code, another in the extensions registry, and a third in its own label and shortcodes. It is now Library Shortcode throughout. The stored on/off state is keyed by that name, so the rename ships with a translation step: whichever way you had it set is carried over, and no site has to re-enable it.
- The TypeScript check had been passing while examining no code at all. The project listed the build-tooling files twice, in its own configuration and in the referenced one that owns them, which made the compiler stop before it reached any application code — and the failure was reported in a form the check script did not recognise, so it read the empty result as a clean run. The 358 errors it had recently declared fixed were never fixed; they had stopped being looked for. The overlap is removed, the script now refuses to pass when the compiler exits without checking anything, and the real backlog of 1059 errors is recorded so that new ones fail the check.
- Fifteen JavaScript test suites had been failing to compile rather than failing to pass, because one of the interface libraries they load uses a syntax the build was not configured to read. The 73 tests inside them had not been running at all. The suite now compiles in full: 681 tests across 79 suites.
- The build toolchain had been straddling two major versions of Babel since the revert in 4.6.2: the plugins and presets moved back to 7.x while three packages stayed on 8. One of those was pulling a duplicate compiler into the install, another could not be reached at all, and the third supplies the helper functions compiled into the shipped JavaScript — it happened to still work only because the two versions share a file layout. All three are back in step with the rest of the toolchain.
- Fifty development dependencies are gone from the install, most of them left over from an older build setup or superseded when the linter configuration was rewritten. None reach the shipped plugin; this only shrinks what a contributor downloads.
- Module icons have a single authored source. One generator reads the hand-drawn SVGs and emits all three artifacts from them — the palette icons, the admin registry and the Visual Builder components — so the three can no longer disagree, and no icon is pulled from a third-party library at build time any more. A follow-up repointed the six files still naming the directory the icons had moved out of, including the module-development notes that tell the next person where to put one.
- Five suites now render the modules rather than reading their metadata. Every Divi 5 module is rendered in PHP and its values checked against the markup; every one is rendered again in Jest and in a real browser; the builder canvas is compared against the frontend for the same settings; the frontend scripts are run against the markup the modules actually serve; and all 67 classic-builder modules are rendered both on the page and on the canvas. One spec and one fixture per module, so a failure names the module rather than the suite.
- The design suites ask the browser which rule won rather than trusting the CSS was emitted. Sixty-seven end-to-end specs open a page per module and read back the winning value for each design group, and eleven more do the same for the form stylers, so a setting that emits its rule and loses the cascade now fails where it used to pass — which is how most of the cascade bugs in this release were found. The fixtures they read are generated rather than kept: a page per registered module, a form provisioned in each of the eleven supported form plugins carrying the fields its styler styles, fixtures removed once their module is no longer registered, and Divi's generated CSS cleared and then re-requested so the first test is not the request that rebuilds it. What the suites still do not check is written down in
docs/testing/coverage-gaps.mdrather than left to be rediscovered. - Composer falls back to git clones when GitHub rate-limits its zipball downloads, which had been failing dependency updates outright, and the static-analysis stubs for the form plugins are current again.
- The classic-builder render suite had been checking the modules against values Divi would never give them. Where a field declares one default for the builder and another for the front end, only the builder's was applied — Divi uses the front-end one and stops looking, so a module such as Lottie was rendered with no source type at all and returned nothing. Twenty-six modules were being measured in a state no visitor sees. Alongside that, several modules were rendered without the one thing they need before they will output anything: an image, a user to describe, a video the parser accepts, a switch that ships off, or in the case of the register and reset-password forms, registration being open and a reset link being followed. Divi also hands a module its shortcode attributes, which the suite was passing as an empty list. Every one of these is now supplied and recorded next to the module it belongs to, so the check renders what a visitor would get: 466 values verified against real markup, up from 440, across the same 65 modules. Fields that a check like this cannot speak to — a CSS length, an image-size name, a date format, a user id — now say so by name instead of looking like values that had stopped appearing.
- An empty error-message box could appear under a file upload on a Gravity Forms form nobody had submitted. Gravity Forms prints the container up front and fills it from JavaScript when validation fails, and hides it in the meantime; the styling this plugin applies to error messages was more specific than that, so the empty container was shown instead — and grew a background and a border as soon as anyone styled the error message. Error styling now applies only to a message that has something to say, which leaves the form plugin's own rule to hide the empty one. The same applies to the eight other form plugins, several of which print their message containers the same way.
- Divi sorts a module's settings into preset buckets — content, markup, script and style — and a preset only writes the settings in its own bucket. Twenty-four settings were in the wrong one: the Lottie playback controls (interaction, loop, speed, mode and direction) and, on all nine form stylers, the two builder-preview switches and Gravity Forms' AJAX switch were all filed as content. Divi files the equivalent settings on its own modules as markup, and its AJAX-style switches as script, so these now match. Applying a preset carries the settings you would expect it to.
- Eight tests of the Divi 5 form-styler base class failed rather than skipping on a site running Divi 4. The class declares itself only when Divi 5 is present, so it was absent and the tests errored with "class not found" instead of standing aside the way the rest of the Divi-dependent tests do.
- The compatibility layer kept for the class names retired in 3.3.3 is gone — seventy-nine files that existed only so code written against the old names kept working. Squad Modules Pro 2.2 and later target the current names and refuse to run against a release old enough to need the old ones, so nothing supported still reaches them. This removes about 600KB from the download. Anyone running a Pro older than 2.2 should update it alongside this release.
- A resized checkbox or radio could show two marks at once. Several form plugins draw their own tick or dot with a pseudo-element rather than letting the browser do it, and that survives the takeover needed to make the size setting work — so the plugin's mark and this plugin's sat on top of each other. The plugin's own is now suppressed while the control is resized, and left alone when it is not.
- The WordPress.org listing artwork understated the plugin. Its banner advertised "50+ modules" and "5+ extensions" against an actual 67 and 8, because those figures had been copied from a marketing page years ago rather than counted. The banners and icon are regenerated, the numbers are counted from the module and extension registries and kept in one place so a banner and a social card cannot disagree, and a right-to-left version is included for the first time — Arabic, Hebrew, Persian and Urdu listings were being shown a banner anchored to the wrong side. The banner now leads with the module count and carries a row of the module icons themselves, and its one sentence names the two builders rather than saying "both builders" — the layout that ships hides the supporting line, so that sentence is all a listing shows, and it was assuming the reader already knew Divi has two.