HEX
Server: Apache
System: Linux webd006.cluster128.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64
User: zwafgyp (177615)
PHP: 7.4.33
Disabled: _dyuweyrj4,_dyuweyrj4r,dl
Upload Files
File: /home/zwafgyp/lacalita/wp-content/plugins/rey-core/inc/modules/variation-swatches/migration.php
<?php
namespace ReyCore\Modules\VariationSwatches;

if (!defined('ABSPATH')) exit; // Exit if accessed directly

class Migration
{
	const OPTION = '__wvs_migration';

	private $types = [];

	private $data = [];

	public function __construct(){
		add_action( 'init', [$this, 'init']);
	}

	function init(){

		if( ! is_admin() ){
			return;
		}

		if( ! current_user_can( 'administrator' ) ){
			return;
		}

		add_action( 'wp_ajax_reycore_variation_swatches_wvs_migration', [$this, 'ajax_wvs_migration']);
		// add_action( 'reycore/customizer/control=single_product_hide_out_of_stock_variation', [ $this, 'customizer__show_migration_control' ], 10, 2 );
		// add_action( 'reycore/customizer/control=woocommerce_loop_variation', [ $this, 'customizer__show_migration_control' ], 10, 2 );
		add_action( 'reycore/customizer/section=woo-product-page-summary-components/marker=swatches_after_settings', [$this, 'customizer__show_migration_control']);
		add_action( 'customize_controls_print_scripts', [$this, 'customizer__migration_scripts'] );

		if( ! Base::$settings['always_show_migration'] ){

			if( ! self::can_show_migration() ){
				return;
			}

			if( self::has_migrated() ){
				return;
			}

			// check if can migrate WVS data
			if( ! self::can_migrate_wvs() ){
				self::set_migrated();
				return;
			}

		}

		// add_action( 'admin_enqueue_scripts', [$this, 'enqueue_scripts']);
		// add_action( 'admin_notices', [$this, 'show_migrate_banner'] );
	}

	public static function can_show_migration(){
		if( isset($_REQUEST['post_type']) && $_REQUEST['post_type'] === 'product' ){
			if(
				(isset($_REQUEST['taxonomy']) && $_REQUEST['taxonomy'] !== '' && ! in_array(reycore__clean($_REQUEST['taxonomy']), ['product_cat', 'product_tag'], true)) ||
				(isset($_REQUEST['page']) && $_REQUEST['page'] === 'product_attributes')
			 ){
				return true;
			}
		}
		return false;
	}

	public static function has_migrated(){
		return get_option( Base::OPT . self::OPTION, false);
	}

	public static function set_migrated( $clear_cache = true ){

		// Clear cache and flush rewrite rules.
		if( $clear_cache ){
			delete_transient( 'wc_attribute_taxonomies' );
			\WC_Cache_Helper::invalidate_cache_group( 'woocommerce-attributes' );
		}

		return update_option( Base::OPT . self::OPTION, true, false);
	}

	/**
	 * Checks if WVS had saved options.
	 *
	 * @return boolean
	 */
	public static function can_migrate_wvs(){

		$wvs_main_opt = get_option( 'woo_variation_swatches' );

		// Sometimes the option is empty.
		if( $wvs_main_opt === false ){
			return true;
		}

		return ! empty( $wvs_main_opt);
	}

	public function show_migrate_banner(){
		?>
		<div class="reyAdm-notice reyAdm-notice--wvs-migrate notice" data-key="wvs-migrate">
			<button type="button" class="reyAdm-noticeDismiss notice-dismiss" data-dismiss="1day"><span class="screen-reader-text"><?php esc_html_e('Dismiss this notice.', 'rey-core') ?></span></button>
			<div class="__inner">
				<div class="__logo">
					<?php echo reycore__get_svg_icon(['id'=>'logo']) ?>
				</div>
				<div class="__content">
					<h3><?php esc_html_e('Migrate "WooCommerce Variation Swatches" attribute types to Rey\'s?', 'rey-core') ?></h3>
					<p><?php esc_html_e('It appears the "WooCommerce Variation Swatches" plugin was previously installed. Do you want to migrate the Product Attributes values to Rey\'s attribute swatches types?', 'rey-core') ?></p>
					<p>
						<button class="js-wvs-migrate-btn button button-primary"><?php esc_html_e('Yes, migrate', 'rey-core') ?></button>
					</p>
				</div>
			</div>
		</div>
		<?php
	}

