HEX
Server: nginx
System: Linux pool195-106-36.bur.atomicsites.net 6.12.57+deb12-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.57-1~bpo12+1 (2025-11-17) x86_64
User: (0)
PHP: 8.3.32
Disabled: pcntl_fork
Upload Files
File: //srv/htdocs/wp-content/plugins/custom-codes/lib/upgrade.php
<?php
/**
 * Upgrade actions
 *
 * @since   2.0.0
 * @package Custom_Codes
 */

defined( 'ABSPATH' ) || die( 'No script kiddies please!' );


/**
 * Upgrade from old versions.
 */
function codes_upgrade() {

	$old_version = get_option( '_codes_version', '0' );
	$new_version = CODES_VERSION;
	if ( $old_version === $new_version ) {
		return;
	}

	// Check an old setting to see a new installation.
	do_action( 'codes_upgrade', $new_version, $old_version );
	update_option( '_codes_version', $new_version );
}
add_action( 'setup_theme', 'codes_upgrade' );




// FOR BEFORE 2.3.2 =======================================================.
/**
 * Create mixin posts.
 *
 * @param string $new_version New version number.
 * @param string $old_version Old version number.
 */
function codes_move_multisite_codes( $new_version, $old_version ) {
	global $wp_filesystem;

	if ( ! version_compare( $old_version, '2.3.2', '<' ) ) {
		return;
	}

	// List all the sites.
	if ( function_exists( 'get_sites' ) && class_exists( 'WP_Site_Query' ) ) {

		$sites = get_sites();
		foreach ( $sites as $site ) {
			switch_to_blog( $site->blog_id );

			// Get all the codes belong to current blog ID.
			$codes = get_posts(
				array(
					'post_type'      => 'custom-code',
					'posts_per_page' => -1,
					'post_status'    => 'any',
				)
			);

			// Early exit if posts are not ready.
			if ( ! is_array( $codes ) ) {
					continue;
			}

			// Process all the codes.
			foreach ( $codes as $code ) {

				// List & move all the files.
				foreach ( glob( WP_CONTENT_DIR . "/custom_codes/$code->ID-*.*" ) as $source_file_path ) {
					$file_name             = basename( $source_file_path );
					$destination_file_path = WP_CONTENT_DIR . "/custom_codes/site-$site->blog_id/$file_name";
					$wp_filesystem->move( $source_file_path, $destination_file_path );
				}
			}

			restore_current_blog();
		}
	}
}
add_action( 'codes_upgrade', 'codes_move_multisite_codes', 13, 2 );





// FOR BETWEEN 2.0.0 AND 2.0.3 =======================================================.

/**
 * Create mixin posts.
 *
 * @param string $new_version New version number.
 * @param string $old_version Old version number.
 */
function codes_create_mixin_posts( $new_version, $old_version ) {
	global $codes_langs, $wp_filesystem;

	if ( ! version_compare( $old_version, '2.0.3', '<' ) || ! version_compare( $old_version, '2.0.0', '>=' ) ) {
		return;
	}

	// Find the mixin files.
	foreach ( glob( CODES_FOLDER_DIR . '*-scss-mixins.scss' ) as $file_path ) {

		$file_name = basename( $file_path );
		$post_ID   = explode( '-', $file_name )[0];

		// Location.
		$location = get_option( '_codes_location', 'frontend' );

		// Type Label.
		$type_label = 'frontend' === $location ? __( 'Public Mixins', 'custom-codes' ) : __( 'Admin Mixins', 'custom-codes' );

		// Create mixin post.
		$mixin_id = wp_insert_post(
			array(
				'post_title'  => $type_label,
				'post_type'   => 'custom-code',
				'post_status' => 'private',
				'meta_input'  => array(
					'_codes_language'   => 'scss',
					'_codes_location'   => 'everywhere',
					'_codes_adminroles' => array(),
					'_codes_savecount'  => 0,
				),
			)
		);

		if ( ! is_wp_error( $mixin_id ) ) {

			// Create mixin editor.
			$new_file = CODES_FOLDER_DIR . "$mixin_id-scss-desktop.scss";
			$wp_filesystem->move( $file_path, $new_file );

			// Create mixin output.
			$output_file = CODES_FOLDER_DIR . "$mixin_id-scss-output.scss";
			$wp_filesystem->copy( $new_file, $output_file );

			// Find the post editors.
			foreach ( glob( CODES_FOLDER_DIR . "$post_ID-*.scss" ) as $post_file_path ) {
				if ( $post_file_path === $new_file || $post_file_path === $output_file ) {
					continue;
				}

				$editor_content = $wp_filesystem->get_contents( $post_file_path );
				$editor_content = '/* ' . __( 'Import Mixins', 'custom-codes' ) . " */\n@import \"$mixin_id-scss-desktop\"; \n\n$editor_content";

				$wp_filesystem->put_contents( $post_file_path, $editor_content );

			}
		}
	} // Old mixins loop
}
add_action( 'codes_upgrade', 'codes_create_mixin_posts', 12, 2 );




