geno/wp-content/plugins/ti-woocommerce-wishlist/includes/export.class.php
2024-02-01 11:54:18 +00:00

222 lines
5.7 KiB
PHP

<?php
/**
* Export/Import plugin settings class
*
* @since 1.17.0
* @package TInvWishlist
*/
defined( 'ABSPATH' ) || exit;
/**
* Class TInvWL_Export
*
* This class handles the exporting and importing of plugin settings.
*/
class TInvWL_Export {
/**
* Plugin name.
*
* @var string
*/
private string $_name;
/**
* Plugin version.
*
* @var string
*/
private string $_version;
/**
* Constructor.
*
* @param string $plugin_name Plugin name.
* @param string $version Plugin version.
*/
public function __construct( string $plugin_name, string $version ) {
$this->_name = $plugin_name;
$this->_version = $version;
$this->define_hooks();
}
/**
* Define hooks.
*/
private function define_hooks(): void {
add_action( 'admin_action_tinvwl_export_settings', [ $this, 'export_settings' ] );
add_action( 'admin_action_tinvwl_import_settings', [ $this, 'import_settings' ] );
if ( isset( $_REQUEST['error'] ) && isset( $_REQUEST['page'] ) && $_REQUEST['page'] === 'tinvwl-export-import-settings' ) {
add_action( 'admin_notices', [ $this, 'show_error' ] );
}
}
/**
* Show error on the current page.
*/
public function show_error(): void {
printf(
'<div class="notice notice-error"><p><strong>%s</strong></p></div>',
sanitize_text_field( $_REQUEST['error'] )
);
}
/**
* Get sanitized blog name.
*
* @return string
*/
private function blog_name(): string {
$name = get_bloginfo( 'name' );
if ( empty( $name ) ) {
$name = wp_parse_url( home_url(), PHP_URL_HOST );
$port = wp_parse_url( home_url(), PHP_URL_PORT );
if ( $port ) {
$name .= ':' . $port;
}
}
$name = preg_replace( '/[^A-Za-z0-9 ]/', '', $name );
$name = preg_replace( '/\s+/', ' ', $name );
$name = str_replace( ' ', '-', $name );
return $name;
}
/**
* Get all plugin settings.
*
* @return array|bool
*/
public function get_settings(): array {
$dir = TINVWL_PATH . 'admin/settings/';
if ( ! file_exists( $dir ) || ! is_dir( $dir ) ) {
return false;
}
$files = scandir( $dir );
$ids = array();
foreach ( $files as $value ) {
if ( preg_match( '/\.class\.php$/i', $value ) ) {
$file = preg_replace( '/\.class\.php$/i', '', $value );
$class = 'TInvWL_Admin_Settings_' . ucfirst( $file );
$options = $class::instance( $this->_name, $this->_version );
if ( method_exists( $options, 'constructor_data' ) && __FUNCTION__ != 'constructor_data' ) {
foreach ( $options->constructor_data() as $data ) {
$ids[] = $data['id'];
}
}
}
}
$ids = array_values( array_diff( $ids, [ 'save_buttons' ] ) );
$settings = array();
foreach ( $ids as $id ) {
$settings[ 'tinvwl-' . $id ] = get_option( 'tinvwl-' . $id );
}
return $settings;
}
/**
* Allow upload JSON extension.
*
* @param array $mimes
*
* @return array
*/
public function json_mime_type( array $mimes ): array {
$mimes['json'] = 'application/json';
return $mimes;
}
/**
* Handle import settings upload and updating database.
*/
public function import_settings() {
$nonce_value = $_REQUEST['tinvwl_import_nonce'] ?? '';
if ( ! wp_verify_nonce( $nonce_value, 'tinvwl_import' ) || ! in_array( 'administrator', (array) wp_get_current_user()->roles ) ) {
$this->exitWithRedirect( __( 'There was an error importing your settings, please try again.', 'ti-woocommerce-wishlist' ) );
}
$settings_json = '';
if ( isset( $_FILES['settings-file'] ) && $_FILES['settings-file']['error'] === 0 ) {
if ( ! function_exists( 'wp_handle_upload' ) ) {
require_once ABSPATH . 'wp-admin/includes/file.php';
}
$uploadedfile = $_FILES['settings-file'];
$upload_overrides = array(
'test_form' => false,
'mimes' => array( 'json' => 'application/json' ),
);
add_filter( 'upload_mimes', array( $this, 'json_mime_type' ) );
$movefile = wp_handle_upload( $uploadedfile, $upload_overrides );
remove_filter( 'upload_mimes', array( $this, 'json_mime_type' ) );
if ( $movefile && ! isset( $movefile['error'] ) ) {
$settings_json = file_get_contents( $movefile['file'] );
unlink( $movefile['file'] );
} else {
$this->exitWithRedirect( $movefile['error'] );
}
} elseif ( ! empty( trim( stripslashes( $_POST['settings-json'] ) ) ) ) {
$settings_json = trim( stripslashes( $_POST['settings-json'] ) );
} else {
$this->exitWithRedirect( __( 'Please upload the TI WooCommerce Wishlist setting file or copy the content.', 'ti-woocommerce-wishlist' ) );
}
$settings = json_decode( $settings_json, true );
if ( empty( $settings ) ) {
$this->exitWithRedirect( __( 'The settings JSON is not valid.', 'ti-woocommerce-wishlist' ) );
}
foreach ( $settings as $key => $value ) {
update_option( $key, $value );
}
exit( wp_redirect( admin_url( 'admin.php?page=tinvwl' ) ) );
}
private function exitWithRedirect( $errorMessage ) {
exit(
wp_redirect(
admin_url(
'admin.php?page=tinvwl-export-import-settings&error=' .
rawurlencode( $errorMessage )
)
)
);
}
/**
* Handle settings export in a JSON file.
*/
public function export_settings() {
$nonce_value = $_REQUEST['tinvwl_import_nonce'] ?? '';
if ( ! wp_verify_nonce( $nonce_value, 'tinvwl_import' ) || ! in_array( 'administrator', (array) wp_get_current_user()->roles ) ) {
$this->exitWithRedirect( __( 'There was an error exporting your settings, please try again.', 'ti-woocommerce-wishlist' ) );
}
header( 'Content-Type: application/json' );
$name = urlencode( $this->blog_name() );
header( "Content-Disposition: attachment; filename=ti_woocommerce_wishlist_settings-$name.json" );
header( 'Pragma: no-cache' );
$settings = $this->get_settings();
echo json_encode( $settings );
exit;
}
}