This commit is contained in:
Javier Casares 2026-03-02 14:31:34 +00:00
commit 2c300652a6
9 changed files with 230 additions and 82 deletions

View file

@ -1,5 +1,24 @@
== Changelog == == Changelog ==
= 1.1.0 =
_Release date: 2026-03-02_
**Fixed**
* `mlp_migrator_log` (the plugin's own table) was incorrectly listed in the System Status as an MLP2 table requiring renaming. It is now excluded from `get_original_tables()` as it already was from `rename_to_backup()`.
**Changed**
* MLP2 sitemeta keys (`inpsyde_multilingual*`) are now **renamed** to `mlp2bak_inpsyde_multilingual*` during the table preparation step, instead of being deleted. This makes the operation fully reversible.
* Restoring original table names (`Restore original table names`) now also restores the original sitemeta key names.
* Cleanup step (Step 6, "Delete MLP2 network settings") now also deletes the backed-up `mlp2bak_inpsyde_multilingual*` sitemeta keys alongside the existing `mlp_*` keys.
**Compatibility**
* WordPress: 6.7 – 6.9
* PHP: 8.2 – 8.5
= 1.0.0 = = 1.0.0 =
_Release date: 2026-02-27_ _Release date: 2026-02-27_

View file

@ -90,10 +90,14 @@ class Robotstxt_Mlp2_Mlp5_Admin_Page {
wp_die( esc_html__( 'You do not have permission to perform this action.', 'robotstxt-mlp2-mlp5' ) ); wp_die( esc_html__( 'You do not have permission to perform this action.', 'robotstxt-mlp2-mlp5' ) );
} }
$result = Robotstxt_Mlp2_Mlp5_Table_Preparer::rename_to_backup(); $result = Robotstxt_Mlp2_Mlp5_Table_Preparer::rename_to_backup();
$sitemeta_renamed = Robotstxt_Mlp2_Mlp5_Table_Preparer::rename_mlp2_sitemeta();
$args = array( 'renamed' => count( $result['renamed'] ) ); $args = array( 'renamed' => count( $result['renamed'] ) );
if ( ! empty( $result['errors'] ) ) { if ( ! empty( $result['errors'] ) ) {
$args['rename_errors'] = count( $result['errors'] ); $args['rename_errors'] = count( $result['errors'] );
} }
if ( $sitemeta_renamed > 0 ) {
$args['sitemeta_renamed'] = $sitemeta_renamed;
}
wp_safe_redirect( self::page_url( $args ) ); wp_safe_redirect( self::page_url( $args ) );
exit; exit;
} }
@ -107,10 +111,14 @@ class Robotstxt_Mlp2_Mlp5_Admin_Page {
wp_die( esc_html__( 'You do not have permission to perform this action.', 'robotstxt-mlp2-mlp5' ) ); wp_die( esc_html__( 'You do not have permission to perform this action.', 'robotstxt-mlp2-mlp5' ) );
} }
$result = Robotstxt_Mlp2_Mlp5_Table_Preparer::restore_from_backup(); $result = Robotstxt_Mlp2_Mlp5_Table_Preparer::restore_from_backup();
$sitemeta_restored = Robotstxt_Mlp2_Mlp5_Table_Preparer::restore_mlp2_sitemeta();
$args = array( 'restored' => count( $result['restored'] ) ); $args = array( 'restored' => count( $result['restored'] ) );
if ( ! empty( $result['errors'] ) ) { if ( ! empty( $result['errors'] ) ) {
$args['restore_errors'] = count( $result['errors'] ); $args['restore_errors'] = count( $result['errors'] );
} }
if ( $sitemeta_restored > 0 ) {
$args['sitemeta_restored'] = $sitemeta_restored;
}
wp_safe_redirect( self::page_url( $args ) ); wp_safe_redirect( self::page_url( $args ) );
exit; exit;
} }
@ -423,6 +431,12 @@ class Robotstxt_Mlp2_Mlp5_Admin_Page {
/* translators: %d: number of tables that could not be renamed */ /* translators: %d: number of tables that could not be renamed */
printf( '<div class="notice notice-error"><p>%s</p></div>', esc_html( sprintf( _n( '%d table could not be renamed. Check database permissions.', '%d tables could not be renamed. Check database permissions.', $count, 'robotstxt-mlp2-mlp5' ), $count ) ) ); // phpcs:ignore WordPress.WP.I18n.MismatchedPlaceholders printf( '<div class="notice notice-error"><p>%s</p></div>', esc_html( sprintf( _n( '%d table could not be renamed. Check database permissions.', '%d tables could not be renamed. Check database permissions.', $count, 'robotstxt-mlp2-mlp5' ), $count ) ) ); // phpcs:ignore WordPress.WP.I18n.MismatchedPlaceholders
} }
if ( isset( $_GET['sitemeta_renamed'] ) ) {
printf( '<div class="notice notice-success is-dismissible"><p>%s</p></div>', esc_html__( 'MLP2 sitemeta backed up. MultilingualPress 5 can now activate cleanly.', 'robotstxt-mlp2-mlp5' ) );
}
if ( isset( $_GET['sitemeta_restored'] ) ) {
printf( '<div class="notice notice-success is-dismissible"><p>%s</p></div>', esc_html__( 'MLP2 sitemeta restored to original keys.', 'robotstxt-mlp2-mlp5' ) );
}
if ( isset( $_GET['restored'] ) ) { if ( isset( $_GET['restored'] ) ) {
$count = (int) $_GET['restored']; $count = (int) $_GET['restored'];
/* translators: %d: number of restored tables */ /* translators: %d: number of restored tables */

View file

@ -80,26 +80,36 @@ class Robotstxt_Mlp2_Mlp5_Step_Cleanup {
/** /**
* Delete MLP2-related entries from wp_sitemeta. * Delete MLP2-related entries from wp_sitemeta.
* *
* Removes all sitemeta keys whose name starts with 'mlp_' (MLP2 prefix). * Removes sitemeta keys matching 'mlp_*' (MLP2 prefix) and
* 'mlp2bak_inpsyde_multilingual*' (backed-up MLP2 sitemeta).
* *
* @return int Number of keys deleted. * @return int Number of keys deleted.
*/ */
public static function remove_mlp2_sitemeta(): int { public static function remove_mlp2_sitemeta(): int {
global $wpdb; global $wpdb;
$like = $wpdb->esc_like( 'mlp_' ) . '%'; $patterns = array(
$wpdb->esc_like( 'mlp_' ) . '%',
$wpdb->esc_like( Robotstxt_Mlp2_Mlp5_Table_Preparer::SITEMETA_BACKUP_PREFIX ) . '%',
);
$keys = array();
foreach ( $patterns as $like ) {
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
$keys = $wpdb->get_col( $found = $wpdb->get_col(
$wpdb->prepare( $wpdb->prepare(
"SELECT meta_key FROM {$wpdb->sitemeta} WHERE meta_key LIKE %s AND site_id = %d", "SELECT meta_key FROM {$wpdb->sitemeta} WHERE meta_key LIKE %s AND site_id = %d",
$like, $like,
get_current_network_id() get_current_network_id()
) )
); );
if ( is_array( $found ) ) {
$keys = array_merge( $keys, $found );
}
}
$deleted = 0; $deleted = 0;
foreach ( (array) $keys as $key ) { foreach ( array_unique( $keys ) as $key ) {
if ( delete_site_option( $key ) ) { if ( delete_site_option( $key ) ) {
++$deleted; ++$deleted;
} }

View file

@ -84,7 +84,8 @@ class Robotstxt_Mlp2_Mlp5_Table_Preparer {
} }
/** /**
* Return all tables in the database with the original MLP2 prefix. * Return all tables in the database with the original MLP2 prefix,
* excluding tables that belong to this plugin.
* *
* @return string[] Array of full table names. * @return string[] Array of full table names.
*/ */
@ -96,7 +97,21 @@ class Robotstxt_Mlp2_Mlp5_Table_Preparer {
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
$tables = $wpdb->get_col( $wpdb->prepare( 'SHOW TABLES LIKE %s', $like ) ); $tables = $wpdb->get_col( $wpdb->prepare( 'SHOW TABLES LIKE %s', $like ) );
return is_array( $tables ) ? $tables : array(); if ( ! is_array( $tables ) ) {
return array();
}
$prefix = $wpdb->base_prefix . self::ORIGINAL_FRAGMENT;
return array_values(
array_filter(
$tables,
static function ( string $table ) use ( $prefix ): bool {
$suffix = substr( $table, strlen( $prefix ) );
return ! in_array( $suffix, self::PLUGIN_TABLE_SUFFIXES, true );
}
)
);
} }
/** /**
@ -115,6 +130,73 @@ class Robotstxt_Mlp2_Mlp5_Table_Preparer {
return is_array( $tables ) ? $tables : array(); return is_array( $tables ) ? $tables : array();
} }
/**
* Sitemeta key prefix used by MLP2 that blocks MLP5 activation.
*
* @var string
*/
const SITEMETA_ORIGINAL_PREFIX = 'inpsyde_multilingual';
/**
* Prefix prepended to MLP2 sitemeta keys when backing them up.
*
* @var string
*/
const SITEMETA_BACKUP_PREFIX = 'mlp2bak_inpsyde_multilingual';
/**
* Rename MLP2 blocking sitemeta keys to backup names.
*
* MLP5's SystemChecker detects any sitemeta key starting with
* `inpsyde_multilingual` and refuses to activate. This method renames
* those keys to `mlp2bak_inpsyde_multilingual*` so MLP5 can activate
* cleanly while the original data is preserved for restore or cleanup.
*
* @return int Number of sitemeta rows renamed.
*/
public static function rename_mlp2_sitemeta(): int {
global $wpdb;
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
$renamed = $wpdb->query(
$wpdb->prepare(
"UPDATE {$wpdb->sitemeta} SET meta_key = CONCAT( %s, SUBSTR( meta_key, %d ) ) WHERE meta_key LIKE %s AND site_id = %d",
'mlp2bak_',
1,
$wpdb->esc_like( self::SITEMETA_ORIGINAL_PREFIX ) . '%',
get_current_network_id()
)
);
return is_int( $renamed ) ? $renamed : 0;
}
/**
* Restore backup sitemeta keys to their original MLP2 names.
*
* Reverses rename_mlp2_sitemeta(). Only use this before MLP5 has been
* activated, as restoring these keys will block MLP5 activation again.
*
* @return int Number of sitemeta rows restored.
*/
public static function restore_mlp2_sitemeta(): int {
global $wpdb;
$prefix_length = strlen( 'mlp2bak_' ) + 1; // SUBSTR is 1-indexed.
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
$restored = $wpdb->query(
$wpdb->prepare(
"UPDATE {$wpdb->sitemeta} SET meta_key = SUBSTR( meta_key, %d ) WHERE meta_key LIKE %s AND site_id = %d",
$prefix_length,
$wpdb->esc_like( self::SITEMETA_BACKUP_PREFIX ) . '%',
get_current_network_id()
)
);
return is_int( $restored ) ? $restored : 0;
}
/** /**
* Whether any original MLP2 tables exist in the database. * Whether any original MLP2 tables exist in the database.
* *

View file

@ -112,6 +112,12 @@ msgstr "Limpieza completada."
msgid "Cleanup confirmation invalid. Type DELETE exactly." msgid "Cleanup confirmation invalid. Type DELETE exactly."
msgstr "Confirmación de limpieza inválida. Escribe DELETE exactamente." msgstr "Confirmación de limpieza inválida. Escribe DELETE exactamente."
msgid "MLP2 sitemeta backed up. MultilingualPress 5 can now activate cleanly."
msgstr "Sitemeta de MLP2 respaldado. MultilingualPress 5 ya puede activarse sin problemas."
msgid "MLP2 sitemeta restored to original keys."
msgstr "Sitemeta de MLP2 restaurado a sus claves originales."
msgid "Action required: MLP2 tables must be renamed before MultilingualPress 5 can be activated." msgid "Action required: MLP2 tables must be renamed before MultilingualPress 5 can be activated."
msgstr "Acción requerida: las tablas de MLP2 deben renombrarse antes de activar MultilingualPress 5." msgstr "Acción requerida: las tablas de MLP2 deben renombrarse antes de activar MultilingualPress 5."

View file

@ -2,14 +2,14 @@
# This file is distributed under the GPL-3.0-or-later. # This file is distributed under the GPL-3.0-or-later.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: MLP2 to MLP5 (by ROBOTSTXT) 1.0.0\n" "Project-Id-Version: MLP2 to MLP5 (by ROBOTSTXT) 1.1.0\n"
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/robotstxt-mlp2-mlp5\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/robotstxt-mlp2-mlp5\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"POT-Creation-Date: 2026-02-27T10:21:22+00:00\n" "POT-Creation-Date: 2026-03-02T14:12:27+00:00\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"X-Generator: WP-CLI 2.12.0\n" "X-Generator: WP-CLI 2.12.0\n"
"X-Domain: robotstxt-mlp2-mlp5\n" "X-Domain: robotstxt-mlp2-mlp5\n"
@ -40,7 +40,7 @@ msgid "https://git.robotstxt.es/ROBOTSTXT"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:61 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:61
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:290 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:298
msgid "MLP2 to MLP5 Migrator" msgid "MLP2 to MLP5 Migrator"
msgstr "" msgstr ""
@ -49,59 +49,59 @@ msgid "MLP Migrator"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:90 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:90
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:107 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:111
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:131 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:139
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:254 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:262
msgid "You do not have permission to perform this action." msgid "You do not have permission to perform this action."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:271 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:279
msgid "You do not have permission to access this page." msgid "You do not have permission to access this page."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:321 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:329
msgid "Preflight" msgid "Preflight"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:322 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:330
msgid "Analysis" msgid "Analysis"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:323 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:331
#: includes/class-robotstxt-mlp2-mlp5-step-verification.php:30 #: includes/class-robotstxt-mlp2-mlp5-step-verification.php:30
msgid "Site Relations" msgid "Site Relations"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:324 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:332
msgid "Content Relations" msgid "Content Relations"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:325 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:333
msgid "Verification" msgid "Verification"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:326 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:334
msgid "Cleanup" msgid "Cleanup"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:383 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:391
msgid "Reset migration (start over)" msgid "Reset migration (start over)"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:385 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:393
msgid "This will reset the wizard to Step 1 and clear the migration log. It does not modify MLP5 data." msgid "This will reset the wizard to Step 1 and clear the migration log. It does not modify MLP5 data."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:389 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:397
msgid "Reset wizard" msgid "Reset wizard"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:398 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:406
msgid "System status" msgid "System status"
msgstr "" msgstr ""
#. translators: %d: number of renamed tables #. translators: %d: number of renamed tables
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:419 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:427
#, php-format #, php-format
msgid "%d table renamed successfully." msgid "%d table renamed successfully."
msgid_plural "%d tables renamed successfully." msgid_plural "%d tables renamed successfully."
@ -109,15 +109,23 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#. translators: %d: number of tables that could not be renamed #. translators: %d: number of tables that could not be renamed
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:424 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:432
#, php-format #, php-format
msgid "%d table could not be renamed. Check database permissions." msgid "%d table could not be renamed. Check database permissions."
msgid_plural "%d tables could not be renamed. Check database permissions." msgid_plural "%d tables could not be renamed. Check database permissions."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:435
msgid "MLP2 sitemeta backed up. MultilingualPress 5 can now activate cleanly."
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:438
msgid "MLP2 sitemeta restored to original keys."
msgstr ""
#. translators: %d: number of restored tables #. translators: %d: number of restored tables
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:429 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:443
#, php-format #, php-format
msgid "%d table restored to original name." msgid "%d table restored to original name."
msgid_plural "%d tables restored to original names." msgid_plural "%d tables restored to original names."
@ -125,127 +133,127 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#. translators: %d: number of tables that could not be restored #. translators: %d: number of tables that could not be restored
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:434 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:448
#, php-format #, php-format
msgid "%d table could not be restored. Check database permissions." msgid "%d table could not be restored. Check database permissions."
msgid_plural "%d tables could not be restored. Check database permissions." msgid_plural "%d tables could not be restored. Check database permissions."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:437 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:451
msgid "Wizard reset. You can start the migration from Step 1." msgid "Wizard reset. You can start the migration from Step 1."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:440 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:454
msgid "Cleanup completed." msgid "Cleanup completed."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:443 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:457
msgid "Cleanup confirmation invalid. Type DELETE exactly." msgid "Cleanup confirmation invalid. Type DELETE exactly."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:458 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:472
msgid "Action required: MLP2 tables must be renamed before MultilingualPress 5 can be activated." msgid "Action required: MLP2 tables must be renamed before MultilingualPress 5 can be activated."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:461 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:475
msgid "MLP2 tables renamed. Now go to Network Admin &gt; Plugins and activate MultilingualPress 5." msgid "MLP2 tables renamed. Now go to Network Admin &gt; Plugins and activate MultilingualPress 5."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:464 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:478
msgid "Warning: both original and backup MLP2 tables were found. Investigate before proceeding." msgid "Warning: both original and backup MLP2 tables were found. Investigate before proceeding."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:467 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:481
msgid "No MLP2 tables found. Migration cannot proceed. Restore your database from a backup." msgid "No MLP2 tables found. Migration cannot proceed. Restore your database from a backup."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:494 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:508
msgid "System Status" msgid "System Status"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:498 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:512
msgid "MLP2 tables (original names)" msgid "MLP2 tables (original names)"
msgstr "" msgstr ""
#. translators: %d: number of tables #. translators: %d: number of tables
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:501 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:515
#, php-format #, php-format
msgid "%d table — must be renamed" msgid "%d table — must be renamed"
msgid_plural "%d tables — must be renamed" msgid_plural "%d tables — must be renamed"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:503 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:517
msgid "None" msgid "None"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:508 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:522
msgid "MLP2 tables (backup copies)" msgid "MLP2 tables (backup copies)"
msgstr "" msgstr ""
#. translators: %d: number of backup tables #. translators: %d: number of backup tables
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:511 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:525
#, php-format #, php-format
msgid "%d backup table ready" msgid "%d backup table ready"
msgid_plural "%d backup tables ready" msgid_plural "%d backup tables ready"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:513 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:527
msgid "Not yet renamed" msgid "Not yet renamed"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:518 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:532
#: includes/class-robotstxt-mlp2-mlp5-step-preflight.php:105 #: includes/class-robotstxt-mlp2-mlp5-step-preflight.php:105
msgid "MultilingualPress 5 (network-active)" msgid "MultilingualPress 5 (network-active)"
msgstr "" msgstr ""
#. translators: %s: version #. translators: %s: version
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:521 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:535
#: includes/class-robotstxt-mlp2-mlp5-step-preflight.php:108 #: includes/class-robotstxt-mlp2-mlp5-step-preflight.php:108
#, php-format #, php-format
msgid "Active (v%s)" msgid "Active (v%s)"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:523 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:537
#: includes/class-robotstxt-mlp2-mlp5-step-preflight.php:110 #: includes/class-robotstxt-mlp2-mlp5-step-preflight.php:110
msgid "Not active" msgid "Not active"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:544 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:558
msgid "Step 1 — Rename MLP2 Tables" msgid "Step 1 — Rename MLP2 Tables"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:545 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:559
msgid "MultilingualPress 5 cannot activate while the original MLP2 table names are present. Click below to rename them to temporary backup copies ({prefix}mlp2bak_*). This is safe and fully reversible." msgid "MultilingualPress 5 cannot activate while the original MLP2 table names are present. Click below to rename them to temporary backup copies ({prefix}mlp2bak_*). This is safe and fully reversible."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:549 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:563
msgid "Rename MLP2 tables (prepare for MLP5 activation)" msgid "Rename MLP2 tables (prepare for MLP5 activation)"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:558 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:572
msgid "Step 2 — Activate MultilingualPress 5" msgid "Step 2 — Activate MultilingualPress 5"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:559 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:573
msgid "MLP2 tables have been renamed. MultilingualPress 5 can now be activated without the old-version compatibility error." msgid "MLP2 tables have been renamed. MultilingualPress 5 can now be activated without the old-version compatibility error."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:560 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:574
msgid "Go to Network Admin › Plugins" msgid "Go to Network Admin › Plugins"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:569 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:583
msgid "Emergency: restore original MLP2 table names" msgid "Emergency: restore original MLP2 table names"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:571 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:585
msgid "This renames backup tables back to their original MLP2 names. Only use this before MLP5 has been activated." msgid "This renames backup tables back to their original MLP2 names. Only use this before MLP5 has been activated."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:575 #: includes/class-robotstxt-mlp2-mlp5-admin-page.php:589
msgid "Restore original table names" msgid "Restore original table names"
msgstr "" msgstr ""
@ -363,45 +371,45 @@ msgid "Backup table dropped: %s"
msgstr "" msgstr ""
#. translators: %d: key count #. translators: %d: key count
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:108 #: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:118
#, php-format #, php-format
msgid "Removed %d MLP2 sitemeta entries." msgid "Removed %d MLP2 sitemeta entries."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:119 #: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:129
msgid "Step 6 — Cleanup (Optional)" msgid "Step 6 — Cleanup (Optional)"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:122 #: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:132
msgid "Migration complete!" msgid "Migration complete!"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:122 #: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:132
msgid "MultilingualPress 5 is now configured with your migrated data. Verify that everything works before performing the optional cleanup below." msgid "MultilingualPress 5 is now configured with your migrated data. Verify that everything works before performing the optional cleanup below."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:125 #: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:135
msgid "The cleanup actions below are optional and irreversible. MultilingualPress 5 will work correctly whether or not you perform them." msgid "The cleanup actions below are optional and irreversible. MultilingualPress 5 will work correctly whether or not you perform them."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:138 #: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:148
msgid "Deactivate MultilingualPress 2 (network-wide)" msgid "Deactivate MultilingualPress 2 (network-wide)"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:140 #: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:150
msgid "Deactivate MultilingualPress 2" msgid "Deactivate MultilingualPress 2"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:141 #: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:151
msgid "already inactive" msgid "already inactive"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:148 #: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:158
msgid "Delete MLP2 backup database tables" msgid "Delete MLP2 backup database tables"
msgstr "" msgstr ""
#. translators: %d: table count #. translators: %d: table count
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:149 #: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:159
#, php-format #, php-format
msgid "%d table" msgid "%d table"
msgid_plural "%d tables" msgid_plural "%d tables"
@ -409,19 +417,19 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#. translators: %d: table count #. translators: %d: table count
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:150 #: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:160
msgid "Irreversible. Only do this after verifying the migration in MLP5." msgid "Irreversible. Only do this after verifying the migration in MLP5."
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:156 #: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:166
msgid "Delete MLP2 network settings from wp_sitemeta" msgid "Delete MLP2 network settings from wp_sitemeta"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:163 #: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:173
msgid "Type DELETE to confirm:" msgid "Type DELETE to confirm:"
msgstr "" msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:169 #: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:179
msgid "Proceed with cleanup" msgid "Proceed with cleanup"
msgstr "" msgstr ""

View file

@ -3,9 +3,9 @@ Contributors: javiercasares, robotstxt
Tags: multisite, multilingual, multilingualpress, migration, mlp Tags: multisite, multilingual, multilingualpress, migration, mlp
Requires at least: 6.7 Requires at least: 6.7
Tested up to: 6.9 Tested up to: 6.9
Stable tag: 1.0.0 Stable tag: 1.1.0
Requires PHP: 8.2 Requires PHP: 8.2
Version: 1.0.0 Version: 1.1.0
License: GPL-3.0-or-later License: GPL-3.0-or-later
License URI: https://www.gnu.org/licenses/gpl-3.0.txt License URI: https://www.gnu.org/licenses/gpl-3.0.txt
Network: true Network: true
@ -373,6 +373,15 @@ PHP 8.2 through 8.5. Note that MultilingualPress 2 is not compatible with PHP 8.
== Changelog == == Changelog ==
= 1.1.0 =
_Release date: 2026-03-02_
* MLP2 sitemeta keys (`inpsyde_multilingual*`) are now renamed to `mlp2bak_inpsyde_multilingual*` during table preparation instead of being deleted, making the operation fully reversible.
* Restoring original table names also restores the original sitemeta keys.
* Cleanup step (Step 6) now also deletes the backed-up sitemeta keys.
* Fixed: `mlp_migrator_log` (plugin's own table) was incorrectly listed as an MLP2 table requiring renaming.
= 1.0.0 = = 1.0.0 =
_Release date: 2026-02-27_ _Release date: 2026-02-27_

View file

@ -3,7 +3,7 @@
* Plugin Name: MLP2 to MLP5 (by ROBOTSTXT) * Plugin Name: MLP2 to MLP5 (by ROBOTSTXT)
* Plugin URI: https://git.robotstxt.es/ROBOTSTXT/robotstxt-mlp2-mlp5 * Plugin URI: https://git.robotstxt.es/ROBOTSTXT/robotstxt-mlp2-mlp5
* Description: Guided, safe, and reversible migration from MultilingualPress 2 to MultilingualPress 5. * Description: Guided, safe, and reversible migration from MultilingualPress 2 to MultilingualPress 5.
* Version: 1.0.0 * Version: 1.1.0
* Author: ROBOTSTXT * Author: ROBOTSTXT
* Author URI: https://git.robotstxt.es/ROBOTSTXT * Author URI: https://git.robotstxt.es/ROBOTSTXT
* License: GPL-3.0-or-later * License: GPL-3.0-or-later
@ -31,7 +31,7 @@ if ( ! defined( 'ABSPATH' ) ) {
* in the `mlp_migrator_db_version` sitemeta key and runs any pending upgrade * in the `mlp_migrator_db_version` sitemeta key and runs any pending upgrade
* routines automatically on the next request after a plugin update. * routines automatically on the next request after a plugin update.
*/ */
define( 'ROBOTSTXT_MLP2_MLP5_VERSION', '1.0.0' ); define( 'ROBOTSTXT_MLP2_MLP5_VERSION', '1.1.0' );
define( 'ROBOTSTXT_MLP2_MLP5_DB_VERSION', '1.0' ); define( 'ROBOTSTXT_MLP2_MLP5_DB_VERSION', '1.0' );
require_once __DIR__ . '/includes/class-robotstxt-mlp2-mlp5-logger.php'; require_once __DIR__ . '/includes/class-robotstxt-mlp2-mlp5-logger.php';