Skip to content

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

Merged
subodhr258 merged 8 commits into
developfrom
fix/no-viewer-email-in-analytics
Oct 20, 2026
Merged

subodhr258 merged 8 commits into
developfrom
fix/no-viewer-email-in-analytics

Conversation

@subodhr258

@subodhr258 subodhr258 commented Oct 19, 2026 •

Copy link
Copy Markdown
Collaborator

Review packet

In one line: The plugin no longer puts the signed-in viewer's email address into the front-end page (in the videoAnalyticsParams object and in the player's godamData.currentLoggedInUserData) or into the analytics events the player sends. No issue; planned in rtCamp/godam-analytics#364 (item 4).

1. Criteria and proof

Acceptance criterion Proof
A signed-in viewer's page source has no emailId (before: it carries the viewer's address) PHP test test_signed_in_viewers_email_is_not_in_the_page_params; capture S01, block 1
The player's page data has no email (before: godamData.currentLoggedInUserData.email holds the address) PHP test test_player_page_data_for_a_signed_in_viewer_has_no_email; capture S01, block 2
Across 12 front-end pages, the viewer's address appears 0 times in the page source from GoDAM (before: 2 times on each page) capture S01, block 4
The analytics request body has no email key (before: email holds the viewer's address) JS test does not send the viewer email, even when the page still carries one; capture S01, block 3
A page cached by an older plugin version, which still carries emailId, does not make the player send it same JS test (its fixture keeps emailId: 'a@b.test' on purpose)
The comments routes still get the viewer's email on the server PHP test test_the_server_side_user_data_still_has_the_email
The page and the request keep the user id, site id, token and post details PHP test test_page_params_keep_what_analytics_still_needs; JS test still sends the WordPress user id
Plays are still recorded and the country still resolves capture S02

2. Before and after

A signed-in subscriber opens a page with videos on godam-dev in Chrome and plays one for 6 seconds. Before is develop (2.4.0); after is this branch. Captures are verbatim from the browser and from the analytics service's database.

What was read Before After
emailId in videoAnalyticsParams the viewer's address not present
email in godamData.currentLoggedInUserData the viewer's address not present (name and type stay)
email in the play request the viewer's address not a key
email stored for the 6 events of the run the viewer's address, 6 of 6 empty, 6 of 6
The viewer's address in the page source, 12 pages 2 each (3 on the 2 pages with WooCommerce blocks) 0 each (1 on those 2 pages: WooCommerce's own cart data)
Video 203 plays, page loads, country 1, 1, USA 1 1, 1, USA 1

Page source and play request, before and after

Stored events and daily figures, before and after

3. Tests

  • Added: tests/php/ViewerEmailNotInPageTest.php. It builds the page params with a signed-in user and asserts there is no emailId key and the address appears nowhere in the JSON; that the player's page data has no email but keeps name and type; that the server-side user data still has the email; and that userId, siteId, endpoint, token and postId are still in the page params. Each test runs in its own process, and loads its stubs there, because loading godam-transcoder-functions.php registers hooks and EarlyTranslationHooksTest checks exactly that on first load.
  • Added: two tests in assets/src/js/godam-player/analytics-helpers.test.js (no email key even when the page still carries emailId; wp_user_id still sent).
  • Added: tests/stubs/template-tags.php, the page-tag stubs the PHP test needs (is_single, get_the_title and similar).
  • Changed: tests/stubs/engagement-functions.php. The current-user stub now also returns ID and data->user_email (an empty data when nobody is signed in), as WordPress does. The Engagement tests that use it still pass: 428 PHP tests, 1414 assertions, in normal, reversed and random order.
  • Changed: assets/src/js/godam-player/engagement.test.js. Its page-data fixture no longer has an email, matching what the page now prints.
  • Revert check: with the fix reverted, test_signed_in_viewers_email_is_not_in_the_page_params fails with "Failed asserting that an array does not have the key 'emailId'", test_player_page_data_for_a_signed_in_viewer_has_no_email fails with "Failed asserting that an array does not have the key 'email'", and the JS test fails with Expected path: not "email", Received value: "a@b.test".

4. Risk flags

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

5. Independent review

A separate review pass saw only the task and the diff, first on the analytics change and then again after the player-data and readme commits.

