diff --git a/CHANGELOG.md b/CHANGELOG.md index 56e105f..7bc9f67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,50 @@ Format: [Keep a Changelog 1.1.0](https://keepachangelog.com/en/1.1.0/) — versi --- +## [0.7.5] — 2026-05-30 — WordPress.org slug rename: `a-radio` → `rangerhq-radio` + +A third-party AI-driven naming-check tool (run via Plugin Check's Claude AI connector against the v0.7.4 build) flagged the slug as too generic for the wp.org Plugin Directory: + +> The display name "a-radio" is too generic. The term "radio" is a broadly used, common functional word, and the single-letter prefix "a-" does not add meaningful distinctiveness or describe what the plugin actually does. With 60,000+ plugins in the directory, a name this short and generic makes it hard for users to identify the plugin and distinguish it from others. + +The verdict was advisory (not the official wp.org reviewer) but defensible — single-word generic slugs are increasingly rejected by human reviewers as the directory grows. Better to fix it preemptively than face a rejection at submission time. + +The new slug `rangerhq-radio` matches the public display name "RangerHQ Radio" (which is unchanged) and lines up with the rest of the RangerHQ plugin family: `rangerhq-spatial`, `rangerhq-glyph`, now `rangerhq-radio`. Consistent prefix, distinctive enough for the directory, descriptive of what the plugin does. + +### Changed +- **Plugin slug** `a-radio` → `rangerhq-radio`. The slug is the plugin's folder name + the URL fragment at `wordpress.org/plugins//`. Folder renamed on disk; Gitea repository moved from `ranger/a-radio` to `ranger/rangerhq-radio` (history + tags + issues preserved by Gitea's rename). +- **Text Domain** `a-radio` → `rangerhq-radio` to match the slug (wp.org best practice + PCP `textdomain_mismatch` requirement). All 125 i18n call sites updated via in-place `sed` across every `*.php` file: `__()`, `_e()`, `esc_html__()`, `esc_html_e()`, `esc_attr__()`, `esc_attr_e()`, and the translator-comment arguments. PHP lint clean post-rename. +- **`Text Domain:` plugin header** in `radio.php` line 15 updated to match. +- **`RADIO_GITEA_URL` constant** value updated from `https://git.davidtkeane.com/ranger/a-radio` to `https://git.davidtkeane.com/ranger/rangerhq-radio` to follow the Gitea repo rename. The constant name stays the same (internal naming; no churn). +- **Install URL in root `README.md`** — repo link in the install step updated. +- **Gitea issue link in `readme.txt` FAQ** — updated to the new repo URL. +- **`readme.txt` Stable tag** → `0.7.5`. +- **`inc/about.php` Version history** — v0.7.5 rotated into the "latest" slot; v0.7.4 demoted to a one-liner in the earlier-releases list. + +### Unchanged (deliberately — would have been pure churn) +- **Plugin Name header** (`RangerHQ Radio`) — already correct, distinctive, and brand-aligned. +- **Plugin URI** (`https://icanhelp.ie/radio`). +- **Internal PHP constants** (`RADIO_VERSION`, `RADIO_FILE`, `RADIO_PATH`, `RADIO_URL`, `RADIO_BASENAME`, `RADIO_GITEA_URL`, `RADIO_SUPPORT_URL`, `RADIO_META_KEY`). Constants don't have to match the slug; renaming them would have rippled through every PHP file for zero functional benefit. +- **User-meta keys** (`radio_state`, `radio_history`, `radio_favourites`). Renaming would have orphaned every existing user's settings + history + favourites on upgrade. +- **HTML `data-radio-*` attributes** in the player markup (`data-radio-play`, `data-radio-viz`, `data-radio-station`, etc.) — these are the JS controller's element selectors in `radio.js`, not slug-related. They share the word "radio" by coincidence; renaming would have required corresponding `radio.js` changes for zero benefit. +- **CSS class names** (`radio-player`, `radio-player__*`, `radio-about-*`, etc.) — same reasoning. Internal scoping. +- **Main plugin file name** (`radio.php`). WordPress doesn't require the main file to be named after the slug; it just has to exist in the slug folder. Many plugins ship with `/.php`. Keeping `radio.php` saved a rename + a corresponding update to every git reference. + +### Migration +- **wp.org installs** (once accepted): no migration — wp.org will accept the plugin under the new slug from day one. +- **Existing Gitea-installed copies** (the local dev install at `/Users/ranger/Local Sites/plugin-test/.../a-radio/` was renamed in-place to `.../rangerhq-radio/` as part of this release; M5 or other Gitea installs would need the same): deactivate the plugin in WP admin (so WP releases its hold on `a-radio/radio.php`), rename the folder on disk, reactivate via the new entry at `rangerhq-radio/radio.php`. WordPress's `active_plugins` option in `wp_options` is keyed on the basename (`folder/file.php`), so a folder rename appears to WP as an uninstall + a new install — but no data is lost because all user-facing state lives in `user_meta` under unchanged keys (`radio_state` / `radio_history` / `radio_favourites`). +- **Tags + git history**: preserved across the Gitea repo rename. The annotated tag for v0.7.5 was pushed AFTER the Gitea repo rename so it lives in the new URL space from the start. + +### Why the slug matters even though "RangerHQ Radio" is fine +WordPress.org reviewers evaluate two strings independently — the **display name** (Plugin Name header, what users see in their admin) and the **slug** (folder name, what appears in the URL at `wordpress.org/plugins//`). They have to be distinct enough that: +- Users can find the plugin via wp.org search. +- The URL is recognisable and not easily confused with other plugins. +- The slug doesn't collide with an already-registered plugin name. + +"RangerHQ Radio" was always fine as the display name. The slug `a-radio` was the weak link — short, generic, with a non-descriptive prefix. `rangerhq-radio` is none of those things. + +--- + ## [0.7.4] — 2026-05-30 — WordPress.org submission cleanup (updater out, LICENSE in) Walks back the Update URI guard pattern from v0.7.3 and replaces it with the simpler, actually-correct answer: just remove the custom updater entirely. The WordPress.org Plugin Check tool (PCP) raised `plugin_updater_detected` on the v0.7.3 build with the message *"Including An Update Checker / Changing Updates functionality. Plugin Updater detected. Use of the Update URI header is not allowed in plugins hosted on WordPress.org."* PCP scans the source as-shipped, not as-distributed, so the build-time `sed` strip we relied on in v0.7.3 never had a chance to run before the scan — and the scanner flagged both the header and the `inc/updater.php` file itself. Two options remained: (a) keep dancing around PCP with branches and build scripts, or (b) accept that WordPress.org is the canonical update channel once a plugin is hosted there and drop the custom system. We went with (b). diff --git a/README.md b/README.md index 88bdd26..981d668 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ A small, focused, free WordPress plugin that drops a SomaFM radio player into yo ## Installation -1. Download the latest release `.zip` from [git.davidtkeane.com/ranger/a-radio/releases](https://git.davidtkeane.com/ranger/a-radio/releases) +1. Download the latest release `.zip` from [git.davidtkeane.com/ranger/rangerhq-radio/releases](https://git.davidtkeane.com/ranger/rangerhq-radio/releases) 2. WP Admin → Plugins → Add New → Upload Plugin 3. Activate 4. Look at **WP Admin → Dashboard** for the mini-player, or **WP Admin → Radio** diff --git a/inc/about.php b/inc/about.php index ed91790..3dc2db9 100644 --- a/inc/about.php +++ b/inc/about.php @@ -14,48 +14,48 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } function radio_render_about_page() { if ( ! current_user_can( 'read' ) ) { - wp_die( esc_html__( 'You do not have permission to view this page.', 'a-radio' ) ); + wp_die( esc_html__( 'You do not have permission to view this page.', 'rangerhq-radio' ) ); } $count = count( radio_get_stations_flat() ); ?>
-

+

-

+

- element pointed at SomaFM\'s public streams.', 'a-radio' ); ?> + element pointed at SomaFM\'s public streams.', 'rangerhq-radio' ); ?>

