diff --git a/README.md b/README.md index 4693d88..2c91cca 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,3 @@ -# Wheel of Fortune Plugin - -Test posodobitve za preverjanje Gitea workflow. - # Wheel of Fortune - WordPress Plugin Vtičnik "Kolo Sreče" (Wheel of Fortune) omogoča uporabnikom vrtenje kolesa za nagrade. Povezan je z WooCommerce za dodeljevanje spinov ob nakupu izdelkov. diff --git a/admin/edit-wheel-page.php b/admin/edit-wheel-page.php index 7ae67c3..8df0bac 100644 --- a/admin/edit-wheel-page.php +++ b/admin/edit-wheel-page.php @@ -20,6 +20,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { $discount_value = isset($_POST['prize_discount_value']) ? floatval($_POST['prize_discount_value']) : 0; $email_subject = isset($_POST['prize_email_subject']) ? sanitize_text_field($_POST['prize_email_subject']) : ''; $email_template = isset($_POST['prize_email_template']) ? wp_kses_post($_POST['prize_email_template']) : ''; + $is_try_again = isset($_POST['prize_is_try_again']) ? 1 : 0; if (!empty($name) && $wheel_id > 0) { $result = $wpdb->insert( @@ -35,8 +36,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { 'discount_value' => $discount_value, 'email_subject' => $email_subject, 'email_template' => $email_template, + 'is_try_again' => $is_try_again ], - ['%d', '%s', '%s', '%f', '%d', '%s', '%d', '%f', '%s', '%s'] + ['%d', '%s', '%s', '%f', '%d', '%s', '%d', '%f', '%s', '%s', '%d'] ); if ($result !== false) { @@ -62,6 +64,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { $discount_value = isset($_POST['prize_discount_value']) ? floatval($_POST['prize_discount_value']) : 0; $email_subject = isset($_POST['prize_email_subject']) ? sanitize_text_field($_POST['prize_email_subject']) : ''; $email_template = isset($_POST['prize_email_template']) ? wp_kses_post($_POST['prize_email_template']) : ''; + $is_try_again = isset($_POST['prize_is_try_again']) ? 1 : 0; if (!empty($name) && $prize_id > 0 && $wheel_id > 0) { $result = $wpdb->update( @@ -77,9 +80,10 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { 'discount_value' => $discount_value, 'email_subject' => $email_subject, 'email_template' => $email_template, + 'is_try_again' => $is_try_again ], ['id' => $prize_id], - ['%d', '%s', '%s', '%f', '%d', '%s', '%d', '%f', '%s', '%s'], + ['%d', '%s', '%s', '%f', '%d', '%s', '%d', '%f', '%s', '%s', '%d'], ['%d'] ); @@ -193,29 +197,6 @@ if ( } } -if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'update_wheel_settings') { - if (check_admin_referer('wheel_edit_settings_nonce')) { - global $wpdb; - $wheels_table = $wpdb->prefix . 'wof_wheels'; - - $wheel_id = isset($_POST['wheel_id']) ? intval($_POST['wheel_id']) : 0; - $has_daily_spin = isset($_POST['has_daily_spin']) ? 1 : 0; - - if ($wheel_id > 0) { - $wpdb->update( - $wheels_table, - ['has_daily_spin' => $has_daily_spin], - ['id' => $wheel_id], - ['%d'], - ['%d'] - ); - echo '

' . __('Wheel settings updated!', 'wheel-of-fortune') . '

'; - // Osvežimo podatke o kolesu po shranjevanju - $wheel = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wheels_table WHERE id = %d", $wheel_id), ARRAY_A); - } - } -} - global $wpdb; $wheels_table = $wpdb->prefix . 'wof_wheels'; $prizes_table = $wpdb->prefix . 'wheel_prizes'; @@ -254,26 +235,15 @@ if (class_exists('WooCommerce')) {
-
-

-
- - - - - - - - -
- -

-
-

-
+ +
+

: + + + +