	static function wvs_map(){
		return [
			Base::TYPES_PREFIX . 'color' => [
				'product_attribute_color'       => 'rey_attribute_color',
				'product_attribute_color_2'     => 'rey_attribute_color_secondary',
				'product_attribute_color_2_img' => 'rey_attribute_image',
			],
			Base::TYPES_PREFIX . 'image' => [
				'product_attribute_image' => 'rey_attribute_image',
			],
		];
	}

	function ajax_wvs_migration(){

		if ( ! check_ajax_referer( 'reycore-ajax-verification', 'security', false ) ) {
			wp_send_json( ['error' => 'Invalid security nonce!'] );
		}

		$data_maps = self::wvs_map();

		$attributes_to_migrate = $data_to_migrate = [];

		$status = [
			'migrated' => false,
			'taxonomies' => []
		];

		foreach (wc_get_attribute_taxonomies() as $key => $attribute) {

			if( ! (isset($attribute->attribute_type) && $attribute->attribute_type !== 'select') ){
				continue;
			}

			$type = $attribute->attribute_type;

			if( strpos($type, Base::TYPES_PREFIX) === false ){
				$type = Base::TYPES_PREFIX . $type;
			}

			if( ! Base::instance()->swatch_exists( $type ) ){
				continue;
			}

			$attribute->attribute_type = $type;

			$attributes_to_migrate[] = $attribute;
		}

		// no attributes to migrate, so bail
		// and update option that migration is not needed anymore
		if( empty($attributes_to_migrate) ){
			$status['migrated'] = self::set_migrated();
			wp_send_json($status);
		}

		foreach ($attributes_to_migrate as $attribute) {

			$taxonomy = wc_attribute_taxonomy_name($attribute->attribute_name);

			// process type update
			$update_attribute_type = wc_update_attribute($attribute->attribute_id, [
				'id'           => $attribute->attribute_id,
				'name'         => $attribute->attribute_name,
				'slug'         => '',
				'order_by'     => $attribute->attribute_orderby,
				'type'         => $attribute->attribute_type,
				'has_archives' => (bool) $attribute->attribute_public,
			]);

			if( is_wp_error($update_attribute_type) ){
				continue;
			}

			if( ! ( isset($data_maps[ $attribute->attribute_type ]) && $data_map = $data_maps[ $attribute->attribute_type ] ) ) {
				continue;
			}

			$terms_to_migrate = [];

			$terms = get_terms([
				'taxonomy'   => $taxonomy,
				'hide_empty' => false,
			]);

			foreach ($terms as $term) {

				$term_meta = get_term_meta( $term->term_id );

				foreach ($data_map as $term_key => $new_term_key) {

					if( ! ( isset($term_meta[ $term_key ]) && $field_data = $term_meta[ $term_key ][0] ) ){
						continue;
					}

					$update = update_field( $new_term_key, $field_data, $term );

					if( $update ){
						$terms_to_migrate[$term->term_id][$new_term_key] = $field_data;
					}

				}
			}

			$data_to_migrate[ $taxonomy ] = $terms_to_migrate;

			if( ! empty($terms_to_migrate) ){
				delete_transient( Base::get_attribute_transient_name( $taxonomy ) );
			}

		}

		$status['migrated'] = self::set_migrated();
		$status['taxonomies'] = $data_to_migrate;

		wp_send_json($status);
	}

	public function enqueue_scripts(){

		\wp_enqueue_style(
			Base::ASSET_HANDLE . '-admin',
			Base::get_path( basename( __DIR__ ) ) . '/admin-style.css',
			[],
			REY_CORE_VERSION
		);

		\wp_enqueue_script(
			Base::ASSET_HANDLE . '-admin',
			Base::get_path( basename( __DIR__ ) ) . '/admin-script.js',
			['jquery'],
			REY_CORE_VERSION,
			true
		);

	}

	function customizer__show_migration_control($section){

		if( ! Base::instance()->is_enabled() ){
			return;
		}

		if( ! current_user_can( 'administrator' ) ){
			return;
		}

		if( self::has_migrated() ){
			return;
		}

		// If can't migrate, force set migration.
		if( ! self::can_migrate_wvs() ){
			self::set_migrated();
			return;
		}

		$section->add_control( [
			'type'        => 'rey-button',
			'settings'    => 'wvs_swatches_migration_button',
			'label'       => __('Migrate WVS. data', 'rey-core'),
			'help' => [
				__('Migrate swatches data from WooCommerce Variation Swatches plugin.', 'rey-core')
			],
			'default'     => '',
			'choices'     => [
				'text'   => esc_html__('Yes, migrate', 'rey-core'),
				'action' => 'reycore_variation_swatches_wvs_migration',
			],
		] );

	}

	function customizer__migration_scripts(){


		if( self::has_migrated() ){
			return;
		}

		$this->enqueue_scripts();
	}

}