 Bruno Kos
WPML-Unterstützer seit 12/2018
Sprachen:
Englisch (English )
Deutsch (Deutsch )
Französisch (Français )
Zeitzone:
Europe/Zagreb (GMT+02:00)
|
Nur zur Bestätigung – das Ziel ist es, ausschließlich die Slugs der rund 6.000 übersetzten Custom Post Types (CPTs) neu zu generieren, damit jede URL dem übersetzten Titel entspricht, richtig?
Normale Beiträge oder Seiten würden dabei nicht geändert, sondern nur die über WPML übersetzten CPT-Einträge.
Falls das so ist, könnten wir dies programmatisch umsetzen – also ein Skript ausführen, das alle betroffenen CPTs auf einmal verarbeitet, anstatt den Übersetzungsprozess erneut zu starten oder die Slugs manuell anzupassen.
Können Sie bitte bestätigen, dass dies das gewünschte Ziel ist?
|
 gisaL
|
Hallo,
das ist soweit korrekt. Zuvor müssten jedoch die einzelnen URLs erfasst werden, damit wir nach den Übersetzungen direkt die Redirects einrichten können.
Sofern das Skript erfolgreich alle URLs anpasst, könnte der Vorgang dann auch für andere Post Types, z.B. Seiten wiederholt werden?
Freundliche Grüße
|
 Bruno Kos
WPML-Unterstützer seit 12/2018
Sprachen:
Englisch (English )
Deutsch (Deutsch )
Französisch (Français )
Zeitzone:
Europe/Zagreb (GMT+02:00)
|
Wir haben ein benutzerdefiniertes PHP-Skript vorbereitet, mit dem Sie die Slugs aller übersetzten Beiträge eines bestimmten Beitragstyps (Post Type) in WPML neu generieren können. Das Skript erstellt außerdem eine CSV-Datei mit den alten und neuen URLs, sodass Sie anschließend Weiterleitungen einrichten können, falls erforderlich.
<?php
/**
* Regenerate slugs for all WPML-translated posts of a given post type
* and capture old/new URLs for redirects.
*
* Run via WP-CLI:
* wp eval-file regenerate-slugs-with-redirects.php your_post_type
*
* Example:
* wp eval-file regenerate-slugs-with-redirects.php page
*/
if (empty($argv[1])) {
echo "Usage: wp eval-file regenerate-slugs-with-redirects.php <post_type>\n";
exit(1);
}
$post_type = sanitize_key($argv[1]);
global $wpdb;
$translations = $wpdb->get_results(
$wpdb->prepare("
SELECT p.ID, p.post_title, p.post_name, t.language_code, t.source_language_code
FROM {$wpdb->prefix}posts p
JOIN {$wpdb->prefix}icl_translations t
ON p.ID = t.element_id
WHERE p.post_type = %s
AND p.post_status IN ('publish', 'draft')
AND t.element_type = CONCAT('post_', %s)
AND t.source_language_code IS NOT NULL
", $post_type, $post_type)
);
if (empty($translations)) {
echo "No translated posts found for post type '{$post_type}'.\n";
exit;
}
echo "Found " . count($translations) . " translated {$post_type} posts...\n";
$redirects = [];
$home_url = home_url();
foreach ($translations as $row) {
$old_slug = $row->post_name;
$new_slug = sanitize_title($row->post_title);
if ($new_slug !== $old_slug) {
$old_url = get_permalink($row->ID);
$updated = wp_update_post([
'ID' => $row->ID,
'post_name' => $new_slug,
], true);
if (is_wp_error($updated)) {
echo "Failed to update post #{$row->ID} ({$row->language_code}): " . $updated->get_error_message() . "\n";
} else {
$new_url = get_permalink($row->ID);
echo "Updated post #{$row->ID} ({$row->language_code}) → {$new_slug}\n";
$redirects[] = [$old_url, $new_url];
}
} else {
echo "Skipped post #{$row->ID} ({$row->language_code}) — slug already matches.\n";
}
}
// Output redirect mapping to CSV file
if (!empty($redirects)) {
$uploads = wp_upload_dir();
$csv_path = trailingslashit($uploads['basedir']) . "slug-redirects-{$post_type}-" . date('Ymd-His') . ".csv";
$fp = fopen($csv_path, 'w');
fputcsv($fp, ['Old URL', 'New URL']);
foreach ($redirects as $pair) {
fputcsv($fp, $pair);
}
fclose($fp);
echo "\nRedirect mapping saved to: {$csv_path}\n";
echo "You can now import this into your redirect plugin or server config.\n";
} else {
echo "\nNo redirects needed — all slugs already up-to-date.\n";
}
Bitte beachten Sie, dass dieses Skript „as is“ bereitgestellt wird und nicht in Ihrer Umgebung getestet wurde. Die Ausführung oder Anpassung solcher benutzerdefinierten Skripte liegt außerhalb unseres regulären Supportumfangs. Für weitergehende Entwicklungen oder individuelle Unterstützung können Sie sich an unsere empfohlenen Dienstleister über das https://wpml.org/announcements/2025/08/wpml-contractors-system-closing/) wenden.
Was das Skript macht
* Durchsucht alle übersetzten Beiträge (nicht die Originale) eines angegebenen Beitragstyps.
* Generiert den Slug (`post_name`) basierend auf dem aktuellen Beitragstitel neu.
* Aktualisiert die Beiträge in der Datenbank.
* Speichert eine CSV-Datei mit den alten und neuen URLs, damit Sie diese z. B. in ein Redirect-Plugin oder Ihre Serverkonfiguration importieren können.
Wie Sie das Skript ausführen
Das Skript muss über WP-CLI im Hauptverzeichnis Ihrer WordPress-Installation ausgeführt werden.
Beispielbefehl:
Posts wp eval-file regenerate-slugs-with-redirects.php post
Pages wp eval-file regenerate-slugs-with-redirects.php page
Products (WooCommerce) wp eval-file regenerate-slugs-with-redirects.php product
Events (custom CPT) wp eval-file regenerate-slugs-with-redirects.php event
etc.
Wichtige Hinweise
* Erstellen Sie immer ein vollständiges Backup Ihrer Website und Datenbank, bevor Sie das Skript ausführen.
* Führen Sie es zunächst auf einer Test- oder Staging-Umgebung aus.
* Das Skript ändert die Slugs und URLs von Beiträgen – dies kann Auswirkungen auf Links und SEO haben, wenn keine Weiterleitungen eingerichtet werden.
* Nach der Ausführung finden Sie die erzeugte CSV-Datei im Verzeichnis `/uploads` Ihrer Website.
Das ist eine individuelle Anpassung, die außerhalb unseres Supportumfangs liegt. Leider können wir hierbei keine weitere Fehleranalyse oder Anpassung vornehmen. Wenn Sie zusätzliche Entwicklung oder Unterstützung benötigen, empfehlen wir, sich an einen unserer erfahrenen Dienstleister über das https://wpml.org/announcements/2025/08/wpml-contractors-system-closing/ zu wenden.
|