Trending Now 1.1.0
Upgrading from 1.0.0 takes one manual install. The update mechanism ships in this release, so a 1.0.0 site has no way to discover it. Upload the zip once — every release after this one appears on the Plugins screen by itself.
Added
Google News via SerpAPI — a news source that answers in a couple of seconds instead of GDELT's ten to twenty. Query, optional domain allowlist, country and language. One search credit per fetch, not per item, so a daily source costs about 30 a month; identical repeat queries come from SerpAPI's own cache and are free. Credit exhaustion is handled as its own failure — it reads like a rate limit but needs a human to top up — and Diagnostics shows the remaining balance without spending one.
Self-update from GitHub releases. The plugin declares an Update URI, so WordPress routes update checks here rather than to wordpress.org, which also stops an unrelated plugin sharing the slug from being installed over it. Prefers the attached zip, falls back to the generated zipball, and supports a token for private repositories.
Manual links — a new admin tab for hand-picked links that mix into the same widget. Same fields as an ingested item, plus a position (1-based slot, 0 for no preference, out-of-range clamped) and an expiry with quick presets and a live countdown. They reserve their slots before automatic selection runs, deduplicate against anything a source also finds, and appear in the archive. Links back to your own site are allowed here. Expiry marks the link stale rather than deleting it — off the widget, kept in the archive — and rebuilds immediately instead of waiting up to a full ingest interval.
Credentials via constants — ADVTN_SERPAPI_KEY and ADVTN_GITHUB_TOKEN in wp-config.php, keeping keys out of the database and out of settings exports.
Removed
The GDELT source. Free, but 10–20 seconds per request against a rate limit of roughly one per five seconds whose penalty outlasted its own window — and while throttled it returned errors that actively misled, reporting a bare, valid domain:espn.com as "The specified domain is too short or too long." A failing GDELT source also ate most of the inline ingest budget and pushed healthy sources into the background queue.
gdelt source rows are removed automatically on upgrade. Items already ingested are kept, stay classified as news, and age out normally.
Fixed
- SerpAPI rejected every query —
sowas sent alongsideq, which the API refuses. - Outbound requests died at exactly 10s regardless of
http_timeout: WordPress never setsconnect_timeout, which Requests hardcodes to 10 and which covers the TLS handshake. - API error text was discarded in favour of a generic message, hiding the only useful diagnostic.
- The archive rewrite flush only fired when the slug changed through the admin form, so a WP-CLI or scripted change left the archive quietly 404ing.
Upgrade safety
Verified by installing the published 1.0.0, configuring it, seeding data, and upgrading: every setting, the ingest secret, all sources except GDELT, all items and the committed selection came through unchanged. The signed REST endpoint still authenticated with the original secret.
Two notes: your GDELT source is intentionally removed, and WordPress replaces the whole plugin directory on update — keep custom templates in {theme}/trending-now/, never inside the plugin folder.
Full detail in CHANGELOG.md.