diff --git a/admin/qtx_activation_hook.php b/admin/qtx_activation_hook.php index b410d4b8..2a228791 100644 --- a/admin/qtx_activation_hook.php +++ b/admin/qtx_activation_hook.php @@ -787,7 +787,6 @@ function qtranxf_activation_hook() { // Migrate (rename/import) legacy options, temporary transitions during evolutions. qtranxf_rename_legacy_option( 'qtranslate_modules', QTX_OPTIONS_MODULES_STATE ); qtranxf_import_legacy_option( 'acf_qtranslate', QTX_OPTIONS_MODULE_ACF, false ); - qtranxf_import_legacy_option( 'qts_options', QTX_OPTIONS_MODULE_SLUGS, false ); $ts = time(); $next_thanks = get_option( 'qtranslate_next_thanks' ); @@ -932,6 +931,30 @@ function qtranxf_admin_notices_gutenberg() { add_action( 'admin_notices', 'qtranxf_admin_notices_gutenberg' ); +function qtranxf_admin_notices_slugs_migrate() { + if ( qtranxf_check_admin_notice( 'slugs-migrate' ) || ! QTX_Module_Loader::is_module_active( 'slugs' ) ) { + return; + } + $old_value = get_option( 'qts_options' ); // Very quick check to avoid loading more code. + if ( ! $old_value ) { + return; + } + require_once( QTRANSLATE_DIR . '/modules/slugs/admin/slugs-migrate-qts.php' ); + $msg = qtranxf_slugs_check_migrate_qts(); // More advanced checks with QTS meta. + if ( empty( $msg ) ) { + return; + } + qtranxf_admin_notice_dismiss_script(); + echo '

'; + $options_link = admin_url( 'options-general.php?page=qtranslate-xt#import' ); + echo '

' . sprintf( __( '%s : found slugs meta that can be migrated. Go to the import settings to migrate.', 'qtranslate' ), qtranxf_get_plugin_link(), $options_link ) . '

'; + echo '

' . $msg . '

'; + echo '

' . __( 'I have already done it, dismiss this message.', 'qtranslate' ); + echo '

'; +} + +add_action( 'admin_notices', 'qtranxf_admin_notices_slugs_migrate' ); + function qtranxf_admin_notice_deactivate_plugin( $name, $plugin ) { deactivate_plugins( $plugin, true ); $d = dirname( $plugin ); @@ -1028,6 +1051,14 @@ function qtranxf_update_option_admin_notices( $messages, $id, $set = true ) { return $messages; } +/** + * Update an admin notice to be set (hidden) / unset (shown). + * + * @param string $id + * @param bool $set true to set the message as seen (hide), false to unset (show) + * + * @return array|mixed + */ function qtranxf_update_admin_notice( $id, $set ) { $messages = get_option( 'qtranslate_admin_notices', array() ); diff --git a/admin/qtx_admin_options_update.php b/admin/qtx_admin_options_update.php index 913e6843..ceb1024a 100644 --- a/admin/qtx_admin_options_update.php +++ b/admin/qtx_admin_options_update.php @@ -45,6 +45,14 @@ function qtranxf_edit_config() { if ( isset( $_POST['qtranslate_reset'] ) && isset( $_POST['qtranslate_reset2'] ) ) { $messages[] = __( 'qTranslate has been reset.', 'qtranslate' ); } elseif ( isset( $_POST['default_language'] ) ) { + // TODO: remove temporary hack - restore QTS options for master dev before migration. + // Undo import legacy options in master before new options are saved with new keys... + $qts_options = get_option( 'qts_options' ); + $new_options = get_option( QTX_OPTIONS_MODULE_SLUGS ); + // Re-create original QTS options that can be properly imported again. + if ( ! $qts_options && $new_options && count( $new_options ) > 0 && strpos( array_keys( $new_options )[0], '_qts_' ) === 0 ) { + update_option( 'qts_options', $new_options, false ); + } qtranxf_update_settings(); @@ -971,6 +979,12 @@ function qtranxf_executeOnUpdate() { $messages[] = $msg; } } + + if ( isset( $_POST['qtranslate_import_slugs_migrate'] ) && $_POST['qtranslate_import_slugs_migrate'] ) { + require_once( QTRANSLATE_DIR . '/modules/slugs/admin/slugs-migrate-qts.php' ); + $db_commit = isset( $_POST['qtranslate_import_slugs_confirm'] ) && $_POST['qtranslate_import_slugs_confirm']; + $messages[] = qtranxf_slugs_migrate_qts_data( $db_commit ); + } } function qtranxf_mark_default( $text ) { diff --git a/admin/qtx_import_export.php b/admin/qtx_import_export.php index ce816871..138fb9d9 100644 --- a/admin/qtx_import_export.php +++ b/admin/qtx_import_export.php @@ -229,6 +229,27 @@ function qtranxf_admin_section_import_export( $request_uri ) { 'text' => sprintf( __( 'Use plugin %s to import data.', 'qtranslate' ), 'W2Q: WPML to qTranslate' ) ) ) ?> + + + + + +
+ + + + diff --git a/modules/slugs/admin/slugs-admin.php b/modules/slugs/admin/slugs-admin.php index 2a91f869..75b0f27c 100644 --- a/modules/slugs/admin/slugs-admin.php +++ b/modules/slugs/admin/slugs-admin.php @@ -73,10 +73,11 @@ function qts_uninstall() { $meta_keys = array(); foreach ( $q_config['enabled_languages'] as $lang ) { - $meta_keys[] = QTS_META_PREFIX . $lang; + $meta_keys[] = QTX_SLUGS_META_PREFIX . $lang; } $meta_keys = "'" . implode( "','", $meta_keys ) . "'"; $wpdb->query( "DELETE from $wpdb->postmeta WHERE meta_key IN ($meta_keys)" ); + $wpdb->query( "DELETE from $wpdb->termmeta WHERE meta_key IN ($meta_keys)" ); qts_deactivate(); @@ -126,7 +127,7 @@ function qts_draw_meta_box( $post ) { echo '' . PHP_EOL; $flag_location = qtranxf_flag_location(); foreach ( $q_config['enabled_languages'] as $lang ): - $slug = get_post_meta( $post->ID, QTS_META_PREFIX . $lang, true ); + $slug = get_post_meta( $post->ID, QTX_SLUGS_META_PREFIX . $lang, true ); $value = ( $slug ) ? htmlspecialchars( $slug, ENT_QUOTES ) : ''; $name = $q_config['language_name'][ $lang ]; $title = sprintf( __( 'Slug' ) . ' (%s)', $name ); @@ -149,7 +150,7 @@ function qts_draw_meta_box( $post ) { */ function qts_sanitize_post_slug( $slug, $post, $lang ) { $post_title = trim( qtranxf_use( $lang, $post->post_title ) ); - $post_name = get_post_meta( $post->ID, QTS_META_PREFIX . $lang, true ); + $post_name = get_post_meta( $post->ID, QTX_SLUGS_META_PREFIX . $lang, true ); if ( ! $post_name ) { $post_name = $post->post_name; } @@ -229,7 +230,7 @@ function qts_wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $po // TODO: update unique_slug :: missing hieararchical from current wp func ( 4.3.1 ) // Post slugs must be unique across all posts. $check_sql = "SELECT $wpdb->postmeta.meta_value FROM $wpdb->posts,$wpdb->postmeta WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id AND $wpdb->postmeta.meta_key = '%s' AND $wpdb->postmeta.meta_value = '%s' AND $wpdb->posts.post_type = %s AND $wpdb->posts.ID != %d LIMIT 1"; - $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, QTS_META_PREFIX . $lang, $slug, $post_type, $post_ID ) ); + $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, QTX_SLUGS_META_PREFIX . $lang, $slug, $post_type, $post_ID ) ); // TODO: update unique_slug :: missing check for conflict with dates archive from current wp func ( 4.3.1 ) if ( $post_name_check || in_array( $slug, $feeds ) || apply_filters( 'wp_unique_post_slug_is_bad_flat_slug', false, $slug, $post_type ) ) { @@ -237,7 +238,7 @@ function qts_wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $po do { // TODO: update unique_slug :: same as above: differs from current wp func ( 4.3.1 ) $alt_post_name = substr( $slug, 0, 200 - ( strlen( $suffix ) + 1 ) ) . "-$suffix"; - $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, QTS_META_PREFIX . $lang, $alt_post_name, $post_type, $post_ID ) ); + $post_name_check = $wpdb->get_var( $wpdb->prepare( $check_sql, QTX_SLUGS_META_PREFIX . $lang, $alt_post_name, $post_type, $post_ID ) ); $suffix++; } while ( $post_name_check ); $slug = $alt_post_name; @@ -276,8 +277,8 @@ function qts_save_postdata( $post_id, $post = null ) { $slug = qts_sanitize_post_slug( $slug, $post, $lang ); $slug = qts_unique_post_slug( $slug, $post, $lang ); - delete_post_meta( $post_id, QTS_META_PREFIX . $lang ); - update_post_meta( $post_id, QTS_META_PREFIX . $lang, $slug ); + delete_post_meta( $post_id, QTX_SLUGS_META_PREFIX . $lang ); + update_post_meta( $post_id, QTX_SLUGS_META_PREFIX . $lang, $slug ); } } } @@ -318,7 +319,7 @@ function qts_sanitize_term_slug( $slug, $term, $lang ) { function qts_unique_term_slug( $slug, $term, $lang ) { global $wpdb; - $query = $wpdb->prepare( "SELECT term_id FROM $wpdb->termmeta WHERE meta_key = '%s' AND meta_value = '%s' AND term_id != %d ", QTS_META_PREFIX . $lang, $slug, $term->term_id ); + $query = $wpdb->prepare( "SELECT term_id FROM $wpdb->termmeta WHERE meta_key = '%s' AND meta_value = '%s' AND term_id != %d ", QTX_SLUGS_META_PREFIX . $lang, $slug, $term->term_id ); $exists_slug = $wpdb->get_results( $query ); if ( empty( $exists_slug ) ) { @@ -326,7 +327,7 @@ function qts_unique_term_slug( $slug, $term, $lang ) { } // If we didn't get a unique slug, try appending a number to make it unique. - $query = $wpdb->prepare( "SELECT meta_value FROM $wpdb->termmeta WHERE meta_key = '%s' AND meta_value = '%s' AND term_id != %d", QTS_META_PREFIX . $lang, $slug, $term->term_id ); + $query = $wpdb->prepare( "SELECT meta_value FROM $wpdb->termmeta WHERE meta_key = '%s' AND meta_value = '%s' AND term_id != %d", QTX_SLUGS_META_PREFIX . $lang, $slug, $term->term_id ); if ( $wpdb->get_var( $query ) ) { $num = 2; @@ -336,7 +337,7 @@ function qts_unique_term_slug( $slug, $term, $lang ) { $slug_check = $wpdb->get_var( $wpdb->prepare( "SELECT meta_value FROM $wpdb->termmeta WHERE meta_key = '%s' AND meta_value = '%s'", - QTS_META_PREFIX . $lang, + QTX_SLUGS_META_PREFIX . $lang, $alt_slug ) ); } while ( $slug_check ); $slug = $alt_slug; @@ -371,8 +372,8 @@ function qts_save_term( $term_id, $tt_id, $taxonomy ) { $slug = qts_sanitize_term_slug( $slug, $term, $lang ); $slug = qts_unique_term_slug( $slug, $term, $lang ); - delete_metadata( 'term', $term_id, QTS_META_PREFIX . $lang ); - update_metadata( 'term', $term_id, QTS_META_PREFIX . $lang, $slug ); + delete_metadata( 'term', $term_id, QTX_SLUGS_META_PREFIX . $lang ); + update_metadata( 'term', $term_id, QTX_SLUGS_META_PREFIX . $lang, $slug ); } } @@ -389,7 +390,7 @@ function qts_show_list_term_fields( $term ) { $flag_location = qtranxf_flag_location(); ?> "; echo ( $desc != '' ) ? "

$desc

" : ""; @@ -102,12 +102,12 @@ function qts_show_form_field( $args = array() ) { case 'textarea': $options[ $id ] = stripslashes( $options[ $id ] ); $options[ $id ] = esc_html( $options[ $id ] ); - echo ""; + echo ""; echo ( $desc != '' ) ? "

$desc

" : ""; break; case 'select': - echo ""; foreach ( $choices as $item ) { $value = esc_attr( $item ); $item = esc_html( $item ); @@ -120,7 +120,7 @@ function qts_show_form_field( $args = array() ) { break; case 'select2': - echo ""; foreach ( $choices as $item ) { $item = explode( "|", $item ); @@ -134,7 +134,7 @@ function qts_show_form_field( $args = array() ) { break; case 'checkbox': - echo ""; + echo ""; echo ( $desc != '' ) ? "

$desc

" : ""; break; @@ -152,7 +152,7 @@ function qts_show_form_field( $args = array() ) { } } - echo " $item[0]
"; + echo " $item[0]
"; } echo ( $desc != '' ) ? "

$desc

" : ""; break; @@ -170,7 +170,7 @@ function qts_show_form_field( $args = array() ) { $checked = 'checked="checked"'; } - echo "