@@ -399,12 +369,12 @@ if (class_exists('WooCommerce')) { - - + +

{user_name}, {prize_name}, etc.

@@ -463,4 +433,41 @@ jQuery(document).ready(function($) { }); }); }); + + + \ No newline at end of file diff --git a/admin/js/admin.js b/admin/js/admin.js index 11b8fb3..8bf5494 100644 --- a/admin/js/admin.js +++ b/admin/js/admin.js @@ -65,13 +65,13 @@ jQuery(document).ready(function($) { $('#edit-prize-name').val(prize.name); $('#edit-prize-description').val(prize.description); $('#edit-prize-probability').val(prize.probability); - $('#edit-prize-daily-spin-probability').val(prize.daily_spin_probability); $('#edit-prize-is-active').prop('checked', parseInt(prize.is_active, 10)); $('#edit-prize-redemption-code').val(prize.redemption_code); $('#edit-prize-is-discount').prop('checked', parseInt(prize.is_discount, 10)); $('#edit-prize-discount-value').val(prize.discount_value); $('#edit-prize-email-subject').val(prize.email_subject); $('#edit-prize-email-template').val(prize.email_template); + $('#edit-prize-is-try-again').prop('checked', parseInt(prize.is_try_again, 10)); modal.show(); } else { @@ -95,13 +95,13 @@ jQuery(document).ready(function($) { name: $('#edit-prize-name').val(), description: $('#edit-prize-description').val(), probability: $('#edit-prize-probability').val(), - daily_spin_probability: $('#edit-prize-daily-spin-probability').val(), is_active: $('#edit-prize-is-active').is(':checked') ? 1 : 0, redemption_code: $('#edit-prize-redemption-code').val(), is_discount: $('#edit-prize-is-discount').is(':checked') ? 1 : 0, discount_value: $('#edit-prize-discount-value').val(), email_subject: $('#edit-prize-email-subject').val(), email_template: $('#edit-prize-email-template').val(), + is_try_again: $('#edit-prize-is-try-again').is(':checked') ? 1 : 0, }; // Debug: preveri wheel_id diff --git a/admin/partials/prize-form-fields.php b/admin/partials/prize-form-fields.php index 20de789..dbf8335 100644 --- a/admin/partials/prize-form-fields.php +++ b/admin/partials/prize-form-fields.php @@ -13,19 +13,12 @@ if (!defined('ABSPATH')) exit; - +

- - - - -

- - @@ -73,4 +66,11 @@ if (!defined('ABSPATH')) exit;

+ + + + + +

+ \ No newline at end of file diff --git a/admin/settings-page.php b/admin/settings-page.php index 00ba747..31b5c8c 100644 --- a/admin/settings-page.php +++ b/admin/settings-page.php @@ -8,6 +8,8 @@ if (!defined('ABSPATH')) { exit; } +global $wpdb; + // Preveri, če ima uporabnik pravice za dostop if (!current_user_can('manage_options')) { return; @@ -67,6 +69,10 @@ if (isset($_POST['wheel_save_settings']) && check_admin_referer('wheel_settings_ } update_option('wheel_spin_products', $spin_products); + // Dnevni spin - shrani izbrano kolo + $daily_spin_wheel_id = isset($_POST['wof_daily_spin_wheel_id']) ? intval($_POST['wof_daily_spin_wheel_id']) : ''; + update_option('wof_daily_spin_wheel_id', $daily_spin_wheel_id); + // Prikaži sporočilo o uspehu add_settings_error('wheel_settings', 'settings_updated', __('Nastavitve so bile uspešno shranjene.', 'wheel-of-fortune'), 'updated'); } @@ -79,6 +85,11 @@ $max_spins = get_option('wheel_max_spins', 0); $send_emails = get_option('wheel_send_emails', false); $spin_products = get_option('wheel_spin_products', array()); +// Pridobi vsa kolesa za dropdown +$wheels_table = $wpdb->prefix . 'wof_wheels'; +$wheels = $wpdb->get_results("SELECT * FROM $wheels_table ORDER BY id ASC", ARRAY_A); +$daily_spin_wheel_id = get_option('wof_daily_spin_wheel_id', ''); + // Prikaži sporočila o napakah/uspehu settings_errors('wheel_settings'); ?> @@ -118,6 +129,20 @@ settings_errors('wheel_settings');

+ + + + + + +

+ + diff --git a/admin/stats-page.php b/admin/stats-page.php index 62b9d30..6f47051 100644 --- a/admin/stats-page.php +++ b/admin/stats-page.php @@ -81,6 +81,41 @@ if (isset($_POST['mark_redeemed']) && isset($_POST['prize_id'])) { '

'; } +// Ponastavi spine na 0 za vse uporabnike na izbranem kolesu +if (isset($_POST['reset_all_spins_wheel']) && isset($_POST['wheel_id'])) { + check_admin_referer('reset_spins_wheel_nonce', 'reset_spins_wheel_nonce'); + + $wheel_id = intval($_POST['wheel_id']); + + // Preveri, če kolo obstaja + $wheel_exists = $wpdb->get_var($wpdb->prepare("SELECT id FROM $wheels_table WHERE id = %d", $wheel_id)); + + if ($wheel_exists) { + // Ponastavi spine na 0 za vse uporabnike na tem kolesu + $result = $wpdb->update( + $spins_table, + array('spins_available' => 0), + array('wheel_id' => $wheel_id), + array('%d'), + array('%d') + ); + + if ($result !== false) { + echo '

' . + sprintf(__('Vsi spini za kolo ID %d so bili uspešno ponastavljeni na 0.', 'wheel-of-fortune'), $wheel_id) . + '

'; + } else { + echo '

' . + __('Prišlo je do napake pri ponastavitvi spinov.', 'wheel-of-fortune') . + '

'; + } + } else { + echo '

' . + __('Izbrano kolo ne obstaja.', 'wheel-of-fortune') . + '

'; + } +} + // Izberi uporabnika za podrobnosti $selected_user_id = isset($_GET['user_id']) ? intval($_GET['user_id']) : 0; @@ -106,6 +141,22 @@ if ($selected_user_id > 0) {

+ +
+

+ : + +

+ + + +
+

+
+
@@ -132,9 +183,45 @@ if ($selected_user_id > 0) {
+

- + +
+

+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ +
@@ -254,4 +341,200 @@ if ($selected_user_id > 0) {

- \ No newline at end of file + + + \ No newline at end of file diff --git a/assets/css/wheel.css b/assets/css/wheel.css index 82a4e59..056b034 100644 --- a/assets/css/wheel.css +++ b/assets/css/wheel.css @@ -128,12 +128,12 @@ transition: all 0.2s; } -/* Simple gradients for cross-browser compatibility */ -.wheel-segment-yellow { fill: #ffdd00; } -.wheel-segment-green { fill: #88ff00; } -.wheel-segment-red { fill: #ff5500; } -.wheel-segment-pink { fill: #ff44aa; } -.wheel-segment-blue { fill: #00ccff; } +/* Simple solid fills for segment color classes */ +.wheel-segment-red { fill: #ff3131; } +.wheel-segment-green { fill: #7ed957; } +.wheel-segment-purple { fill: #8c52ff; } +.wheel-segment-orange { fill: #ff914d; } +.wheel-segment-blue { fill: #1da3e7; } /* Divider between segments */ .wheel-divider { diff --git a/assets/js/wheel.js b/assets/js/wheel.js index 3277070..2d13c31 100644 --- a/assets/js/wheel.js +++ b/assets/js/wheel.js @@ -20,7 +20,6 @@ jQuery(document).ready(function($) { var isSpinning = false; var accumulatedRotation = 0; var wheelSpins = wof_data.spins_left; - var dailySpinAvailable = wof_data.daily_spin_available; var l10n = wof_data.l10n; // Nastavitve animacije @@ -59,12 +58,22 @@ jQuery(document).ready(function($) { showPrizePopup(prize); isSpinning = false; - updateButtonState(); + if (wheelSpins > 0) { + spinButton.prop('disabled', false).text(l10n.spin_button); + } else { + spinButton.prop('disabled', true).text(l10n.no_spins_left); + } } // Prikaz nagrade function showPrizePopup(prize) { - var html = '

' + l10n.congratulations + '

' + l10n.you_won + ' ' + prize.name + '

'; + var isTryAgain = window.wof_spin_result.is_try_again === 1 || prize.is_try_again === 1; + var html = ''; + if (isTryAgain) { + html = '

' + prize.name + '

'; + } else { + html = '

' + l10n.congratulations + '

' + l10n.you_won + ' ' + prize.name + '

'; + } if (window.wof_spin_result.discount_code) { html += '

' + l10n.discount_code_sent + '

'; } @@ -78,31 +87,9 @@ jQuery(document).ready(function($) { } } - // Posodobitev stanja gumba - function updateButtonState() { - if (isSpinning) return; - - if (dailySpinAvailable) { - spinButton.prop('disabled', false).text(l10n.free_daily_spin || 'FREE DAILY SPIN'); - } else if (wheelSpins > 0) { - spinButton.prop('disabled', false).text(l10n.spin_button); - } else { - spinButton.prop('disabled', true).text(l10n.no_spins_left); - } - } - // Klik na gumb za vrtenje spinButton.on('click', function() { - if (isSpinning) return; - - var spinType = 'paid'; // Privzeto je plačan - - // Preveri, ali najprej porabimo dnevnega - if (dailySpinAvailable) { - spinType = 'daily'; - } else if (wheelSpins <= 0) { - return; // Ničesar za porabiti - } + if (isSpinning || wheelSpins <= 0) return; isSpinning = true; spinButton.prop('disabled', true).text(l10n.spinning); @@ -116,16 +103,10 @@ jQuery(document).ready(function($) { }, data: { wheel_id: wof_data.wheel_id, - spin_type: spinType }, success: function(response) { if (response.success) { window.wof_spin_result = response.data; - - // Posodobimo stanje - if (spinType === 'daily') { - dailySpinAvailable = false; - } wheelSpins = response.data.remaining_spins; updateSpinsCounter(); @@ -156,13 +137,17 @@ jQuery(document).ready(function($) { function handleError(message) { resultDiv.html('

' + message + '

').addClass('error').fadeIn(300); isSpinning = false; - updateButtonState(); + if(wheelSpins > 0){ + spinButton.prop('disabled', false).text(l10n.spin_button); + } } // Inicializacija function init() { updateSpinsCounter(); - updateButtonState(); + if (wheelSpins <= 0) { + spinButton.prop('disabled', true).text(l10n.no_spins_left); + } } init(); diff --git a/code_export.txt b/code_export.txt index 848eeaf..0cc722f 100644 --- a/code_export.txt +++ b/code_export.txt @@ -1,9 +1,5 @@ "./README.md" : """ -# Wheel of Fortune Plugin - -Test posodobitve za preverjanje Gitea workflow. - # Wheel of Fortune - WordPress Plugin Vtičnik "Kolo Sreče" (Wheel of Fortune) omogoča uporabnikom vrtenje kolesa za nagrade. Povezan je z WooCommerce za dodeljevanje spinov ob nakupu izdelkov. @@ -1135,6 +1131,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { $discount_value = isset($_POST['prize_discount_value']) ? floatval($_POST['prize_discount_value']) : 0; $email_subject = isset($_POST['prize_email_subject']) ? sanitize_text_field($_POST['prize_email_subject']) : ''; $email_template = isset($_POST['prize_email_template']) ? wp_kses_post($_POST['prize_email_template']) : ''; + $is_try_again = isset($_POST['prize_is_try_again']) ? 1 : 0; if (!empty($name) && $wheel_id > 0) { $result = $wpdb->insert( @@ -1150,8 +1147,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { 'discount_value' => $discount_value, 'email_subject' => $email_subject, 'email_template' => $email_template, + 'is_try_again' => $is_try_again ], - ['%d', '%s', '%s', '%f', '%d', '%s', '%d', '%f', '%s', '%s'] + ['%d', '%s', '%s', '%f', '%d', '%s', '%d', '%f', '%s', '%s', '%d'] ); if ($result !== false) { @@ -1177,6 +1175,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { $discount_value = isset($_POST['prize_discount_value']) ? floatval($_POST['prize_discount_value']) : 0; $email_subject = isset($_POST['prize_email_subject']) ? sanitize_text_field($_POST['prize_email_subject']) : ''; $email_template = isset($_POST['prize_email_template']) ? wp_kses_post($_POST['prize_email_template']) : ''; + $is_try_again = isset($_POST['prize_is_try_again']) ? 1 : 0; if (!empty($name) && $prize_id > 0 && $wheel_id > 0) { $result = $wpdb->update( @@ -1192,9 +1191,10 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { 'discount_value' => $discount_value, 'email_subject' => $email_subject, 'email_template' => $email_template, + 'is_try_again' => $is_try_again ], ['id' => $prize_id], - ['%d', '%s', '%s', '%f', '%d', '%s', '%d', '%f', '%s', '%s'], + ['%d', '%s', '%s', '%f', '%d', '%s', '%d', '%f', '%s', '%s', '%d'], ['%d'] ); @@ -1474,6 +1474,7 @@ if (class_exists('WooCommerce')) { +

{user_name}, {prize_name}, etc.

@@ -1610,6 +1611,7 @@ jQuery(document).ready(function($) { $('#edit-prize-discount-value').val(prize.discount_value); $('#edit-prize-email-subject').val(prize.email_subject); $('#edit-prize-email-template').val(prize.email_template); + $('#edit-prize-is-try-again').prop('checked', parseInt(prize.is_try_again, 10)); modal.show(); } else { @@ -1639,6 +1641,7 @@ jQuery(document).ready(function($) { discount_value: $('#edit-prize-discount-value').val(), email_subject: $('#edit-prize-email-subject').val(), email_template: $('#edit-prize-email-template').val(), + is_try_again: $('#edit-prize-is-try-again').is(':checked') ? 1 : 0, }; // Debug: preveri wheel_id @@ -2055,6 +2058,13 @@ if (!defined('ABSPATH')) exit;

+ + + + + +

+ """ @@ -2070,6 +2080,8 @@ if (!defined('ABSPATH')) { exit; } +global $wpdb; + // Preveri, če ima uporabnik pravice za dostop if (!current_user_can('manage_options')) { return; @@ -2129,6 +2141,10 @@ if (isset($_POST['wheel_save_settings']) && check_admin_referer('wheel_settings_ } update_option('wheel_spin_products', $spin_products); + // Dnevni spin - shrani izbrano kolo + $daily_spin_wheel_id = isset($_POST['wof_daily_spin_wheel_id']) ? intval($_POST['wof_daily_spin_wheel_id']) : ''; + update_option('wof_daily_spin_wheel_id', $daily_spin_wheel_id); + // Prikaži sporočilo o uspehu add_settings_error('wheel_settings', 'settings_updated', __('Nastavitve so bile uspešno shranjene.', 'wheel-of-fortune'), 'updated'); } @@ -2141,6 +2157,11 @@ $max_spins = get_option('wheel_max_spins', 0); $send_emails = get_option('wheel_send_emails', false); $spin_products = get_option('wheel_spin_products', array()); +// Pridobi vsa kolesa za dropdown +$wheels_table = $wpdb->prefix . 'wof_wheels'; +$wheels = $wpdb->get_results("SELECT * FROM $wheels_table ORDER BY id ASC", ARRAY_A); +$daily_spin_wheel_id = get_option('wof_daily_spin_wheel_id', ''); + // Prikaži sporočila o napakah/uspehu settings_errors('wheel_settings'); ?> @@ -2180,6 +2201,20 @@ settings_errors('wheel_settings');

+ + + + + + +

+ + @@ -4345,7 +4380,13 @@ jQuery(document).ready(function($) { // Prikaz nagrade function showPrizePopup(prize) { - var html = '

' + l10n.congratulations + '

' + l10n.you_won + ' ' + prize.name + '

'; + var isTryAgain = window.wof_spin_result.is_try_again === 1 || prize.is_try_again === 1; + var html = ''; + if (isTryAgain) { + html = '

' + prize.name + '

'; + } else { + html = '

' + l10n.congratulations + '

' + l10n.you_won + ' ' + prize.name + '

'; + } if (window.wof_spin_result.discount_code) { html += '

' + l10n.discount_code_sent + '

'; } @@ -5484,6 +5525,12 @@ class WheelOfFortune { add_action('plugins_loaded', array($this, 'load_textdomain')); register_activation_hook(WHEEL_OF_FORTUNE_PLUGIN_FILE, array($this, 'activate')); register_deactivation_hook(WHEEL_OF_FORTUNE_PLUGIN_FILE, array($this, 'deactivate')); + + // --- CRON: filter in akcija vedno aktivna --- + add_filter('cron_schedules', array($this, 'add_custom_cron_schedules')); + add_action('wof_daily_spin_event', array($this, 'execute_daily_spin_cron')); + // ------------------------------------------ + add_action('admin_menu', array($this, 'admin_menu')); add_action('rest_api_init', array($this, 'register_rest_routes')); add_shortcode('wheel_of_fortune', array($this, 'shortcode')); @@ -5610,30 +5657,19 @@ class WheelOfFortune { $this->run_migration(); $this->set_default_options(); $this->add_default_prizes(); - - // Debug: Preveri, ali se tabela za kolesa ustvari - global $wpdb; - $wheels_table = $wpdb->prefix . 'wof_wheels'; - $wheel_products_table = $wpdb->prefix . 'wheel_of_fortune_products'; - - $wheels_exists = $wpdb->get_var("SHOW TABLES LIKE '$wheels_table'") == $wheels_table; - $products_exists = $wpdb->get_var("SHOW TABLES LIKE '$wheel_products_table'") == $wheel_products_table; - - error_log("=== ACTIVATION DEBUG ==="); - error_log("Wheels table exists: " . ($wheels_exists ? 'YES' : 'NO')); - error_log("Products table exists: " . ($products_exists ? 'YES' : 'NO')); - - if (!$wheels_exists) { - error_log('Wheel of Fortune: Wheels table was not created properly during activation.'); - } else { - error_log('Wheel of Fortune: Wheels table created successfully.'); + // --- TUKAJ OSTANE SAMO NAČRTOVANJE DOGODKA --- + if (!wp_next_scheduled('wof_daily_spin_event')) { + wp_schedule_event(time(), 'daily', 'wof_daily_spin_event'); + error_log("Wheel of Fortune: Cron job 'wof_daily_spin_event' scheduled."); } - + // --------------------------------------------- flush_rewrite_rules(); error_log("Wheel of Fortune: Aktivacija končana."); } public function deactivate() { + wp_clear_scheduled_hook('wof_daily_spin_event'); + error_log("Wheel of Fortune: Cron job 'wof_daily_spin_event' cleared."); flush_rewrite_rules(); } @@ -5916,11 +5952,26 @@ class WheelOfFortune { array($this, 'edit_wheel_page') ); + // Dodam podstran za nastavitve + add_submenu_page( + 'wof-wheels', + __('Settings', 'wheel-of-fortune'), + __('Settings', 'wheel-of-fortune'), + 'manage_options', + 'wof-settings', + array($this, 'settings_page') + ); + // Statistika in uporabniki add_submenu_page('wof-wheels', __('Statistics', 'wheel-of-fortune'), __('Statistics', 'wheel-of-fortune'), 'manage_options', 'wof-stats', array($this, 'stats_page')); add_submenu_page('wof-wheels', __('Users & Spins', 'wheel-of-fortune'), __('Users & Spins', 'wheel-of-fortune'), 'manage_options', 'wof-users', array($this, 'users_page')); } + // Dodam funkcijo za prikaz strani z nastavitvami + public function settings_page() { + require_once WHEEL_OF_FORTUNE_PLUGIN_DIR . 'admin/settings-page.php'; + } + public function wheels_page() { require_once WHEEL_OF_FORTUNE_PLUGIN_DIR . 'admin/wheels-page.php'; } @@ -6004,7 +6055,13 @@ class WheelOfFortune { $this->send_prize_email($user_id, $prize); } - $response_data = [ 'prize' => $prize, 'degree' => $degree, 'remaining_spins' => $new_spins, 'discount_code' => $redemption_code ]; + $response_data = [ + 'prize' => $prize, + 'degree' => $degree, + 'remaining_spins' => $new_spins, + 'discount_code' => $redemption_code, + 'is_try_again' => isset($prize['is_try_again']) ? (int)$prize['is_try_again'] : 0 + ]; return new WP_REST_Response(['success' => true, 'data' => $response_data], 200); } @@ -6649,7 +6706,8 @@ class WheelOfFortune { update_post_meta($coupon_id, 'usage_limit_per_user', '1'); update_post_meta($coupon_id, 'customer_email', array($user->user_email)); update_post_meta($coupon_id, 'description', __('Wheel of Fortune', 'wheel-of-fortune')); - + // Nastavi veljavnost 10 dni + update_post_meta($coupon_id, 'date_expires', strtotime('+10 days')); return $coupon_id; } } catch (Exception $e) { @@ -6677,12 +6735,9 @@ class WheelOfFortune { $coupon->set_usage_limit(1); $coupon->set_usage_limit_per_user(1); $coupon->set_email_restrictions(array($user->user_email)); - - // Dodatna nastavitev - $coupon->set_date_expires(strtotime('+30 days')); - + // Nastavi veljavnost 10 dni + $coupon->set_date_expires(strtotime('+10 days')); $coupon_id = $coupon->save(); - // Preveri, ali je kupon res ustvarjen if ($coupon_id) { $verification_id = wc_get_coupon_id_by_code($code); @@ -6699,7 +6754,6 @@ class WheelOfFortune { // Metoda 4: Neposredno vstavljanje v podatkovno bazo try { global $wpdb; - // Ustvari nov post tipa shop_coupon $wpdb->insert( $wpdb->posts, @@ -6714,9 +6768,7 @@ class WheelOfFortune { 'post_date_gmt' => current_time('mysql', 1) ) ); - $coupon_id = $wpdb->insert_id; - if ($coupon_id) { // Dodaj meta podatke za kupon $meta_data = array( @@ -6726,9 +6778,10 @@ class WheelOfFortune { 'usage_limit' => '1', 'usage_limit_per_user' => '1', 'customer_email' => serialize(array($user->user_email)), - 'description' => __('Wheel of Fortune', 'wheel-of-fortune') + 'description' => __('Wheel of Fortune', 'wheel-of-fortune'), + // Nastavi veljavnost 10 dni + 'date_expires' => strtotime('+10 days') ); - foreach ($meta_data as $meta_key => $meta_value) { $wpdb->insert( $wpdb->postmeta, @@ -6739,7 +6792,6 @@ class WheelOfFortune { ) ); } - return $coupon_id; } } catch (Exception $e) { @@ -6760,8 +6812,9 @@ class WheelOfFortune { $coupon->set_usage_limit(1); $coupon->set_usage_limit_per_user(1); $coupon->set_email_restrictions(array($user->user_email)); + // Nastavi veljavnost 10 dni + $coupon->set_date_expires(strtotime('+10 days')); $coupon_id = $coupon->save(); - if ($coupon_id) { return $coupon_id; } @@ -6930,6 +6983,44 @@ class WheelOfFortune { } wp_send_json_error(__('Napaka pri brisanju.', 'wheel-of-fortune')); } + + // --- NOVE METODE ZA CRON --- + public function add_custom_cron_schedules($schedules) { + // Lahko pustiš custom interval, če ga uporabljaš še kje drugje, sicer ni potreben + // $schedules['every_2_minutes'] = array( + // 'interval' => 120, + // 'display' => __('Every 2 minutes', 'wheel-of-fortune') + // ); + return $schedules; + } + + public function execute_daily_spin_cron() { + wheel_of_fortune_debug_log('CRON: "wof_daily_spin_event" triggered.'); + $wheel_id = get_option('wof_daily_spin_wheel_id'); + if (empty($wheel_id)) { + wheel_of_fortune_debug_log('CRON: No wheel selected for daily spin. Aborting.'); + return; + } + $users = get_users(array('fields' => 'ID')); + wheel_of_fortune_debug_log('CRON: Found ' . count($users) . ' users to process for wheel ID ' . $wheel_id); + foreach ($users as $user_id) { + $last_given_meta_key = '_wof_daily_spin_last_given_' . $wheel_id; + $last_given_timestamp = get_user_meta($user_id, $last_given_meta_key, true); + // Sprememba: 24 ur (23*HOUR_IN_SECONDS) + if (empty($last_given_timestamp) || (time() - $last_given_timestamp > 23 * HOUR_IN_SECONDS)) { + $ok = wheel_of_fortune_add_spins($user_id, 1, $wheel_id); + if ($ok) { + update_user_meta($user_id, $last_given_meta_key, time()); + wheel_of_fortune_debug_log("CRON: Assigned spin to user $user_id for wheel $wheel_id. Result: " . var_export($ok, true)); + } else { + wheel_of_fortune_debug_log("CRON: Failed to assign spin to user $user_id for wheel $wheel_id."); + } + } else { + wheel_of_fortune_debug_log("CRON: User $user_id already received a spin recently. Skipping."); + } + } + } + // ---------------------------- } // Initialize plugin diff --git a/export_code.sh b/export_code.sh old mode 100755 new mode 100644 diff --git a/wheel-of-fortune.php b/wheel-of-fortune.php index 4ce746e..1d6657b 100644 --- a/wheel-of-fortune.php +++ b/wheel-of-fortune.php @@ -105,6 +105,12 @@ class WheelOfFortune { add_action('plugins_loaded', array($this, 'load_textdomain')); register_activation_hook(WHEEL_OF_FORTUNE_PLUGIN_FILE, array($this, 'activate')); register_deactivation_hook(WHEEL_OF_FORTUNE_PLUGIN_FILE, array($this, 'deactivate')); + + // --- CRON: filter in akcija vedno aktivna --- + add_filter('cron_schedules', array($this, 'add_custom_cron_schedules')); + add_action('wof_daily_spin_event', array($this, 'execute_daily_spin_cron')); + // ------------------------------------------ + add_action('admin_menu', array($this, 'admin_menu')); add_action('rest_api_init', array($this, 'register_rest_routes')); add_shortcode('wheel_of_fortune', array($this, 'shortcode')); @@ -125,8 +131,10 @@ class WheelOfFortune { add_action('wp_ajax_wheel_get_product', array($this, 'ajax_get_product')); add_action('wp_ajax_wheel_test_email', array($this, 'ajax_test_email')); add_action('wp_ajax_wheel_get_prizes', array($this, 'ajax_get_prizes')); + add_action('wp_ajax_ajax_update_wheel_product_spins', array($this, 'ajax_update_wheel_product_spins')); add_action('wp_ajax_wof_delete_wheel_product', array($this, 'ajax_delete_wheel_product')); - add_action('wp_ajax_wof_update_wheel_product_spins', array($this, 'ajax_update_wheel_product_spins')); + add_action('wp_ajax_wheel_migrate_try_again', array($this, 'ajax_migrate_try_again')); + add_action('wp_ajax_wheel_reset_spins_wheel', array($this, 'ajax_reset_spins_wheel')); // Vključi testno skripto za kupone if (is_admin()) { @@ -226,35 +234,22 @@ class WheelOfFortune { } public function activate() { - error_log("Wheel of Fortune: Aktivacija plugina..."); $this->create_database_tables(); $this->run_migration(); $this->set_default_options(); - $this->add_default_prizes(); - // Debug: Preveri, ali se tabela za kolesa ustvari - global $wpdb; - $wheels_table = $wpdb->prefix . 'wof_wheels'; - $wheel_products_table = $wpdb->prefix . 'wheel_of_fortune_products'; - - $wheels_exists = $wpdb->get_var("SHOW TABLES LIKE '$wheels_table'") == $wheels_table; - $products_exists = $wpdb->get_var("SHOW TABLES LIKE '$wheel_products_table'") == $wheel_products_table; - - error_log("=== ACTIVATION DEBUG ==="); - error_log("Wheels table exists: " . ($wheels_exists ? 'YES' : 'NO')); - error_log("Products table exists: " . ($products_exists ? 'YES' : 'NO')); - - if (!$wheels_exists) { - error_log('Wheel of Fortune: Wheels table was not created properly during activation.'); - } else { - error_log('Wheel of Fortune: Wheels table created successfully.'); + // Dodaj cron opravilo za dnevne spine + if (!wp_next_scheduled('wheel_daily_spins_cron')) { + wp_schedule_event(time(), 'wheel_daily', 'wheel_daily_spins_cron'); } - flush_rewrite_rules(); - error_log("Wheel of Fortune: Aktivacija končana."); + // Izvedi migracijo za is_try_again stolpec + $this->migrate_add_is_try_again_column(); } public function deactivate() { + wp_clear_scheduled_hook('wof_daily_spin_event'); + error_log("Wheel of Fortune: Cron job 'wof_daily_spin_event' cleared."); flush_rewrite_rules(); } @@ -296,7 +291,6 @@ class WheelOfFortune { id mediumint(9) NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL, slug varchar(100) NOT NULL, - has_daily_spin tinyint(1) NOT NULL DEFAULT 0, created_at datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, PRIMARY KEY (id), UNIQUE KEY slug (slug) @@ -320,7 +314,6 @@ class WheelOfFortune { name varchar(255) NOT NULL, description text DEFAULT '', probability float NOT NULL, - daily_spin_probability float DEFAULT NULL, is_active tinyint(1) NOT NULL DEFAULT 1, image_url varchar(255) DEFAULT '', email_subject varchar(255) DEFAULT '', @@ -328,6 +321,7 @@ class WheelOfFortune { redemption_code varchar(100) DEFAULT '', is_discount tinyint(1) NOT NULL DEFAULT 0, discount_value float DEFAULT 0, + is_try_again tinyint(1) NOT NULL DEFAULT 0, PRIMARY KEY (id), KEY wheel_id (wheel_id) ) $charset_collate;"; @@ -387,6 +381,29 @@ class WheelOfFortune { } else { error_log("Wheel of Fortune: Tabela $wheel_products_table uspešno ustvarjena."); } + + // Migracija: dodaj stolpec is_try_again v obstoječe tabele + $this->migrate_add_is_try_again_column(); + } + + private function migrate_add_is_try_again_column() { + global $wpdb; + $table_prizes = $wpdb->prefix . 'wheel_prizes'; + + // Preveri, če stolpec is_try_again že obstaja + $column_exists = $wpdb->get_results("SHOW COLUMNS FROM $table_prizes LIKE 'is_try_again'"); + + if (empty($column_exists)) { + // Dodaj stolpec is_try_again + $result = $wpdb->query("ALTER TABLE $table_prizes ADD COLUMN is_try_again tinyint(1) NOT NULL DEFAULT 0"); + if ($result !== false) { + error_log("Wheel of Fortune: Stolpec is_try_again uspešno dodan v tabelo $table_prizes"); + } else { + error_log("Wheel of Fortune: Napaka pri dodajanju stolpca is_try_again v tabelo $table_prizes"); + } + } else { + error_log("Wheel of Fortune: Stolpec is_try_again že obstaja v tabeli $table_prizes"); + } } private function run_migration() { @@ -539,11 +556,26 @@ class WheelOfFortune { array($this, 'edit_wheel_page') ); + // Dodam podstran za nastavitve + add_submenu_page( + 'wof-wheels', + __('Settings', 'wheel-of-fortune'), + __('Settings', 'wheel-of-fortune'), + 'manage_options', + 'wof-settings', + array($this, 'settings_page') + ); + // Statistika in uporabniki add_submenu_page('wof-wheels', __('Statistics', 'wheel-of-fortune'), __('Statistics', 'wheel-of-fortune'), 'manage_options', 'wof-stats', array($this, 'stats_page')); add_submenu_page('wof-wheels', __('Users & Spins', 'wheel-of-fortune'), __('Users & Spins', 'wheel-of-fortune'), 'manage_options', 'wof-users', array($this, 'users_page')); } + // Dodam funkcijo za prikaz strani z nastavitvami + public function settings_page() { + require_once WHEEL_OF_FORTUNE_PLUGIN_DIR . 'admin/settings-page.php'; + } + public function wheels_page() { require_once WHEEL_OF_FORTUNE_PLUGIN_DIR . 'admin/wheels-page.php'; } @@ -578,65 +610,29 @@ class WheelOfFortune { } $wheel_id = $request->get_param('wheel_id'); - $spin_type = $request->get_param('spin_type') === 'daily' ? 'daily' : 'paid'; // NOVO - if (empty($wheel_id)) { return new WP_Error('no_wheel_id', __('Wheel ID is missing.', 'wheel-of-fortune'), ['status' => 400]); } global $wpdb; - $wheels_table = $wpdb->prefix . 'wof_wheels'; - $wheel_data = $wpdb->get_row($wpdb->prepare("SELECT has_daily_spin FROM $wheels_table WHERE id = %d", $wheel_id), ARRAY_A); - - $spins_left = 0; - $is_eligible_for_daily = false; - - // Preverjanje za DNEVNI SPIN - if ($spin_type === 'daily') { - if (!empty($wheel_data) && $wheel_data['has_daily_spin']) { - $last_spin_meta_key = '_wof_last_daily_spin_' . $wheel_id; - $last_spin_timestamp = get_user_meta($user_id, $last_spin_meta_key, true); - - if (empty($last_spin_timestamp) || strtotime('today') > $last_spin_timestamp) { - $is_eligible_for_daily = true; - } - } - if (!$is_eligible_for_daily) { - return new WP_Error('daily_spin_used', __('You have already used your free daily spin today.', 'wheel-of-fortune'), ['status' => 403]); - } - } - // Preverjanje za PLAČAN SPIN - else { - $spins_table = $wpdb->prefix . 'wheel_spins'; - $user_spins = $wpdb->get_row($wpdb->prepare("SELECT spins_available FROM $spins_table WHERE user_id = %d AND wheel_id = %d", $user_id, $wheel_id)); - $spins_left = $user_spins ? intval($user_spins->spins_available) : 0; - - if ($spins_left <= 0) { - return new WP_Error('no_spins', __('You have no spins left.', 'wheel-of-fortune'), ['status' => 403]); - } + $spins_table = $wpdb->prefix . 'wheel_spins'; + $user_spins = $wpdb->get_row($wpdb->prepare("SELECT spins_available FROM $spins_table WHERE user_id = %d AND wheel_id = %d", $user_id, $wheel_id)); + $spins = $user_spins ? intval($user_spins->spins_available) : 0; + + if ($spins <= 0) { + return new WP_Error('no_spins', __('You have no spins left.', 'wheel-of-fortune'), ['status' => 403]); } - // Nadaljuj z logiko vrtenja - $prizes = $this->get_wheel_prizes($wheel_id, $is_eligible_for_daily); + $prizes = $this->get_wheel_prizes($wheel_id); if (empty($prizes)) { return new WP_Error('no_prizes', __('No prizes available.', 'wheel-of-fortune'), ['status' => 500]); } + // Uporabi delujočo logiko za izbiro nagrade $prize = $this->select_random_prize($prizes); + $new_spins = $spins - 1; - // Zmanjšaj spine ali zabeleži dnevni spin - if ($spin_type === 'daily') { - $last_spin_meta_key = '_wof_last_daily_spin_' . $wheel_id; - update_user_meta($user_id, $last_spin_meta_key, time()); - // Pridobimo trenutno število spinov za response - $spins_table = $wpdb->prefix . 'wheel_spins'; - $user_spins_obj = $wpdb->get_row($wpdb->prepare("SELECT spins_available FROM $spins_table WHERE user_id = %d AND wheel_id = %d", $user_id, $wheel_id)); - $new_spins = $user_spins_obj ? intval($user_spins_obj->spins_available) : 0; - } else { - $new_spins = $spins_left - 1; - $spins_table = $wpdb->prefix . 'wheel_spins'; - $wpdb->update($spins_table, ['spins_available' => $new_spins, 'last_spin_date' => current_time('mysql')], ['user_id' => $user_id, 'wheel_id' => $wheel_id]); - } + $wpdb->update($spins_table, ['spins_available' => $new_spins, 'last_spin_date' => current_time('mysql')], ['user_id' => $user_id, 'wheel_id' => $wheel_id]); $log_table = $wpdb->prefix . 'wheel_log'; $wpdb->insert($log_table, ['user_id' => $user_id, 'wheel_id' => $wheel_id, 'prize_id' => $prize['id'], 'spin_date' => current_time('mysql'), 'redeemed' => 0]); @@ -659,37 +655,26 @@ class WheelOfFortune { } } - if (get_option('wheel_send_emails', true)) { + // Pošlji email samo, če ni "try again" nagrada + if (get_option('wheel_send_emails', true) && (!isset($prize['is_try_again']) || $prize['is_try_again'] != 1)) { $this->send_prize_email($user_id, $prize); } - $response_data = [ - 'prize' => $prize, - 'degree' => $degree, - 'remaining_spins' => $new_spins, + $response_data = [ + 'prize' => $prize, + 'degree' => $degree, + 'remaining_spins' => $new_spins, 'discount_code' => $redemption_code, - 'spin_type' => $spin_type + 'is_try_again' => isset($prize['is_try_again']) ? (int)$prize['is_try_again'] : 0 ]; return new WP_REST_Response(['success' => true, 'data' => $response_data], 200); } - public function get_wheel_prizes($wheel_id = 1, $is_daily_spin = false) { + public function get_wheel_prizes($wheel_id = 1) { global $wpdb; $table_name = $wpdb->prefix . 'wheel_prizes'; - $prizes = $wpdb->get_results($wpdb->prepare("SELECT * FROM $table_name WHERE wheel_id = %d AND is_active = 1 ORDER BY id ASC", $wheel_id), ARRAY_A); - - if ($is_daily_spin) { - foreach ($prizes as &$prize) { - // Če je daily_spin_probability nastavljena, jo uporabi. Sicer uporabi standardno. - if (isset($prize['daily_spin_probability']) && $prize['daily_spin_probability'] !== null) { - $prize['probability'] = $prize['daily_spin_probability']; - } - } - unset($prize); // Prekini referenco - } - - return $prizes; + return $wpdb->get_results($wpdb->prepare("SELECT * FROM $table_name WHERE wheel_id = %d AND is_active = 1 ORDER BY id ASC", $wheel_id), ARRAY_A); } private function select_random_prize($prizes) { @@ -795,23 +780,11 @@ class WheelOfFortune { $spins_left = $wpdb->get_var($wpdb->prepare("SELECT spins_available FROM $spins_table WHERE user_id = %d AND wheel_id = %d", $user_id, $wheel_id)); $spins_left = ($spins_left === null) ? 0 : (int)$spins_left; - // Preveri, ali je dnevni spin na voljo - $daily_spin_available = false; - if (isset($wheel['has_daily_spin']) && $wheel['has_daily_spin']) { - $last_spin_meta_key = '_wof_last_daily_spin_' . $wheel_id; - $last_spin_timestamp = get_user_meta($user_id, $last_spin_meta_key, true); - - if (empty($last_spin_timestamp) || strtotime('today') > $last_spin_timestamp) { - $daily_spin_available = true; - } - } - // Definiramo polje za prevode, da bo dostopno v PHP in JS $l10n = [ 'spin_button' => __('SPIN', 'wheel-of-fortune'), 'spinning' => __('Spinning...', 'wheel-of-fortune'), 'no_spins_left' => __('No More Spins', 'wheel-of-fortune'), - 'free_daily_spin' => __('FREE DAILY SPIN', 'wheel-of-fortune'), 'congratulations' => __('Congratulations!', 'wheel-of-fortune'), 'you_won' => __('You won:', 'wheel-of-fortune'), 'close' => __('Close', 'wheel-of-fortune'), @@ -825,7 +798,6 @@ class WheelOfFortune { 'nonce' => wp_create_nonce('wp_rest'), 'wheel_id' => $wheel_id, 'spins_left' => $spins_left, - 'daily_spin_available' => $daily_spin_available, 'prizes' => $prizes, 'l10n' => $l10n // Uporabimo definirano polje )); @@ -899,7 +871,8 @@ class WheelOfFortune { $text_paths = ''; // Generate segments and text paths - $segment_colors = ['#00dfe9', '#ff00c4', '#0cf101']; + // Updated segment color palette + $segment_colors = ['#ff3131', '#7ed957', '#8c52ff', '#ff914d', '#1da3e7']; for ($i = 0; $i < $num_prizes; $i++) { $prize = $prizes[$i]; $start_angle = $i * $angle; @@ -999,13 +972,13 @@ class WheelOfFortune { $name = isset($_POST['name']) ? sanitize_text_field($_POST['name']) : ''; $description = isset($_POST['description']) ? sanitize_textarea_field($_POST['description']) : ''; $probability = isset($_POST['probability']) ? floatval($_POST['probability']) : 0; - $daily_spin_probability = isset($_POST['daily_spin_probability']) && $_POST['daily_spin_probability'] !== '' ? floatval($_POST['daily_spin_probability']) : null; $is_active = isset($_POST['is_active']) ? intval($_POST['is_active']) : 0; $redemption_code = isset($_POST['redemption_code']) ? sanitize_text_field($_POST['redemption_code']) : ''; $is_discount = isset($_POST['is_discount']) ? intval($_POST['is_discount']) : 0; $email_subject = isset($_POST['email_subject']) ? sanitize_text_field($_POST['email_subject']) : ''; $email_template = isset($_POST['email_template']) ? wp_kses_post($_POST['email_template']) : ''; $discount_value = isset($_POST['discount_value']) ? floatval($_POST['discount_value']) : 0; + $is_try_again = isset($_POST['is_try_again']) ? intval($_POST['is_try_again']) : 0; if (empty($name)) { wp_send_json_error(['message' => __('Prize name is required.', 'wheel-of-fortune')]); @@ -1019,10 +992,6 @@ class WheelOfFortune { wp_send_json_error(['message' => __('Probability must be between 0 and 1.', 'wheel-of-fortune')]); } - if ($daily_spin_probability !== null && ($daily_spin_probability < 0 || $daily_spin_probability > 1)) { - wp_send_json_error(['message' => __('Daily spin probability must be between 0 and 1.', 'wheel-of-fortune')]); - } - global $wpdb; $table_name = $wpdb->prefix . 'wheel_prizes'; @@ -1031,16 +1000,16 @@ class WheelOfFortune { 'name' => $name, 'description' => $description, 'probability' => $probability, - 'daily_spin_probability' => $daily_spin_probability, 'is_active' => $is_active, 'redemption_code' => $redemption_code, 'is_discount' => $is_discount, 'email_subject' => $email_subject, 'email_template' => $email_template, 'discount_value' => $discount_value, + 'is_try_again' => $is_try_again, ]; - $format = ['%d', '%s', '%s', '%f', '%f', '%d', '%s', '%d', '%s', '%s', '%f']; + $format = ['%d', '%s', '%s', '%f', '%d', '%s', '%d', '%s', '%s', '%f', '%d']; if ($prize_id > 0) { $result = $wpdb->update($table_name, $data, ['id' => $prize_id], $format, ['%d']); @@ -1345,7 +1314,8 @@ class WheelOfFortune { update_post_meta($coupon_id, 'usage_limit_per_user', '1'); update_post_meta($coupon_id, 'customer_email', array($user->user_email)); update_post_meta($coupon_id, 'description', __('Wheel of Fortune', 'wheel-of-fortune')); - + // Nastavi veljavnost 10 dni + update_post_meta($coupon_id, 'date_expires', strtotime('+10 days')); return $coupon_id; } } catch (Exception $e) { @@ -1373,12 +1343,9 @@ class WheelOfFortune { $coupon->set_usage_limit(1); $coupon->set_usage_limit_per_user(1); $coupon->set_email_restrictions(array($user->user_email)); - - // Dodatna nastavitev - $coupon->set_date_expires(strtotime('+30 days')); - + // Nastavi veljavnost 10 dni + $coupon->set_date_expires(strtotime('+10 days')); $coupon_id = $coupon->save(); - // Preveri, ali je kupon res ustvarjen if ($coupon_id) { $verification_id = wc_get_coupon_id_by_code($code); @@ -1395,7 +1362,6 @@ class WheelOfFortune { // Metoda 4: Neposredno vstavljanje v podatkovno bazo try { global $wpdb; - // Ustvari nov post tipa shop_coupon $wpdb->insert( $wpdb->posts, @@ -1410,9 +1376,7 @@ class WheelOfFortune { 'post_date_gmt' => current_time('mysql', 1) ) ); - $coupon_id = $wpdb->insert_id; - if ($coupon_id) { // Dodaj meta podatke za kupon $meta_data = array( @@ -1422,9 +1386,10 @@ class WheelOfFortune { 'usage_limit' => '1', 'usage_limit_per_user' => '1', 'customer_email' => serialize(array($user->user_email)), - 'description' => __('Wheel of Fortune', 'wheel-of-fortune') + 'description' => __('Wheel of Fortune', 'wheel-of-fortune'), + // Nastavi veljavnost 10 dni + 'date_expires' => strtotime('+10 days') ); - foreach ($meta_data as $meta_key => $meta_value) { $wpdb->insert( $wpdb->postmeta, @@ -1435,7 +1400,6 @@ class WheelOfFortune { ) ); } - return $coupon_id; } } catch (Exception $e) { @@ -1456,8 +1420,9 @@ class WheelOfFortune { $coupon->set_usage_limit(1); $coupon->set_usage_limit_per_user(1); $coupon->set_email_restrictions(array($user->user_email)); + // Nastavi veljavnost 10 dni + $coupon->set_date_expires(strtotime('+10 days')); $coupon_id = $coupon->save(); - if ($coupon_id) { return $coupon_id; } @@ -1478,6 +1443,12 @@ class WheelOfFortune { * @param array $prize The prize details array. */ public function send_prize_email($user_id, $prize) { + // Ne pošlji emaila, če je nagrada "try again" + if (isset($prize['is_try_again']) && $prize['is_try_again'] == 1) { + wheel_of_fortune_debug_log("send_prize_email: Email ni poslan za 'try again' nagrado: {$prize['name']}"); + return; + } + $user = get_userdata($user_id); if (!$user) { wheel_of_fortune_debug_log("send_prize_email: Uporabnik z ID {$user_id} ni bil najden."); @@ -1599,33 +1570,123 @@ class WheelOfFortune { } public function ajax_delete_wheel_product() { - check_ajax_referer('wof_delete_wheel_product'); + check_ajax_referer('wof_delete_wheel_product', '_ajax_nonce'); + if (!current_user_can('manage_options')) { - wp_send_json_error(__('Nimaš dovoljenja.', 'wheel-of-fortune')); + wp_send_json_error(['message' => __('You do not have permission to perform this action.', 'wheel-of-fortune')]); } - global $wpdb; + $id = isset($_POST['id']) ? intval($_POST['id']) : 0; - // Debug informacije - error_log("=== AJAX DELETE WHEEL PRODUCT DEBUG ==="); - error_log("POST data: " . print_r($_POST, true)); - error_log("ID to delete: " . $id); + if (!$id) { + wp_send_json_error(['message' => __('Invalid ID.', 'wheel-of-fortune')]); + } - if ($id > 0) { - $table = $wpdb->prefix . 'wheel_of_fortune_products'; - error_log("Table: " . $table); - - $result = $wpdb->delete($table, ['id' => $id], ['%d']); - error_log("Delete result: " . $result); - error_log("Last SQL query: " . $wpdb->last_query); - error_log("Last SQL error: " . $wpdb->last_error); - - if ($result !== false) { - wp_send_json_success(); + global $wpdb; + $table_name = $wpdb->prefix . 'wheel_of_fortune_products'; + + $result = $wpdb->delete($table_name, ['id' => $id]); + + if ($result !== false) { + wp_send_json_success(['message' => __('Product deleted successfully.', 'wheel-of-fortune')]); + } else { + wp_send_json_error(['message' => __('Failed to delete product.', 'wheel-of-fortune')]); + } + } + + public function ajax_migrate_try_again() { + check_ajax_referer('wheel_admin_nonce', '_ajax_nonce'); + + if (!current_user_can('manage_options')) { + wp_send_json_error(['message' => __('You do not have permission to perform this action.', 'wheel-of-fortune')]); + } + + $this->migrate_add_is_try_again_column(); + + wp_send_json_success(['message' => __('Migration completed successfully. The is_try_again column has been added to the database.', 'wheel-of-fortune')]); + } + + public function ajax_reset_spins_wheel() { + check_ajax_referer('wheel_admin_nonce', '_ajax_nonce'); + + if (!current_user_can('manage_options')) { + wp_send_json_error(['message' => __('You do not have permission to perform this action.', 'wheel-of-fortune')]); + } + + $wheel_id = isset($_POST['wheel_id']) ? intval($_POST['wheel_id']) : 0; + + if (!$wheel_id) { + wp_send_json_error(['message' => __('Wheel ID is required.', 'wheel-of-fortune')]); + } + + global $wpdb; + $wheels_table = $wpdb->prefix . 'wof_wheels'; + $spins_table = $wpdb->prefix . 'wheel_spins'; + + // Preveri, če kolo obstaja + $wheel_exists = $wpdb->get_var($wpdb->prepare("SELECT id FROM $wheels_table WHERE id = %d", $wheel_id)); + + if (!$wheel_exists) { + wp_send_json_error(['message' => __('Selected wheel does not exist.', 'wheel-of-fortune')]); + } + + // Ponastavi spine na 0 za vse uporabnike na tem kolesu + $result = $wpdb->update( + $spins_table, + array('spins_available' => 0), + array('wheel_id' => $wheel_id), + array('%d'), + array('%d') + ); + + if ($result !== false) { + wp_send_json_success([ + 'message' => sprintf(__('All spins for wheel ID %d have been successfully reset to 0.', 'wheel-of-fortune'), $wheel_id), + 'affected_users' => $result + ]); + } else { + wp_send_json_error(['message' => __('An error occurred while resetting spins.', 'wheel-of-fortune')]); + } + } + + // --- NOVE METODE ZA CRON --- + public function add_custom_cron_schedules($schedules) { + // Lahko pustiš custom interval, če ga uporabljaš še kje drugje, sicer ni potreben + // $schedules['every_2_minutes'] = array( + // 'interval' => 120, + // 'display' => __('Every 2 minutes', 'wheel-of-fortune') + // ); + return $schedules; + } + + public function execute_daily_spin_cron() { + wheel_of_fortune_debug_log('CRON: "wof_daily_spin_event" triggered.'); + $wheel_id = get_option('wof_daily_spin_wheel_id'); + if (empty($wheel_id)) { + wheel_of_fortune_debug_log('CRON: No wheel selected for daily spin. Aborting.'); + return; + } + $users = get_users(array('fields' => 'ID')); + wheel_of_fortune_debug_log('CRON: Found ' . count($users) . ' users to process for wheel ID ' . $wheel_id); + foreach ($users as $user_id) { + $last_given_meta_key = '_wof_daily_spin_last_given_' . $wheel_id; + $last_given_timestamp = get_user_meta($user_id, $last_given_meta_key, true); + // Sprememba: 24 ur (23*HOUR_IN_SECONDS) + if (empty($last_given_timestamp) || (time() - $last_given_timestamp > 23 * HOUR_IN_SECONDS)) { + $ok = wheel_of_fortune_add_spins($user_id, 1, $wheel_id); + if ($ok) { + update_user_meta($user_id, $last_given_meta_key, time()); + wheel_of_fortune_debug_log("CRON: Assigned spin to user $user_id for wheel $wheel_id. Result: " . var_export($ok, true)); + } else { + wheel_of_fortune_debug_log("CRON: Failed to assign spin to user $user_id for wheel $wheel_id."); + } + } else { + wheel_of_fortune_debug_log("CRON: User $user_id already received a spin recently. Skipping."); } } - wp_send_json_error(__('Napaka pri brisanju.', 'wheel-of-fortune')); } + + // ---------------------------- } // Initialize plugin