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 ==
= 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 =
_Release date: 2026-02-27_

View file

@ -89,11 +89,15 @@ class Robotstxt_Mlp2_Mlp5_Admin_Page {
if ( ! current_user_can( self::CAPABILITY ) ) {
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();
$args = array( 'renamed' => count( $result['renamed'] ) );
$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'] ) );
if ( ! empty( $result['errors'] ) ) {
$args['rename_errors'] = count( $result['errors'] );
}
if ( $sitemeta_renamed > 0 ) {
$args['sitemeta_renamed'] = $sitemeta_renamed;
}
wp_safe_redirect( self::page_url( $args ) );
exit;
}
@ -106,11 +110,15 @@ class Robotstxt_Mlp2_Mlp5_Admin_Page {
if ( ! current_user_can( self::CAPABILITY ) ) {
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();
$args = array( 'restored' => count( $result['restored'] ) );
$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'] ) );
if ( ! empty( $result['errors'] ) ) {
$args['restore_errors'] = count( $result['errors'] );
}
if ( $sitemeta_restored > 0 ) {
$args['sitemeta_restored'] = $sitemeta_restored;
}
wp_safe_redirect( self::page_url( $args ) );
exit;
}
@ -423,6 +431,12 @@ class Robotstxt_Mlp2_Mlp5_Admin_Page {
/* 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
}
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'] ) ) {
$count = (int) $_GET['restored'];
/* 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.
*
* 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.
*/
public static function remove_mlp2_sitemeta(): int {
global $wpdb;
$like = $wpdb->esc_like( 'mlp_' ) . '%';
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
$keys = $wpdb->get_col(
$wpdb->prepare(
"SELECT meta_key FROM {$wpdb->sitemeta} WHERE meta_key LIKE %s AND site_id = %d",
$like,
get_current_network_id()
)
$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
$found = $wpdb->get_col(
$wpdb->prepare(
"SELECT meta_key FROM {$wpdb->sitemeta} WHERE meta_key LIKE %s AND site_id = %d",
$like,
get_current_network_id()
)
);
if ( is_array( $found ) ) {
$keys = array_merge( $keys, $found );
}
}
$deleted = 0;
foreach ( (array) $keys as $key ) {
foreach ( array_unique( $keys ) as $key ) {
if ( delete_site_option( $key ) ) {
++$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.
*/
@ -96,7 +97,21 @@ class Robotstxt_Mlp2_Mlp5_Table_Preparer {
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
$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();
}
/**
* 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.
*

View file

@ -112,6 +112,12 @@ msgstr "Limpieza completada."
msgid "Cleanup confirmation invalid. Type DELETE exactly."
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."
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.
msgid ""
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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\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"
"X-Generator: WP-CLI 2.12.0\n"
"X-Domain: robotstxt-mlp2-mlp5\n"
@ -40,7 +40,7 @@ msgid "https://git.robotstxt.es/ROBOTSTXT"
msgstr ""
#: 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"
msgstr ""
@ -49,59 +49,59 @@ msgid "MLP Migrator"
msgstr ""
#: 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:131
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:254
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:111
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:139
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:262
msgid "You do not have permission to perform this action."
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."
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:321
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:329
msgid "Preflight"
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:322
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:330
msgid "Analysis"
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
msgid "Site Relations"
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:324
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:332
msgid "Content Relations"
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:325
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:333
msgid "Verification"
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:326
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:334
msgid "Cleanup"
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:383
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:391
msgid "Reset migration (start over)"
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."
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:389
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:397
msgid "Reset wizard"
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:398
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:406
msgid "System status"
msgstr ""
#. 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
msgid "%d table renamed successfully."
msgid_plural "%d tables renamed successfully."
@ -109,15 +109,23 @@ msgstr[0] ""
msgstr[1] ""
#. 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
msgid "%d table could not be renamed. Check database permissions."
msgid_plural "%d tables could not be renamed. Check database permissions."
msgstr[0] ""
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
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:429
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:443
#, php-format
msgid "%d table restored to original name."
msgid_plural "%d tables restored to original names."
@ -125,127 +133,127 @@ msgstr[0] ""
msgstr[1] ""
#. 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
msgid "%d table could not be restored. Check database permissions."
msgid_plural "%d tables could not be restored. Check database permissions."
msgstr[0] ""
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."
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:440
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:454
msgid "Cleanup completed."
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."
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."
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."
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."
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."
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:494
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:508
msgid "System Status"
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:498
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:512
msgid "MLP2 tables (original names)"
msgstr ""
#. 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
msgid "%d table — must be renamed"
msgid_plural "%d tables — must be renamed"
msgstr[0] ""
msgstr[1] ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:503
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:517
msgid "None"
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:508
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:522
msgid "MLP2 tables (backup copies)"
msgstr ""
#. 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
msgid "%d backup table ready"
msgid_plural "%d backup tables ready"
msgstr[0] ""
msgstr[1] ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:513
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:527
msgid "Not yet renamed"
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
msgid "MultilingualPress 5 (network-active)"
msgstr ""
#. 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
#, php-format
msgid "Active (v%s)"
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
msgid "Not active"
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"
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."
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)"
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"
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."
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"
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"
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."
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:575
#: includes/class-robotstxt-mlp2-mlp5-admin-page.php:589
msgid "Restore original table names"
msgstr ""
@ -363,45 +371,45 @@ msgid "Backup table dropped: %s"
msgstr ""
#. translators: %d: key count
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:108
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:118
#, php-format
msgid "Removed %d MLP2 sitemeta entries."
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:119
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:129
msgid "Step 6 — Cleanup (Optional)"
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:122
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:132
msgid "Migration complete!"
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."
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."
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)"
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:140
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:150
msgid "Deactivate MultilingualPress 2"
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:141
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:151
msgid "already inactive"
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"
msgstr ""
#. translators: %d: table count
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:149
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:159
#, php-format
msgid "%d table"
msgid_plural "%d tables"
@ -409,19 +417,19 @@ msgstr[0] ""
msgstr[1] ""
#. 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."
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"
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:163
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:173
msgid "Type DELETE to confirm:"
msgstr ""
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:169
#: includes/class-robotstxt-mlp2-mlp5-step-cleanup.php:179
msgid "Proceed with cleanup"
msgstr ""

View file

@ -3,9 +3,9 @@ Contributors: javiercasares, robotstxt
Tags: multisite, multilingual, multilingualpress, migration, mlp
Requires at least: 6.7
Tested up to: 6.9
Stable tag: 1.0.0
Stable tag: 1.1.0
Requires PHP: 8.2
Version: 1.0.0
Version: 1.1.0
License: GPL-3.0-or-later
License URI: https://www.gnu.org/licenses/gpl-3.0.txt
Network: true
@ -373,6 +373,15 @@ PHP 8.2 through 8.5. Note that MultilingualPress 2 is not compatible with PHP 8.
== 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 =
_Release date: 2026-02-27_

View file

@ -3,7 +3,7 @@
* Plugin Name: MLP2 to MLP5 (by ROBOTSTXT)
* Plugin URI: https://git.robotstxt.es/ROBOTSTXT/robotstxt-mlp2-mlp5
* Description: Guided, safe, and reversible migration from MultilingualPress 2 to MultilingualPress 5.
* Version: 1.0.0
* Version: 1.1.0
* Author: ROBOTSTXT
* Author URI: https://git.robotstxt.es/ROBOTSTXT
* 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
* 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' );
require_once __DIR__ . '/includes/class-robotstxt-mlp2-mlp5-logger.php';