'1tb', 'num_users' => 2, 'payment_frequency' => 'monthly' ]; } $storage_space = sanitize_text_field($config_data['storage_space'] ?? '1tb'); $valid_storage = ['1tb','2tb','3tb','4tb','5tb','6tb','7tb','8tb','9tb','10tb','15tb','20tb']; if (!in_array($storage_space, $valid_storage, true)) { $storage_space = '1tb'; } $num_users = max(2, min(20, intval($config_data['num_users'] ?? 2))); $payment_frequency = sanitize_text_field($config_data['payment_frequency'] ?? 'monthly'); $valid_frequencies = ['monthly','semiannual','annual','biennial','triennial','quadrennial','quinquennial']; if (!in_array($payment_frequency, $valid_frequencies, true)) { $payment_frequency = 'monthly'; } return [ 'storage_space' => $storage_space, 'num_users' => $num_users, 'payment_frequency' => $payment_frequency ]; } } // Detecta posibles handles de script function banda_detect_script_handles() { global $wp_scripts; $possible_handles = [ 'simply-snippet-nextcloud-banda-dynamic-pricing', 'simply-code-nextcloud-banda-dynamic-pricing', 'nextcloud-banda-dynamic-pricing', 'banda-dynamic-pricing', 'simply-snippet-banda-pricing', 'simply-code-banda-pricing', 'simply-snippet-nextcloud-banda', 'simply-code-nextcloud-banda', 'pmpro-banda-pricing', 'banda-pricing-script' ]; $detected_handles = []; if (isset($wp_scripts->registered)) { foreach ($wp_scripts->registered as $handle => $script) { if (stripos($handle, 'banda') !== false || stripos($handle, 'nextcloud') !== false || stripos($handle, 'pricing') !== false || (stripos($handle, 'simply') !== false && stripos($handle, 'snippet') !== false)) { $detected_handles[] = $handle; } } } $all_handles = array_unique(array_merge($possible_handles, $detected_handles)); banda_theme_log('Script handles detection completed', [ 'possible_count' => count($possible_handles), 'detected_count' => count($detected_handles), 'total_handles' => count($all_handles), 'detected_handles' => array_slice($detected_handles, 0, 5) ]); return $all_handles; } // Función principal de localización mejorada - CORREGIDA function banda_localize_pricing_script_improved() { if (!function_exists('pmpro_getOption')) { banda_theme_log('PMPro functions not available, skipping localization'); return; } $checkout_page_id = pmpro_getOption('checkout_page_id'); $account_page_id = pmpro_getOption('account_page_id'); $is_relevant_page = ( is_page($checkout_page_id) || is_page($account_page_id) || !empty($_GET['level']) ); if (!$is_relevant_page) { banda_theme_log('Not on relevant page, skipping localization'); return; } $level_id = 0; if (!empty($_GET['level'])) { $level_id = (int)sanitize_text_field($_GET['level']); } elseif (!empty($_GET['pmpro_level'])) { $level_id = (int)sanitize_text_field($_GET['pmpro_level']); } elseif (function_exists('nextcloud_banda_get_current_level_id')) { $level_id = nextcloud_banda_get_current_level_id(); } $allowed_levels = function_exists('nextcloud_banda_get_config') ? nextcloud_banda_get_config('allowed_levels') : [2]; if (!in_array($level_id, $allowed_levels, true)) { banda_theme_log('Level not allowed for localization', [ 'level_id' => $level_id, 'allowed_levels' => $allowed_levels, ]); return; } $base_price = NEXTCLOUD_BANDA_BASE_PRICE; if ($level_id > 0) { $level = pmpro_getLevel($level_id); if ($level && !empty($level->initial_payment) && $level->initial_payment > 0) { $base_price = (float) $level->initial_payment; } } $current_storage = '1tb'; $current_users = 2; $current_frequency = 'monthly'; $has_previous_config = false; $used_space_tb = 0; $next_payment_date = null; $has_active_membership = false; $current_subscription = null; $current_price_paid = 0; $last_credit_value = 0; if (is_user_logged_in()) { $user_id = get_current_user_id(); if ( function_exists('nextcloud_banda_get_next_payment_info') && function_exists('nextcloud_banda_get_user_real_config_improved') ) { $user_levels = pmpro_getMembershipLevelsForUser($user_id); if (!empty($user_levels)) { foreach ($user_levels as $l) { if (in_array((int) $l->id, $allowed_levels, true)) { $cycle_info = nextcloud_banda_get_next_payment_info($user_id); if ($cycle_info && !empty($cycle_info['cycle_end']) && $cycle_info['cycle_end'] > time()) { $has_active_membership = true; break; } } } } if ($has_active_membership) { $level = pmpro_getMembershipLevelForUser($user_id); if ($level) { $real_config = nextcloud_banda_get_user_real_config_improved($user_id, $level); if (!empty($real_config) && $real_config['source'] !== 'defaults_no_active_membership') { $current_storage = sanitize_text_field($real_config['storage_space'] ?? '1tb'); $current_users = max(2, min(20, intval($real_config['num_users'] ?? 2))); $current_frequency = sanitize_text_field($real_config['payment_frequency'] ?? 'monthly'); $has_previous_config = true; $current_price_paid = !empty($real_config['current_cycle_amount']) ? (float) $real_config['current_cycle_amount'] : ((float) $level->initial_payment); $last_credit_value = !empty($real_config['last_proration_credit']) ? (float) $real_config['last_proration_credit'] : 0.0; } } if ($level) { $cycle_number = (int) ($level->cycle_number ?? 1); $cycle_period = (string) ($level->cycle_period ?? 'Month'); $derived_frequency = function_exists('nextcloud_banda_derive_frequency_from_cycle') ? nextcloud_banda_derive_frequency_from_cycle($cycle_number, $cycle_period) : 'monthly'; $cycle_label = function_exists('nextcloud_banda_map_cycle_label') ? nextcloud_banda_map_cycle_label($cycle_number, $cycle_period) : 'Mensal'; $current_subscription = [ 'storage_space' => $current_storage, 'num_users' => $current_users, 'payment_frequency' => $derived_frequency, 'cycle_label' => $cycle_label, 'cycle_number' => $cycle_number, 'cycle_period' => $cycle_period, 'final_amount' => !empty($level->initial_payment) ? (float) $level->initial_payment : 0, 'current_price_paid' => $current_price_paid, 'last_credit_value' => $last_credit_value, 'subscription_end_date' => (!empty($level->enddate) && $level->enddate !== '0000-00-00 00:00:00') ? $level->enddate : null, 'subscription_start_date' => !empty($level->startdate) ? $level->startdate : null, ]; } if (function_exists('nextcloud_banda_get_used_space_tb')) { $used_space_tb = nextcloud_banda_get_used_space_tb($user_id); } $cycle_info = nextcloud_banda_get_next_payment_info($user_id); if ($cycle_info && !empty($cycle_info['next_payment_date'])) { $next_payment_date = date('c', (int) $cycle_info['next_payment_date']); } } } } $configs_available = function_exists('nextcloud_banda_get_config'); $price_per_tb = $configs_available ? nextcloud_banda_get_config('price_per_tb') : 70.00; $price_per_user = $configs_available ? nextcloud_banda_get_config('price_per_additional_user') : 10.00; $base_users_included = $configs_available ? nextcloud_banda_get_config('base_users_included') : 2; $base_storage_tb = $configs_available ? nextcloud_banda_get_config('base_storage_included') : 1; $frequency_multipliers = $configs_available ? nextcloud_banda_get_config('frequency_multipliers') : [ 'monthly' => 1.0, 'semiannual' => 5.7, 'annual' => 10.8, 'biennial' => 20.4, 'triennial' => 28.8, 'quadrennial' => 36.0, 'quinquennial'=> 42.0, ]; $localization = [ 'level_id' => $level_id, 'base_price' => $base_price, 'currency_symbol' => 'R$', 'price_per_tb' => (float) $price_per_tb, 'price_per_user' => (float) $price_per_user, 'base_users_included' => (int) $base_users_included, 'base_storage_included' => (int) $base_storage_tb, 'current_storage' => $current_storage, 'current_users' => $current_users, 'current_frequency' => $current_frequency, 'has_previous_config' => (bool) $has_previous_config, 'hasActiveMembership' => (bool) $has_active_membership, 'current_subscription_data'=> $current_subscription, 'used_space_tb' => (float) $used_space_tb, 'next_payment_date' => $next_payment_date, 'frequency_multipliers' => $frequency_multipliers, 'frequency_days' => [ 'monthly' => 30, 'semiannual' => 182, 'annual' => 365, 'biennial' => 730, 'triennial' => 1095, 'quadrennial' => 1460, 'quinquennial'=> 1825, ], 'debug' => defined('WP_DEBUG') && WP_DEBUG, 'version' => defined('NEXTCLOUD_BANDA_PLUGIN_VERSION') ? NEXTCLOUD_BANDA_PLUGIN_VERSION : '2.8.0', 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('nextcloud_banda_proration'), 'base_price_constant' => NEXTCLOUD_BANDA_BASE_PRICE, ]; $json = wp_json_encode($localization, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); if ($json === false) { banda_theme_log('Failed to json_encode localization data'); return; } $inline_script = "window.nextcloud_banda_pricing = {$json};"; $handles = banda_detect_script_handles(); $localized = false; foreach ($handles as $handle) { if (wp_script_is($handle, 'registered')) { wp_add_inline_script($handle, $inline_script, 'before'); banda_theme_log("Inline localization injected before handle: {$handle}"); $localized = true; break; } } // Fallbacks si no se pudo inyectar 'before' en ningún handle if (!$localized) { // Fallback 1: wp_head temprano add_action('wp_head', function() use ($inline_script) { echo "\n"; }, 1); // Fallback 2: wp_footer como backup add_action('wp_footer', function() use ($inline_script) { echo "\n"; }, 5); banda_theme_log('Localization injected via inline head/footer fallback', []); } else { banda_theme_log('Localization injected via wp_add_inline_script(before)', ['handles_checked' => count($handles)]); } banda_theme_log('Localization process completed', [ 'method' => $localized ? 'inline_before_handle' : 'inline_head_footer_fallback', 'handles_checked' => count($handles), 'base_price' => $base_price, 'base_price_constant' => NEXTCLOUD_BANDA_BASE_PRICE, 'has_subscription_data' => !empty($current_subscription_data) ]); } // Hooks para ejecutar la localización - MEJORADOS add_action('wp_enqueue_scripts', 'banda_enqueue_banda_assets', 20); function banda_enqueue_banda_assets() { wp_enqueue_style('dashicons'); banda_localize_pricing_script_improved(); } // Fallback adicional para asegurar ejecución add_action('wp_head', function() { if (!did_action('banda_localize_pricing_script_improved')) { banda_localize_pricing_script_improved(); } }, 999); // Función de logging simplificada function banda_theme_log($message, $context = []) { if (function_exists('nextcloud_banda_log_info')) { nextcloud_banda_log_info('[Theme Scripts] ' . $message, $context); } elseif (defined('WP_DEBUG') && WP_DEBUG) { $log_message = '[Banda Theme] ' . $message; if (!empty($context)) { $log_message .= ' | ' . wp_json_encode($context, JSON_UNESCAPED_UNICODE); } error_log($log_message); } } // Enqueue de scripts personalizados adicionales function enqueue_custom_contact_form_scripts() { wp_enqueue_script('custom-contact-form', get_template_directory_uri() . '/js/custom-contact-form.js', array('jquery'), '1.0', true); wp_localize_script('custom-contact-form', 'customContactForm', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('custom_contact_form_nonce') )); } add_action('wp_enqueue_scripts', 'enqueue_custom_contact_form_scripts'); // Log de inicialización banda_theme_log('Theme Scripts loaded successfully - SYNCHRONIZED VERSION', [ 'version' => '2.8.0', 'base_price_constant' => NEXTCLOUD_BANDA_BASE_PRICE, 'functions_available' => [ 'normalize_banda_config' => function_exists('normalize_banda_config'), 'pmpro_functions' => function_exists('pmpro_getOption'), 'nextcloud_banda_functions' => function_exists('nextcloud_banda_get_config') ] ]);