logger = $logger; $this->price_updater = $price_updater; // Add admin menu. add_action( 'admin_menu', array( $this, 'add_admin_menu' ) ); // Register settings. add_action( 'admin_init', array( $this, 'register_settings' ) ); // Handle OAuth callback. add_action( 'admin_init', array( $this, 'handle_oauth_callback' ) ); // Handle AJAX requests. add_action( 'wp_ajax_informatiq_sp_manual_sync', array( $this, 'handle_manual_sync' ) ); add_action( 'wp_ajax_informatiq_sp_test_connection', array( $this, 'handle_test_connection' ) ); add_action( 'wp_ajax_informatiq_sp_revoke_auth', array( $this, 'handle_revoke_auth' ) ); // Enqueue admin assets. add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_assets' ) ); } /** * Add admin menu under WooCommerce. */ public function add_admin_menu() { add_submenu_page( 'woocommerce', __( 'Smart Pricing', 'informatiq-smart-pricing' ), __( 'Smart Pricing', 'informatiq-smart-pricing' ), 'manage_woocommerce', 'informatiq-smart-pricing', array( $this, 'render_admin_page' ) ); } /** * Register plugin settings. */ public function register_settings() { // Register settings. register_setting( 'informatiq_sp_settings', 'informatiq_sp_merchant_id' ); register_setting( 'informatiq_sp_settings', 'informatiq_sp_client_id' ); register_setting( 'informatiq_sp_settings', 'informatiq_sp_client_secret' ); register_setting( 'informatiq_sp_settings', 'informatiq_sp_minimum_margin' ); register_setting( 'informatiq_sp_settings', 'informatiq_sp_auto_update_enabled' ); register_setting( 'informatiq_sp_settings', 'informatiq_sp_update_frequency' ); // Add settings sections. add_settings_section( 'informatiq_sp_google_settings', __( 'Google Merchant Center Settings', 'informatiq-smart-pricing' ), array( $this, 'render_google_settings_section' ), 'informatiq_sp_settings' ); add_settings_section( 'informatiq_sp_pricing_settings', __( 'Pricing Settings', 'informatiq-smart-pricing' ), array( $this, 'render_pricing_settings_section' ), 'informatiq_sp_settings' ); add_settings_section( 'informatiq_sp_automation_settings', __( 'Automation Settings', 'informatiq-smart-pricing' ), array( $this, 'render_automation_settings_section' ), 'informatiq_sp_settings' ); // Add settings fields. add_settings_field( 'informatiq_sp_merchant_id', __( 'Google Merchant ID', 'informatiq-smart-pricing' ), array( $this, 'render_merchant_id_field' ), 'informatiq_sp_settings', 'informatiq_sp_google_settings' ); add_settings_field( 'informatiq_sp_oauth_credentials', __( 'OAuth 2.0 Credentials', 'informatiq-smart-pricing' ), array( $this, 'render_oauth_credentials_field' ), 'informatiq_sp_settings', 'informatiq_sp_google_settings' ); add_settings_field( 'informatiq_sp_authorization', __( 'Google Authorization', 'informatiq-smart-pricing' ), array( $this, 'render_authorization_field' ), 'informatiq_sp_settings', 'informatiq_sp_google_settings' ); add_settings_field( 'informatiq_sp_minimum_margin', __( 'Minimum Margin (%)', 'informatiq-smart-pricing' ), array( $this, 'render_minimum_margin_field' ), 'informatiq_sp_settings', 'informatiq_sp_pricing_settings' ); add_settings_field( 'informatiq_sp_auto_update_enabled', __( 'Enable Automatic Updates', 'informatiq-smart-pricing' ), array( $this, 'render_auto_update_field' ), 'informatiq_sp_settings', 'informatiq_sp_automation_settings' ); add_settings_field( 'informatiq_sp_update_frequency', __( 'Update Frequency', 'informatiq-smart-pricing' ), array( $this, 'render_update_frequency_field' ), 'informatiq_sp_settings', 'informatiq_sp_automation_settings' ); } /** * Handle OAuth callback from Google. */ public function handle_oauth_callback() { // Check if this is an OAuth callback. if ( ! isset( $_GET['informatiq_sp_oauth'] ) || $_GET['informatiq_sp_oauth'] !== 'callback' ) { return; } // Verify state parameter. $state = isset( $_GET['state'] ) ? sanitize_text_field( $_GET['state'] ) : ''; $saved_state = get_transient( 'informatiq_sp_oauth_state' ); if ( empty( $state ) || $state !== $saved_state ) { add_settings_error( 'informatiq_sp_messages', 'informatiq_sp_oauth_error', __( 'OAuth state mismatch. Please try again.', 'informatiq-smart-pricing' ), 'error' ); return; } delete_transient( 'informatiq_sp_oauth_state' ); // Check for errors. if ( isset( $_GET['error'] ) ) { $error = sanitize_text_field( $_GET['error'] ); $error_desc = isset( $_GET['error_description'] ) ? sanitize_text_field( $_GET['error_description'] ) : $error; add_settings_error( 'informatiq_sp_messages', 'informatiq_sp_oauth_error', sprintf( __( 'Authorization failed: %s', 'informatiq-smart-pricing' ), $error_desc ), 'error' ); return; } // Get authorization code. $code = isset( $_GET['code'] ) ? sanitize_text_field( $_GET['code'] ) : ''; if ( empty( $code ) ) { add_settings_error( 'informatiq_sp_messages', 'informatiq_sp_oauth_error', __( 'No authorization code received.', 'informatiq-smart-pricing' ), 'error' ); return; } // Exchange code for tokens. $client_id = get_option( 'informatiq_sp_client_id' ); $client_secret = get_option( 'informatiq_sp_client_secret' ); $redirect_uri = $this->get_oauth_redirect_uri(); try { $tokens = Informatiq_SP_Google_API::exchange_code_for_tokens( $code, $client_id, $client_secret, $redirect_uri ); // Save refresh token. update_option( 'informatiq_sp_refresh_token', $tokens['refresh_token'] ); $this->logger->info( 'Google OAuth authorization successful' ); // Redirect to settings page with success message. wp_redirect( admin_url( 'admin.php?page=informatiq-smart-pricing&oauth=success' ) ); exit; } catch ( Exception $e ) { $this->logger->error( 'OAuth token exchange failed: ' . $e->getMessage() ); add_settings_error( 'informatiq_sp_messages', 'informatiq_sp_oauth_error', sprintf( __( 'Token exchange failed: %s', 'informatiq-smart-pricing' ), $e->getMessage() ), 'error' ); } } /** * Get OAuth redirect URI. * * @return string Redirect URI. */ private function get_oauth_redirect_uri() { return admin_url( 'admin.php?page=informatiq-smart-pricing&informatiq_sp_oauth=callback' ); } /** * Check if plugin is authorized. * * @return bool True if authorized. */ private function is_authorized() { return ! empty( get_option( 'informatiq_sp_refresh_token' ) ); } /** * Render admin page. */ public function render_admin_page() { if ( ! current_user_can( 'manage_woocommerce' ) ) { return; } // Check for OAuth success message. if ( isset( $_GET['oauth'] ) && $_GET['oauth'] === 'success' ) { add_settings_error( 'informatiq_sp_messages', 'informatiq_sp_message', __( 'Google authorization successful!', 'informatiq-smart-pricing' ), 'success' ); } // Check if form was submitted. if ( isset( $_GET['settings-updated'] ) ) { // Update cron schedule if frequency changed. $frequency = get_option( 'informatiq_sp_update_frequency', 'daily' ); Informatiq_SP_Scheduler::reschedule( $frequency ); add_settings_error( 'informatiq_sp_messages', 'informatiq_sp_message', __( 'Settings saved successfully.', 'informatiq-smart-pricing' ), 'success' ); } ?>
is_authorized() ) : ?>
' . esc_html__( 'Configure pricing rules and safeguards.', 'informatiq-smart-pricing' ) . '
'; } /** * Render automation settings section description. */ public function render_automation_settings_section() { echo '' . esc_html__( 'Configure automated price updates.', 'informatiq-smart-pricing' ) . '
'; } /** * Render merchant ID field. */ public function render_merchant_id_field() { $value = get_option( 'informatiq_sp_merchant_id' ); ?>
' . esc_html( $this->get_oauth_redirect_uri() ) . '' ); ?>
| created_at ) ) ); ?> | product_name ); ?> | old_price ) ); ?> | new_price ) ); ?> | competitor_price ) ); ?> |