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

@@ -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>