Finding Grade What I did
The stub file was loaded at the top of the test file, so its stand-in functions and the RTGODAM_ANALYTICS_BASE constant reached every other test Valid Fixed in 2b88478: loaded inside setUp(), in the separate process. The suite passes in normal, reversed and random order.
Pages already stored by a page cache before the update still contain the email, and browsers or CDNs that cached the old script keep sending email, until those caches expire (raised twice) Valid, outside this diff No code change. Listed in section 6. Flushing caches on update is new behaviour and not part of this fix.
Other code that reads or prints the address Valid question, checked Found one: godamData.currentLoggedInUserData.email in the player script's page data, seen on godam-dev. Fixed in 5732543. Static search of the source: emailId is read only by the analytics sender and the godam-for-woo add-on; rtgodam_get_current_logged_in_user_data() is called by the page data (now filtered) and by the comments routes, which run on the server. assets/build is not committed. A scan of 12 front-end pages as a signed-in viewer finds 0 copies from GoDAM.
The stub returned a non-empty data even when nobody was signed in, and its header comment overstated what it guards Valid Fixed in 2b88478: an empty object for visitors, comment reworded.
The request body now has no email key where it had ''; a required column could reject it Valid question, checked Capture S02: the service stored all 6 events with an empty email. The service tested is develop, which per rtCamp/godam-analytics#364 holds the same code as production.
readme.txt lists "Email" among the data sent to analytics Valid Fixed in b2281c2: the entry is removed from the External services list for analytics.godam.io. README.md has the same table row; that file is changed by the readme PR of this release.
No test covers the call in class-godam-player.php that builds godamData, and removing one field is a blocklist Valid, partly The helper now returns only name and type (240c9ba), so a later field is not printed by accident. No unit test for the call itself: the method registers about 20 scripts and styles and needs the built files, so the stubs would outweigh the check. The scan of 12 pages in S01 covers it on a real site.
Process isolation relies on PHPUnit annotations; the tests assert the stubs' own fixed values Overstated composer.json pins PHPUnit to ^9.6, which honours them. The fixed values are the stub's, not the plugin's.

6. Not verified

  • Page caches and CDNs: pages cached by the previous version keep the old params, and cached copies of the old script keep sending email, until they expire. Site owners can purge their page cache after updating. Not tested.
  • The godam-for-woo add-on reads emailId and sends it as email too. After this PR it reads nothing there, so its Reel Pop events carry an empty email (seen in capture S02, type 4, stored empty). No change is needed in that repo for this PR.
  • Plugin versions already installed keep sending email until they update. The analytics service already treats the field as optional; dropping it on the service side is item 4 of rtCamp/godam-analytics#364.
  • The captures were taken at 5732543. The later commits change test files and make the helper list its fields (same output, covered by the PHP tests); the site was not re-captured for them.
  • Tested as a signed-in subscriber, with Chrome driven by a script. Not tested: a logged-out visitor (the plugin never had an address for them), other browsers, or a site behind a page cache.

7. Scope

Beyond the analytics code: the player's page data lost its email (found when the page source was checked on godam-dev; no script reads it), and one line of readme.txt changed, because the External services text for analytics.godam.io no longer lists Email as data sent (the later items are renumbered). languages/godam.pot is regenerated (5 source line numbers moved, because the new helper sits above those strings in custom-functions.php). wp_user_id is kept for now: replacing it with an opaque id is a larger change and is not part of this PR.

What changed

  • rtgodam_get_localize_array() no longer sets emailId from the current user.
  • buildAnalyticsRequestBody() no longer reads emailId or sends email.
  • New rtgodam_get_current_user_data_for_page() returns the current user's data without the email; the player script's godamData.currentLoggedInUserData uses it. The comments routes keep calling rtgodam_get_current_logged_in_user_data(), which still has the email.

How to check by hand

  1. Sign in, open a page that has a GoDAM video, and view the page source. Search for your email address: GoDAM prints it nowhere. videoAnalyticsParams has userId and no emailId.
  2. Open DevTools, Network, filter on analytics, play the video. The request payload has no email key.

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.
The analytics.godam.io entry under External services no longer lists Email as data sent.
@github-actions

