Сделать слаги переводов Polylang идентичными основному языку можно при помощи кода.
Перед использованием обязательно сделайте копию базы данных! Код я тестировал, но, возможно, упустил какие-то детали.
Включите логирование в wp-config.php
.
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
Создайте папку wp-content\mu-plugins
, если она не существует. Создайте в ней файл с любым именем, например, polylang.php
. Вставьте в этот файл следующий код:
<?php
/**
* MU-plugin to set Polylang translation slugs similar to the default language.
*
* @package so-polylang
*/
/**
* Fix Polylang slugs.
*
* @return void
* @noinspection ForgottenDebugOutputInspection
* @noinspection PhpUndefinedFunctionInspection
*/
function fix_polylang_slugs() {
global $wpdb;
$default_lang = pll_default_language();
// phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
$results = $wpdb->get_results( "SELECT description FROM $wpdb->term_taxonomy WHERE taxonomy='post_translations'" );
foreach ( $results as $result ) {
// phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_unserialize
$translations = unserialize( $result->description );
$default_id = $translations[ $default_lang ];
$default_slug = $wpdb->get_var(
$wpdb->prepare(
"SELECT post_name FROM $wpdb->posts WHERE ID=%d",
$default_id
)
);
unset( $translations[ $default_lang ] );
foreach ( $translations as $lang => $translation_id ) {
$slug = $wpdb->get_var(
$wpdb->prepare(
"SELECT post_name FROM $wpdb->posts WHERE ID=%d",
$translation_id
)
);
if ( $slug !== $default_slug ) {
$wpdb->query(
$wpdb->prepare(
"UPDATE $wpdb->posts SET post_name=%s WHERE test.wp_posts.ID=%d",
$default_slug,
$translation_id
)
);
// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log
error_log( 'Post /' . $default_slug . ' - (' . $lang . ') translation slug ' . $slug . ' changed to default.' );
}
}
}
// phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
wp_cache_flush();
}
add_action( 'init', 'fix_polylang_slugs' );
Обновите 1 раз любую страницу вашего сайта. Код сработает и произведёт необходимые замены в базе данных. Файл с кодом теперь можно удалить.
В wp-content\debug.log
должен быть протокол работы примерно следующего содержания:
[15-Apr-2023 10:40:53 UTC] Post /ukr-homepage - (uk) translation slug home-2 changed to default.
[15-Apr-2023 10:40:53 UTC] Post /ukr-homepage - (ru) translation slug home-russkij changed to default.
[15-Apr-2023 10:40:53 UTC] Post /test-slug-2 - (uk) translation slug pivo-333 changed to default.
[15-Apr-2023 10:40:53 UTC] Post /pll-stranicza-en - (uk) translation slug pll-stranycza-uk changed to default.
[15-Apr-2023 10:40:53 UTC] Post /pll-postik-en - (uk) translation slug pll-postyk-uk changed to default.
[15-Apr-2023 10:40:53 UTC] Post /polylang - (ru) translation slug polylang-2 changed to default.
Убедитесь, что слаги установлены одинаковыми для основного языка и переводов.