Автоматическое изменение старых URL при использовании Polylang Pro

Рейтинг: 0Ответов: 1Опубликовано: 15.04.2023

С помощью Polylang Pro сделал так, чтобы ые URL были одинаковыми на разных языках. Но остались ссылки, которые создавались до установки Polylang Pro. Вручную их изменять долго. Можно ли их как то этот процесс автоматизировать? Например: английская (основной язык) версия: name.com/service/app-installation. Сейчас на втором языке: name.com/ru/service/ustanovka-prilojeniya. А нужно на втором языке: name.com/ru/service/app-installation.

Ответы

▲ 0

Сделать слаги переводов 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.

Убедитесь, что слаги установлены одинаковыми для основного языка и переводов.