github-actions Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

🔍 WordPress Plugin Check Report

⚠️ Status: Passed with warnings

📊 Report

🎯 Total Issues ❌ Errors ⚠️ Warnings
15 0 15

⚠️ Warnings (15)

📁 inc/classes/class-video-sitemap.php (1 warning)
📍 Line 🔖 Check 💬 Message
620 WordPress.DB.SlowDBQuery.slow_db_query_meta_key Detected usage of meta_key, possible slow query.
📁 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.
📁 inc/classes/class-video-sitemap-core-provider.php (1 warning)
📍 Line 🔖 Check 💬 Message
73 WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound Hook names invoked by a theme/plugin should start with the theme/plugin prefix. Found: "wp_sitemaps_index_entry".
📁 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/20/demo-post-post/ (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-page-post/ (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/20/demo-post-post/ (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-page-post/ (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

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.
The explanation moves into the test, so the fixture lines this branch leaves alone cannot conflict with the sibling change.
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.
@subodhr258
subodhr258 marked this pull request as ready for review October 19, 2026 17:59
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.
@KMchaudhary

Copy link
Copy Markdown
Collaborator

Code review

Verdict: LGTM — the privacy change is complete and verified at both ends (page params and request body), and the server-side comments path correctly keeps the email.

I traced every consumer of the removed data:

  • emailId is read only by rtgodam_get_localize_array() (removed here) and analytics-helpers.js (removed here) within this repo — no other reader, so the key can be dropped cleanly. The godam-for-woo add-on reads it in its own repo and degrades to an empty email, as the packet notes.
  • currentLoggedInUserData.email: engagement.js only destructures currentLoggedInUserData and forwards it as userData; there is no .email access anywhere in assets/src (non-test). So narrowing it to name/type via rtgodam_get_current_user_data_for_page() breaks no UI.
  • rtgodam_get_current_logged_in_user_data() still returns email for the REST/comments routes.

Using an allowlist (array_intersect_key on name/type) rather than unsetting email is the right call — a field added later to the base helper won't leak into the page by accident. Good test coverage with the revert check.

Two documentation-level notes, neither blocking:

1. README.md still lists "Email" for analytics — README.md:284

You removed "Email" from the analytics.godam.io data-sent list in readme.txt, but README.md:284 still reads IP, Email, Author, Browser info, OS, User Agent. The packet says README.md is handled by this release's readme PR (#2212) — just flagging the coupling so both land in 2.5.0 and the external-services disclosure stays consistent. (Lines 264/274 legitimately keep Email — those are server-side comment/activation flows.)

2. @since n.e.x.t placeholder — inc/helpers/custom-functions.php

rtgodam_get_current_user_data_for_page() is tagged @since n.e.x.t. That's your existing placeholder convention (also in class-pages.php), so this is just a reminder to resolve it to 2.5.0 before tagging.

Minor

  • The class-godam-player.php call site (passing the page helper into godamData) has no unit test; you cover it with the 12-page scan and argue the ~20-script stubbing cost outweighs it. Reasonable — a one-line assertion that the method calls the page helper (not the full one) would cheaply guard against a future revert, if you want belt-and-suspenders.

Thorough packet, especially calling out the page-cache / CDN-cached-script window explicitly.

🤖 Automated review via Claude Code (/code-review, high effort).

@subodhr258
subodhr258 merged commit 7b2b201 into develop Oct 20, 2026
5 checks passed
@subodhr258
subodhr258 deleted the fix/no-viewer-email-in-analytics branch October 20, 2026 10:29
subodhr258 added a commit that referenced this pull request Oct 20, 2026
The page no longer sends the signed-in viewer's email (#2213), and readme.txt
already dropped it; README.md still listed it.

Addresses review: #2213 (comment)
Addresses review: #2212 (comment)
@subodhr258

Copy link
Copy Markdown
Collaborator Author

@KMchaudhary on your comment:

Thanks Kuldip.

  1. README.md:284: fixed in 44b75e9 on Name every screen PostHog runs on in the readme's External Services entry #2212, so README.md drops Email too.
  2. @since n.e.x.t: resolved to 2.5.0 at release prep.

Minor: leaving the call-site test out; the 12-page scan covers it.

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