Skip to content

Keep page-builder shortcode text out of the video sitemap description - #2235

Merged
subodhr258 merged 2 commits into
developfrom
fix/sitemap-description-shortcodes
Oct 21, 2026
Merged

subodhr258 merged 2 commits into
developfrom
fix/sitemap-description-shortcodes

Conversation

@subodhr258

@subodhr258 subodhr258 commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Review packet

In one line: On a page built with a page builder (WPBakery, Divi), the video sitemap no longer shows the builder's raw shortcodes ([vc_row][vc_column]...) in <video:description>; the description now matches what the front-end JSON-LD gives for the same page. Reported on #1622 (the Video SEO epic that #2186 is part of): the bug report. This PR does not close the epic.

1. Criteria and proof

Acceptance criterion Proof
The sitemap's <video:description> for the WPBakery page from the bug report has no [vc_...] text (it falls back to the video title, as the front end gives no description) VideoSitemapTest::test_wpbakery_page_does_not_leak_shortcode_text_into_the_description; recordings V1 (before) and V2 (after)
A WPBakery page with text outside the builder tags gives that text: "A short guide to brewing filter coffee at home." VideoSitemapTest::test_page_text_outside_the_builder_shortcodes_is_used_as_the_description; recordings V1 (before) and V2 (after)
The description is the same whether or not the builder has registered its shortcodes yet VideoSeoSchemaTest::test_page_fallback_is_the_same_before_and_after_the_builder_registers_its_shortcodes
The front-end JSON-LD of both WPBakery test pages is unchanged: 0 lines differ before and after diff of the saved JSON-LD on godam-dev (section 2); and 9 sample texts give the same description with and without the fix when the builder is registered
Ordinary bracketed text ([sic], [1], [b]bold[/b]) is not changed VideoSeoSchemaTest::test_page_fallback_leaves_ordinary_bracketed_text_alone

2. Before and after

Same three pages on godam-dev (WPBakery 9.0 beta active, video sitemap switched on, a video with no description of its own), read logged out as a crawler would, first on develop and then on this branch. The sitemap file differs in exactly three lines, the three descriptions below; every other entry is identical.

Test page content Sitemap <video:description> before after Front-end JSON-LD description before after
[vc_row][vc_column][vc_column_text]Learn to brew filter coffee at home, step by step.[/vc_column_text][godam_video id="265"][/vc_column][/vc_row] [vc_row][vc_column][vc_column_text]Learn to brew filter coffee at home, step by step.[/vc_column_text][/vc_column][/vc_row] the video title (Filter-Coffee-Tutorial-1-original) none none (unchanged)
A short guide to brewing filter coffee at home. [vc_row][vc_column][godam_video id="265"][/vc_column][/vc_row] A short guide to brewing filter coffee at home. [vc_row][vc_column][/vc_column][/vc_row] A short guide to brewing filter coffee at home. A short guide to brewing filter coffee at home. the same (unchanged)
Divi-shaped, Intro line. [et_pb_section][et_pb_row][et_pb_text]Divi copy.[/et_pb_text][/et_pb_row][/et_pb_section] [godam_video id="265"] Outro line. (Divi is not installed there, so these tags are never registered, not even on the front end) Intro line. [et_pb_section]...[/et_pb_section] Outro line. Intro line. Outro line. the same raw text Intro line. Outro line.

B1: the sitemap on develop, the leaking description highlighted

B1 sitemap on develop, raw vc_row shortcodes in the description

S01: the sitemap on this branch, the same entry highlighted

S01 sitemap on this branch, the description is the video title

V1: BEFORE, on develop. Two panes: the page's own front-end JSON-LD on the left, the crawler's sitemap on the right; every step has a caption and a check. The sitemap shows the raw [vc_row]... text.

V1 before the fix, two panes, the sitemap description shows raw vc_row shortcodes

V2: AFTER, on this branch, the same steps. The sitemap shows the video title for the first page and the sentence for the second, as the front end does.

V2 after the fix, two panes, the sitemap description has no shortcode text