// FOR BEFORE 2.0.0 =======================================================.

/**
 * Import old mixins.
 *
 * @param string $type Admin or Public files.
 */
function codes_import_old_mixins( $type = 'Public' ) {
	global $wp_filesystem;

	// Type Label.
	$type_label = 'Admin' === $type ? __( 'Admin Mixins', 'custom-codes' ) : __( 'Public Mixins', 'custom-codes' );

	// Admin Prefix.
	$prefix = 'Admin' === $type ? 'admin_' : '';

	// Exit earlier if no file exists.
	$old_file = CODES_FOLDER_DIR . $prefix . 'mixins.scss';
	if ( ! file_exists( $old_file ) ) {
		return false;
	}

	// Create post.
	$post_ID = wp_insert_post(
		array(
			'post_title'  => $type_label,
			'post_type'   => 'custom-code',
			'post_status' => 'private',
			'meta_input'  => array(
				'_codes_language'   => 'scss',
				'_codes_location'   => 'everywhere',
				'_codes_adminroles' => array(),
				'_codes_savecount'  => 0,
			),
		)
	);
	if ( ! is_wp_error( $post_ID ) ) {

		$new_file = CODES_FOLDER_DIR . "$post_ID-scss-desktop.scss";
		$wp_filesystem->move( $old_file, $new_file );

		$output_file = CODES_FOLDER_DIR . "$post_ID-scss-output.scss";
		$wp_filesystem->copy( $new_file, $output_file );

		return $post_ID;

	}

	return 'Error';
}

/**
 * Import old styles.
 *
 * @param string $type     Admin or Public files.
 * @param int    $mixin_id Mixin ID.
 */
function codes_import_old_styles( $type = 'Public', $mixin_id = false ) {
	global $wp_filesystem;

	// Admin Prefix.
	$prefix = 'Admin' === $type ? 'admin_' : '';

	// Type Label.
	$type_label = 'Admin' === $type ? __( 'Admin', 'custom-codes' ) : __( 'Public', 'custom-codes' );

	// Style Mode (SCSS || CSS).
	$style_lang = get_option( 'cstm_cds_style_mode', 'scss' ) === 'sass' ? 'scss' : get_option( 'cstm_cds_style_mode', 'scss' );

	// Location.
	$location = 'Public' === $type ? 'frontend' : 'backend';

	// Admin Roles.
	$roles = 'Public' === $type ? array() : get_option( 'cstm_cds_permission_roles', array() );

	// Save Count.
	$save_count = get_option( 'cstm_cds_' . $prefix . 'css_save_count', 0 );

	// Create post.
	$post_ID = wp_insert_post(
		array(
			'post_title'  => sprintf(
					/* translators: 1: Admin or Public 2: Language selected */
				__( '%1$s Side %2$s', 'custom-codes' ),
				$type_label,
				strtoupper( $style_lang )
			),
			'post_type'   => 'custom-code',
			'post_status' => 'publish',
			'meta_input'  => array(
				'_codes_language'   => $style_lang,
				'_codes_location'   => $location,
				'_codes_adminroles' => $roles,
				'_codes_savecount'  => $save_count,
			),
		)
	);
	if ( ! is_wp_error( $post_ID ) ) {

		// Rename old editors.
		$old_editors = array(
			$prefix . 'desktop'  => 'desktop',
			$prefix . 'tablet-l' => 'tablet-l',
			$prefix . 'tablet-p' => 'tablet-p',
			$prefix . 'mobile-l' => 'mobile-l',
			$prefix . 'mobile-p' => 'mobile-p',
			$prefix . 'retina'   => 'retina',
			( 'Public' === $type ? 'custom_public' : 'admin_panel' ) => 'output',
		);

		foreach ( $old_editors as $old => $new ) {

			// SCSS.
			$old_file_scss = CODES_FOLDER_DIR . "$old.scss";
			$new_file_scss = CODES_FOLDER_DIR . "$post_ID-scss-$new.scss";
			if ( file_exists( $old_file_scss ) ) {

				$old_file_content = $wp_filesystem->get_contents( $old_file_scss );
				$new_file_content = $old_file_content;
				$wp_filesystem->move( $old_file_scss, $new_file_scss );

				$mixin_filename = "$mixin_id-scss-desktop";
				$mixin_file     = CODES_FOLDER_DIR . "$mixin_filename.scss";

				if ( is_numeric( $mixin_id ) && file_exists( $mixin_file ) ) {

					$new_file_content = '/* ' . __( 'Import Mixins', 'custom-codes' ) . " */\n@import \"$mixin_filename\"; \n\n$new_file_content";
					$wp_filesystem->put_contents( $new_file_scss, $new_file_content );

				}
			}

			// CSS.
			$old_file_css = CODES_FOLDER_DIR . "$old.css";
			$new_file_css = CODES_FOLDER_DIR . "$post_ID-" . ( 'output' === $new ? 'scss' : 'css' ) . "-$new.css";
			if ( file_exists( $old_file_css ) ) {
				$wp_filesystem->move( $old_file_css, $new_file_css );
			}
		}
	}
}

