Wheel_of_Fortune_Plugin/admin/coupon-test.php

357 lines
12 KiB
PHP

<?php
/**
* Testna skripta za preverjanje različnih načinov ustvarjanja WooCommerce kuponov
*/
// Prepreči neposreden dostop
if (!defined('ABSPATH')) {
exit;
}
/**
* Razred za testiranje različnih metod ustvarjanja WooCommerce kuponov
*/
class WheelCouponTester {
/**
* Zažene različne teste za ustvarjanje kuponov
*
* @return array Rezultati testov
*/
public static function run_tests() {
$results = array(
'success' => false,
'message' => '',
'tests' => array(),
'working_method' => null
);
// Preveri, ali je WooCommerce aktiven
if (!class_exists('WooCommerce')) {
$results['message'] = 'WooCommerce ni aktiven. Prosim aktivirajte WooCommerce vtičnik.';
return $results;
}
// Pridobi trenutnega uporabnika za testiranje
$user = wp_get_current_user();
if (!$user || !$user->exists()) {
$results['message'] = 'Uporabnik ni prijavljen. Prijavite se kot administrator.';
return $results;
}
// Nastavi testno kodo
$test_code = 'TEST-' . strtoupper(substr(bin2hex(random_bytes(4)), 0, 8));
// Test 1: Standardna WooCommerce API metoda
$results['tests']['standard_api'] = self::test_standard_api($test_code . '-1', $user);
// Test 2: Programsko ustvarjanje kupona
$results['tests']['programmatic'] = self::test_programmatic($test_code . '-2', $user);
// Test 3: Uporaba WC_Coupon z dodatnimi preverjanji
$results['tests']['wc_coupon_extended'] = self::test_wc_coupon_extended($test_code . '-3', $user);
// Test 4: Neposredno vstavljanje v podatkovno bazo
$results['tests']['direct_db'] = self::test_direct_db($test_code . '-4', $user);
// Počisti testne kupone
self::cleanup_test_coupons($test_code);
// Določi, katera metoda deluje
foreach ($results['tests'] as $method => $test_result) {
if ($test_result['success']) {
$results['working_method'] = $method;
$results['success'] = true;
break;
}
}
if ($results['success']) {
$results['message'] = 'Našli smo delujočo metodo za ustvarjanje kuponov: ' . $results['working_method'];
} else {
$results['message'] = 'Nobena testirana metoda ne deluje. Preverite dnevnik napak za več informacij.';
}
return $results;
}
/**
* Test 1: Standardna WooCommerce API metoda
*/
private static function test_standard_api($code, $user) {
$result = array(
'success' => false,
'message' => '',
'coupon_id' => 0
);
try {
$coupon = new WC_Coupon();
$coupon->set_code($code);
$coupon->set_description('Test coupon');
$coupon->set_discount_type('percent');
$coupon->set_amount(10);
$coupon->set_individual_use(true);
$coupon->set_usage_limit(1);
$coupon->set_usage_limit_per_user(1);
$coupon->set_email_restrictions(array($user->user_email));
$coupon_id = $coupon->save();
if ($coupon_id) {
$result['success'] = true;
$result['message'] = 'Kupon uspešno ustvarjen z ID: ' . $coupon_id;
$result['coupon_id'] = $coupon_id;
} else {
$result['message'] = 'Napaka: Kupon ni bil ustvarjen (save() je vrnil 0)';
}
} catch (Exception $e) {
$result['message'] = 'Napaka: ' . $e->getMessage();
}
return $result;
}
/**
* Test 2: Programsko ustvarjanje kupona
*/
private static function test_programmatic($code, $user) {
$result = array(
'success' => false,
'message' => '',
'coupon_id' => 0
);
try {
// Ustvari nov post tipa shop_coupon
$coupon_data = array(
'post_title' => $code,
'post_content' => '',
'post_status' => 'publish',
'post_author' => $user->ID,
'post_type' => 'shop_coupon'
);
$coupon_id = wp_insert_post($coupon_data);
if (!is_wp_error($coupon_id)) {
// Dodaj meta podatke za kupon
update_post_meta($coupon_id, 'discount_type', 'percent');
update_post_meta($coupon_id, 'coupon_amount', '10');
update_post_meta($coupon_id, 'individual_use', 'yes');
update_post_meta($coupon_id, 'usage_limit', '1');
update_post_meta($coupon_id, 'usage_limit_per_user', '1');
update_post_meta($coupon_id, 'customer_email', array($user->user_email));
$result['success'] = true;
$result['message'] = 'Kupon uspešno ustvarjen z ID: ' . $coupon_id;
$result['coupon_id'] = $coupon_id;
} else {
$result['message'] = 'Napaka: ' . $coupon_id->get_error_message();
}
} catch (Exception $e) {
$result['message'] = 'Napaka: ' . $e->getMessage();
}
return $result;
}
/**
* Test 3: Uporaba WC_Coupon z dodatnimi preverjanji
*/
private static function test_wc_coupon_extended($code, $user) {
$result = array(
'success' => false,
'message' => '',
'coupon_id' => 0
);
try {
// Preveri, ali koda že obstaja
$existing_id = wc_get_coupon_id_by_code($code);
if ($existing_id) {
$result['message'] = 'Napaka: Kupon s to kodo že obstaja (ID: ' . $existing_id . ')';
return $result;
}
// Ustvari nov kupon z dodatnimi preverjanji
$coupon = new WC_Coupon();
$coupon->set_code($code);
$coupon->set_description('Test coupon with extended checks');
$coupon->set_discount_type('percent');
$coupon->set_amount(10);
$coupon->set_individual_use(true);
$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('+7 days'));
$coupon_id = $coupon->save();
// Preveri, ali je kupon res ustvarjen
if ($coupon_id) {
$verification_id = wc_get_coupon_id_by_code($code);
if ($verification_id && $verification_id == $coupon_id) {
$result['success'] = true;
$result['message'] = 'Kupon uspešno ustvarjen in preverjen z ID: ' . $coupon_id;
$result['coupon_id'] = $coupon_id;
} else {
$result['message'] = 'Napaka: Kupon je bil ustvarjen, vendar preverjanje ni uspelo';
}
} else {
$result['message'] = 'Napaka: Kupon ni bil ustvarjen (save() je vrnil 0)';
}
} catch (Exception $e) {
$result['message'] = 'Napaka: ' . $e->getMessage();
}
return $result;
}
/**
* Test 4: Neposredno vstavljanje v podatkovno bazo
*/
private static function test_direct_db($code, $user) {
$result = array(
'success' => false,
'message' => '',
'coupon_id' => 0
);
try {
global $wpdb;
// Ustvari nov post tipa shop_coupon
$wpdb->insert(
$wpdb->posts,
array(
'post_title' => $code,
'post_name' => sanitize_title($code),
'post_content' => '',
'post_status' => 'publish',
'post_author' => $user->ID,
'post_type' => 'shop_coupon',
'post_date' => current_time('mysql'),
'post_date_gmt' => current_time('mysql', 1)
)
);
$coupon_id = $wpdb->insert_id;
if ($coupon_id) {
// Dodaj meta podatke za kupon
$meta_data = array(
'discount_type' => 'percent',
'coupon_amount' => '10',
'individual_use' => 'yes',
'usage_limit' => '1',
'usage_limit_per_user' => '1',
'customer_email' => serialize(array($user->user_email))
);
foreach ($meta_data as $meta_key => $meta_value) {
$wpdb->insert(
$wpdb->postmeta,
array(
'post_id' => $coupon_id,
'meta_key' => $meta_key,
'meta_value' => $meta_value
)
);
}
$result['success'] = true;
$result['message'] = 'Kupon uspešno ustvarjen neposredno v bazi z ID: ' . $coupon_id;
$result['coupon_id'] = $coupon_id;
} else {
$result['message'] = 'Napaka: Kupon ni bil ustvarjen v bazi';
}
} catch (Exception $e) {
$result['message'] = 'Napaka: ' . $e->getMessage();
}
return $result;
}
/**
* Počisti testne kupone
*/
private static function cleanup_test_coupons($prefix) {
global $wpdb;
// Poišči vse testne kupone
$test_coupons = $wpdb->get_results(
$wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_title LIKE %s AND post_type = 'shop_coupon'",
$prefix . '%'
)
);
// Izbriši najdene kupone
foreach ($test_coupons as $coupon) {
wp_delete_post($coupon->ID, true);
}
}
}
/**
* Funkcija za obdelavo AJAX zahteve za testiranje kuponov
*/
function wheel_test_coupons_ajax() {
// Preveri varnostno kodo
check_ajax_referer('wheel_admin_nonce', 'nonce');
// Preveri pravice
if (!current_user_can('manage_options')) {
wp_send_json_error(array('message' => 'Nimate pravic za izvedbo tega dejanja.'));
return;
}
// Zaženi teste
$results = WheelCouponTester::run_tests();
// Vrni rezultate
if ($results['success']) {
wp_send_json_success($results);
} else {
wp_send_json_error($results);
}
}
add_action('wp_ajax_wheel_test_coupons', 'wheel_test_coupons_ajax');
/**
* Shrani najboljšo metodo za ustvarjanje kuponov
*/
function wheel_save_best_coupon_method() {
// Preveri varnostno kodo
check_ajax_referer('wheel_admin_nonce', 'nonce');
// Preveri pravice
if (!current_user_can('manage_options')) {
wp_send_json_error(array('message' => 'Nimate pravic za izvedbo tega dejanja.'));
return;
}
// Preveri, ali je metoda podana
if (!isset($_POST['method']) || empty($_POST['method'])) {
wp_send_json_error(array('message' => 'Metoda ni podana.'));
return;
}
$method = sanitize_text_field($_POST['method']);
$valid_methods = array('standard_api', 'programmatic', 'wc_coupon_extended', 'direct_db');
if (!in_array($method, $valid_methods)) {
wp_send_json_error(array('message' => 'Neveljavna metoda.'));
return;
}
// Shrani najboljšo metodo
update_option('wheel_best_coupon_method', $method);
wp_send_json_success(array(
'message' => sprintf(__('Metoda %s je bila uspešno shranjena kot najboljša metoda za ustvarjanje kuponov.', 'wheel-of-fortune'), $method)
));
}
add_action('wp_ajax_wheel_save_best_coupon_method', 'wheel_save_best_coupon_method');