handle_upload() ) { return; } $this->determine_path(); if ( ! $this->unzip_file() ) { $this->clean_up(); return; } $this->parse_options(); $this->clean_up(); } /** * Handle the file upload * * @return boolean */ private function handle_upload() { $overrides = array( 'mimes' => array( 'zip' => 'application/zip' ) ); // Explicitly allow zip in multisite. $this->file = wp_handle_upload( $_FILES['settings_import_file'], $overrides ); if ( is_wp_error( $this->file ) ) { $this->msg = __( 'Settings could not be imported:', 'wordpress-seo' ) . ' ' . $this->file->get_error_message(); return false; } if ( is_array( $this->file ) && isset( $this->file['error'] ) ) { $this->msg = __( 'Settings could not be imported:', 'wordpress-seo' ) . ' ' . $this->file['error']; return false; } if ( ! isset( $this->file['file'] ) ) { $this->msg = __( 'Settings could not be imported:', 'wordpress-seo' ) . ' ' . __( 'Upload failed.', 'wordpress-seo' ); return false; } return true; } /** * Determine the path to the import file */ private function determine_path() { $this->upload_dir = wp_upload_dir(); if ( ! defined( 'DIRECTORY_SEPARATOR' ) ) { define( 'DIRECTORY_SEPARATOR', '/' ); } $this->path = $this->upload_dir['basedir'] . DIRECTORY_SEPARATOR . 'wpseo-import' . DIRECTORY_SEPARATOR; if ( ! isset( $GLOBALS['wp_filesystem'] ) || ! is_object( $GLOBALS['wp_filesystem'] ) ) { WP_Filesystem(); } } /** * Unzip the file * * @return boolean */ private function unzip_file() { $unzipped = unzip_file( $this->file['file'], $this->path ); $msg_base = __( 'Settings could not be imported:', 'wordpress-seo' ) . ' '; if ( is_wp_error( $unzipped ) ) { /* translators: %s expands to an error message. */ $this->msg = $msg_base . sprintf( __( 'Unzipping failed with error "%s".', 'wordpress-seo' ), $unzipped->get_error_message() ); return false; } $this->filename = $this->path . 'settings.ini'; if ( ! is_file( $this->filename ) || ! is_readable( $this->filename ) ) { $this->msg = $msg_base . __( 'Unzipping failed - file settings.ini not found.', 'wordpress-seo' ); return false; } return true; } /** * Parse the option file */ private function parse_options() { $options = parse_ini_file( $this->filename, true ); if ( is_array( $options ) && $options !== array() ) { if ( isset( $options['wpseo']['version'] ) && $options['wpseo']['version'] !== '' ) { $this->old_wpseo_version = $options['wpseo']['version']; } foreach ( $options as $name => $opt_group ) { $this->parse_option_group( $name, $opt_group, $options ); } $this->msg = __( 'Settings successfully imported.', 'wordpress-seo' ); $this->success = true; } else { $this->msg = __( 'Settings could not be imported:', 'wordpress-seo' ) . ' ' . __( 'No settings found in file.', 'wordpress-seo' ); } } /** * Parse the option group and import it * * @param string $name Name string. * @param array $opt_group Option group data. * @param array $options Options data. */ private function parse_option_group( $name, $opt_group, $options ) { if ( $name === 'wpseo_taxonomy_meta' ) { $opt_group = json_decode( urldecode( $opt_group['wpseo_taxonomy_meta'] ), true ); } // Make sure that the imported options are cleaned/converted on import. $option_instance = WPSEO_Options::get_option_instance( $name ); if ( is_object( $option_instance ) && method_exists( $option_instance, 'import' ) ) { $option_instance->import( $opt_group, $this->old_wpseo_version, $options ); } elseif ( WP_DEBUG === true || ( defined( 'WPSEO_DEBUG' ) && WPSEO_DEBUG === true ) ) { /* translators: %s expands to the name of an outdated setting. */ $this->msg = sprintf( __( 'Setting "%s" is no longer used and has been discarded.', 'wordpress-seo' ), $name ); } } /** * Remove the files */ private function clean_up() { if ( file_exists( $this->filename ) && is_writable( $this->filename ) ) { unlink( $this->filename ); } if ( ! empty( $this->file['file'] ) && file_exists( $this->file['file'] ) && is_writable( $this->file['file'] ) ) { unlink( $this->file['file'] ); } if ( file_exists( $this->path ) && is_writable( $this->path ) ) { $wp_file = new WP_Filesystem_Direct( $this->path ); $wp_file->rmdir( $this->path, true ); } } }