3. Tests

  • Added, in tests/php/VideoSeoSchemaTest.php (11 tests): builder tags not registered yet leave no [; same description before and after the builder registers; Divi et_pb_* tags; a self-closing unregistered tag; a hyphenated builder tag (contact-form-7); a tag another filter took off the strip list is left alone; ordinary bracketed text is left alone; 20,000 distinct builder-style tags still give a description; one 70,000-character tag name still gives a description; the filter is not left registered, also when another filter throws.
  • Added, in tests/php/VideoSitemapTest.php (2 tests): the WPBakery page from the bug report, and a page with text outside the builder tags, read from the generated sitemap XML.
  • Changed: tests/stubs/video-seo-functions.php. The strip_shortcodes() stub removed every [tag], which hid this bug (it never looked at which shortcodes are registered). It now follows core: only registered shortcodes are removed, with the text they enclose, and strip_shortcodes_tagnames is applied. tests/stubs/hooks.php gets a remove_filter() stub.
  • Revert check: with inc/classes/class-seo.php put back to develop, 7 tests fail, for example "Failed asserting that two arrays are identical" with the actual value '[vc_row][vc_column][vc_column_text]Learn to brew filter coffee at home, step by step.[/vc_column_text][/vc_column][/vc_row]'. The other new tests are safety checks and pass on both. Each safeguard (the cap, the name length limit, finally, remove_filter, the registered-name check, the name pattern) was also broken on purpose in turn, and a test failed each time.
  • Whole suite: 613 tests pass. PHPCS is clean on the five changed files, and the attachment hook checks (bin/hook-check) pass.

4. Risk flags

No risk flags fired on #2235. Nothing in the diff touched the watched areas.

5. Independent review

A fresh reviewer (Sonnet 5.5) saw only the problem statement and the diff. It ran the change against WordPress's real shortcode code, not just the test stubs. Its findings, each checked against the code:

Finding Grade What I did
class-seo.php: any bracketed word ([sic], [1], [b]..[/b], [Read more]) was also removed from the front-end description, so it did change for ordinary pages Valid Fixed in c600aa9: only names that look like a builder tag are added (a letter first, an underscore or hyphen in the name, at most 64 characters). New test
One very long bracketed word (70,000 characters) makes core's pattern too large; the description came out empty and PHP warned Valid Fixed in c600aa9: names over 64 characters are ignored. New test
The filter was not removed if strip_shortcodes() threw Valid (low severity) Fixed in c600aa9: remove_filter() runs in a finally block. New test
A tag that another plugin deliberately took off the strip list was added back Valid (low impact) Fixed in c600aa9: names that are registered are left to core. New test
The cap tests did not catch removing the cap or the remove_filter() call Valid Fixed in c600aa9: tests with 20,000 names and with a filter left registered
The cap of 100 names leaves raw tags for names after the 100th By design Kept: it keeps the pattern far below PCRE's size limit, and a page with over 100 distinct builder tags before its text is not realistic. Documented on the constant
Same-name nesting ([vc_column][vc_column]..), a closing tag with no opener, an unterminated tag and an escaped [[vc_row]] still show some bracket text By design Same result as core gives for registered tags on the front end today, so no regression
Regex time grows with the number of unclosed tags Overstated Core's own pattern has the same cost for registered tags (the reviewer measured 2.9 s for 20,000 [gallery] before this change). Sitemap pages are cached for 24 hours. Not changed
PHP 7.4, escaping, the sitemap cache, other callers, and the test stub changes No findings The reviewer checked each (PHPCS PHPCompatibility, wp_strip_all_tags after decoding, only one caller, three random-order full runs)

6. Not verified

  • Real Divi: it is not installed on godam-dev. Divi-shaped [et_pb_*] content was tested (unit tests, and a page on godam-dev where the tags are never registered), not the plugin itself.
  • Elementor and Gutenberg pages: the change only touches the page-text fallback, which they reach only when a video has no description and no transcript; not run on the site.
  • The Yoast, Rank Math and All in One SEO sitemap providers: they call the same function, but only the plugin's own /godam-video-sitemap.xml was read on the site.
  • PHP 7.4 and WordPress 6.5 were not run: the local 7.4 binary is broken, so I read the code for PHP 8 features (none) and ran PHPCS. The site runs WordPress 7.1.3; the strip_shortcodes_tagnames filter exists since WordPress 4.7.
  • A site that already built and cached a sitemap on a 2.5.0 development build keeps the old text for up to 24 hours. 2.5.0 is not released, so no live site is affected.

7. Scope

  • Beyond class-seo.php and its tests: the two stub changes in section 3.
  • Behaviour change on the front end, in one case: where a builder's tags are not registered on the front end either (for example Divi tags left on a page after Divi was deactivated), the JSON-LD description used to show the raw [et_pb_*] text and now shows clean text. The Divi-shaped test page in section 2 shows it. Pages whose shortcodes are all registered are unchanged.
  • Ordinary text can be affected in one case: a bracketed word with an underscore or hyphen in it (for example [my_note]) is treated like a builder tag in the fallback description, and when a closing tag follows, the text between them is removed too. It only changes the fallback description (used when a video has no description of its own and no transcript). Plain bracketed words such as [sic] or [1] are untouched. Noted in review.
  • @since 2.5.0 is used, like the code around it, because the 2.5.0 version bump has already run and this ships in 2.5.0.

The sitemap is served at parse_request priority 1, before WPBakery and Divi
register their shortcodes, so core's strip_shortcodes() left tags such as
[vc_row] in the fallback description taken from the page text. Add the tag
names found in the text to strip_shortcodes()'s own list so unregistered
shortcodes are removed the same way registered ones are, which gives the same
description in the sitemap and on the front end.

The strip_shortcodes() test stub removed every [tag], which hid the bug. It now
follows core: only registered shortcodes are removed.
…ck description

Review of the first version found that it also removed ordinary bracketed text
([sic], [1], [b]bold[/b]) from the front-end description, that one very long
bracketed word made core's pattern too large and the description empty, that a
tag another filter had taken off the strip list was re-added, and that the
filter stayed registered if stripping threw.

Only names that look like a builder tag are added now (a letter first, an
underscore or hyphen in the name, 64 characters at most), tags that are
registered are left to core, and the filter is removed in a finally block.
New tests pin the cap, the length limit, the filter removal and the ordinary
bracketed text.
@github-actions

Copy link
Copy Markdown

🔍 WordPress Plugin Check Report

⚠️ Status: Passed with warnings

📊 Report

🎯 Total Issues ❌ Errors ⚠️ Warnings
13 0 13

⚠️ Warnings (13)

📁 readme.txt (2 warnings)
📍 Line 🔖 Check 💬 Message
0 mismatched_plugin_name Plugin name "GoDAM - Organize WordPress Media Library & File Manager with Unlimited Folders for Images, Videos & more" is different from the name declared in plugin header "GoDAM".
0 trademarked_term The plugin name includes a restricted term. Your chosen plugin name - "GoDAM - Organize WordPress Media Library & File Manager with Unlimited Folders for Images, Videos & more" - contains the restricted term "wordpress" which cannot be used at all in your plugin name.
📁 assets/build/css/main.css (1 warning)
📍 Line 🔖 Check 💬 Message
0 EnqueuedStylesScope This style is being loaded in all contexts.
📁 assets/src/libs/analytics.min.js (5 warnings)
📍 Line 🔖 Check 💬 Message
0 EnqueuedScriptsScope This script is being loaded in all frontend contexts.
0 NonBlockingScripts.NoStrategy This script on http://localhost:8880 (with handle analytics-library) is loaded in the footer. Consider a defer or async script loading strategy instead.
0 NonBlockingScripts.NoStrategy This script on http://localhost:8880/2026/10/21/hello-world/ (with handle analytics-library) is loaded in the footer. Consider a defer or async script loading strategy instead.
0 NonBlockingScripts.NoStrategy This script on http://localhost:8880/sample-page/ (with handle analytics-library) is loaded in the footer. Consider a defer or async script loading strategy instead.
0 NonBlockingScripts.NoStrategy This script on http://localhost:8880/demo-attachment-post/ (with handle analytics-library) is loaded in the footer. Consider a defer or async script loading strategy instead.
📁 assets/build/js/main.min.js (5 warnings)
📍 Line 🔖 Check 💬 Message
0 EnqueuedScriptsScope This script is being loaded in all frontend contexts.
0 NonBlockingScripts.NoStrategy This script on http://localhost:8880 (with handle rtgodam-script) is loaded in the footer. Consider a defer or async script loading strategy instead.
0 NonBlockingScripts.NoStrategy This script on http://localhost:8880/2026/10/21/hello-world/ (with handle rtgodam-script) is loaded in the footer. Consider a defer or async script loading strategy instead.
0 NonBlockingScripts.NoStrategy This script on http://localhost:8880/sample-page/ (with handle rtgodam-script) is loaded in the footer. Consider a defer or async script loading strategy instead.
0 NonBlockingScripts.NoStrategy This script on http://localhost:8880/demo-attachment-post/ (with handle rtgodam-script) is loaded in the footer. Consider a defer or async script loading strategy instead.

🤖 Generated by WordPress Plugin Check Action • Learn more about Plugin Check

@rudrakshi-gupta

Copy link
Copy Markdown
Member

Tested on my local site: develop at 00d6c0e (2.5.0), WPBakery 9.0 beta 3, Yoast SEO active, video sitemap on. I reproduced the bug, then applied this PR's class-seo.php change and re-read the same pages logged out.

Reproduced, and fixed by this PR

Video with no description and no transcript, on three pages:

Page content Sitemap video:description on develop With this PR Front-end JSON-LD description (same before and after)
[vc_row][vc_column][vc_column_text]Learn to brew filter coffee at home, step by step.[/vc_column_text][godam_video …][/vc_column][/vc_row] [vc_row][vc_column][vc_column_text]Learn to brew filter coffee at home, step by step.[/vc_column_text][/vc_column][/vc_row] The video title none
A short guide to brewing filter coffee at home. [vc_row][vc_column][godam_video …][/vc_column][/vc_row] A short guide to brewing filter coffee at home. [vc_row][vc_column][/vc_column][/vc_row] A short guide to brewing filter coffee at home. the same text
Read the guide [sic] and see note [1]. [godam_video …] unchanged unchanged the same text

Note for anyone retesting: the video needs a thumbnail. A video without one is left out of the sitemap, so the page doesn't appear at all.

I also checked the builder-tag pattern against sample names: vc_row, vc_column_text, et_pb_section, contact-form-7 and fusion_builder_container are stripped; [sic], [1], [b], [Read more] and registered core tags like gallery are kept. The changed file passes php -l. Adding the names through core's own strip_shortcodes_tagnames filter, with remove_filter() in finally, keeps the result identical to what the front end gives.

Minor, non-blocking

  1. Text inside builder tags is dropped: on the first page, "Learn to brew filter coffee at home…" sits inside [vc_column_text], so both the sitemap and the JSON-LD fall back to the video title. That matches the front end today, so it isn't a regression. A follow-up could keep the inner text of layout tags (vc_row, vc_column, vc_column_text, …) so both get a real description.
  2. Bracketed words with _ or - in ordinary text: something like [my_note] in a post would now also be removed, along with any text it encloses. This is low risk since it only affects the fallback description, but worth knowing.

Not tested: real Divi (not installed), PHP 7.4.

@subodhr258

Copy link
Copy Markdown
Collaborator Author

Thank you for testing this, and for checking the pattern against sample names. Both notes are right, and I made no code change for them:

  • Text inside builder tags. Kept as it is on purpose, so the sitemap and the JSON-LD stay the same. Keeping the inner text of layout tags (vc_row, vc_column, vc_column_text) would change the front-end JSON-LD as well, so it would be its own change. I have left it to Subodh to decide where to track it.
  • Bracketed words with an underscore or hyphen. Yes: [my_note] in ordinary text is treated like a builder tag, and if a closing tag follows, the text it encloses goes too. I have added this to the Scope section of the description so it is written down.

@subodhr258
subodhr258 merged commit f9f83e7 into develop Oct 21, 2026
6 checks passed
@subodhr258
subodhr258 deleted the fix/sitemap-description-shortcodes branch October 21, 2026 12:29
subodhr258 added a commit that referenced this pull request Oct 22, 2026
* Stop the admin menu jumping when a GoDAM page loads (#2207)

* Fix: stop the admin menu jumping when a GoDAM page loads

pages/style.css restores Tailwind's border reset for every element on the
page. It is injected by page-css.min.js after the page has painted, and
core's a { transition: border .05s } then animates each admin menu link's
border from 3px to 0: every item grows from 34px to 40px and the whole
menu jumps by about 186px, then snaps back. Keep the reset off
#adminmenumain and #wpadminbar.

* Fix: open the Media Editor with the admin menu already folded

The editor folds the menu from React after the page has painted, so the
menu showed at full width and then collapsed. Add the folded body class
on the server when the editor opens a file.

* Keep the reset off the menu and admin bar containers too; test the editor fold

- pages/style.css also excludes #adminmenumain and #wpadminbar themselves,
  not only their descendants.
- MediaEditorMenuFoldTest: the Media Editor with an id gets 'folded';
  its file picker, other GoDAM pages, the Media Library and no screen
  do not.

* Regenerate the POT: 12 references into class-pages.php moved down

Line numbers only; no strings added or changed. Built like CI: Node
22.14.0, npm ci, npm run build:prod, composer pot.

* feat(seo): fix VideoObject schema and add video sitemap (#2186)

* feat(seo): fix VideoObject schema and add video sitemap (#1622 v1)

Make GoDAM's video schema indexable by Google and add a video sitemap
that plugs into Yoast SEO, Rank Math, All in One SEO or the WordPress
core sitemap. No new public URLs are created.

- Schema contentUrl now uses the HLS (.m3u8) stream, falling back to the
  original file; the DASH .mpd is never output. Resolved at output time,
  so pages cached before this change are fixed without a re-save.
- Add embedUrl pointing at GoDAM's existing video-embed player page.
- Never output an empty description: fall back to a 160-char transcript
  excerpt (fetched on save only, cached in _godam_seo_transcript_excerpt),
  then the page excerpt, otherwise omit the property.
- Output isFamilyFriendly as a real JSON boolean (string values such as
  "false" are parsed correctly) and omit an empty uploadDate.
- Add Video_Sitemap: /godam-video-sitemap.xml with one <url> per
  published page and one <video:video> per video, built from the cached
  video SEO post meta via the shared schema builder so both always agree.
- Exclude drafts, private and password-protected posts, pages noindexed
  in Yoast / Rank Math / AIOSEO, and videos the editor excludes.
- List the sitemap in the Yoast, Rank Math and AIOSEO indexes, or via a
  core sitemap provider when none is active; paginate at 1000 URLs,
  cache per site with version-based invalidation.
- Add GoDAM > Settings > SEO with an "Enable video sitemap" toggle (off
  by default) and a per-video "Exclude from video sitemap" toggle in
  Gutenberg, Elementor and WPBakery.
- Warn editors in all three editors when a video title looks like a
  raw file name.
- Prefer the HLS URL when prefilling SEO contentUrl in the editors.
- Add new filters: godam_video_seo_content_url, godam_video_seo_embed_url,
  godam_video_seo_description, godam_video_sitemap_enabled,
  godam_video_sitemap_entries_per_page, godam_video_sitemap_post_types,
  godam_video_sitemap_exclude_post, godam_video_sitemap_entry.
- Add PHPUnit coverage (VideoSeoSchemaTest, VideoSitemapTest) and Jest
  tests for the filename-title check.

* Resolve feedback

* Resolve feedbacks and regenrate POT file

* Revert the POT file

* Resolve Privacy Issue

* feat(seo): add key moments to video schema from chapters (#1597) (#2194)

Output each GoDAM video chapter as a schema.org Clip in the VideoObject's
hasPart, so Google can show "key moments" (jump-to links) for the video
in search results.

- Add Seo::get_key_moment_clips(): reads the chapters from the
  attachment's rtgodam_meta at output time, so editing chapters updates
  the schema without re-saving the page.
- Each Clip has name, startOffset, endOffset and a deep link of the form
  <page>?t=<seconds>#godam-video-<attachment id>, which the GoDAM player
  already uses to seek on page load.
- A clip ends at the chapter's own endTime, else the next chapter's
  start, else the video duration (clamped to the duration when known).
- Skip chapters with no title, an unreadable start, a start at or past
  the end of the video, or zero length; drop duplicate start times;
  strip HTML from chapter names.
- Parse chapter times as plain seconds, mm:ss or hh:mm:ss(.ms), falling
  back to originalTime when startTime is missing.
- Build clip URLs without add_query_arg(): use & on plain permalinks and
  drop any existing fragment from the page URL.
- Only add hasPart when the video has an attachment and a host page
  (render-time output on archives/404 has nothing to deep-link to).
- Add filters godam_video_seo_key_moments_enabled and
  godam_video_seo_key_moments.
- Move ISO 8601 duration parsing to Seo::iso8601_to_seconds();
  Video_Sitemap::iso8601_duration_to_seconds() now delegates to it.
- Add VideoSeoKeyMomentsTest (27 tests) and a get_permalink() test stub.

* Match WPBakery SEO Settings to Gutenberg Model (#2209)

* ci: run the POT check only on PRs into main (#2188)

* ci: run the POT check only on the develop → main merge

Feature PRs into develop no longer have to regenerate languages/godam.pot.
The release PR from develop into main still fails if the committed POT is
stale. PRs into main from any other branch skip the job.

* ci: run the POT check on every PR into main

Patch releases reach main from fix and hotfix branches, not only from
develop, so they need the check too. The branches: [main] trigger
already keeps it off feature PRs into develop.

* Pass only a numeric form ID to the form layer preview (#2223)

Cast the layer id to an integer in the preview template and in the Ninja Forms
and MetForm callbacks, and add unit tests for it.

* Keep the Gravity Forms recorder working after an AJAX page change (#2217)

* Keep the Gravity Forms recorder working after an AJAX page change

Gravity Forms replaces a page's markup on every AJAX page change or failed
submit. The recorder kept pointing at the replaced container, file input and
button, and Uppy had bound its dashboard trigger once to the old button, so
Start Recording opened nothing on the new page.

On every gform_post_render, an uploader whose markup left the page now finds
the new container by its id, reads the input and button from it, binds the
new button once and shows the recording it holds again.

* Regenerate the translation template for the recorder's moved lines

* Stop sending the signed-in viewer's email with video analytics (#2213)

* Stop sending the signed-in viewer's email with video analytics

The page params that GoDAM prints on every front-end page no longer carry
the current user's email address (`emailId`), and the analytics request body
no longer has an `email` field. The WordPress user id is still sent.

Tests: the request-body helper and the page params are both checked for the
absence of the email, including a page cached by an older version.

* Remove the viewer's email from the analytics data listed in the readme

The analytics.godam.io entry under External services no longer lists Email as data sent.

* Keep the signed-in viewer's email out of the player's page data

The player script's page data (godamData.currentLoggedInUserData) carried the current user's email address, which nothing in the browser reads. It now holds the display name and whether someone is signed in. The comments routes still read the email on the server.

* Keep the fixture lines untouched in the JS test

The explanation moves into the test, so the fixture lines this branch leaves alone cannot conflict with the sibling change.

* List the page's user fields instead of removing one

rtgodam_get_current_user_data_for_page() now returns only the display name and the sign-in type, so a field added later to the server-side user data is not printed into the page by accident.

* Regenerate the POT for the new line numbers

The new helper in custom-functions.php moves five strings further down the file, so their source references change. Nothing else in the file differs from develop.

* Clean up video share popup: remove GoDAM Central/Embed links, use Page link, show share button for all videos (#2211)

* Clean up video share popup links and share button gating

- Remove the redundant GoDAM Central and Embed copy fields from the share
  modal footer, keeping only the Page Link field.
- Point the social share links at the WordPress page link instead of the
  GoDAM Central URL, which is private by default and shows a login prompt.
- Show the share button for all videos when sharing is enabled in the
  block settings, instead of only transcoded videos.

Closes #2210

* Address review: keep share anchor and gate button on an ID

- Encode the share link with encodeURIComponent so the #godam-video-{id}
  anchor and any query param travel with the social share URL instead of
  splitting off (encodeURI left #, ? and & intact).
- Hide the share button for players with neither a WordPress attachment ID
  nor a transcoding job ID ("Insert from URL" embeds), since their share
  link could not target the video.
- Remove stale README references to the removed GoDAM Central/Embed links
  and correct the ID described for share links.

---------

Co-authored-by: KMchaudhary <kuldipkumar.chaudhary@rtcamp.com>

* Save converted MP3 audio as audio/mpeg, and fix files already saved as audio/mp3 (#2208)

* Fix: store transcoded MP3 audio as audio/mpeg, not audio/mp3

WordPress registers MP3 as audio/mpeg. Attachments saved as audio/mp3
were left out of REST media_type=audio, and REST ignored a
mime_type=audio/mp3 filter. New conversions are saved as audio/mpeg,
and a one-time migration (2.4.1 batch) fixes the ones saved before.

* Test the saved type, satisfy the hook-integrity check, retry a failed SELECT

- TranscodedAudioMimeTypeTest calls add_transcoded_files() and checks
  that converted audio is saved as audio/mpeg (video stays video/mp4).
  With the old audio/mp3 it fails.
- add_transcoded_files() starts $transcoded_files as array(), not false;
  PHP 8.1+ reported every conversion as a deprecated false-to-array use.
- The migration's two direct queries carry godam-coverage-ignore: the
  runner already runs it once per site.
- A failed SELECT now returns false so the runner retries, instead of
  marking the site done with nothing changed.
- The runner test checks batch order instead of which batch is last.

* Run the MP3 type migration in the 2.5.0 batch

2.4.1 ships without this change but still stores 2.4.1 as each site's
migration version, and the runner skips batches at or below the stored
version. Keyed 2.4.1, the migration would never run on sites that update
through 2.4.1; keyed 2.5.0 it runs for both 2.4.0 and 2.4.1 sites.

* Release prep v2.5.0: version bump, changelog and POT refresh (#2231)

- Version 2.5.0 in godam.php, readme.txt, README.md, package.json and package-lock.json.
- v2.5.0 changelog in readme.txt and CHANGELOG.md; v2.3.2 removed from readme.txt to keep the last three.
- Every @SInCE n.e.x.t replaced with 2.5.0 (51 tags in 6 files).
- languages/godam.pot regenerated from a production build.

* Fix the two new Plugin Check warnings in the Video SEO sitemap code (#2232)

- class-video-sitemap.php: the phpcs:ignore named slow_query_meta_key, which is not a sniff, so it ignored nothing. Use slow_db_query_meta_key.
- class-video-sitemap-core-provider.php: ignore NonPrefixedHooknameFound on WordPress core's own wp_sitemaps_index_entry filter.

* Keep page-builder shortcode text out of the video sitemap description (#2235)

* Keep page-builder shortcode text out of the video sitemap description

The sitemap is served at parse_request priority 1, before WPBakery and Divi
register their shortcodes, so core's strip_shortcodes() left tags such as
[vc_row] in the fallback description taken from the page text. Add the tag
names found in the text to strip_shortcodes()'s own list so unregistered
shortcodes are removed the same way registered ones are, which gives the same
description in the sitemap and on the front end.

The strip_shortcodes() test stub removed every [tag], which hid the bug. It now
follows core: only registered shortcodes are removed.

* Only strip builder-style unregistered shortcode names from the fallback description

Review of the first version found that it also removed ordinary bracketed text
([sic], [1], [b]bold[/b]) from the front-end description, that one very long
bracketed word made core's pattern too large and the description empty, that a
tag another filter had taken off the strip list was re-added, and that the
filter stayed registered if stripping threw.

Only names that look like a builder tag are added now (a letter first, an
underscore or hyphen in the name, 64 characters at most), tags that are
registered are left to core, and the filter is removed in a finally block.
New tests pin the cap, the length limit, the filter removal and the ordinary
bracketed text.

* Set the 2.5.0 changelog date to October 22, 2026 (#2236)

2.5.0 releases on 22 Oct (release ticket rtCamp/godam-plugin-wp#60), but readme.txt and CHANGELOG.md dated it October 21.

---------

Co-authored-by: Kuldip Chaudhary <64731232+KMchaudhary@users.noreply.github.com>
Co-authored-by: Rudrakshi Gupta <109859631+rudrakshi-gupta@users.noreply.github.com>
Co-authored-by: Vishal Kumar <vishnshiv3@gmail.com>
Co-authored-by: KMchaudhary <kuldipkumar.chaudhary@rtcamp.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants