v0.7.5 — WordPress.org slug rename: a-radio → rangerhq-radio

A third-party AI-driven naming check flagged `a-radio` as too
generic for the wp.org Plugin Directory (single common functional
word, no distinguishing prefix). The verdict was advisory but
defensible — short generic slugs are increasingly rejected as the
directory grows past 60K plugins. Fixing it preemptively is cheaper
than facing a rejection at submission time.

The new slug `rangerhq-radio` matches the public display name
"RangerHQ Radio" (unchanged) and lines up with the rest of the
RangerHQ plugin family: `rangerhq-spatial`, `rangerhq-glyph`,
now `rangerhq-radio`.

Changes (packaging only — no player behaviour change):
* Text Domain `a-radio` → `rangerhq-radio` across all 125 i18n
  call sites via in-place sed (esc_html__, _e, __, esc_attr_e
  and their friends). PHP lint clean post-rename.
* `Text Domain:` plugin header in radio.php line 15 → `rangerhq-radio`.
* `RADIO_GITEA_URL` constant value → new Gitea repo URL.
* README.md install link → new repo URL.
* readme.txt FAQ Gitea link → new repo URL.
* readme.txt Stable tag → 0.7.5.
* inc/about.php — v0.7.5 in "latest" slot; v0.7.4 demoted.

Unchanged deliberately (would have been pure churn):
* Plugin Name header "RangerHQ Radio" — already correct.
* Plugin URI.
* Internal constants `RADIO_*` — don't have to match slug.
* User-meta keys `radio_state` / `radio_history` /
  `radio_favourites` — renaming would orphan every existing
  user's settings on upgrade.
* HTML `data-radio-*` attributes — JS controller's element
  selectors in radio.js, not slug-related.
* CSS class names `radio-player`, `radio-about-*` — internal
  scoping.
* Main plugin file name `radio.php`.

Migration: existing Gitea-installed copies need their folder
renamed on disk (a-radio → rangerhq-radio) + reactivation in
WP admin. No data loss because all user-facing state lives in
user_meta under unchanged keys.

This commit is the file content for v0.7.5; the annotated tag
and push will follow the Gitea repo rename (ranger/a-radio →
ranger/rangerhq-radio) so the new tag lives in the new URL
space from the start.
This commit is contained in:
2026-05-30 04:55:39 +01:00
parent de93aa50ca
commit 340cbb2487
9 changed files with 182 additions and 131 deletions
+32 -31
View File
@@ -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() );
?>
<div class="wrap radio-about-wrap">
<h1><?php esc_html_e( 'About Radio', 'a-radio' ); ?></h1>
<h1><?php esc_html_e( 'About Radio', 'rangerhq-radio' ); ?></h1>
<!-- ── Top row: three short cards (What / Who / Credits) ── -->
<div class="radio-about-grid">
<div class="radio-about-card">
<h2><?php esc_html_e( 'What Radio does', 'a-radio' ); ?></h2>
<h2><?php esc_html_e( 'What Radio does', 'rangerhq-radio' ); ?></h2>
<p>
<?php
printf(
/* translators: %d = station count */
esc_html__( 'Adds a small, focused radio player to your WordPress dashboard. %d hand-curated SomaFM stations across 10 genres — ambient, electronic, lounge, rock, metal, jazz, world, reggae, holiday and specials. Plays in your admin pages while you work. Your chosen station + volume persist per user.', 'a-radio' ),
esc_html__( 'Adds a small, focused radio player to your WordPress dashboard. %d hand-curated SomaFM stations across 10 genres — ambient, electronic, lounge, rock, metal, jazz, world, reggae, holiday and specials. Plays in your admin pages while you work. Your chosen station + volume persist per user.', 'rangerhq-radio' ),
(int) $count
);
?>
</p>
<p>
<?php esc_html_e( 'Audio plays directly in your browser via HTML5 — no server-side proxy, no extra services to host, no third-party tracking. Just an <audio> element pointed at SomaFM\'s public streams.', 'a-radio' ); ?>
<?php esc_html_e( 'Audio plays directly in your browser via HTML5 — no server-side proxy, no extra services to host, no third-party tracking. Just an <audio> element pointed at SomaFM\'s public streams.', 'rangerhq-radio' ); ?>
</p>
</div>
<div class="radio-about-card">
<h2><?php esc_html_e( 'Who Radio is for', 'a-radio' ); ?></h2>
<h2><?php esc_html_e( 'Who Radio is for', 'rangerhq-radio' ); ?></h2>
<p>
<?php esc_html_e( 'Anyone who likes background music while working in the WordPress admin. Coders, writers, support agents, content editors. The 44 SomaFM stations cover a wide enough range that there\'s something for any mood — from coding-focus ambient (Groove Salad, Drone Zone) to drive-time electronic (DEF CON Radio, Beat Blender) to mellow lounge (Lush, Secret Agent) to specifically-quirky picks (SF 10-33 mixes ambient with San Francisco public-safety radio).', 'a-radio' ); ?>
<?php esc_html_e( 'Anyone who likes background music while working in the WordPress admin. Coders, writers, support agents, content editors. The 44 SomaFM stations cover a wide enough range that there\'s something for any mood — from coding-focus ambient (Groove Salad, Drone Zone) to drive-time electronic (DEF CON Radio, Beat Blender) to mellow lounge (Lush, Secret Agent) to specifically-quirky picks (SF 10-33 mixes ambient with San Francisco public-safety radio).', 'rangerhq-radio' ); ?>
</p>
</div>
<div class="radio-about-card">
<h2><?php esc_html_e( 'Credits + thanks', 'a-radio' ); ?></h2>
<h2><?php esc_html_e( 'Credits + thanks', 'rangerhq-radio' ); ?></h2>
<p>
<?php
printf(
wp_kses(
/* translators: %s = link to somafm.com */
__( 'All stations and streams are provided by %s — an independent, listener-supported, commercial-free internet radio network broadcasting from San Francisco since 2000. Radio is just a small WordPress wrapper around their public streams. If you enjoy this plugin, please consider donating to SomaFM directly.', 'a-radio' ),
__( 'All stations and streams are provided by %s — an independent, listener-supported, commercial-free internet radio network broadcasting from San Francisco since 2000. Radio is just a small WordPress wrapper around their public streams. If you enjoy this plugin, please consider donating to SomaFM directly.', 'rangerhq-radio' ),
array( 'a' => array( 'href' => true, 'target' => true, 'rel' => true ) )
),
'<a href="https://somafm.com/support/" target="_blank" rel="noopener">SomaFM</a>'
@@ -63,11 +63,11 @@ function radio_render_about_page() {
?>
</p>
<p>
<?php esc_html_e( 'Plugin author: David Keane. Part of the RangerHQ plugin family. GPL v2 or later. Source on Gitea.', 'a-radio' ); ?>
<?php esc_html_e( 'Plugin author: David Keane. Part of the RangerHQ plugin family. GPL v2 or later. Source on Gitea.', 'rangerhq-radio' ); ?>
</p>
<?php if ( defined( 'RADIO_SUPPORT_URL' ) && RADIO_SUPPORT_URL ) : ?>
<a class="radio-support-link" href="<?php echo esc_url( RADIO_SUPPORT_URL ); ?>" target="_blank" rel="noopener">
<?php esc_html_e( 'Like Radio? If You fancy to buy me a coffee →', 'a-radio' ); ?>
<?php esc_html_e( 'Like Radio? If You fancy to buy me a coffee →', 'rangerhq-radio' ); ?>
</a>
<?php endif; ?>
</div>
@@ -76,38 +76,39 @@ function radio_render_about_page() {
<!-- ── Version history: latest in full, earlier as one-liners ── -->
<div class="radio-about-versions">
<h2><?php esc_html_e( 'Version history', 'a-radio' ); ?></h2>
<h2><?php esc_html_e( 'Version history', 'rangerhq-radio' ); ?></h2>
<div class="radio-about-versions__latest">
<span class="ver">v0.7.4</span> &mdash; 30 May 2026 <span class="latest"><?php esc_html_e( 'latest', 'a-radio' ); ?></span>
<span class="ver">v0.7.5</span> &mdash; 30 May 2026 <span class="latest"><?php esc_html_e( 'latest', 'rangerhq-radio' ); ?></span>
<p>
<?php esc_html_e( 'WordPress.org submission cleanup. Removed the self-hosted Gitea updater (`inc/updater.php`) and the `Update URI` header from `radio.php` — WordPress.org explicitly disallows both for hosted plugins (Plugin Check `plugin_updater_detected`). Updates now flow through WordPress.org as the canonical channel. Added a top-level LICENSE file with the full GPL v2 text and GPL header blocks to the CSS and JS assets so the licensing of every shipped file is explicit. No user-visible behaviour changes for the player — only the small `Updates` panel that used to sit at the bottom of Radio → Settings is gone.', 'a-radio' ); ?>
<?php esc_html_e( 'WordPress.org slug rename: a-radio → rangerhq-radio. The previous slug was too generic for the directory (single common functional word, no distinguishing prefix); the new slug matches the public display name and lines up with the rest of the RangerHQ plugin family. Text Domain renamed to match across all 125 i18n call sites. Gitea repository moved. No user-visible behaviour change in the player; this is a packaging change only. Internal constants and user-meta keys are unchanged so settings, history, and favourites survive intact.', 'rangerhq-radio' ); ?>
</p>
</div>
<h3><?php esc_html_e( 'Earlier releases', 'a-radio' ); ?></h3>
<h3><?php esc_html_e( 'Earlier releases', 'rangerhq-radio' ); ?></h3>
<ul class="radio-about-versions__earlier">
<li><span class="ver">v0.7.3</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Privacy section in readme + SomaFM terms-of-use link (Update URI guard pattern from this release was walked back in v0.7.4 — Plugin Check disallows it for wp.org-hosted plugins regardless of header value)', 'a-radio' ); ?></li>
<li><span class="ver">v0.7.2</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Screenshots + correct wp.org contributor handle (ir240474)', 'a-radio' ); ?></li>
<li><span class="ver">v0.7.1</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Plugin Check follow-up — Tested-up-to bumped to 7.0, .DS_Store re-cleanup', 'a-radio' ); ?></li>
<li><span class="ver">v0.7.0</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'WordPress.org submission prep — full Plugin Check clean (169 → 4 issues, branding, textdomain, security, popup refactor, readme.txt)', 'a-radio' ); ?></li>
<li><span class="ver">v0.6.3</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Discreet buy-me-a-coffee support link (Updates panel + Credits card)', 'a-radio' ); ?></li>
<li><span class="ver">v0.6.2</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Current version badge on the Settings page', 'a-radio' ); ?></li>
<li><span class="ver">v0.6.1</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'About page restructure — balanced 3-card top row + compact version history', 'a-radio' ); ?></li>
<li><span class="ver">v0.6.0</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Pop-out mini-player — continuous background play across admin navigation', 'a-radio' ); ?></li>
<li><span class="ver">v0.5.0</span> <span class="ver-date">29 May 2026</span> &mdash; <?php esc_html_e( 'Track history + favourites (Spotify / YouTube / Apple Music / Bandcamp search links)', 'a-radio' ); ?></li>
<li><span class="ver">v0.4.0</span> <span class="ver-date">29 May 2026</span> &mdash; <?php esc_html_e( 'Now-playing indicator — dancing bars + Web Audio frequency visualizer', 'a-radio' ); ?></li>
<li><span class="ver">v0.3.2</span> <span class="ver-date">29 May 2026</span> &mdash; <?php esc_html_e( 'Play-button glyph baseline fix (dashicon → Unicode ▶ / ‖)', 'a-radio' ); ?></li>
<li><span class="ver">v0.3.1</span> <span class="ver-date">29 May 2026</span> &mdash; <?php esc_html_e( 'My Radio layout polish + dropped dark-auto', 'a-radio' ); ?></li>
<li><span class="ver">v0.3.0</span> <span class="ver-date">29 May 2026</span> &mdash; <?php esc_html_e( 'Dark theme + mute + OS media keys + SomaFM current-track display', 'a-radio' ); ?></li>
<li><span class="ver">v0.2.0</span> <span class="ver-date">26 May 2026</span> &mdash; <?php esc_html_e( 'UI rebuilt to WordPress admin standards', 'a-radio' ); ?></li>
<li><span class="ver">v0.1.0</span> <span class="ver-date">26 May 2026</span> &mdash; <?php esc_html_e( 'First release — 44 SomaFM stations, dashboard widget + dedicated admin page, per-user state, self-hosted Gitea updater', 'a-radio' ); ?></li>
<li><span class="ver">v0.7.4</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'wp.org submission cleanup — removed self-hosted updater + Update URI header (PCP plugin_updater_detected); added LICENSE file + per-asset GPL headers', 'rangerhq-radio' ); ?></li>
<li><span class="ver">v0.7.3</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Privacy section in readme + SomaFM terms-of-use link (Update URI guard pattern from this release was walked back in v0.7.4 — Plugin Check disallows it for wp.org-hosted plugins regardless of header value)', 'rangerhq-radio' ); ?></li>
<li><span class="ver">v0.7.2</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Screenshots + correct wp.org contributor handle (ir240474)', 'rangerhq-radio' ); ?></li>
<li><span class="ver">v0.7.1</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Plugin Check follow-up — Tested-up-to bumped to 7.0, .DS_Store re-cleanup', 'rangerhq-radio' ); ?></li>
<li><span class="ver">v0.7.0</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'WordPress.org submission prep — full Plugin Check clean (169 → 4 issues, branding, textdomain, security, popup refactor, readme.txt)', 'rangerhq-radio' ); ?></li>
<li><span class="ver">v0.6.3</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Discreet buy-me-a-coffee support link (Updates panel + Credits card)', 'rangerhq-radio' ); ?></li>
<li><span class="ver">v0.6.2</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Current version badge on the Settings page', 'rangerhq-radio' ); ?></li>
<li><span class="ver">v0.6.1</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'About page restructure — balanced 3-card top row + compact version history', 'rangerhq-radio' ); ?></li>
<li><span class="ver">v0.6.0</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Pop-out mini-player — continuous background play across admin navigation', 'rangerhq-radio' ); ?></li>
<li><span class="ver">v0.5.0</span> <span class="ver-date">29 May 2026</span> &mdash; <?php esc_html_e( 'Track history + favourites (Spotify / YouTube / Apple Music / Bandcamp search links)', 'rangerhq-radio' ); ?></li>
<li><span class="ver">v0.4.0</span> <span class="ver-date">29 May 2026</span> &mdash; <?php esc_html_e( 'Now-playing indicator — dancing bars + Web Audio frequency visualizer', 'rangerhq-radio' ); ?></li>
<li><span class="ver">v0.3.2</span> <span class="ver-date">29 May 2026</span> &mdash; <?php esc_html_e( 'Play-button glyph baseline fix (dashicon → Unicode ▶ / ‖)', 'rangerhq-radio' ); ?></li>
<li><span class="ver">v0.3.1</span> <span class="ver-date">29 May 2026</span> &mdash; <?php esc_html_e( 'My Radio layout polish + dropped dark-auto', 'rangerhq-radio' ); ?></li>
<li><span class="ver">v0.3.0</span> <span class="ver-date">29 May 2026</span> &mdash; <?php esc_html_e( 'Dark theme + mute + OS media keys + SomaFM current-track display', 'rangerhq-radio' ); ?></li>
<li><span class="ver">v0.2.0</span> <span class="ver-date">26 May 2026</span> &mdash; <?php esc_html_e( 'UI rebuilt to WordPress admin standards', 'rangerhq-radio' ); ?></li>
<li><span class="ver">v0.1.0</span> <span class="ver-date">26 May 2026</span> &mdash; <?php esc_html_e( 'First release — 44 SomaFM stations, dashboard widget + dedicated admin page, per-user state, self-hosted Gitea updater', 'rangerhq-radio' ); ?></li>
</ul>
<a class="radio-about-changelog-link"
href="<?php echo esc_url( RADIO_GITEA_URL . '/src/branch/main/CHANGELOG.md' ); ?>"
target="_blank" rel="noopener">
<?php esc_html_e( 'View the full CHANGELOG.md →', 'a-radio' ); ?>
<?php esc_html_e( 'View the full CHANGELOG.md →', 'rangerhq-radio' ); ?>
</a>
</div>
+12 -12
View File
@@ -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() );
?>
<div class="wrap radio-wrap">
<h1><?php esc_html_e( 'Radio', 'a-radio' ); ?></h1>
<h1><?php esc_html_e( 'Radio', 'rangerhq-radio' ); ?></h1>
<p class="radio-intro">
<?php
printf(
/* translators: %d = number of stations */
esc_html__( 'A tab of background music for your WordPress admin. %d hand-curated SomaFM stations across 10 genres — free, no ads, no tracking.', 'a-radio' ),
esc_html__( 'A tab of background music for your WordPress admin. %d hand-curated SomaFM stations across 10 genres — free, no ads, no tracking.', 'rangerhq-radio' ),
(int) $count
);
?>
@@ -35,7 +35,7 @@ function radio_render_main_page() {
<div class="postbox">
<div class="postbox-header">
<h2 class="hndle"><?php esc_html_e( 'Player', 'a-radio' ); ?></h2>
<h2 class="hndle"><?php esc_html_e( 'Player', 'rangerhq-radio' ); ?></h2>
</div>
<div class="inside">
<div class="radio-player" data-radio-surface="main">
@@ -45,7 +45,7 @@ function radio_render_main_page() {
<span class="radio-player__bars"><span></span><span></span><span></span><span></span></span>
<canvas class="radio-player__viz" data-radio-viz hidden></canvas>
</span>
<span class="radio-player__label"><?php esc_html_e( 'Now Playing', 'a-radio' ); ?></span>
<span class="radio-player__label"><?php esc_html_e( 'Now Playing', 'rangerhq-radio' ); ?></span>
<span class="radio-player__station-name" data-radio-name><?php echo esc_html( $station['name'] ); ?></span>
<span class="radio-player__station-genre" data-radio-genre><?php echo esc_html( $station['genre'] ); ?></span>
<p class="radio-player__station-desc" data-radio-desc><?php echo esc_html( $station['description'] ); ?></p>
@@ -55,24 +55,24 @@ function radio_render_main_page() {
<div class="radio-player__controls">
<button type="button" class="button button-primary radio-player__play" data-radio-play>
<span class="radio-player__play-glyph" data-radio-play-glyph aria-hidden="true">&#9654;</span>
<span data-radio-play-label><?php esc_html_e( 'Play', 'a-radio' ); ?></span>
<span data-radio-play-label><?php esc_html_e( 'Play', 'rangerhq-radio' ); ?></span>
</button>
<button type="button" class="button radio-player__popout" data-radio-popout title="<?php esc_attr_e( 'Open in a pop-out window — keeps playing while you navigate the admin', 'a-radio' ); ?>">
<span aria-hidden="true">↗</span> <?php esc_html_e( 'Pop out', 'a-radio' ); ?>
<button type="button" class="button radio-player__popout" data-radio-popout title="<?php esc_attr_e( 'Open in a pop-out window — keeps playing while you navigate the admin', 'rangerhq-radio' ); ?>">
<span aria-hidden="true">↗</span> <?php esc_html_e( 'Pop out', 'rangerhq-radio' ); ?>
</button>
<div class="radio-player__volume">
<button type="button" class="radio-player__mute" data-radio-mute aria-label="<?php esc_attr_e( 'Mute', 'a-radio' ); ?>">
<button type="button" class="radio-player__mute" data-radio-mute aria-label="<?php esc_attr_e( 'Mute', 'rangerhq-radio' ); ?>">
<span class="dashicons dashicons-controls-volumeon" aria-hidden="true"></span>
</button>
<input type="range" min="0" max="100" value="<?php echo esc_attr( (int) round( $state['volume'] * 100 ) ); ?>" data-radio-volume aria-label="<?php esc_attr_e( 'Volume', 'a-radio' ); ?>">
<input type="range" min="0" max="100" value="<?php echo esc_attr( (int) round( $state['volume'] * 100 ) ); ?>" data-radio-volume aria-label="<?php esc_attr_e( 'Volume', 'rangerhq-radio' ); ?>">
<span class="radio-player__volume-pct" data-radio-volume-pct><?php echo esc_html( (int) round( $state['volume'] * 100 ) ); ?>%</span>
</div>
</div>
<div class="radio-player__station-select">
<label for="radio-station-main"><?php esc_html_e( 'Station', 'a-radio' ); ?></label>
<label for="radio-station-main"><?php esc_html_e( 'Station', 'rangerhq-radio' ); ?></label>
<select id="radio-station-main" data-radio-station>
<?php foreach ( $stations as $genre => $entries ) :
if ( empty( $entries ) ) { continue; }
@@ -100,7 +100,7 @@ function radio_render_main_page() {
printf(
wp_kses(
/* translators: %s = link to somafm.com */
__( 'Stations and streams provided by %s — an independent, listener-supported, commercial-free internet radio network. Please consider supporting them.', 'a-radio' ),
__( 'Stations and streams provided by %s — an independent, listener-supported, commercial-free internet radio network. Please consider supporting them.', 'rangerhq-radio' ),
array( 'a' => array( 'href' => true, 'target' => true, 'rel' => true ) )
),
'<a href="https://somafm.com/" target="_blank" rel="noopener">SomaFM</a>'
+9 -9
View File
@@ -21,7 +21,7 @@ function radio_register_dashboard_widget() {
wp_add_dashboard_widget(
'radio_dashboard_widget',
__( 'Radio', 'a-radio' ),
__( 'Radio', 'rangerhq-radio' ),
'radio_render_dashboard_widget'
);
}
@@ -38,7 +38,7 @@ function radio_render_dashboard_widget() {
<span class="radio-player__bars"><span></span><span></span><span></span><span></span></span>
<canvas class="radio-player__viz" data-radio-viz hidden></canvas>
</span>
<span class="radio-player__label"><?php esc_html_e( 'Now Playing', 'a-radio' ); ?></span>
<span class="radio-player__label"><?php esc_html_e( 'Now Playing', 'rangerhq-radio' ); ?></span>
<span class="radio-player__station-name" data-radio-name><?php echo esc_html( $station['name'] ); ?></span>
<span class="radio-player__station-genre" data-radio-genre><?php echo esc_html( $station['genre'] ); ?></span>
<p class="radio-player__station-desc" data-radio-desc><?php echo esc_html( $station['description'] ); ?></p>
@@ -48,24 +48,24 @@ function radio_render_dashboard_widget() {
<div class="radio-player__controls">
<button type="button" class="button button-primary radio-player__play" data-radio-play>
<span class="radio-player__play-glyph" data-radio-play-glyph aria-hidden="true">&#9654;</span>
<span data-radio-play-label><?php esc_html_e( 'Play', 'a-radio' ); ?></span>
<span data-radio-play-label><?php esc_html_e( 'Play', 'rangerhq-radio' ); ?></span>
</button>
<button type="button" class="button radio-player__popout" data-radio-popout title="<?php esc_attr_e( 'Open in a pop-out window — keeps playing while you navigate', 'a-radio' ); ?>">
<span aria-hidden="true">↗</span> <?php esc_html_e( 'Pop out', 'a-radio' ); ?>
<button type="button" class="button radio-player__popout" data-radio-popout title="<?php esc_attr_e( 'Open in a pop-out window — keeps playing while you navigate', 'rangerhq-radio' ); ?>">
<span aria-hidden="true">↗</span> <?php esc_html_e( 'Pop out', 'rangerhq-radio' ); ?>
</button>
<div class="radio-player__volume">
<button type="button" class="radio-player__mute" data-radio-mute aria-label="<?php esc_attr_e( 'Mute', 'a-radio' ); ?>">
<button type="button" class="radio-player__mute" data-radio-mute aria-label="<?php esc_attr_e( 'Mute', 'rangerhq-radio' ); ?>">
<span class="dashicons dashicons-controls-volumeon" aria-hidden="true"></span>
</button>
<input type="range" min="0" max="100" value="<?php echo esc_attr( (int) round( $state['volume'] * 100 ) ); ?>" data-radio-volume aria-label="<?php esc_attr_e( 'Volume', 'a-radio' ); ?>">
<input type="range" min="0" max="100" value="<?php echo esc_attr( (int) round( $state['volume'] * 100 ) ); ?>" data-radio-volume aria-label="<?php esc_attr_e( 'Volume', 'rangerhq-radio' ); ?>">
<span class="radio-player__volume-pct" data-radio-volume-pct><?php echo esc_html( (int) round( $state['volume'] * 100 ) ); ?>%</span>
</div>
</div>
<div class="radio-player__station-select">
<label for="radio-station-widget"><?php esc_html_e( 'Station', 'a-radio' ); ?></label>
<label for="radio-station-widget"><?php esc_html_e( 'Station', 'rangerhq-radio' ); ?></label>
<select id="radio-station-widget" data-radio-station>
<?php foreach ( $stations as $genre => $entries ) :
if ( empty( $entries ) ) { continue; }
@@ -90,7 +90,7 @@ function radio_render_dashboard_widget() {
printf(
wp_kses(
/* translators: %s = link to somafm.com */
__( 'Powered by %s', 'a-radio' ),
__( 'Powered by %s', 'rangerhq-radio' ),
array( 'a' => array( 'href' => true, 'target' => true, 'rel' => true ) )
),
'<a href="https://somafm.com/" target="_blank" rel="noopener">SomaFM</a>'
+16 -16
View File
@@ -133,7 +133,7 @@ function radio_search_urls( $artist, $title ) {
/** Render the History admin page (tabs: History / Favourites). */
function radio_render_history_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' ) );
}
$tab = isset( $_GET['tab'] ) ? sanitize_key( wp_unslash( $_GET['tab'] ) ) : 'history'; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- tab-switch only, no state change
@@ -163,15 +163,15 @@ function radio_render_history_page() {
$nonce = wp_create_nonce( 'radio_history' );
?>
<div class="wrap radio-history-wrap">
<h1><?php esc_html_e( 'Radio — Track history', 'a-radio' ); ?></h1>
<h1><?php esc_html_e( 'Radio — Track history', 'rangerhq-radio' ); ?></h1>
<h2 class="nav-tab-wrapper">
<a href="<?php echo esc_url( $hist_url ); ?>" class="nav-tab <?php echo $tab === 'history' ? 'nav-tab-active' : ''; ?>">
<?php esc_html_e( 'History', 'a-radio' ); ?>
<?php esc_html_e( 'History', 'rangerhq-radio' ); ?>
<span class="radio-tab-count">(<?php echo (int) count( $all_history ); ?>)</span>
</a>
<a href="<?php echo esc_url( $fav_url ); ?>" class="nav-tab <?php echo $tab === 'favourites' ? 'nav-tab-active' : ''; ?>">
★ <?php esc_html_e( 'Favourites', 'a-radio' ); ?>
★ <?php esc_html_e( 'Favourites', 'rangerhq-radio' ); ?>
<span class="radio-tab-count">(<?php echo (int) count( $all_favourites ); ?>)</span>
</a>
</h2>
@@ -179,24 +179,24 @@ function radio_render_history_page() {
<?php if ( empty( $entries ) ) : ?>
<p class="radio-history-empty">
<?php if ( $tab === 'favourites' ) : ?>
<?php esc_html_e( 'No favourites yet — star a track on the History tab to save it here.', 'a-radio' ); ?>
<?php esc_html_e( 'No favourites yet — star a track on the History tab to save it here.', 'rangerhq-radio' ); ?>
<?php else : ?>
<?php esc_html_e( 'No tracks logged yet. Play some music in the Radio player — tracks will appear here as they play.', 'a-radio' ); ?>
<?php esc_html_e( 'No tracks logged yet. Play some music in the Radio player — tracks will appear here as they play.', 'rangerhq-radio' ); ?>
<?php endif; ?>
</p>
<?php else : ?>
<div class="radio-history-toolbar">
<input type="search" id="radio-history-search" placeholder="<?php esc_attr_e( 'Filter by artist or title…', 'a-radio' ); ?>" />
<input type="search" id="radio-history-search" placeholder="<?php esc_attr_e( 'Filter by artist or title…', 'rangerhq-radio' ); ?>" />
<select id="radio-history-station">
<option value=""><?php esc_html_e( 'All stations', 'a-radio' ); ?></option>
<option value=""><?php esc_html_e( 'All stations', 'rangerhq-radio' ); ?></option>
<?php foreach ( $stations_in_list as $sid => $sname ) : ?>
<option value="<?php echo esc_attr( $sid ); ?>"><?php echo esc_html( $sname ); ?></option>
<?php endforeach; ?>
</select>
<?php if ( $tab === 'history' ) : ?>
<button type="button" id="radio-history-clear" class="button radio-history-clear" data-nonce="<?php echo esc_attr( $nonce ); ?>">
🗑 <?php esc_html_e( 'Clear history', 'a-radio' ); ?>
🗑 <?php esc_html_e( 'Clear history', 'rangerhq-radio' ); ?>
</button>
<?php endif; ?>
</div>
@@ -204,11 +204,11 @@ function radio_render_history_page() {
<table class="widefat radio-history-table">
<thead>
<tr>
<th class="when"><?php esc_html_e( 'When', 'a-radio' ); ?></th>
<th class="station"><?php esc_html_e( 'Station', 'a-radio' ); ?></th>
<th class="track"><?php esc_html_e( 'Artist — Title', 'a-radio' ); ?></th>
<th class="search"><?php esc_html_e( 'Search', 'a-radio' ); ?></th>
<th class="fav"><span class="screen-reader-text"><?php esc_html_e( 'Favourite', 'a-radio' ); ?></span>★</th>
<th class="when"><?php esc_html_e( 'When', 'rangerhq-radio' ); ?></th>
<th class="station"><?php esc_html_e( 'Station', 'rangerhq-radio' ); ?></th>
<th class="track"><?php esc_html_e( 'Artist — Title', 'rangerhq-radio' ); ?></th>
<th class="search"><?php esc_html_e( 'Search', 'rangerhq-radio' ); ?></th>
<th class="fav"><span class="screen-reader-text"><?php esc_html_e( 'Favourite', 'rangerhq-radio' ); ?></span>★</th>
</tr>
</thead>
<tbody>
@@ -222,7 +222,7 @@ function radio_render_history_page() {
<td class="when" title="<?php echo esc_attr( wp_date( 'j M Y, H:i', (int) $e['at'] ) ); ?>">
<?php
/* translators: %s = human-readable time difference, e.g. "2 minutes" */
printf( esc_html__( '%s ago', 'a-radio' ), esc_html( $ago ) );
printf( esc_html__( '%s ago', 'rangerhq-radio' ), esc_html( $ago ) );
?>
</td>
<td class="station"><?php echo esc_html( $e['station'] ); ?></td>
@@ -243,7 +243,7 @@ function radio_render_history_page() {
data-station="<?php echo esc_attr( $e['station'] ); ?>"
data-station-id="<?php echo esc_attr( $e['station_id'] ); ?>"
data-nonce="<?php echo esc_attr( $nonce ); ?>"
aria-label="<?php echo $is_fav ? esc_attr__( 'Remove from favourites', 'a-radio' ) : esc_attr__( 'Add to favourites', 'a-radio' ); ?>">
aria-label="<?php echo $is_fav ? esc_attr__( 'Remove from favourites', 'rangerhq-radio' ) : esc_attr__( 'Add to favourites', 'rangerhq-radio' ); ?>">
<?php echo $is_fav ? '★' : '☆'; ?>
</button>
</td>
+14 -14
View File
@@ -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 '<div class="notice notice-success is-dismissible"><p>' . esc_html__( 'Settings saved.', 'a-radio' ) . '</p></div>';
echo '<div class="notice notice-success is-dismissible"><p>' . esc_html__( 'Settings saved.', 'rangerhq-radio' ) . '</p></div>';
}
$state = radio_get_state();
@@ -47,7 +47,7 @@ function radio_render_settings_page() {
?>
<div class="wrap radio-settings-wrap">
<h1>
<?php esc_html_e( 'Radio — Settings', 'a-radio' ); ?>
<?php esc_html_e( 'Radio — Settings', 'rangerhq-radio' ); ?>
<span class="radio-version-badge">v<?php echo esc_html( RADIO_VERSION ); ?></span>
</h1>
@@ -57,7 +57,7 @@ function radio_render_settings_page() {
<table class="form-table" role="presentation">
<tr>
<th scope="row">
<label for="default_station"><?php esc_html_e( 'Default station', 'a-radio' ); ?></label>
<label for="default_station"><?php esc_html_e( 'Default station', 'rangerhq-radio' ); ?></label>
</th>
<td>
<select id="default_station" name="default_station">
@@ -74,14 +74,14 @@ function radio_render_settings_page() {
<?php endforeach; ?>
</select>
<p class="description">
<?php esc_html_e( 'The station that loads when you open Radio in a fresh tab.', 'a-radio' ); ?>
<?php esc_html_e( 'The station that loads when you open Radio in a fresh tab.', 'rangerhq-radio' ); ?>
</p>
</td>
</tr>
<tr>
<th scope="row">
<label for="default_volume"><?php esc_html_e( 'Default volume', 'a-radio' ); ?></label>
<label for="default_volume"><?php esc_html_e( 'Default volume', 'rangerhq-radio' ); ?></label>
</th>
<td>
<input type="range" id="default_volume" name="default_volume" min="0" max="100" value="<?php echo esc_attr( (int) round( $state['volume'] * 100 ) ); ?>" aria-describedby="default_volume_label">
@@ -91,34 +91,34 @@ function radio_render_settings_page() {
<tr>
<th scope="row">
<label for="theme"><?php esc_html_e( 'Theme', 'a-radio' ); ?></label>
<label for="theme"><?php esc_html_e( 'Theme', 'rangerhq-radio' ); ?></label>
</th>
<td>
<select id="theme" name="theme">
<option value="auto" <?php selected( $state['theme'], 'auto' ); ?>><?php esc_html_e( 'Auto (match WP admin colour scheme)', 'a-radio' ); ?></option>
<option value="light" <?php selected( $state['theme'], 'light' ); ?>><?php esc_html_e( 'Light', 'a-radio' ); ?></option>
<option value="dark" <?php selected( $state['theme'], 'dark' ); ?>><?php esc_html_e( 'Dark', 'a-radio' ); ?></option>
<option value="auto" <?php selected( $state['theme'], 'auto' ); ?>><?php esc_html_e( 'Auto (match WP admin colour scheme)', 'rangerhq-radio' ); ?></option>
<option value="light" <?php selected( $state['theme'], 'light' ); ?>><?php esc_html_e( 'Light', 'rangerhq-radio' ); ?></option>
<option value="dark" <?php selected( $state['theme'], 'dark' ); ?>><?php esc_html_e( 'Dark', 'rangerhq-radio' ); ?></option>
</select>
</td>
</tr>
<tr>
<th scope="row">
<?php esc_html_e( 'Dashboard widget', 'a-radio' ); ?>
<?php esc_html_e( 'Dashboard widget', 'rangerhq-radio' ); ?>
</th>
<td>
<label>
<input type="checkbox" name="hide_dashboard_widget" value="1" <?php checked( $hide_widget ); ?>>
<?php esc_html_e( 'Hide the Radio widget from the WordPress Dashboard', 'a-radio' ); ?>
<?php esc_html_e( 'Hide the Radio widget from the WordPress Dashboard', 'rangerhq-radio' ); ?>
</label>
<p class="description">
<?php esc_html_e( 'When checked, Radio is only accessible from the dedicated admin page (WP Admin → Radio → My Radio).', 'a-radio' ); ?>
<?php esc_html_e( 'When checked, Radio is only accessible from the dedicated admin page (WP Admin → Radio → My Radio).', 'rangerhq-radio' ); ?>
</p>
</td>
</tr>
</table>
<?php submit_button( __( 'Save Changes', 'a-radio' ), 'primary', 'radio_settings_submit' ); ?>
<?php submit_button( __( 'Save Changes', 'rangerhq-radio' ), 'primary', 'radio_settings_submit' ); ?>
</form>
</div>
<?php