-

+

- +

-

+

array( 'href' => true, 'target' => true, 'rel' => true ) ) ), 'SomaFM' @@ -63,11 +63,11 @@ function radio_render_about_page() { ?>

- +

- +
@@ -76,38 +76,39 @@ function radio_render_about_page() {
-

+

- v0.7.4 — 30 May 2026 + v0.7.5 — 30 May 2026

- +

-

+

    -
  • v0.7.3 30 May 2026
  • -
  • v0.7.2 30 May 2026
  • -
  • v0.7.1 30 May 2026
  • -
  • v0.7.0 30 May 2026
  • -
  • v0.6.3 30 May 2026
  • -
  • v0.6.2 30 May 2026
  • -
  • v0.6.1 30 May 2026
  • -
  • v0.6.0 30 May 2026
  • -
  • v0.5.0 29 May 2026
  • -
  • v0.4.0 29 May 2026
  • -
  • v0.3.2 29 May 2026
  • -
  • v0.3.1 29 May 2026
  • -
  • v0.3.0 29 May 2026
  • -
  • v0.2.0 26 May 2026
  • -
  • v0.1.0 26 May 2026
  • +
  • v0.7.4 30 May 2026
  • +
  • v0.7.3 30 May 2026
  • +
  • v0.7.2 30 May 2026
  • +
  • v0.7.1 30 May 2026
  • +
  • v0.7.0 30 May 2026
  • +
  • v0.6.3 30 May 2026
  • +
  • v0.6.2 30 May 2026
  • +
  • v0.6.1 30 May 2026
  • +
  • v0.6.0 30 May 2026
  • +
  • v0.5.0 29 May 2026
  • +
  • v0.4.0 29 May 2026
  • +
  • v0.3.2 29 May 2026
  • +
  • v0.3.1 29 May 2026
  • +
  • v0.3.0 29 May 2026
  • +
  • v0.2.0 26 May 2026
  • +
  • v0.1.0 26 May 2026
- +
diff --git a/inc/admin-page.php b/inc/admin-page.php index 1521bde..d6e97d5 100644 --- a/inc/admin-page.php +++ b/inc/admin-page.php @@ -12,7 +12,7 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } function radio_render_main_page() { if ( ! current_user_can( 'read' ) ) { - wp_die( esc_html__( 'You do not have permission to view this page.', 'a-radio' ) ); + wp_die( esc_html__( 'You do not have permission to view this page.', 'rangerhq-radio' ) ); } $state = radio_get_state(); @@ -21,13 +21,13 @@ function radio_render_main_page() { $count = count( radio_get_stations_flat() ); ?>
-

+

@@ -35,7 +35,7 @@ function radio_render_main_page() {

-

+

@@ -45,7 +45,7 @@ function radio_render_main_page() { - +

@@ -55,24 +55,24 @@ function radio_render_main_page() {
-
- - + %
- + + %
- + +
@@ -204,11 +204,11 @@ function radio_render_history_page() { - - - - - + + + + + @@ -222,7 +222,7 @@ function radio_render_history_page() { @@ -243,7 +243,7 @@ function radio_render_history_page() { data-station="" data-station-id="" data-nonce="" - aria-label=""> + aria-label=""> diff --git a/inc/settings.php b/inc/settings.php index ed6c54d..ad3026f 100644 --- a/inc/settings.php +++ b/inc/settings.php @@ -10,7 +10,7 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } function radio_render_settings_page() { if ( ! current_user_can( 'read' ) ) { - wp_die( esc_html__( 'You do not have permission to view this page.', 'a-radio' ) ); + wp_die( esc_html__( 'You do not have permission to view this page.', 'rangerhq-radio' ) ); } // Handle form submission. @@ -38,7 +38,7 @@ function radio_render_settings_page() { $state['hide_dashboard_widget'] = $hide_widget ? 1 : 0; update_user_meta( $user_id, RADIO_META_KEY, $state ); - echo '

' . esc_html__( 'Settings saved.', 'a-radio' ) . '

'; + echo '

' . esc_html__( 'Settings saved.', 'rangerhq-radio' ) . '

'; } $state = radio_get_state(); @@ -47,7 +47,7 @@ function radio_render_settings_page() { ?>

- + v

@@ -57,7 +57,7 @@ function radio_render_settings_page() {
- +
wp_create_nonce( 'radio_save_state' ), 'popoutUrl' => admin_url( 'admin-post.php?action=radio_popout' ), 'strings' => array( - 'play' => __( 'Play', 'a-radio' ), - 'pause' => __( 'Pause', 'a-radio' ), - 'loading' => __( 'Loading…', 'a-radio' ), - 'error' => __( 'Stream error — try another station.', 'a-radio' ), - 'saveError' => __( 'Preferences not saved — check your connection.', 'a-radio' ), - 'mute' => __( 'Mute', 'a-radio' ), - 'unmute' => __( 'Unmute', 'a-radio' ), - 'nowPlaying' => __( 'Now Playing', 'a-radio' ), - 'volume' => __( 'Volume', 'a-radio' ), - 'station' => __( 'Station', 'a-radio' ), - 'addFav' => __( 'Add to favourites', 'a-radio' ), - 'removeFav' => __( 'Remove from favourites', 'a-radio' ), - 'clearConfirm' => __( 'Clear all track history? (Favourites are kept.)', 'a-radio' ), + 'play' => __( 'Play', 'rangerhq-radio' ), + 'pause' => __( 'Pause', 'rangerhq-radio' ), + 'loading' => __( 'Loading…', 'rangerhq-radio' ), + 'error' => __( 'Stream error — try another station.', 'rangerhq-radio' ), + 'saveError' => __( 'Preferences not saved — check your connection.', 'rangerhq-radio' ), + 'mute' => __( 'Mute', 'rangerhq-radio' ), + 'unmute' => __( 'Unmute', 'rangerhq-radio' ), + 'nowPlaying' => __( 'Now Playing', 'rangerhq-radio' ), + 'volume' => __( 'Volume', 'rangerhq-radio' ), + 'station' => __( 'Station', 'rangerhq-radio' ), + 'addFav' => __( 'Add to favourites', 'rangerhq-radio' ), + 'removeFav' => __( 'Remove from favourites', 'rangerhq-radio' ), + 'clearConfirm' => __( 'Clear all track history? (Favourites are kept.)', 'rangerhq-radio' ), ), ) ); } @@ -241,7 +241,7 @@ function radio_ajax_clear_history() { add_action( 'admin_post_radio_popout', 'radio_render_popout_page' ); function radio_render_popout_page() { if ( ! current_user_can( 'read' ) ) { - wp_die( esc_html__( 'You do not have permission to view this page.', 'a-radio' ) ); + wp_die( esc_html__( 'You do not have permission to view this page.', 'rangerhq-radio' ) ); } $state = radio_get_state(); @@ -258,16 +258,16 @@ function radio_render_popout_page() { 'popoutUrl' => '', // already in popout — no further popouts 'autoPlay' => isset( $_GET['play'] ), // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- query flag only, no state change 'strings' => array( - 'play' => __( 'Play', 'a-radio' ), - 'pause' => __( 'Pause', 'a-radio' ), - 'loading' => __( 'Loading…', 'a-radio' ), - 'error' => __( 'Stream error — try another station.', 'a-radio' ), - 'saveError' => __( 'Preferences not saved — check your connection.', 'a-radio' ), - 'mute' => __( 'Mute', 'a-radio' ), - 'unmute' => __( 'Unmute', 'a-radio' ), - 'nowPlaying' => __( 'Now Playing', 'a-radio' ), - 'volume' => __( 'Volume', 'a-radio' ), - 'station' => __( 'Station', 'a-radio' ), + 'play' => __( 'Play', 'rangerhq-radio' ), + 'pause' => __( 'Pause', 'rangerhq-radio' ), + 'loading' => __( 'Loading…', 'rangerhq-radio' ), + 'error' => __( 'Stream error — try another station.', 'rangerhq-radio' ), + 'saveError' => __( 'Preferences not saved — check your connection.', 'rangerhq-radio' ), + 'mute' => __( 'Mute', 'rangerhq-radio' ), + 'unmute' => __( 'Unmute', 'rangerhq-radio' ), + 'nowPlaying' => __( 'Now Playing', 'rangerhq-radio' ), + 'volume' => __( 'Volume', 'rangerhq-radio' ), + 'station' => __( 'Station', 'rangerhq-radio' ), ), ); @@ -289,15 +289,15 @@ function radio_render_popout_page() { <?php /* translators: %s = currently playing station name */ - printf( esc_html__( 'Radio — %s', 'a-radio' ), esc_html( $station['name'] ) ); + printf( esc_html__( 'Radio — %s', 'rangerhq-radio' ), esc_html( $station['name'] ) ); ?>
-

- +

+
@@ -308,7 +308,7 @@ function radio_render_popout_page() { - +

@@ -318,19 +318,19 @@ function radio_render_popout_page() {
- - + %
- +