admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'c7dbt_setup_nonce' ), 'dashboard' => admin_url( 'admin.php?page=c7dbt' ), 'version' => C7DBT_VERSION, 'slug' => C7DBT_Helpers::collection_slug(), ) ); } /** * Capability + nonce gate for wizard AJAX. */ private function assert_wizard_request() { check_ajax_referer( 'c7dbt_setup_nonce', 'nonce' ); if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => 'forbidden' ), 403 ); } } /** * Shared Quick Fix used by wizard AJAX. * * @param string $slug Collection slug. * @return array */ public static function run_quick_fix( $slug = '' ) { $slug = C7DBT_Helpers::normalize_collection_slug( $slug ); if ( ! $slug ) { $slug = C7DBT_Helpers::collection_slug(); } C7DBT_Settings::update( array( 'default_collection_slug' => $slug, 'redirect_collection_root' => 1, 'update_continue_shopping' => 1, ) ); $r1 = ( new C7DBT_Shop_Routes() )->apply(); $r2 = ( new C7DBT_Menu_Scanner() )->fix_all(); return array( 'messages' => array_merge( isset( $r1['messages'] ) ? $r1['messages'] : array(), isset( $r2['messages'] ) ? $r2['messages'] : array() ), 'health' => ( new C7DBT_Health() )->report(), 'slug' => $slug, 'preview' => home_url( '/collection/' . $slug . '/' ), ); } /** * Preset cards for the branding step (safe public fields only). * * @return array */ public static function preset_cards() { $cards = array(); foreach ( C7DBT_Presets::all() as $key => $preset ) { $brand = isset( $preset['brand'] ) && is_array( $preset['brand'] ) ? $preset['brand'] : array(); $cards[] = array( 'key' => $key, 'label' => isset( $preset['label'] ) ? $preset['label'] : $key, 'description' => isset( $preset['description'] ) ? $preset['description'] : '', 'swatch' => ! empty( $brand['primary_button_bg'] ) ? $brand['primary_button_bg'] : '#5c1a1b', 'text' => ! empty( $brand['primary_button_text_color'] ) ? $brand['primary_button_text_color'] : '#ffffff', ); } return $cards; } /** * AJAX: health scan. */ public function ajax_scan() { $this->assert_wizard_request(); $health = ( new C7DBT_Health() )->report(); $slug = C7DBT_Helpers::collection_slug(); wp_send_json_success( array( 'health' => $health, 'recommended' => C7DBT_Helpers::recommend_package_id( $health ), 'packages' => C7DBT_Helpers::service_packages(), 'presets' => self::preset_cards(), 'slug' => $slug, 'preview' => home_url( '/collection/' . $slug . '/' ), 'guideUrl' => C7DBT_Helpers::guide_url(), 'dashboard' => admin_url( 'admin.php?page=c7dbt' ), ) ); } /** * AJAX: Quick Fix. */ public function ajax_quick_fix() { $this->assert_wizard_request(); // phpcs:ignore WordPress.Security.NonceVerification.Missing $slug = isset( $_POST['slug'] ) ? C7DBT_Helpers::normalize_collection_slug( sanitize_text_field( wp_unslash( $_POST['slug'] ) ) ) : ''; $result = self::run_quick_fix( $slug ); $result['recommended'] = C7DBT_Helpers::recommend_package_id( $result['health'] ); $result['packages'] = C7DBT_Helpers::service_packages(); $result['presets'] = self::preset_cards(); wp_send_json_success( $result ); } /** * AJAX: apply brand preset. */ public function ajax_apply_brand() { $this->assert_wizard_request(); // phpcs:ignore WordPress.Security.NonceVerification.Missing $key = isset( $_POST['preset'] ) ? sanitize_key( wp_unslash( $_POST['preset'] ) ) : ''; if ( ! $key || ! C7DBT_Presets::apply( $key ) ) { wp_send_json_error( array( 'message' => 'invalid_preset' ), 400 ); } $health = ( new C7DBT_Health() )->report(); wp_send_json_success( array( 'preset' => $key, 'health' => $health, 'recommended' => C7DBT_Helpers::recommend_package_id( $health ), ) ); } /** * AJAX: finish wizard. */ public function ajax_finish() { $this->assert_wizard_request(); // phpcs:ignore WordPress.Security.NonceVerification.Missing $apply_fixes = ! empty( $_POST['apply_quick_fixes'] ); // phpcs:ignore WordPress.Security.NonceVerification.Missing $slug = isset( $_POST['slug'] ) ? C7DBT_Helpers::normalize_collection_slug( sanitize_text_field( wp_unslash( $_POST['slug'] ) ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing $preset = isset( $_POST['preset'] ) ? sanitize_key( wp_unslash( $_POST['preset'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing $frontend_credit = ! empty( $_POST['frontend_credit'] ) ? 1 : 0; if ( $apply_fixes ) { self::run_quick_fix( $slug ); } if ( $preset ) { C7DBT_Presets::apply( $preset ); } C7DBT_Settings::update( array( 'frontend_credit' => $frontend_credit ) ); update_option( self::COMPLETED_KEY, 1, false ); delete_transient( self::REDIRECT_TRANSIENT ); wp_send_json_success( array( 'redirect' => admin_url( 'admin.php?page=c7dbt' ), ) ); } /** * Render inside normal plugin layout. */ public function render_page() { if ( ! current_user_can( 'manage_options' ) ) { return; } delete_transient( self::REDIRECT_TRANSIENT ); $page_title = __( 'Setup', '7labs-debug-branding-for-commerce7' ); $current = self::PAGE_SLUG; $settings = C7DBT_Settings::get(); $slug = C7DBT_Helpers::collection_slug(); $dashboard = admin_url( 'admin.php?page=c7dbt' ); $presets = self::preset_cards(); // Ensure admin CSS loads (setup enqueue depends on c7dbt-admin handle). wp_enqueue_style( 'c7dbt-admin', C7DBT_URL . 'admin/css/admin.css', array( 'wp-color-picker' ), C7DBT_VERSION ); include C7DBT_PATH . 'admin/views/layout-header.php'; include C7DBT_PATH . 'admin/views/setup.php'; include C7DBT_PATH . 'admin/views/layout-footer.php'; } }