/**
 * Import old scripts.
 *
 * @param string $type Admin or Public files.
 */
function codes_import_old_scripts( $type = 'Public' ) {
	global $wp_filesystem;

	// Exit earlier if no file exists.
	if ( ( 'Public' === $type && ! file_exists( CODES_FOLDER_DIR . 'custom_public.js' ) && ! file_exists( CODES_FOLDER_DIR . 'custom_public_head.js' ) )
		|| ( 'Admin' === $type && ! file_exists( CODES_FOLDER_DIR . 'admin_panel.js' ) && ! file_exists( CODES_FOLDER_DIR . 'admin_panel_head.js' ) )
	) {
		return;
	}

	// Admin Prefix.
	$prefix = 'Admin' === $type ? 'admin_panel' : 'custom_public';

	// Type Label.
	$type_label = 'Admin' === $type ? __( 'Admin', 'custom-codes' ) : __( 'Public', 'custom-codes' );

	// Extension.
	$extension = 'js';

	// Location.
	$location = 'Public' === $type ? 'frontend' : 'backend';

	// Admin Roles.
	$roles = 'Public' === $type ? array() : get_option( 'cstm_cds_permission_roles', array() );

	// Save Count.
	$save_count = get_option( 'cstm_cds_js_head_save_count', 0 );

	// Create post.
	$post_ID = wp_insert_post(
		array(
			'post_title'  => sprintf(
					/* translators: 1: Admin or Public 2: Language selected */
				__( '%1$s Side %2$s', 'custom-codes' ),
				$type_label,
				strtoupper( $extension )
			),
			'post_type'   => 'custom-code',
			'post_status' => 'publish',
			'meta_input'  => array(
				'_codes_language'   => $extension,
				'_codes_location'   => $location,
				'_codes_adminroles' => $roles,
				'_codes_savecount'  => $save_count,
			),
		)
	);
	if ( ! is_wp_error( $post_ID ) ) {

		// Rename old editors.
		$old_editors = array(
			$prefix           => 'head',
			$prefix . '_head' => 'body-closing',
		);

		foreach ( $old_editors as $old => $new ) {

			$old_file = CODES_FOLDER_DIR . "$old.$extension";
			$new_file = CODES_FOLDER_DIR . "$post_ID-$extension-$new.$extension";
			if ( file_exists( $old_file ) ) {
				$wp_filesystem->move( $old_file, $new_file );
			}
		}
	}
}

/**
 * Import old custom PHP functions.
 */
function codes_import_old_php() {
	global $wp_filesystem;

	// Exit earlier if no file exists.
	$old_file = CODES_FOLDER_DIR . 'admin_functions.php';
	if ( ! file_exists( $old_file ) ) {
		return;
	}

	// Location.
	$location = 'everywhere';

	// Admin Roles.
	$roles = array();

	// Save Count.
	$save_count = 0;

	// Create post.
	$post_ID = wp_insert_post(
		array(
			'post_title'  => __( 'Custom PHP Functions', 'custom-codes' ),
			'post_type'   => 'custom-code',
			'post_status' => 'publish',
			'meta_input'  => array(
				'_codes_language'   => 'php',
				'_codes_location'   => $location,
				'_codes_adminroles' => $roles,
				'_codes_savecount'  => $save_count,
			),
		)
	);
	if ( ! is_wp_error( $post_ID ) ) {

		$new_file = CODES_FOLDER_DIR . "$post_ID-php-default.php";
		$wp_filesystem->move( $old_file, $new_file );

	}
}

