feat: kein interner-name-feld mehr - ID automatisch aus anbietername

- Dienst-Zeile zeigt/erfordert nur noch den Anbietername.
- Interne ID wird beim Speichern aus dem Namen abgeleitet (sanitize_title),
  bestehende IDs bleiben via Hidden-Field stabil; Eindeutigkeit erzwungen.
- Shortcode-Hilfe erklaert: ID = Anbietername in Kleinbuchstaben mit Bindestrichen.
- EN-Uebersetzung (120) aktualisiert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
s4luorth
2026-06-07 17:03:26 +02:00
parent de4f16fefa
commit 40f4207024
5 changed files with 34 additions and 28 deletions

View File

@@ -11,15 +11,13 @@
$( '.cb-color-picker', ctx ).wpColorPicker();
}
/* ── Live header update: "interner-name — Anbietername" ── */
/* ── Live header update: provider name ── */
function syncTitle( box ) {
const id = ( $( '.cb-input-id', box ).val() || '' ).trim();
const name = ( $( '.cb-input-name', box ).val() || '' ).trim();
const head = ( id || ( cbAdmin.newServiceLbl || 'neu' ) ) + ( name ? ' — ' + name : '' );
$( '.cb-service-title', box ).first().text( head );
$( '.cb-service-title', box ).first().text( name || ( cbAdmin.newServiceLbl || 'Neuer Dienst' ) );
}
function bindNameSync( box ) {
$( '.cb-input-name, .cb-input-id', box ).on( 'input', function () {
$( '.cb-input-name', box ).on( 'input', function () {
syncTitle( box );
} );
}
@@ -239,7 +237,7 @@
const $box = addServiceRow( data );
if ( $box && $box.length ) {
$box[ 0 ].scrollIntoView( { behavior: 'smooth', block: 'center' } );
$box.find( '.cb-input-id' ).trigger( 'focus' );
$box.find( '.cb-input-name' ).trigger( 'focus' );
}
} )
.appendTo( $act );

View File

@@ -104,17 +104,36 @@ class CB_Settings {
: [];
$services = [];
$used_ids = [];
foreach ( $raw_services as $item ) {
if ( ! is_array( $item ) ) {
continue;
}
$name = sanitize_text_field( $item['name'] ?? '' );
if ( $name === '' ) {
continue; // a service needs at least a provider name
}
// Keep the existing id stable (hidden field); derive from the name
// for new services. Ensure uniqueness.
$id = sanitize_key( $item['id'] ?? '' );
if ( $id === '' ) {
continue;
$id = sanitize_title( $name );
}
if ( $id === '' ) {
$id = 'dienst';
}
$base_id = $id;
$n = 2;
while ( in_array( $id, $used_ids, true ) ) {
$id = $base_id . '-' . $n;
$n++;
}
$used_ids[] = $id;
$services[] = [
'id' => $id,
'name' => sanitize_text_field( $item['name'] ?? '' ),
'name' => $name,
'enabled' => ! empty( $item['enabled'] ),
'match_pattern' => sanitize_text_field( $item['match_pattern'] ?? '' ),
'recipient' => sanitize_text_field( $item['recipient'] ?? '' ),
@@ -530,8 +549,8 @@ class CB_Settings {
$name = $svc['name'] ?? '';
$id = $svc['id'] ?? '';
$enabled = $svc['enabled'] ?? true; // default ON (new + legacy services)
// Header label: "interner-name — Anbietername"
$headname = trim( ( $id !== '' ? $id : __( 'neu', 'gdpr-content-blocker' ) ) . ( $name !== '' ? ' — ' . $name : '' ) );
// Header shows just the provider name (internal id is auto-derived).
$headname = $name !== '' ? $name : __( 'Neuer Dienst', 'gdpr-content-blocker' );
?>
<div class="cb-service-box" data-cb-index="<?php echo $idx; ?>">
<div class="cb-service-head">
@@ -548,13 +567,10 @@ class CB_Settings {
<span class="dashicons dashicons-trash"></span>
</button>
</div>
<?php // Internal id is kept stable for existing services and auto-derived
// from the name for new ones (no separate field). ?>
<input type="hidden" class="cb-input-id" name="cb_services[<?php echo $idx; ?>][id]" value="<?php echo $f( 'id' ); ?>">
<div class="cb-service-grid" style="display:none;">
<div class="cb-field">
<label><?php esc_html_e( 'Interner Name (Slug)', 'gdpr-content-blocker' ); ?> *</label>
<input type="text" name="cb_services[<?php echo $idx; ?>][id]"
value="<?php echo $f( 'id' ); ?>" required
placeholder="google-maps" pattern="[a-z0-9\-]+" class="cb-input-id">
</div>
<div class="cb-field">
<label><?php esc_html_e( 'Anbietername', 'gdpr-content-blocker' ); ?> *</label>
<input type="text" name="cb_services[<?php echo $idx; ?>][name]"
@@ -650,7 +666,7 @@ class CB_Settings {
<tr>
<td style="vertical-align:top;"><strong><?php esc_html_e( 'Inhalt manuell blockieren', 'gdpr-content-blocker' ); ?></strong><br>
<?php echo $code( '[content_blocker id="google-maps"]…iframe…[/content_blocker]' ); ?></td>
<td><?php esc_html_e( 'Umschließt ein iframe und ersetzt es durch den Platzhalter des angegebenen Dienstes. Verwenden Sie den internen Namen aus dem Tab „Dienste".', 'gdpr-content-blocker' ); ?></td>
<td><?php esc_html_e( 'Umschließt ein iframe und ersetzt es durch den Platzhalter des angegebenen Dienstes. Die ID ist der Anbietername in Kleinbuchstaben mit Bindestrichen (z. B. „Google Maps" → google-maps).', 'gdpr-content-blocker' ); ?></td>
</tr>
<tr>
<td style="vertical-align:top;"><strong><?php esc_html_e( 'Dienste-Übersicht (Datenschutzerklärung)', 'gdpr-content-blocker' ); ?></strong><br>

View File

@@ -243,9 +243,6 @@ msgstr "Scan website"
msgid "Darstellung speichern"
msgstr "Save appearance"
msgid "neu"
msgstr "new"
msgid "Details anzeigen/ausblenden"
msgstr "Show/hide details"
@@ -255,9 +252,6 @@ msgstr "Blocker on/off"
msgid "Dienst entfernen"
msgstr "Remove service"
msgid "Interner Name (Slug)"
msgstr "Internal name (slug)"
msgid "Anbietername"
msgstr "Provider name"
@@ -318,8 +312,8 @@ msgstr "Renders a clearly visible link that withdraws consent for external embed
msgid "Inhalt manuell blockieren"
msgstr "Block content manually"
msgid "Umschließt ein iframe und ersetzt es durch den Platzhalter des angegebenen Dienstes. Verwenden Sie den internen Namen aus dem Tab „Dienste\"."
msgstr "Wraps an iframe and replaces it with the placeholder of the given service. Use the internal name from the \"Services\" tab."
msgid "Umschließt ein iframe und ersetzt es durch den Platzhalter des angegebenen Dienstes. Die ID ist der Anbietername in Kleinbuchstaben mit Bindestrichen (z. B. „Google Maps\" → google-maps)."
msgstr "Wraps an iframe and replaces it with the placeholder of the given service. The ID is the provider name in lowercase with hyphens (e.g. \"Google Maps\" → google-maps)."
msgid "Dienste-Übersicht (Datenschutzerklärung)"
msgstr "Services overview (privacy policy)"