/**
 * Save the old admin notes.
 */
function codes_import_admin_notes() {
	global $wp_filesystem;

	// Exit earlier if no file exists.
	$old_notes = get_option( 'cstm_cds_admin_notes', array() );
	if ( ! count( $old_notes ) ) {
		return;
	}

	// Location.
	$location = 'backend';

	// Admin Roles.
	$roles = array( 'administrator' );

	// Save Count.
	$save_count = 0;

	// Create post.
	$post_ID = wp_insert_post(
		array(
			'post_title'  => __( 'Admin Notes', 'custom-codes' ),
			'post_type'   => 'custom-code',
			'post_status' => 'private',
			'meta_input'  => array(
				'_codes_language'   => 'html',
				'_codes_location'   => $location,
				'_codes_adminroles' => $roles,
				'_codes_savecount'  => $save_count,
			),
		)
	);
	if ( ! is_wp_error( $post_ID ) ) {

		$content  = "<!--\n";
		$content .= __( 'Admin Notes', 'custom-codes' ) . ":\n\n";
		foreach ( $old_notes as $user_ID => $note ) {

			$user = get_user_by( 'id', $user_ID );

			$content .= "#$user_ID ($user->user_email):\n";
			$content .= "$note\n\n";

		}
		$content .= '-->';

		$wp_filesystem->put_contents( CODES_FOLDER_DIR . "$post_ID-html-head.html", $content );

	}
}


/**
 * Create posts for existing files (SCSS/CSS, Admin SCSS/CSS, JS, Admin JS, Admin PHP, Admin Notes).
 *
 * @param string $new_version New version number.
 * @param string $old_version Old version number.
 */
function codes_create_posts( $new_version, $old_version ) {

	if ( ! version_compare( $old_version, '2.0.0', '<' )
		|| count( get_posts( array( 'post_type' => 'custom-code' ) ) )
	) {
		return;
	}

	// Import Mixins.
	$public_mixin_id = codes_import_old_mixins( 'Public' );
	$admin_mixin_id  = codes_import_old_mixins( 'Admin' );

	// Import Styles.
	codes_import_old_styles( 'Public', $public_mixin_id );
	codes_import_old_styles( 'Admin', $admin_mixin_id );

	// Delete style options.
	delete_option( 'cstm_cds_style_mode' );
	delete_option( 'cstm_cds_css_save_count' );
	delete_option( 'cstm_cds_admin_css_save_count' );

	// Import Scripts.
	codes_import_old_scripts( 'Public' );
	codes_import_old_scripts( 'Admin' );

	// Delete script options.
	delete_option( 'cstm_cds_js_head_save_count' );
	delete_option( 'cstm_cds_js_bottom_save_count' );
	delete_option( 'cstm_cds_admin_js_head_save_count' );
	delete_option( 'cstm_cds_admin_js_bottom_save_count' );
	delete_option( 'cstm_cds_permission_roles' );

	// Import Admin PHP.
	codes_import_old_php();

	// Import Admin Notes.
	codes_import_admin_notes();
	delete_option( 'cstm_cds_admin_notes' );
}
add_action( 'codes_upgrade', 'codes_create_posts', 10, 2 );


/**
 * Import & remove old settings.
 *
 * @param string $new_version New version number.
 * @param string $old_version Old version number.
 */
function codes_import_old_settings( $new_version, $old_version ) {
	global $wp_roles;

	if ( ! version_compare( $old_version, '2.0.0', '<' ) || get_role( 'cstm_cds_admin' ) === null ) {
		return;
	}

	// Update media query direction update.
	update_option( '_codes_output_order', 'desktop-first' );

	// Media query options.
	$desktop  = '';
	$tablet_l = '@media (max-width: ' . get_option( 'cstm_cds_tablet_l', 1199 ) . 'px)';
	$tablet_p = '@media (max-width: ' . get_option( 'cstm_cds_tablet_p', 991 ) . 'px)';
	$phone_l  = '@media (max-width: ' . get_option( 'cstm_cds_phone_l', 767 ) . 'px)';
	$phone_p  = '@media (max-width: ' . get_option( 'cstm_cds_phone_p', 479 ) . 'px)';
	$retina   = '@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (-o-min-device-pixel-ratio: 3/2), only screen and (min--moz-device-pixel-ratio: 1.5), only screen and (min-device-pixel-ratio: 1.5)';

	// Update.
	update_option( '_codes_desktop', $desktop );
	update_option( '_codes_tablet_l', $tablet_l );
	update_option( '_codes_tablet_p', $tablet_p );
	update_option( '_codes_phone_l', $phone_l );
	update_option( '_codes_phone_p', $phone_p );
	update_option( '_codes_retina', $retina );

	// Delete old query numbers.
	delete_option( 'cstm_cds_tablet_l' );
	delete_option( 'cstm_cds_tablet_p' );
	delete_option( 'cstm_cds_phone_l' );
	delete_option( 'cstm_cds_phone_p' );

	// Store files option.
	$store = get_option( 'cstm_cds_store_files', '' ) === 'yes' ? true : false;
	update_option( '_codes_store', $store );
	delete_option( 'cstm_cds_store_files' );

	// User options.
	update_user_meta( get_current_user_id(), '_codes_fontsize', 14 );
	update_user_meta( get_current_user_id(), '_codes_indent', 'space-4' );

	$theme = get_option( 'cstm_cds_editor_theme', 'dark' ) !== 'dark' ? 'default' : 'dark';
	update_user_meta( get_current_user_id(), '_codes_theme', $theme );
	delete_option( 'cstm_cds_editor_theme' );

	// Deprecated option.
	delete_option( 'cstm_cds_admin_roles' );

	// Remove the old capability.
	foreach ( $wp_roles->roles as $role_name => $role_details ) {

		$role = get_role( $role_name );
		$role->remove_cap( 'cstm_cds_full_access' );

	}

	// Remove the old role.
	remove_role( 'cstm_cds_admin' );
}
add_action( 'codes_upgrade', 'codes_import_old_settings', 11, 2 );




// FOR AFTER 2.5.0 =======================================================.

/**
 * Dismiss AI Notice
 *
 * @since 2.5.0
 */
function codes_ai_dismiss_notice() {
	if ( isset( $_GET['codes_dismiss_ai_notice'] ) && is_admin() ) {
		check_admin_referer( 'codes_dismiss_notice' );
		update_option( 'codes_ai_notice_dismissed', 1 );
		wp_safe_redirect( remove_query_arg( 'codes_dismiss_ai_notice' ) );
		exit;
	}
}
add_action( 'admin_init', 'codes_ai_dismiss_notice' );


/**
 * AI Feature Notice
 *
 * @since 2.5.0
 */
function codes_ai_admin_notice() {
	if ( ( ! get_option( 'codes_ai_notice_dismissed' ) && ! get_option( '_codes_google_key' ) && ! get_option( '_codes_openai_key' ) ) || CODES_DEBUG ) {
		?>
		<style>
			.ai-gradient-button {
				display: inline-flex !important;
				align-items: center;
				gap: 5px;
				background: linear-gradient(135deg, #1e3c72 0%, #2173ff 50%, #1e3c72 100%) !important;
				background-size: 200% auto !important;
				cursor: pointer;
				transition: all 0.5s ease;
				box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
				color: #fff !important;
				border: none !important;
				padding-left: 15px !important;
				padding-right: 20px !important;
			}
			.ai-gradient-button:hover {
				background-position: right center !important;
			}
			.ai-gradient-button svg {
				width: 20px;
				height: 20px;
			}
		</style>
		<div class="notice notice-info is-dismissible">
			<p>
				<strong><?php esc_html_e( 'New in CodeKit: AI Assistant', 'custom-codes' ); ?></strong><br>
		<?php esc_html_e( 'Experience the power of AI in your coding workflow! Generate, optimize, and fix your code instantly with our new AI Assistant.', 'custom-codes' ); ?>
			</p>
			<p>
				<a href="<?php echo esc_url( admin_url( 'edit.php?post_type=custom-code&page=settings#ai-settings' ) ); ?>" class="button button-primary ai-gradient-button">
					<svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
						<path d="M12 2L14.35 8.65L21 11L14.35 13.35L12 20L9.65 13.35L3 11L9.65 8.65L12 2Z" fill="#fff" stroke="none"/>
					</svg>
		<?php esc_html_e( 'Start Using AI Assistant', 'custom-codes' ); ?>
				</a>
				<a href="<?php echo esc_url( wp_nonce_url( add_query_arg( 'codes_dismiss_ai_notice', '1' ), 'codes_dismiss_notice' ) ); ?>" style="margin-left: 10px; margin-top: 5px; display: inline-block; text-decoration: none; color: #72777c;"><?php esc_html_e( 'Dismiss', 'custom-codes' ); ?></a>
			</p>
		</div>
		<?php
	}
}
add_action( 'admin_notices', 'codes_ai_admin_notice' );