2593 lines
97 KiB
PHP
2593 lines
97 KiB
PHP
<?php
|
|
/**
|
|
* Slovenia Bike Tours functions and definitions
|
|
*/
|
|
|
|
// Registracija potrebnih WordPress funkcionalnosti
|
|
function grilctours_setup() {
|
|
// Add default posts and comments RSS feed links to head.
|
|
add_theme_support('automatic-feed-links');
|
|
|
|
// Let WordPress manage the document title.
|
|
add_theme_support('title-tag');
|
|
|
|
// Enable support for Post Thumbnails on posts and pages.
|
|
add_theme_support('post-thumbnails');
|
|
|
|
// Add support for custom logo
|
|
add_theme_support('custom-logo', array(
|
|
'height' => 100,
|
|
'width' => 300,
|
|
'flex-height' => true,
|
|
'flex-width' => true,
|
|
));
|
|
|
|
// Registriraj navigacijske menije
|
|
register_nav_menus(array(
|
|
'primary' => esc_html__('Primary Menu', 'grilctours'),
|
|
'footer' => esc_html__('Footer Menu', 'grilctours'),
|
|
));
|
|
}
|
|
add_action('after_setup_theme', 'grilctours_setup');
|
|
|
|
/**
|
|
* Registracija stilov in skript
|
|
*/
|
|
function grilctours_scripts() {
|
|
// Glavni CSS
|
|
wp_enqueue_style('grilctours-style', get_stylesheet_uri());
|
|
|
|
// Google Fonts
|
|
wp_enqueue_style('google-fonts', 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
|
|
|
|
// Glavni JavaScript
|
|
wp_enqueue_script('grilctours-script', get_template_directory_uri() . '/js/script.js', array('jquery'), '1.0.0', true);
|
|
}
|
|
add_action('wp_enqueue_scripts', 'grilctours_scripts');
|
|
|
|
// Dodaj podporo za media uploader v admin
|
|
function grilctours_admin_scripts($hook) {
|
|
global $post_type;
|
|
|
|
// Naloži skripte za edit in add new strani za individual_tour in experience_journey
|
|
if (($hook == 'post.php' || $hook == 'post-new.php') && ($post_type == 'individual_tour' || $post_type == 'experience_journey')) {
|
|
wp_enqueue_media();
|
|
wp_enqueue_script('grilctours-admin-script', get_template_directory_uri() . '/admin-scripts.js', array('jquery'), '1.0.0', true);
|
|
}
|
|
}
|
|
add_action('admin_enqueue_scripts', 'grilctours_admin_scripts');
|
|
|
|
// Registracija Custom Post Type za Experience Journey
|
|
function register_experience_journey_post_type() {
|
|
$labels = array(
|
|
'name' => 'Experience Journeys',
|
|
'singular_name' => 'Experience Journey',
|
|
'menu_name' => 'Experience Journeys',
|
|
'add_new' => 'Add New Journey',
|
|
'add_new_item' => 'Add New Journey',
|
|
'edit_item' => 'Edit Journey',
|
|
'new_item' => 'New Journey',
|
|
'view_item' => 'View Journey',
|
|
'search_items' => 'Search Journeys',
|
|
'not_found' => 'No journeys found',
|
|
'not_found_in_trash' => 'No journeys found in Trash'
|
|
);
|
|
|
|
$args = array(
|
|
'labels' => $labels,
|
|
'public' => true,
|
|
'has_archive' => true,
|
|
'menu_icon' => 'dashicons-palmtree',
|
|
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
|
|
'rewrite' => array('slug' => 'journeys'),
|
|
'show_in_rest' => true,
|
|
'menu_position' => 5
|
|
);
|
|
|
|
register_post_type('experience_journey', $args);
|
|
}
|
|
add_action('init', 'register_experience_journey_post_type');
|
|
|
|
// Registracija Custom Post Type za Individual Tour
|
|
function register_individual_tour_post_type() {
|
|
$labels = array(
|
|
'name' => 'Individual Tours',
|
|
'singular_name' => 'Individual Tour',
|
|
'menu_name' => 'Individual Tours',
|
|
'add_new' => 'Add New Tour',
|
|
'add_new_item' => 'Add New Tour',
|
|
'edit_item' => 'Edit Tour',
|
|
'new_item' => 'New Tour',
|
|
'view_item' => 'View Tour',
|
|
'search_items' => 'Search Tours',
|
|
'not_found' => 'No tours found',
|
|
'not_found_in_trash' => 'No tours found in Trash'
|
|
);
|
|
|
|
$args = array(
|
|
'labels' => $labels,
|
|
'public' => true,
|
|
'has_archive' => true,
|
|
'menu_icon' => 'dashicons-location',
|
|
'supports' => array('title', 'editor', 'thumbnail'),
|
|
'rewrite' => array('slug' => 'tours'),
|
|
'show_in_rest' => true,
|
|
'menu_position' => 6
|
|
);
|
|
|
|
register_post_type('individual_tour', $args);
|
|
}
|
|
add_action('init', 'register_individual_tour_post_type');
|
|
|
|
// Vključi datoteko za meta polja tur
|
|
require_once get_template_directory() . '/tour-meta-fields.php';
|
|
|
|
// Registracija meta boxov za Experience Journey
|
|
function register_experience_journey_meta_boxes() {
|
|
add_meta_box(
|
|
'experience_journey_details',
|
|
'Journey Details',
|
|
'render_experience_journey_meta_box',
|
|
'experience_journey',
|
|
'normal',
|
|
'high'
|
|
);
|
|
}
|
|
add_action('add_meta_boxes', 'register_experience_journey_meta_boxes');
|
|
|
|
// Render meta box za Experience Journey
|
|
function render_experience_journey_meta_box($post) {
|
|
$target_audience = get_post_meta($post->ID, '_target_audience', true);
|
|
$journey_image = get_post_meta($post->ID, '_journey_image', true);
|
|
$short_title = get_post_meta($post->ID, '_short_title', true);
|
|
$page_title = get_post_meta($post->ID, '_page_title', true);
|
|
|
|
wp_nonce_field('experience_journey_nonce', 'experience_journey_nonce');
|
|
?>
|
|
<div class="journey-meta-box">
|
|
<p>
|
|
<label for="short_title"><strong>Short Title (for Homepage)</strong></label>
|
|
<input type="text" id="short_title" name="short_title" class="widefat" value="<?php echo esc_attr($short_title); ?>">
|
|
<span class="description">Enter a short title that will be displayed on the homepage (e.g. "One Day Experience")</span>
|
|
</p>
|
|
|
|
<p>
|
|
<label for="page_title"><strong>Page Title</strong></label>
|
|
<input type="text" id="page_title" name="page_title" class="widefat" value="<?php echo esc_attr($page_title); ?>">
|
|
<span class="description">Enter the title that will be displayed when viewing this experience journey (e.g. "One Day Tours")</span>
|
|
</p>
|
|
|
|
<p>
|
|
<label><strong>Journey Image</strong></label><br>
|
|
<div class="journey-image-upload">
|
|
<input type="hidden" name="journey_image" id="journey_image" value="<?php echo esc_attr($journey_image); ?>">
|
|
<img src="<?php echo $journey_image ? esc_url($journey_image) : ''; ?>"
|
|
style="max-width: 300px; <?php echo !$journey_image ? 'display: none;' : ''; ?>"
|
|
class="journey-image-preview">
|
|
<br>
|
|
<button type="button" class="upload-journey-image button">Upload Image</button>
|
|
<button type="button" class="remove-journey-image button" <?php echo !$journey_image ? 'style="display: none;"' : ''; ?>>Remove Image</button>
|
|
<p class="description">Upload an image that will be displayed as the journey's main image.</p>
|
|
</div>
|
|
</p>
|
|
|
|
<p>
|
|
<label for="target_audience"><strong>Target Audience</strong></label>
|
|
<textarea id="target_audience" name="target_audience" class="widefat" rows="5"><?php echo esc_textarea($target_audience); ?></textarea>
|
|
<span class="description">Describe who this journey is designed for.</span>
|
|
</p>
|
|
</div>
|
|
|
|
<script>
|
|
jQuery(document).ready(function($) {
|
|
// Image upload
|
|
$('.upload-journey-image').click(function(e) {
|
|
e.preventDefault();
|
|
|
|
var image = wp.media({
|
|
title: 'Upload Journey Image',
|
|
multiple: false
|
|
}).open()
|
|
.on('select', function() {
|
|
var uploaded_image = image.state().get('selection').first();
|
|
var image_url = uploaded_image.toJSON().url;
|
|
|
|
$('#journey_image').val(image_url);
|
|
$('.journey-image-preview').attr('src', image_url).show();
|
|
$('.remove-journey-image').show();
|
|
});
|
|
});
|
|
|
|
// Remove image
|
|
$('.remove-journey-image').click(function(e) {
|
|
e.preventDefault();
|
|
$('#journey_image').val('');
|
|
$('.journey-image-preview').attr('src', '').hide();
|
|
$(this).hide();
|
|
});
|
|
});
|
|
</script>
|
|
<?php
|
|
}
|
|
|
|
// Shrani meta podatke za Experience Journey
|
|
function save_experience_journey_meta($post_id) {
|
|
if (!isset($_POST['experience_journey_nonce']) || !wp_verify_nonce($_POST['experience_journey_nonce'], 'experience_journey_nonce')) {
|
|
return;
|
|
}
|
|
|
|
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
|
|
return;
|
|
}
|
|
|
|
if (!current_user_can('edit_post', $post_id)) {
|
|
return;
|
|
}
|
|
|
|
if (isset($_POST['short_title'])) {
|
|
update_post_meta($post_id, '_short_title', sanitize_text_field($_POST['short_title']));
|
|
}
|
|
|
|
if (isset($_POST['page_title'])) {
|
|
update_post_meta($post_id, '_page_title', sanitize_text_field($_POST['page_title']));
|
|
}
|
|
|
|
if (isset($_POST['target_audience'])) {
|
|
update_post_meta($post_id, '_target_audience', sanitize_textarea_field($_POST['target_audience']));
|
|
}
|
|
|
|
if (isset($_POST['journey_image'])) {
|
|
update_post_meta($post_id, '_journey_image', esc_url_raw($_POST['journey_image']));
|
|
}
|
|
}
|
|
add_action('save_post_experience_journey', 'save_experience_journey_meta');
|
|
|
|
// Funkcija za pošiljanje e-pošte iz obrazca za povpraševanje
|
|
function handle_inquiry_form() {
|
|
// Preveri nonce za varnost
|
|
check_ajax_referer('inquiry_nonce', 'security');
|
|
|
|
// Pridobi podatke iz zahtevka
|
|
$tour_title = sanitize_text_field($_POST['tourTitle']);
|
|
$name = sanitize_text_field($_POST['name']);
|
|
$email = sanitize_email($_POST['email']);
|
|
$phone = sanitize_text_field($_POST['phone']);
|
|
$date = sanitize_text_field($_POST['date']);
|
|
$participants = intval($_POST['participants']);
|
|
$country = sanitize_text_field($_POST['country']);
|
|
$extras = isset($_POST['extras']) ? $_POST['extras'] : array();
|
|
$message = sanitize_textarea_field($_POST['message']);
|
|
|
|
// Pripravi seznam izbranih dodatnih storitev
|
|
$extras_list = '';
|
|
if (!empty($extras)) {
|
|
$extras_list = "<ul>";
|
|
foreach ($extras as $extra) {
|
|
$extras_list .= "<li>" . sanitize_text_field($extra) . "</li>";
|
|
}
|
|
$extras_list .= "</ul>";
|
|
} else {
|
|
$extras_list = "None";
|
|
}
|
|
|
|
// Pripravi vsebino e-pošte
|
|
$to = 'dincija@gmail.com';
|
|
$subject = 'New Tour Inquiry: ' . $tour_title;
|
|
|
|
$body = "
|
|
<html>
|
|
<head>
|
|
<title>New Tour Inquiry</title>
|
|
<style>
|
|
body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
|
|
.inquiry-details { background-color: #f9f9f9; padding: 20px; border-radius: 5px; }
|
|
h2 { color: #003d5b; }
|
|
.label { font-weight: bold; }
|
|
ul { margin: 5px 0; padding-left: 20px; }
|
|
.message { margin-top: 15px; padding: 15px; background-color: #fff; border-left: 4px solid #003d5b; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h2>New Inquiry for: $tour_title</h2>
|
|
<div class='inquiry-details'>
|
|
<p><span class='label'>Name:</span> $name</p>
|
|
<p><span class='label'>Email:</span> $email</p>
|
|
<p><span class='label'>Phone:</span> " . ($phone ? $phone : "Not provided") . "</p>
|
|
<p><span class='label'>Date:</span> $date</p>
|
|
<p><span class='label'>Number of participants:</span> $participants</p>
|
|
<p><span class='label'>Country:</span> " . ($country ? $country : "Not provided") . "</p>
|
|
<p><span class='label'>Selected extras:</span> $extras_list</p>
|
|
<div class='message'>
|
|
<p><span class='label'>Message:</span></p>
|
|
<p>" . nl2br($message) . "</p>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
";
|
|
|
|
// Nastavi glave za HTML e-pošto
|
|
$headers = array(
|
|
'Content-Type: text/html; charset=UTF-8',
|
|
'From: ' . $name . ' <' . $email . '>',
|
|
'Reply-To: ' . $email
|
|
);
|
|
|
|
// Pošlji e-pošto
|
|
$sent = wp_mail($to, $subject, $body, $headers);
|
|
|
|
// Pošlji odgovor
|
|
if ($sent) {
|
|
wp_send_json_success(array('message' => 'Inquiry sent successfully!'));
|
|
} else {
|
|
wp_send_json_error(array('message' => 'Failed to send inquiry. Please try again later.'));
|
|
}
|
|
|
|
wp_die();
|
|
}
|
|
|
|
// Registriraj AJAX akcije
|
|
add_action('wp_ajax_send_inquiry', 'handle_inquiry_form');
|
|
add_action('wp_ajax_nopriv_send_inquiry', 'handle_inquiry_form');
|
|
|
|
// Funkcija za testiranje pošiljanja e-pošte
|
|
function test_email_sending() {
|
|
$to = 'dincija@gmail.com';
|
|
$subject = 'Test Email from Slovenia Bike Tours';
|
|
$body = '
|
|
<html>
|
|
<head>
|
|
<title>Test Email</title>
|
|
<style>
|
|
body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
|
|
.test-message { background-color: #f9f9f9; padding: 20px; border-radius: 5px; }
|
|
h2 { color: #003d5b; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h2>Test Email</h2>
|
|
<div class="test-message">
|
|
<p>This is a test email from Slovenia Bike Tours website.</p>
|
|
<p>If you are receiving this, the email functionality is working correctly.</p>
|
|
<p>Time of sending: ' . current_time('mysql') . '</p>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
';
|
|
|
|
$headers = array(
|
|
'Content-Type: text/html; charset=UTF-8',
|
|
'From: Slovenia Bike Tours <wordpress@' . $_SERVER['HTTP_HOST'] . '>',
|
|
);
|
|
|
|
$sent = wp_mail($to, $subject, $body, $headers);
|
|
|
|
return $sent ? 'Email sent successfully!' : 'Failed to send email.';
|
|
}
|
|
|
|
// Dodaj REST API endpoint za testiranje e-pošte
|
|
function register_test_email_endpoint() {
|
|
register_rest_route('slovenia-bike-tours/v1', '/test-email', array(
|
|
'methods' => 'GET',
|
|
'callback' => 'test_email_sending',
|
|
'permission_callback' => function() {
|
|
return current_user_can('manage_options');
|
|
}
|
|
));
|
|
}
|
|
add_action('rest_api_init', 'register_test_email_endpoint');
|
|
|
|
/**
|
|
* Dodaj nastavitve za footer v WordPress Customizer
|
|
*/
|
|
function grilctours_customize_register($wp_customize) {
|
|
// Sekcija za footer
|
|
$wp_customize->add_section('footer_settings', array(
|
|
'title' => __('Footer Settings', 'grilctours'),
|
|
'priority' => 120,
|
|
));
|
|
|
|
// Footer opis
|
|
$wp_customize->add_setting('footer_description', array(
|
|
'default' => 'We\'re a travel agency and tour operator for holidays, activities, and other unforgettable experiences in every corner of the Europe, and for every sort of traveler.',
|
|
'sanitize_callback' => 'wp_kses_post',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control('footer_description', array(
|
|
'label' => __('Footer Description', 'grilctours'),
|
|
'section' => 'footer_settings',
|
|
'type' => 'textarea',
|
|
));
|
|
|
|
// Kontaktni podatki
|
|
$wp_customize->add_setting('footer_email', array(
|
|
'default' => 'info@europewonder.com',
|
|
'sanitize_callback' => 'sanitize_email',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control('footer_email', array(
|
|
'label' => __('Email Address', 'grilctours'),
|
|
'section' => 'footer_settings',
|
|
'type' => 'email',
|
|
));
|
|
|
|
$wp_customize->add_setting('footer_phone', array(
|
|
'default' => '+386 (0) 31 332 823',
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control('footer_phone', array(
|
|
'label' => __('Phone Number', 'grilctours'),
|
|
'section' => 'footer_settings',
|
|
'type' => 'text',
|
|
));
|
|
|
|
$wp_customize->add_setting('footer_whatsapp', array(
|
|
'default' => '38631332823',
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control('footer_whatsapp', array(
|
|
'label' => __('WhatsApp Number', 'grilctours'),
|
|
'section' => 'footer_settings',
|
|
'type' => 'text',
|
|
'description' => __('Enter your WhatsApp number (numbers only, no spaces or special characters)', 'grilctours'),
|
|
));
|
|
|
|
// Calendly link
|
|
$wp_customize->add_setting('calendly_link', array(
|
|
'default' => '',
|
|
'sanitize_callback' => 'esc_url_raw',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control('calendly_link', array(
|
|
'label' => __('Calendly Link', 'grilctours'),
|
|
'section' => 'footer_settings',
|
|
'type' => 'url',
|
|
'description' => __('Enter your Calendly link for booking consultations in the footer', 'grilctours'),
|
|
));
|
|
}
|
|
add_action('customize_register', 'grilctours_customize_register');
|
|
|
|
/**
|
|
* Dodaj nastavitve za front page v WordPress Customizer
|
|
*/
|
|
function grilctours_customize_front_page($wp_customize) {
|
|
// Hero sekcija
|
|
$wp_customize->add_section('hero_settings', array(
|
|
'title' => __('Hero Section Settings', 'grilctours'),
|
|
'priority' => 110,
|
|
));
|
|
|
|
// Hero naslov
|
|
$wp_customize->add_setting('hero_title', array(
|
|
'default' => 'Europe Wonder',
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control('hero_title', array(
|
|
'label' => __('Hero Title', 'grilctours'),
|
|
'section' => 'hero_settings',
|
|
'type' => 'text',
|
|
));
|
|
|
|
// Hero podnaslov
|
|
$wp_customize->add_setting('hero_subtitle', array(
|
|
'default' => 'Your path to unforgettable experiences',
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control('hero_subtitle', array(
|
|
'label' => __('Hero Subtitle', 'grilctours'),
|
|
'section' => 'hero_settings',
|
|
'type' => 'text',
|
|
));
|
|
|
|
// Hero ozadje
|
|
$wp_customize->add_setting('hero_background', array(
|
|
'default' => get_theme_file_uri('images/hero.jpg'),
|
|
'sanitize_callback' => 'esc_url_raw',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control(new WP_Customize_Image_Control($wp_customize, 'hero_background', array(
|
|
'label' => __('Hero Background Image', 'grilctours'),
|
|
'section' => 'hero_settings',
|
|
)));
|
|
|
|
// Tours sekcija
|
|
$wp_customize->add_section('tours_settings', array(
|
|
'title' => __('Tours Section Settings', 'grilctours'),
|
|
'priority' => 115,
|
|
));
|
|
|
|
// Tours naslov
|
|
$wp_customize->add_setting('tours_title', array(
|
|
'default' => 'Experience Journeys',
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control('tours_title', array(
|
|
'label' => __('Tours Section Title', 'grilctours'),
|
|
'section' => 'tours_settings',
|
|
'type' => 'text',
|
|
));
|
|
|
|
// Video sekcija
|
|
$wp_customize->add_section('video_settings', array(
|
|
'title' => __('Video Section Settings', 'grilctours'),
|
|
'priority' => 116,
|
|
));
|
|
|
|
// Video URL
|
|
$wp_customize->add_setting('video_url', array(
|
|
'default' => 'https://player.vimeo.com/video/1061260497?h=7fb6d020c3',
|
|
'sanitize_callback' => 'esc_url_raw',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control('video_url', array(
|
|
'label' => __('Video URL (Vimeo)', 'grilctours'),
|
|
'section' => 'video_settings',
|
|
'type' => 'url',
|
|
'description' => __('Enter the Vimeo video URL', 'grilctours'),
|
|
));
|
|
}
|
|
add_action('customize_register', 'grilctours_customize_front_page');
|
|
|
|
/**
|
|
* Dodaj nastavitve za logotipe v WordPress Customizer
|
|
*/
|
|
function grilctours_customize_logos($wp_customize) {
|
|
// Sekcija za logotipe
|
|
$wp_customize->add_section('logo_settings', array(
|
|
'title' => __('Logo Settings', 'grilctours'),
|
|
'priority' => 105,
|
|
));
|
|
|
|
// Header logo
|
|
$wp_customize->add_setting('header_logo', array(
|
|
'default' => get_theme_file_uri('images/logo.png'),
|
|
'sanitize_callback' => 'esc_url_raw',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control(new WP_Customize_Image_Control($wp_customize, 'header_logo', array(
|
|
'label' => __('Header Logo', 'grilctours'),
|
|
'section' => 'logo_settings',
|
|
'description' => __('Upload logo for the header (recommended size: 40px height)', 'grilctours'),
|
|
)));
|
|
|
|
// Footer logo
|
|
$wp_customize->add_setting('footer_logo', array(
|
|
'default' => get_theme_file_uri('images/logo-footer.png'),
|
|
'sanitize_callback' => 'esc_url_raw',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control(new WP_Customize_Image_Control($wp_customize, 'footer_logo', array(
|
|
'label' => __('Footer Logo', 'grilctours'),
|
|
'section' => 'logo_settings',
|
|
'description' => __('Upload logo for the footer (recommended size: 40px height)', 'grilctours'),
|
|
)));
|
|
}
|
|
add_action('customize_register', 'grilctours_customize_logos');
|
|
|
|
/**
|
|
* Customizer funkcije za razporejanje Experience Journeys
|
|
*/
|
|
function grilctours_customize_journey_order($wp_customize) {
|
|
$wp_customize->add_section('experience_journey_order_section', array(
|
|
'title' => 'Razporeditev Experience Journeys',
|
|
'priority' => 30,
|
|
));
|
|
|
|
// Get all experience journeys
|
|
$args = array(
|
|
'post_type' => 'experience_journey',
|
|
'posts_per_page' => -1,
|
|
'post_status' => 'publish',
|
|
);
|
|
$journeys = get_posts($args);
|
|
$journey_choices = array();
|
|
|
|
if (!empty($journeys)) {
|
|
foreach ($journeys as $journey) {
|
|
$journey_choices[$journey->ID] = $journey->post_title;
|
|
}
|
|
}
|
|
|
|
// Add setting for journey order
|
|
$wp_customize->add_setting('experience_journey_order', array(
|
|
'default' => '',
|
|
'type' => 'option',
|
|
'capability' => 'edit_theme_options',
|
|
'transport' => 'refresh',
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
));
|
|
|
|
// Definiraj razred znotraj funkcije, samo ko je potreben
|
|
class Journey_Order_Control extends WP_Customize_Control {
|
|
public $type = 'journey_order';
|
|
public $journeys = array();
|
|
|
|
public function render_content() {
|
|
// Edinstveni ID za ta kontrolnik
|
|
$list_id = 'sortable-journey-list';
|
|
?>
|
|
<label>
|
|
<?php if (!empty($this->label)): ?>
|
|
<span class="customize-control-title"><?php echo esc_html($this->label); ?></span>
|
|
<?php endif; ?>
|
|
<?php if (!empty($this->description)): ?>
|
|
<span class="description customize-control-description"><?php echo esc_html($this->description); ?></span>
|
|
<?php endif; ?>
|
|
</label>
|
|
<?php if (!empty($this->journeys)): ?>
|
|
<ul id="<?php echo esc_attr($list_id); ?>" class="journey-sortable-list">
|
|
<?php foreach ($this->journeys as $journey_id => $journey_title): ?>
|
|
<div class="sortable-journey-item" data-journey-id="<?php echo esc_attr($journey_id); ?>">
|
|
<i class="dashicons dashicons-move"></i>
|
|
<?php echo esc_html($journey_title); ?>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
</ul>
|
|
<input type="hidden" id="<?php echo esc_attr($this->id); ?>" name="<?php echo esc_attr($this->id); ?>" value="<?php echo esc_attr($this->value()); ?>" <?php $this->link(); ?> />
|
|
<?php else: ?>
|
|
<p>Ni najdenih Experience Journeys za razporejanje.</p>
|
|
<?php endif; ?>
|
|
<?php
|
|
}
|
|
}
|
|
|
|
// Add control for journey order
|
|
$wp_customize->add_control(new Journey_Order_Control(
|
|
$wp_customize,
|
|
'experience_journey_order_control',
|
|
array(
|
|
'label' => 'Razporeditev Experience Journeys',
|
|
'section' => 'experience_journey_order_section',
|
|
'settings' => 'experience_journey_order',
|
|
'journeys' => $journey_choices,
|
|
)
|
|
));
|
|
}
|
|
add_action('customize_register', 'grilctours_customize_journey_order');
|
|
|
|
/**
|
|
* Dodaj JavaScript in CSS za Customizer
|
|
*/
|
|
function grilctours_customizer_scripts() {
|
|
wp_enqueue_script('jquery-ui-sortable');
|
|
|
|
// Dodaj JavaScript za sortiranje
|
|
$script = "
|
|
jQuery(document).ready(function($) {
|
|
// Počakaj, da se DOM naloži, preden inicializiramo sortable
|
|
setTimeout(function() {
|
|
console.log('Inicializacija journey sortable seznama...');
|
|
|
|
// Poišči sortable seznam
|
|
var sortableList = $('.journey-sortable-list');
|
|
|
|
if (sortableList.length) {
|
|
console.log('Sortable seznam najden, inicializam...');
|
|
|
|
sortableList.sortable({
|
|
items: '.sortable-journey-item',
|
|
handle: '.dashicons-move',
|
|
placeholder: 'sortable-journey-placeholder',
|
|
update: function(event, ui) {
|
|
console.log('Vrstni red posodobljen');
|
|
|
|
// Zberi ID-je v novem vrstnem redu
|
|
var ids = [];
|
|
$('.sortable-journey-item').each(function() {
|
|
ids.push($(this).data('journey-id'));
|
|
});
|
|
|
|
// Posodobi skrito polje
|
|
var inputField = sortableList.siblings('input[type=\"hidden\"]');
|
|
inputField.val(ids.join(',')).trigger('change');
|
|
|
|
console.log('Nova vrednost:', ids.join(','));
|
|
}
|
|
});
|
|
|
|
console.log('Sortable inicializiran!');
|
|
} else {
|
|
console.log('Sortable seznam ni bil najden!');
|
|
}
|
|
}, 1000);
|
|
});
|
|
";
|
|
|
|
wp_add_inline_script('jquery-ui-sortable', $script);
|
|
|
|
// Dodaj CSS stile
|
|
$style = "
|
|
.journey-sortable-list {
|
|
margin: 15px 0;
|
|
padding: 0;
|
|
list-style: none;
|
|
}
|
|
|
|
.sortable-journey-item {
|
|
background: #fff;
|
|
border: 1px solid #ddd;
|
|
padding: 10px;
|
|
margin-bottom: 10px;
|
|
display: flex;
|
|
align-items: center;
|
|
cursor: move;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.sortable-journey-item .dashicons-move {
|
|
margin-right: 10px;
|
|
color: #555;
|
|
}
|
|
|
|
.sortable-journey-item:hover {
|
|
background: #f9f9f9;
|
|
border-color: #999;
|
|
}
|
|
|
|
.sortable-journey-placeholder {
|
|
border: 2px dashed #bbb;
|
|
background: #f7f7f7;
|
|
height: 40px;
|
|
margin-bottom: 10px;
|
|
}
|
|
";
|
|
|
|
wp_add_inline_style('customize-controls', $style);
|
|
}
|
|
add_action('customize_controls_enqueue_scripts', 'grilctours_customizer_scripts');
|
|
|
|
/**
|
|
* Omogoči admin skripte za posamezne tipe objav
|
|
*/
|
|
// ... existing code ...
|
|
|
|
// Začasno odstranjeno zaradi napake
|
|
// require_once get_template_directory() . '/mytheme-customizer.php';
|
|
|
|
// Preveri če je WooCommerce aktiviran
|
|
function is_woocommerce_activated() {
|
|
return class_exists('WooCommerce');
|
|
}
|
|
|
|
// Vključi Stripe PHP knjižnico in inicializiraj samo če je WooCommerce aktiviran
|
|
function init_stripe() {
|
|
if (!is_woocommerce_activated()) {
|
|
return;
|
|
}
|
|
|
|
// Preveri če obstaja composer autoload
|
|
$autoload_path = get_template_directory() . '/vendor/autoload.php';
|
|
if (!file_exists($autoload_path)) {
|
|
error_log('Stripe PHP library not found. Please run composer require stripe/stripe-php');
|
|
return;
|
|
}
|
|
|
|
// Vključi composer autoload
|
|
require_once $autoload_path;
|
|
|
|
// Preveri če je Stripe razred na voljo
|
|
if (!class_exists('\Stripe\Stripe')) {
|
|
error_log('Stripe PHP class not found after including autoload.php');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
// Nastavi Stripe API ključ
|
|
\Stripe\Stripe::setApiKey('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');
|
|
} catch (Exception $e) {
|
|
error_log('Error initializing Stripe: ' . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
// Inicializiraj Stripe po tem, ko je WordPress naložen
|
|
add_action('init', 'init_stripe', 20);
|
|
|
|
// AJAX handler za obdelavo rezervacije ture
|
|
function process_tour_booking() {
|
|
if (!is_woocommerce_activated()) {
|
|
wp_send_json_error(['message' => 'WooCommerce is not activated']);
|
|
return;
|
|
}
|
|
|
|
check_ajax_referer('process_tour_booking', 'security');
|
|
|
|
try {
|
|
// Preveri obvezna polja in izpiši natančen razlog napake
|
|
$required_fields = [
|
|
'name' => 'Full Name',
|
|
'email' => 'Email',
|
|
'date' => 'Departure Date',
|
|
'participants' => 'Number of Participants'
|
|
];
|
|
|
|
$missing_fields = [];
|
|
|
|
foreach ($required_fields as $field => $label) {
|
|
if (empty($_POST[$field])) {
|
|
$missing_fields[] = $label;
|
|
}
|
|
}
|
|
|
|
if (!empty($missing_fields)) {
|
|
throw new Exception('The following fields are required: ' . implode(', ', $missing_fields));
|
|
}
|
|
|
|
// Dodatno preverjanje veljavnosti e-pošte
|
|
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
|
|
throw new Exception('Please enter a valid email address.');
|
|
}
|
|
|
|
// Preveri, da je število udeležencev najmanj 1
|
|
if (intval($_POST['participants']) < 1) {
|
|
throw new Exception('Number of participants must be at least 1.');
|
|
}
|
|
|
|
// Datum mora biti v prihodnosti
|
|
$departure_date = new DateTime($_POST['date']);
|
|
$today = new DateTime();
|
|
$today->setTime(0, 0, 0); // Nastavi čas na začetek dneva
|
|
|
|
if ($departure_date < $today) {
|
|
throw new Exception('Departure date must be in the future.');
|
|
}
|
|
|
|
// Ustvari WooCommerce naročilo
|
|
$order = wc_create_order();
|
|
|
|
// Dodaj podatke o stranki
|
|
$order->set_billing_first_name($_POST['name']);
|
|
$order->set_billing_email($_POST['email']);
|
|
|
|
// Dodaj podatke o turi
|
|
$tour_id = intval($_POST['tour_id']);
|
|
$tour_name = sanitize_text_field($_POST['tour_name']);
|
|
$participants = intval($_POST['participants']);
|
|
$total_price = floatval($_POST['total_price']);
|
|
|
|
// Pridobi WooCommerce produkt preko SKU-ja
|
|
$product_id = wc_get_product_id_by_sku('tour-' . $tour_id);
|
|
if (!$product_id) {
|
|
// Poskusimo pridobiti produkt direktno po ID-ju
|
|
$product = wc_get_product($tour_id);
|
|
if (!$product) {
|
|
throw new Exception('Tour product not found. Please contact administrator.');
|
|
}
|
|
} else {
|
|
$product = wc_get_product($product_id);
|
|
if (!$product) {
|
|
throw new Exception('Failed to load tour product');
|
|
}
|
|
}
|
|
|
|
// Dodaj produkt v naročilo
|
|
$item_id = $order->add_product($product, $participants);
|
|
|
|
// Dodaj datum odhoda kot meta podatek postavke
|
|
if ($item_id) {
|
|
wc_add_order_item_meta($item_id, '_tour_date', sanitize_text_field($_POST['date']));
|
|
}
|
|
|
|
// Dodaj dodatke, če obstajajo
|
|
if (!empty($_POST['extras'])) {
|
|
$extras = json_decode(stripslashes($_POST['extras']), true);
|
|
if (!is_array($extras)) {
|
|
$extras = json_decode($_POST['extras'], true); // Poskusi brez stripslashes
|
|
}
|
|
|
|
if (is_array($extras)) {
|
|
foreach ($extras as $extra) {
|
|
// Preveri, da ima ekstra vse potrebne podatke
|
|
if (empty($extra['name']) || !isset($extra['price'])) {
|
|
continue;
|
|
}
|
|
|
|
// Ustvari nov produkt za dodatek
|
|
$extra_product = new WC_Product_Simple();
|
|
$extra_product->set_name($extra['name']);
|
|
$extra_product->set_regular_price(strval($extra['price']));
|
|
$extra_product->set_status('private');
|
|
$extra_product->set_catalog_visibility('hidden');
|
|
$extra_product->save();
|
|
|
|
// Dodaj dodatek v naročilo
|
|
$order->add_product($extra_product, 1);
|
|
|
|
// Dodaj meta podatke
|
|
$order->add_meta_data('_extra_' . sanitize_title($extra['name']), true);
|
|
|
|
// Izbriši začasni produkt
|
|
wp_delete_post($extra_product->get_id(), true);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Dodaj single supplement, če je potrebno
|
|
if (!empty($_POST['single_supplement']) && ($_POST['single_supplement'] === 'true' || $_POST['single_supplement'] === true)) {
|
|
$tour_duration = intval(get_post_meta($tour_id, '_tour_duration', true));
|
|
$single_supplement = 100 * $tour_duration; // 100€ na dan
|
|
$order->add_fee('Single Supplement', $single_supplement);
|
|
}
|
|
|
|
// Nastavi skupno ceno
|
|
$order->calculate_totals();
|
|
$order->set_total($total_price);
|
|
|
|
// Shrani meta podatke
|
|
$order->update_meta_data('_tour_date', sanitize_text_field($_POST['date']));
|
|
$order->update_meta_data('_participants', $participants);
|
|
|
|
// Preračunaj skupno vrednost in določi znesek plačila glede na izbrani tip plačila
|
|
$payment_type = isset($_POST['payment_type']) ? sanitize_text_field($_POST['payment_type']) : 'full';
|
|
$payment_amount = isset($_POST['payment_amount']) ? floatval($_POST['payment_amount']) : $total_price;
|
|
|
|
// Shrani informacije o plačilu
|
|
$order->update_meta_data('_payment_type', $payment_type);
|
|
|
|
if ($payment_type === 'partial') {
|
|
// Izračunaj zneske za delno plačilo
|
|
$deposit_amount = $payment_amount; // že nastavljen na 30% v JavaScript
|
|
$remaining_amount = $total_price - $deposit_amount;
|
|
|
|
// Shrani podatke o delnem plačilu
|
|
$order->update_meta_data('_deposit_amount', $deposit_amount);
|
|
$order->update_meta_data('_remaining_amount', $remaining_amount);
|
|
$order->update_meta_data('_is_deposit_paid', false);
|
|
$order->update_meta_data('_is_remaining_paid', false);
|
|
|
|
// Dodaj opombo naročilu o delnem plačilu
|
|
$order->add_order_note(sprintf(
|
|
'Partial payment selected. Deposit: €%.2f, Remaining: €%.2f',
|
|
$deposit_amount,
|
|
$remaining_amount
|
|
));
|
|
}
|
|
|
|
// Shrani naročilo
|
|
$order->save();
|
|
|
|
// Ustvari Stripe Payment Intent
|
|
try {
|
|
// Če je izbrano delno plačilo, uporabi znesek pologa namesto celotnega zneska
|
|
$payment_amount_cents = intval($payment_amount * 100); // Stripe uporablja cente
|
|
|
|
$payment_intent = \Stripe\PaymentIntent::create([
|
|
'amount' => $payment_amount_cents,
|
|
'currency' => 'eur',
|
|
'metadata' => [
|
|
'order_id' => $order->get_id(),
|
|
'tour_name' => $tour_name,
|
|
'tour_date' => $_POST['date'],
|
|
'payment_type' => $payment_type,
|
|
'total_price' => $total_price
|
|
]
|
|
]);
|
|
|
|
// Shrani Payment Intent ID v naročilo
|
|
$order->update_meta_data('_stripe_payment_intent', $payment_intent->id);
|
|
$order->save();
|
|
|
|
// Vrni uspeh in client secret
|
|
wp_send_json_success([
|
|
'client_secret' => $payment_intent->client_secret,
|
|
'thank_you_url' => $order->get_checkout_order_received_url(),
|
|
'order_id' => $order->get_id(),
|
|
'payment_type' => $payment_type,
|
|
'payment_amount' => $payment_amount
|
|
]);
|
|
} catch (\Stripe\Exception\ApiErrorException $e) {
|
|
// Če Stripe vrne napako, izbriši naročilo in vrni napako
|
|
$order->delete(true);
|
|
throw new Exception('Payment processing error: ' . $e->getMessage());
|
|
}
|
|
|
|
} catch (Exception $e) {
|
|
error_log('Tour booking error: ' . $e->getMessage());
|
|
wp_send_json_error(['message' => $e->getMessage()]);
|
|
}
|
|
}
|
|
add_action('wp_ajax_process_tour_booking', 'process_tour_booking');
|
|
add_action('wp_ajax_nopriv_process_tour_booking', 'process_tour_booking');
|
|
|
|
// Webhook handler za Stripe dogodke
|
|
function handle_stripe_webhook() {
|
|
$payload = @file_get_contents('php://input');
|
|
$event = null;
|
|
|
|
try {
|
|
$event = \Stripe\Event::constructFrom(
|
|
json_decode($payload, true)
|
|
);
|
|
} catch(\UnexpectedValueException $e) {
|
|
http_response_code(400);
|
|
exit();
|
|
}
|
|
|
|
if ($event->type === 'payment_intent.succeeded') {
|
|
$payment_intent = $event->data->object;
|
|
|
|
// Najdi WooCommerce naročilo
|
|
$orders = wc_get_orders([
|
|
'meta_key' => '_stripe_payment_intent',
|
|
'meta_value' => $payment_intent->id,
|
|
'limit' => 1
|
|
]);
|
|
|
|
if (!empty($orders)) {
|
|
$order = $orders[0];
|
|
|
|
// Pridobi podatke o plačilu
|
|
$payment_type = get_post_meta($order->get_id(), '_payment_type', true);
|
|
$payment_amount = $payment_intent->amount / 100; // Pretvori iz centov
|
|
|
|
if ($payment_type === 'partial') {
|
|
// Če gre za delno plačilo
|
|
$is_deposit_paid = get_post_meta($order->get_id(), '_is_deposit_paid', true);
|
|
|
|
if (!$is_deposit_paid) {
|
|
// Označi polog kot plačan
|
|
update_post_meta($order->get_id(), '_is_deposit_paid', true);
|
|
|
|
// Dodaj opombo naročilu
|
|
$deposit_amount = get_post_meta($order->get_id(), '_deposit_amount', true);
|
|
$remaining_amount = get_post_meta($order->get_id(), '_remaining_amount', true);
|
|
|
|
$order->add_order_note(sprintf(
|
|
'Deposit of €%.2f received. Remaining balance: €%.2f',
|
|
$deposit_amount,
|
|
$remaining_amount
|
|
));
|
|
|
|
// Posodobi status naročila na "on-hold" ali podobno
|
|
$order->update_status('on-hold', 'Deposit payment received. Awaiting final payment.');
|
|
} else {
|
|
// Če gre za plačilo preostalega zneska
|
|
update_post_meta($order->get_id(), '_is_remaining_paid', true);
|
|
$order->payment_complete($payment_intent->id);
|
|
$order->add_order_note('Final payment completed via Stripe (Payment Intent ID: ' . $payment_intent->id . ')');
|
|
}
|
|
} else {
|
|
// Če gre za polno plačilo, označi naročilo kot plačano
|
|
$order->payment_complete($payment_intent->id);
|
|
$order->add_order_note('Stripe payment completed (Payment Intent ID: ' . $payment_intent->id . ')');
|
|
}
|
|
|
|
$order->save();
|
|
}
|
|
}
|
|
|
|
http_response_code(200);
|
|
}
|
|
|
|
// Dodaj rewrite pravilo za Stripe webhook
|
|
function add_stripe_webhook_endpoint() {
|
|
add_rewrite_rule('^stripe-webhook/?$', 'index.php?stripe-webhook=1', 'top');
|
|
}
|
|
add_action('init', 'add_stripe_webhook_endpoint');
|
|
|
|
// Registriraj query var za webhook
|
|
function add_stripe_webhook_query_var($vars) {
|
|
$vars[] = 'stripe-webhook';
|
|
return $vars;
|
|
}
|
|
add_filter('query_vars', 'add_stripe_webhook_query_var');
|
|
|
|
// Poslušaj za webhook zahtevke
|
|
function listen_for_stripe_webhook() {
|
|
if (get_query_var('stripe-webhook')) {
|
|
handle_stripe_webhook();
|
|
exit;
|
|
}
|
|
}
|
|
add_action('parse_request', 'listen_for_stripe_webhook');
|
|
|
|
// Funkcija za kreiranje/posodabljanje WooCommerce produkta ob shranjevanju Individual Tour-a
|
|
function create_wc_product_from_tour($post_id) {
|
|
// Preveri če je WooCommerce aktiviran
|
|
if (!class_exists('WooCommerce')) {
|
|
return;
|
|
}
|
|
|
|
// Preveri če je post type Individual Tour
|
|
if (get_post_type($post_id) !== 'individual_tour') {
|
|
return;
|
|
}
|
|
|
|
// Preveri če je to avtomatsko shranjevanje
|
|
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
|
|
return;
|
|
}
|
|
|
|
// Pridobi podatke o turi
|
|
$tour_title = get_the_title($post_id);
|
|
$tour_price = floatval(get_post_meta($post_id, '_tour_price', true));
|
|
$tour_description = get_post_field('post_content', $post_id);
|
|
|
|
// Če cena ni nastavljena, nastavi na 0
|
|
if (!$tour_price) {
|
|
$tour_price = 0;
|
|
}
|
|
|
|
// Preveri če produkt že obstaja (uporabi SKU za povezavo)
|
|
$product_id = wc_get_product_id_by_sku('tour-' . $post_id);
|
|
|
|
if ($product_id) {
|
|
// Posodobi obstoječ produkt
|
|
$product = wc_get_product($product_id);
|
|
if ($product) {
|
|
$product->set_name($tour_title);
|
|
$product->set_regular_price(strval($tour_price));
|
|
$product->set_description($tour_description);
|
|
$product->save();
|
|
}
|
|
} else {
|
|
// Ustvari nov produkt
|
|
$product = new WC_Product_Simple();
|
|
|
|
$product->set_name($tour_title);
|
|
$product->set_regular_price(strval($tour_price));
|
|
$product->set_description($tour_description);
|
|
$product->set_sku('tour-' . $post_id);
|
|
$product->set_status('publish');
|
|
|
|
// Nastavi featured image če obstaja
|
|
$hero_image_id = get_post_meta($post_id, '_hero_image', true);
|
|
if ($hero_image_id) {
|
|
$product->set_image_id($hero_image_id);
|
|
}
|
|
|
|
$product->save();
|
|
}
|
|
}
|
|
|
|
// Odstrani staro akcijo
|
|
remove_action('save_post_individual_tour', 'create_wc_product_from_tour');
|
|
|
|
// Dodaj novo akcijo, ki se sproži po shranjevanju meta podatkov
|
|
add_action('updated_post_meta', 'update_wc_product_on_meta_update', 10, 4);
|
|
|
|
// Funkcija za posodobitev WooCommerce produkta ob spremembi meta podatkov
|
|
function update_wc_product_on_meta_update($meta_id, $post_id, $meta_key, $_meta_value) {
|
|
// Preveri če je pravi meta ključ in post type
|
|
if ($meta_key === '_tour_price' && get_post_type($post_id) === 'individual_tour') {
|
|
create_wc_product_from_tour($post_id);
|
|
}
|
|
}
|
|
|
|
// Dodaj akcijo za kreiranje produkta ob objavi ture
|
|
add_action('wp_insert_post', function($post_id, $post) {
|
|
if ($post->post_type === 'individual_tour' && $post->post_status === 'publish') {
|
|
create_wc_product_from_tour($post_id);
|
|
}
|
|
}, 10, 2);
|
|
|
|
// Izbriši WooCommerce produkt ko se izbriše Individual Tour
|
|
function delete_wc_product_with_tour($post_id) {
|
|
if (!class_exists('WooCommerce')) {
|
|
return;
|
|
}
|
|
|
|
if (get_post_type($post_id) !== 'individual_tour') {
|
|
return;
|
|
}
|
|
|
|
$product_id = wc_get_product_id_by_sku('tour-' . $post_id);
|
|
if ($product_id) {
|
|
wp_delete_post($product_id, true);
|
|
}
|
|
}
|
|
add_action('before_delete_post', 'delete_wc_product_with_tour');
|
|
|
|
// Funkcija za dodajanje ture v košarico
|
|
function add_tour_to_cart() {
|
|
try {
|
|
// Preveri nonce za varnost
|
|
if (!isset($_POST['security']) || !wp_verify_nonce($_POST['security'], 'add_tour_to_cart')) {
|
|
wp_send_json_error(array('message' => 'Security check failed'));
|
|
return;
|
|
}
|
|
|
|
// Preveri če so vsi potrebni podatki prisotni
|
|
$required_fields = array('tour_id', 'participants', 'date', 'name', 'email');
|
|
foreach ($required_fields as $field) {
|
|
if (!isset($_POST[$field]) || empty($_POST[$field])) {
|
|
wp_send_json_error(array('message' => "Missing required field: {$field}"));
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Pridobi podatke iz zahtevka
|
|
$tour_id = intval($_POST['tour_id']);
|
|
$participants = intval($_POST['participants']);
|
|
$date = sanitize_text_field($_POST['date']);
|
|
$name = sanitize_text_field($_POST['name']);
|
|
$email = sanitize_email($_POST['email']);
|
|
|
|
// Preveri če je WooCommerce aktiviran
|
|
if (!class_exists('WooCommerce')) {
|
|
wp_send_json_error(array('message' => 'WooCommerce is not active'));
|
|
return;
|
|
}
|
|
|
|
// Pridobi WooCommerce product ID
|
|
$product_id = wc_get_product_id_by_sku('tour-' . $tour_id);
|
|
if (!$product_id) {
|
|
wp_send_json_error(array('message' => 'Product not found'));
|
|
return;
|
|
}
|
|
|
|
// Počisti košarico
|
|
WC()->cart->empty_cart();
|
|
|
|
// Dodaj produkt v košarico
|
|
$cart_item_data = array(
|
|
'tour_date' => $date,
|
|
'participants' => $participants,
|
|
'customer_name' => $name,
|
|
'customer_email' => $email
|
|
);
|
|
|
|
$added = WC()->cart->add_to_cart($product_id, $participants, 0, array(), $cart_item_data);
|
|
|
|
if ($added) {
|
|
wp_send_json_success(array(
|
|
'message' => 'Tour added to cart',
|
|
'checkout_url' => wc_get_checkout_url()
|
|
));
|
|
} else {
|
|
wp_send_json_error(array('message' => 'Failed to add tour to cart'));
|
|
}
|
|
} catch (Exception $e) {
|
|
wp_send_json_error(array(
|
|
'message' => 'An error occurred: ' . $e->getMessage(),
|
|
'error' => $e->getTraceAsString()
|
|
));
|
|
}
|
|
}
|
|
|
|
// Registriraj AJAX akcije
|
|
add_action('wp_ajax_add_tour_to_cart', 'add_tour_to_cart');
|
|
add_action('wp_ajax_nopriv_add_tour_to_cart', 'add_tour_to_cart');
|
|
|
|
// Prikaži dodatne podatke v košarici in na checkout strani
|
|
function display_cart_item_custom_meta($item_data, $cart_item) {
|
|
if (isset($cart_item['tour_date'])) {
|
|
$item_data[] = array(
|
|
'key' => 'Departure Date',
|
|
'value' => wc_clean($cart_item['tour_date'])
|
|
);
|
|
}
|
|
|
|
if (isset($cart_item['customer_name'])) {
|
|
$item_data[] = array(
|
|
'key' => 'Customer Name',
|
|
'value' => wc_clean($cart_item['customer_name'])
|
|
);
|
|
}
|
|
|
|
if (isset($cart_item['customer_email'])) {
|
|
$item_data[] = array(
|
|
'key' => 'Customer Email',
|
|
'value' => wc_clean($cart_item['customer_email'])
|
|
);
|
|
}
|
|
|
|
return $item_data;
|
|
}
|
|
add_filter('woocommerce_get_item_data', 'display_cart_item_custom_meta', 10, 2);
|
|
|
|
// Shrani dodatne podatke v naročilo
|
|
function add_custom_meta_to_order_items($item, $cart_item_key, $values, $order) {
|
|
if (isset($values['tour_date'])) {
|
|
$item->add_meta_data('Departure Date', $values['tour_date']);
|
|
}
|
|
|
|
if (isset($values['customer_name'])) {
|
|
$item->add_meta_data('Customer Name', $values['customer_name']);
|
|
}
|
|
|
|
if (isset($values['customer_email'])) {
|
|
$item->add_meta_data('Customer Email', $values['customer_email']);
|
|
}
|
|
}
|
|
add_action('woocommerce_checkout_create_order_line_item', 'add_custom_meta_to_order_items', 10, 4);
|
|
|
|
// Dodaj order bump template na checkout stran
|
|
function add_order_bump_to_checkout() {
|
|
include_once get_template_directory() . '/woocommerce/checkout/order-bump.php';
|
|
}
|
|
// Odstrani stari hook
|
|
remove_action('woocommerce_review_order_before_payment', 'add_order_bump_to_checkout');
|
|
// Dodaj nove hooke za različne lokacije
|
|
add_action('woocommerce_checkout_before_order_review', 'add_order_bump_to_checkout');
|
|
add_action('woocommerce_before_checkout_form', 'add_order_bump_to_checkout');
|
|
|
|
// AJAX handler za posodobitev košarice z extras-i
|
|
function handle_update_cart_extras() {
|
|
check_ajax_referer('update_order_review', 'security');
|
|
|
|
if (!isset($_POST['extras'])) {
|
|
wp_send_json_error('No extras provided');
|
|
return;
|
|
}
|
|
|
|
$extras = json_decode(stripslashes($_POST['extras']), true);
|
|
|
|
// Odstrani obstoječe extras iz košarice
|
|
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
|
|
if (isset($cart_item['is_extra']) && $cart_item['is_extra']) {
|
|
WC()->cart->remove_cart_item($cart_item_key);
|
|
}
|
|
}
|
|
|
|
// Pridobi tour ID iz prvega izdelka v košarici
|
|
$tour_id = null;
|
|
foreach (WC()->cart->get_cart() as $cart_item) {
|
|
if (isset($cart_item['product_id'])) {
|
|
$product = wc_get_product($cart_item['product_id']);
|
|
if ($product) {
|
|
$sku = $product->get_sku();
|
|
if (strpos($sku, 'tour-') === 0) {
|
|
$tour_id = str_replace('tour-', '', $sku);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!$tour_id) {
|
|
wp_send_json_error('No tour found in cart');
|
|
return;
|
|
}
|
|
|
|
// Pridobi available extras za tour
|
|
$available_extras = get_post_meta($tour_id, '_available_extras', true);
|
|
|
|
// Dodaj izbrane extras v košarico
|
|
foreach ($extras as $extra) {
|
|
$index = $extra['index'];
|
|
if (isset($available_extras[$index])) {
|
|
$extra_data = $available_extras[$index];
|
|
|
|
// Ustvari nov produkt za extra
|
|
$extra_product = new WC_Product_Simple();
|
|
$extra_product->set_name($extra_data['name']);
|
|
$extra_product->set_price($extra_data['price']);
|
|
$extra_product->set_status('private');
|
|
$extra_product->save();
|
|
|
|
// Dodaj extra v košarico
|
|
WC()->cart->add_to_cart($extra_product->get_id(), 1, 0, array(), array(
|
|
'is_extra' => true,
|
|
'tour_id' => $tour_id,
|
|
'extra_data' => $extra_data
|
|
));
|
|
|
|
// Izbriši začasni produkt
|
|
wp_delete_post($extra_product->get_id(), true);
|
|
}
|
|
}
|
|
|
|
WC()->cart->calculate_totals();
|
|
wp_send_json_success();
|
|
}
|
|
add_action('wp_ajax_update_cart_extras', 'handle_update_cart_extras');
|
|
add_action('wp_ajax_nopriv_update_cart_extras', 'handle_update_cart_extras');
|
|
|
|
// Prikaži extra podatke v košarici in naročilu
|
|
function display_cart_item_extra_meta($item_data, $cart_item) {
|
|
if (isset($cart_item['is_extra']) && $cart_item['is_extra']) {
|
|
$item_data[] = array(
|
|
'key' => 'Type',
|
|
'value' => 'Tour Extra'
|
|
);
|
|
}
|
|
return $item_data;
|
|
}
|
|
add_filter('woocommerce_get_item_data', 'display_cart_item_extra_meta', 10, 2);
|
|
|
|
// Shrani extra podatke v naročilo
|
|
function save_order_item_extra_meta($item, $cart_item_key, $values, $order) {
|
|
if (isset($values['is_extra']) && $values['is_extra']) {
|
|
$item->add_meta_data('_is_extra', true);
|
|
$item->add_meta_data('_tour_id', $values['tour_id']);
|
|
$item->add_meta_data('_extra_data', $values['extra_data']);
|
|
}
|
|
}
|
|
add_action('woocommerce_checkout_create_order_line_item', 'save_order_item_extra_meta', 10, 4);
|
|
|
|
/**
|
|
* Prikaži dodatne podatke o turi v košarici
|
|
*/
|
|
function display_tour_cart_item_data($item_data, $cart_item) {
|
|
if (isset($cart_item['tour_date'])) {
|
|
$item_data[] = array(
|
|
'key' => 'Date',
|
|
'value' => $cart_item['tour_date']
|
|
);
|
|
}
|
|
|
|
if (isset($cart_item['participants'])) {
|
|
$item_data[] = array(
|
|
'key' => 'Participants',
|
|
'value' => $cart_item['participants']
|
|
);
|
|
}
|
|
|
|
return $item_data;
|
|
}
|
|
add_filter('woocommerce_get_item_data', 'display_tour_cart_item_data', 10, 2);
|
|
|
|
/**
|
|
* Shrani dodatne podatke o turi v naročilo
|
|
*/
|
|
function save_tour_order_item_meta($item, $cart_item_key, $values, $order) {
|
|
if (isset($values['tour_date'])) {
|
|
$item->add_meta_data('Date', $values['tour_date']);
|
|
}
|
|
|
|
if (isset($values['participants'])) {
|
|
$item->add_meta_data('Participants', $values['participants']);
|
|
}
|
|
|
|
if (isset($values['is_tour_extra'])) {
|
|
$item->add_meta_data('_is_tour_extra', true);
|
|
if (isset($values['tour_id'])) {
|
|
$item->add_meta_data('_tour_id', $values['tour_id']);
|
|
}
|
|
}
|
|
}
|
|
add_action('woocommerce_checkout_create_order_line_item', 'save_tour_order_item_meta', 10, 4);
|
|
|
|
// Preusmeri na custom Thank You stran po uspešnem plačilu
|
|
function redirect_to_custom_thank_you_page($order_received_url, $order) {
|
|
return home_url('/thank-you/');
|
|
}
|
|
add_filter('woocommerce_get_checkout_order_received_url', 'redirect_to_custom_thank_you_page', 10, 2);
|
|
|
|
/**
|
|
* Dodaj Customizer kontrolo za "drag & drop" Individual Tours znotraj Experience Journeyev
|
|
*/
|
|
function grilctours_customize_individual_tour_order($wp_customize) {
|
|
// Dodaj sekcijo
|
|
$wp_customize->add_section('individual_tour_order_section', array(
|
|
'title' => __('Individual Tours Order', 'grilctours'),
|
|
'priority' => 210,
|
|
));
|
|
|
|
// Definiraj razred znotraj funkcije, samo ko je potreben
|
|
class Individual_Tour_Order_Control extends WP_Customize_Control {
|
|
public $type = 'individual_tour_order';
|
|
public $tours = array();
|
|
public $journey_id = 0;
|
|
|
|
public function render_content() {
|
|
// Edinstveni ID za ta kontrolnik
|
|
$list_id = 'sortable-tour-list-' . $this->journey_id;
|
|
?>
|
|
<label>
|
|
<?php if (!empty($this->label)): ?>
|
|
<span class="customize-control-title"><?php echo esc_html($this->label); ?></span>
|
|
<?php endif; ?>
|
|
|
|
<?php if (!empty($this->description)): ?>
|
|
<span class="description customize-control-description"><?php echo esc_html($this->description); ?></span>
|
|
<?php endif; ?>
|
|
|
|
<div id="<?php echo esc_attr($list_id); ?>" class="sortable-list sortable-tours-list" data-journey-id="<?php echo esc_attr($this->journey_id); ?>">
|
|
<?php
|
|
if (!empty($this->tours)):
|
|
foreach ($this->tours as $tour):
|
|
?>
|
|
<div class="sortable-item" data-id="<?php echo esc_attr($tour->ID); ?>">
|
|
<span class="dashicons dashicons-menu"></span>
|
|
<span class="item-title"><?php echo esc_html($tour->post_title); ?></span>
|
|
</div>
|
|
<?php
|
|
endforeach;
|
|
else:
|
|
?>
|
|
<p class="description"><?php _e('Ni najdenih Individual Tours.', 'grilctours'); ?></p>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<input type="hidden" <?php $this->link(); ?> value="<?php echo esc_attr(get_option($this->id, '')); ?>" />
|
|
</label>
|
|
<?php
|
|
}
|
|
}
|
|
|
|
// Pridobi vse Experience Journeye
|
|
$journeys = get_posts(array(
|
|
'post_type' => 'experience_journey',
|
|
'posts_per_page' => -1,
|
|
'orderby' => 'title',
|
|
'order' => 'ASC',
|
|
));
|
|
|
|
// Za vsak Experience Journey dodaj kontrolo za Individual Tours
|
|
foreach ($journeys as $journey) {
|
|
$journey_id = $journey->ID;
|
|
$journey_title = $journey->post_title;
|
|
|
|
// Pridobi vse Individual Tours za ta Experience Journey
|
|
$tours = get_posts(array(
|
|
'post_type' => 'individual_tour',
|
|
'posts_per_page' => -1,
|
|
'meta_query' => array(
|
|
array(
|
|
'key' => '_experience_journey',
|
|
'value' => $journey_id,
|
|
'compare' => '='
|
|
)
|
|
)
|
|
));
|
|
|
|
// Če ni Individual Tours za ta Journey, preskoči
|
|
if (empty($tours)) {
|
|
continue;
|
|
}
|
|
|
|
// Ustvari nastavitev za ta Journey
|
|
$setting_id = 'individual_tour_order_' . $journey_id;
|
|
|
|
$wp_customize->add_setting($setting_id, array(
|
|
'default' => '',
|
|
'type' => 'option',
|
|
'capability' => 'edit_theme_options',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
// Pridobi shranjeni vrstni red
|
|
$saved_order = get_option($setting_id, '');
|
|
$order_array = !empty($saved_order) ? explode(',', $saved_order) : array();
|
|
|
|
// Sortiraj ture glede na obstoječ vrstni red
|
|
$ordered_tours = array();
|
|
|
|
// Najprej dodaj tiste v shranjenem vrstnem redu
|
|
foreach ($order_array as $id) {
|
|
foreach ($tours as $index => $tour) {
|
|
if ($tour->ID == $id) {
|
|
$ordered_tours[] = $tour;
|
|
unset($tours[$index]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Dodaj preostale na konec
|
|
$ordered_tours = array_merge($ordered_tours, $tours);
|
|
|
|
// Dodaj kontrolo
|
|
$wp_customize->add_control(
|
|
new Individual_Tour_Order_Control(
|
|
$wp_customize,
|
|
$setting_id,
|
|
array(
|
|
'label' => sprintf(__('Tours in %s', 'grilctours'), $journey_title),
|
|
'description' => __('Drag and drop tours to change their order.', 'grilctours'),
|
|
'section' => 'individual_tour_order_section',
|
|
'tours' => $ordered_tours,
|
|
'journey_id' => $journey_id,
|
|
)
|
|
)
|
|
);
|
|
}
|
|
}
|
|
add_action('customize_register', 'grilctours_customize_individual_tour_order');
|
|
|
|
/**
|
|
* Razširi obstoječe JS in CSS za podporo urejanju Individual Tours
|
|
*/
|
|
function grilctours_customize_individual_tour_scripts() {
|
|
$script = "
|
|
jQuery(document).ready(function($) {
|
|
setTimeout(function() {
|
|
console.log('Začenjam inicializacijo sortable za Individual Tours...');
|
|
|
|
// Poišči vse sortable sezname Individual Tours
|
|
var sortableLists = $('.sortable-tours-list');
|
|
|
|
if (sortableLists.length) {
|
|
console.log('Najdenih', sortableLists.length, 'sortable seznamov za Individual Tours');
|
|
|
|
sortableLists.each(function() {
|
|
var journeyId = $(this).data('journey-id');
|
|
var listId = $(this).attr('id');
|
|
|
|
console.log('Inicializiram seznam:', listId, 'za Journey ID:', journeyId);
|
|
|
|
try {
|
|
$(this).sortable({
|
|
containment: 'parent',
|
|
cursor: 'move',
|
|
handle: '.dashicons-menu',
|
|
items: '.sortable-item',
|
|
revert: true,
|
|
tolerance: 'pointer',
|
|
update: function(event, ui) {
|
|
var ids = [];
|
|
$(this).find('.sortable-item').each(function() {
|
|
ids.push($(this).attr('data-id'));
|
|
});
|
|
|
|
// Posodobi vrednost kontrole
|
|
var settingId = 'individual_tour_order_' + journeyId;
|
|
var inputField = $('input[data-customize-setting-link=\"' + settingId + '\"]');
|
|
|
|
console.log('Posodabljam', settingId, 'nova vrednost:', ids.join(','));
|
|
inputField.val(ids.join(',')).trigger('change');
|
|
}
|
|
}).disableSelection();
|
|
|
|
console.log('Sortable uspešno inicializiran za', listId);
|
|
} catch (e) {
|
|
console.error('Napaka pri inicializaciji sortable za', listId, ':', e);
|
|
}
|
|
});
|
|
} else {
|
|
console.log('Ni najdenih sortable seznamov za Individual Tours');
|
|
}
|
|
}, 1500);
|
|
});
|
|
";
|
|
|
|
wp_add_inline_script('jquery-ui-sortable', $script);
|
|
}
|
|
add_action('customize_controls_enqueue_scripts', 'grilctours_customize_individual_tour_scripts');
|
|
|
|
/**
|
|
* Funkcija za urejanje vrstnega reda Experience Journeys glede na nastavitev v Customizer-ju
|
|
*
|
|
* @param WP_Query $query Query objekt
|
|
*/
|
|
function grilctours_order_experience_journeys($query) {
|
|
// Izvajaj samo za glavne poizvedbe in experience_journey post type
|
|
if (!is_admin() && $query->is_main_query() &&
|
|
(is_post_type_archive('experience_journey') || is_home() || is_front_page())) {
|
|
|
|
// Pridobi shranjeni vrstni red
|
|
$saved_order = get_option('experience_journey_order', '');
|
|
|
|
// Če je vrstni red definiran
|
|
if (!empty($saved_order)) {
|
|
$order_array = explode(',', $saved_order);
|
|
|
|
// Uporabi shranjen vrstni red za poizvedbo
|
|
if (!empty($order_array)) {
|
|
$query->set('post_type', 'experience_journey');
|
|
$query->set('posts_per_page', -1);
|
|
$query->set('orderby', 'post__in');
|
|
$query->set('post__in', $order_array);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
add_action('pre_get_posts', 'grilctours_order_experience_journeys');
|
|
|
|
/**
|
|
* Dodaj nastavitve za Custom Inquiry sekcijo v WordPress Customizer
|
|
*/
|
|
function grilctours_customize_inquiry_section($wp_customize) {
|
|
// Sekcija za nastavitve Custom Inquiry
|
|
$wp_customize->add_section('inquiry_section_settings', array(
|
|
'title' => __('Inquiry Section Settings', 'grilctours'),
|
|
'priority' => 107,
|
|
));
|
|
|
|
// Naslov sekcije
|
|
$wp_customize->add_setting('inquiry_section_title', array(
|
|
'default' => 'Ready to Plan Your Custom Journey?',
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control('inquiry_section_title', array(
|
|
'label' => __('Section Title', 'grilctours'),
|
|
'section' => 'inquiry_section_settings',
|
|
'type' => 'text',
|
|
));
|
|
|
|
// Opis sekcije
|
|
$wp_customize->add_setting('inquiry_section_description', array(
|
|
'default' => 'A world of moonlit forests and twisting turquoise rivers, Slovenia is a fairytale destination. Home to storybook castles, historic towns, and picturesque alpine landscapes; let us create your perfect holiday experience.',
|
|
'sanitize_callback' => 'wp_kses_post',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control('inquiry_section_description', array(
|
|
'label' => __('Section Description', 'grilctours'),
|
|
'section' => 'inquiry_section_settings',
|
|
'type' => 'textarea',
|
|
));
|
|
|
|
// Gumb besedilo
|
|
$wp_customize->add_setting('inquiry_button_text', array(
|
|
'default' => 'START PLANNING',
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control('inquiry_button_text', array(
|
|
'label' => __('Button Text', 'grilctours'),
|
|
'section' => 'inquiry_section_settings',
|
|
'type' => 'text',
|
|
));
|
|
|
|
// Ozadje sekcije
|
|
$wp_customize->add_setting('inquiry_section_background', array(
|
|
'default' => '',
|
|
'sanitize_callback' => 'esc_url_raw',
|
|
'transport' => 'refresh',
|
|
));
|
|
|
|
$wp_customize->add_control(new WP_Customize_Image_Control($wp_customize, 'inquiry_section_background', array(
|
|
'label' => __('Section Background Image', 'grilctours'),
|
|
'section' => 'inquiry_section_settings',
|
|
'settings' => 'inquiry_section_background',
|
|
)));
|
|
}
|
|
add_action('customize_register', 'grilctours_customize_inquiry_section');
|
|
|
|
/**
|
|
* Custom Inquiry Ajax Handler
|
|
*/
|
|
function handle_custom_inquiry_form() {
|
|
// Beležimo začetek funkcije
|
|
error_log('Custom inquiry form submission started');
|
|
|
|
// Preveri nonce (varnost)
|
|
if (!isset($_POST['security']) || !wp_verify_nonce($_POST['security'], 'custom_inquiry_nonce')) {
|
|
error_log('Invalid security token in custom inquiry form');
|
|
wp_send_json_error('Invalid security token');
|
|
return;
|
|
}
|
|
|
|
// Pridobi podatke iz obrazca
|
|
$name = isset($_POST['name']) ? sanitize_text_field($_POST['name']) : '';
|
|
$email = isset($_POST['email']) ? sanitize_email($_POST['email']) : '';
|
|
$travel_date = isset($_POST['travel_date']) ? sanitize_text_field($_POST['travel_date']) : 'Not specified';
|
|
$travelers = isset($_POST['travelers']) ? intval($_POST['travelers']) : 0;
|
|
$destination = isset($_POST['destination']) ? sanitize_text_field($_POST['destination']) : 'Not specified';
|
|
$message = isset($_POST['message']) ? sanitize_textarea_field($_POST['message']) : '';
|
|
|
|
// Beleži prejete podatke
|
|
error_log('Form data: Name=' . $name . ', Email=' . $email . ', Date=' . $travel_date . ', Travelers=' . $travelers);
|
|
error_log('Form additional data: Destination=' . $destination . ', Message=' . substr($message, 0, 50) . (strlen($message) > 50 ? '...' : ''));
|
|
|
|
// Preveri obvezna polja
|
|
if (empty($name) || empty($email)) {
|
|
error_log('Missing required fields in custom inquiry form');
|
|
wp_send_json_error('Please fill in all required fields.');
|
|
return;
|
|
}
|
|
|
|
// Nastavi fiksni e-poštni naslov prejemnika
|
|
$admin_email = 'info@europewonder.com'; // Fiksni e-poštni naslov
|
|
$to = $admin_email;
|
|
error_log('Sending inquiry to admin email: ' . $to);
|
|
|
|
// Nastavi zadevo
|
|
$subject = 'New Custom Journey Inquiry from ' . $name;
|
|
|
|
// Priprava sporočila
|
|
$body = "
|
|
<html>
|
|
<head>
|
|
<title>New Custom Journey Inquiry</title>
|
|
<style>
|
|
body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
|
|
h2 { color: #0073aa; }
|
|
table { border-collapse: collapse; width: 100%; }
|
|
th, td { padding: 10px; text-align: left; border-bottom: 1px solid #ddd; }
|
|
th { background-color: #f2f2f2; width: 30%; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h2>New Custom Journey Inquiry</h2>
|
|
<p>A new inquiry has been submitted through your website:</p>
|
|
|
|
<table>
|
|
<tr>
|
|
<th>Name:</th>
|
|
<td>" . esc_html($name) . "</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Email:</th>
|
|
<td>" . esc_html($email) . "</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Planned Travel Date:</th>
|
|
<td>" . esc_html($travel_date) . "</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Number of Travelers:</th>
|
|
<td>" . esc_html($travelers) . "</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Preferred Destination(s):</th>
|
|
<td>" . esc_html($destination) . "</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Message:</th>
|
|
<td>" . nl2br(esc_html($message)) . "</td>
|
|
</tr>
|
|
</table>
|
|
</body>
|
|
</html>
|
|
";
|
|
|
|
// Nastavi glave
|
|
$headers = array(
|
|
'Content-Type: text/html; charset=UTF-8',
|
|
'From: Europe Wonder <info@europewonder.com>',
|
|
'Reply-To: ' . esc_html($name) . ' <' . esc_html($email) . '>'
|
|
);
|
|
|
|
// Beleži podrobnosti e-pošte pred pošiljanjem
|
|
error_log('Attempting to send email with subject: ' . $subject);
|
|
error_log('Email headers: ' . print_r($headers, true));
|
|
|
|
// Pošlji e-pošto in zapiši več informacij
|
|
add_action('wp_mail_failed', function($wp_error) {
|
|
error_log('WP Mail failed: ' . $wp_error->get_error_message());
|
|
});
|
|
|
|
// Pošlji e-pošto
|
|
$sent = wp_mail($to, $subject, $body, $headers);
|
|
|
|
// Beleži rezultat pošiljanja
|
|
if (!$sent) {
|
|
// Beleži napako pri pošiljanju
|
|
global $phpmailer;
|
|
if (isset($phpmailer) && isset($phpmailer->ErrorInfo) && !empty($phpmailer->ErrorInfo)) {
|
|
error_log('PHPMailer error: ' . $phpmailer->ErrorInfo);
|
|
} else {
|
|
error_log('Email sending failed but no PHPMailer error available');
|
|
}
|
|
error_log('WordPress admin email setting: ' . get_option('admin_email'));
|
|
error_log('Email sending result: FAILED');
|
|
} else {
|
|
error_log('Email sending result: SUCCESS');
|
|
}
|
|
|
|
// Pošlji tudi e-pošto stranki
|
|
if ($sent) {
|
|
$customer_subject = 'Thank you for your inquiry - Europe Wonder';
|
|
$customer_body = "
|
|
<html>
|
|
<head>
|
|
<title>Thank You for Your Inquiry</title>
|
|
<style>
|
|
body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
|
|
h2 { color: #0073aa; }
|
|
p { margin-bottom: 15px; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h2>Thank You for Your Inquiry</h2>
|
|
<p>Dear " . esc_html($name) . ",</p>
|
|
<p>Thank you for your interest in our custom journey services. We have received your inquiry and will get back to you as soon as possible to discuss your travel plans.</p>
|
|
<p>Here's a summary of the information you provided:</p>
|
|
<ul>
|
|
<li><strong>Planned Travel Date:</strong> " . esc_html($travel_date) . "</li>
|
|
<li><strong>Number of Travelers:</strong> " . esc_html($travelers) . "</li>
|
|
<li><strong>Preferred Destination(s):</strong> " . esc_html($destination) . "</li>
|
|
</ul>
|
|
<p>If you have any additional questions or information to add, please feel free to reply to this email.</p>
|
|
<p>Best regards,<br>Europe Wonder Team</p>
|
|
</body>
|
|
</html>
|
|
";
|
|
|
|
$customer_headers = array(
|
|
'Content-Type: text/html; charset=UTF-8',
|
|
'From: Europe Wonder <info@europewonder.com>'
|
|
);
|
|
|
|
error_log('Attempting to send customer confirmation email to: ' . $email);
|
|
error_log('Customer email headers: ' . print_r($customer_headers, true));
|
|
|
|
$customer_sent = wp_mail($email, $customer_subject, $customer_body, $customer_headers);
|
|
|
|
if (!$customer_sent) {
|
|
// Beleži napako pri pošiljanju potrditvenega e-sporočila
|
|
global $phpmailer;
|
|
if (isset($phpmailer) && isset($phpmailer->ErrorInfo) && !empty($phpmailer->ErrorInfo)) {
|
|
error_log('Customer email PHPMailer error: ' . $phpmailer->ErrorInfo);
|
|
} else {
|
|
error_log('Customer email sending failed but no PHPMailer error available');
|
|
}
|
|
error_log('Customer email sending result: FAILED');
|
|
} else {
|
|
error_log('Customer email sending result: SUCCESS');
|
|
}
|
|
}
|
|
|
|
// Vrni odgovor
|
|
if ($sent) {
|
|
error_log('Custom inquiry form submission completed successfully');
|
|
wp_send_json_success('Thank you for your inquiry! We will contact you shortly.');
|
|
} else {
|
|
error_log('Custom inquiry form submission failed - email not sent');
|
|
wp_send_json_error('There was an error sending your inquiry. Please try again.');
|
|
}
|
|
}
|
|
add_action('wp_ajax_custom_inquiry_submit', 'handle_custom_inquiry_form');
|
|
add_action('wp_ajax_nopriv_custom_inquiry_submit', 'handle_custom_inquiry_form');
|
|
|
|
// ... existing code ...
|
|
|
|
// Dodatni AJAX handler za potrjevanje plačil
|
|
function confirm_stripe_payment() {
|
|
try {
|
|
check_ajax_referer('confirm_stripe_payment', 'security');
|
|
|
|
// Preveri obvezne parametre
|
|
if (empty($_POST['payment_intent_id']) || empty($_POST['order_id'])) {
|
|
wp_send_json_error(['message' => 'Missing required parameters']);
|
|
return;
|
|
}
|
|
|
|
$payment_intent_id = sanitize_text_field($_POST['payment_intent_id']);
|
|
$order_id = intval($_POST['order_id']);
|
|
|
|
// Preveri, da naročilo obstaja
|
|
$order = wc_get_order($order_id);
|
|
if (!$order) {
|
|
wp_send_json_error(['message' => 'Order not found']);
|
|
return;
|
|
}
|
|
|
|
// Preveri status plačilnega namena z API klicem na Stripe
|
|
try {
|
|
// Inicializiraj Stripe, če še ni
|
|
if (!class_exists('\Stripe\Stripe')) {
|
|
init_stripe();
|
|
}
|
|
|
|
$payment_intent = \Stripe\PaymentIntent::retrieve($payment_intent_id);
|
|
|
|
// Beleži podatke za razhroščevanje
|
|
error_log('Stripe Payment Intent: ' . print_r($payment_intent, true));
|
|
|
|
// Če je plačilo uspešno
|
|
if ($payment_intent->status === 'succeeded') {
|
|
// Označi naročilo kot plačano
|
|
$order->payment_complete($payment_intent_id);
|
|
$order->add_order_note('Stripe payment confirmed via AJAX (Payment Intent ID: ' . $payment_intent_id . ')');
|
|
$order->save();
|
|
|
|
// Vrni uspeh
|
|
wp_send_json_success([
|
|
'message' => 'Payment confirmed',
|
|
'order_id' => $order_id,
|
|
'payment_intent_id' => $payment_intent_id
|
|
]);
|
|
} else {
|
|
// Če plačilo ni uspešno
|
|
$order->update_status('failed', 'Stripe payment intent status: ' . $payment_intent->status);
|
|
wp_send_json_error([
|
|
'message' => 'Payment not completed. Status: ' . $payment_intent->status,
|
|
'payment_status' => $payment_intent->status
|
|
]);
|
|
}
|
|
} catch (Exception $e) {
|
|
error_log('Error verifying payment intent: ' . $e->getMessage());
|
|
wp_send_json_error(['message' => 'Error verifying payment: ' . $e->getMessage()]);
|
|
}
|
|
|
|
} catch (Exception $e) {
|
|
error_log('Payment confirmation error: ' . $e->getMessage());
|
|
wp_send_json_error(['message' => $e->getMessage()]);
|
|
}
|
|
}
|
|
add_action('wp_ajax_confirm_stripe_payment', 'confirm_stripe_payment');
|
|
add_action('wp_ajax_nopriv_confirm_stripe_payment', 'confirm_stripe_payment');
|
|
|
|
// AJAX handler za generiranje povezave za plačilo preostalega zneska
|
|
function generate_remaining_payment_link() {
|
|
try {
|
|
// Preveri, da je WooCommerce aktiviran
|
|
if (!is_woocommerce_activated()) {
|
|
wp_send_json_error(['message' => 'WooCommerce is not activated']);
|
|
return;
|
|
}
|
|
|
|
check_ajax_referer('generate_payment_link', 'security');
|
|
|
|
// Preveri obvezne parametre
|
|
if (empty($_POST['order_id'])) {
|
|
wp_send_json_error(['message' => 'Missing order ID']);
|
|
return;
|
|
}
|
|
|
|
$order_id = intval($_POST['order_id']);
|
|
|
|
// Preveri, da naročilo obstaja
|
|
$order = wc_get_order($order_id);
|
|
if (!$order) {
|
|
wp_send_json_error(['message' => 'Order not found']);
|
|
return;
|
|
}
|
|
|
|
// Preveri, da gre za delno plačilo in da je prvi obrok že plačan
|
|
$payment_type = get_post_meta($order_id, '_payment_type', true);
|
|
$is_deposit_paid = get_post_meta($order_id, '_is_deposit_paid', true);
|
|
$is_remaining_paid = get_post_meta($order_id, '_is_remaining_paid', true);
|
|
|
|
if ($payment_type !== 'partial') {
|
|
wp_send_json_error(['message' => 'This is not a partial payment order']);
|
|
return;
|
|
}
|
|
|
|
if (!$is_deposit_paid) {
|
|
wp_send_json_error(['message' => 'Deposit not yet paid']);
|
|
return;
|
|
}
|
|
|
|
if ($is_remaining_paid) {
|
|
wp_send_json_error(['message' => 'Remaining amount already paid']);
|
|
return;
|
|
}
|
|
|
|
// Pridobi preostali znesek za plačilo
|
|
$remaining_amount = floatval(get_post_meta($order_id, '_remaining_amount', true));
|
|
if (!$remaining_amount || $remaining_amount <= 0) {
|
|
wp_send_json_error(['message' => 'Invalid remaining amount']);
|
|
return;
|
|
}
|
|
|
|
// Inicializiraj Stripe, če še ni
|
|
if (!class_exists('\Stripe\Stripe')) {
|
|
init_stripe();
|
|
}
|
|
|
|
// Ustvari nov Payment Intent za preostali znesek
|
|
$payment_intent = \Stripe\PaymentIntent::create([
|
|
'amount' => intval($remaining_amount * 100), // Stripe uporablja cente
|
|
'currency' => 'eur',
|
|
'metadata' => [
|
|
'order_id' => $order_id,
|
|
'payment_type' => 'remaining',
|
|
'tour_name' => $order->get_order_item_name(0), // Ime prve postavke v naročilu
|
|
'payment_description' => 'Remaining payment (70%) for tour booking'
|
|
]
|
|
]);
|
|
|
|
// Shrani nov Payment Intent ID v naročilo
|
|
update_post_meta($order_id, '_stripe_remaining_payment_intent', $payment_intent->id);
|
|
|
|
// Dodaj opombo naročilu
|
|
$order->add_order_note(sprintf(
|
|
'Generated payment link for remaining balance of €%.2f (Payment Intent ID: %s)',
|
|
$remaining_amount,
|
|
$payment_intent->id
|
|
));
|
|
|
|
$order->save();
|
|
|
|
// Vrni podatke za plačilo
|
|
wp_send_json_success([
|
|
'message' => 'Payment link generated',
|
|
'order_id' => $order_id,
|
|
'amount' => $remaining_amount,
|
|
'payment_intent_id' => $payment_intent->id,
|
|
'client_secret' => $payment_intent->client_secret
|
|
]);
|
|
|
|
} catch (Exception $e) {
|
|
error_log('Error generating payment link: ' . $e->getMessage());
|
|
wp_send_json_error(['message' => 'Error generating payment link: ' . $e->getMessage()]);
|
|
}
|
|
}
|
|
add_action('wp_ajax_generate_remaining_payment_link', 'generate_remaining_payment_link');
|
|
add_action('wp_ajax_nopriv_generate_remaining_payment_link', 'generate_remaining_payment_link');
|
|
|
|
// ... existing code ...
|
|
|
|
/**
|
|
* Theme Functions
|
|
*/
|
|
|
|
// Vključi SMTP konfiguracijo
|
|
require_once get_template_directory() . '/custom-smtp-config.php';
|
|
|
|
// ... existing code ...
|
|
|
|
/**
|
|
* Customizer nastavitve za About Us stran
|
|
*/
|
|
function grilctours_customize_about_page($wp_customize) {
|
|
// Dodaj sekcijo za About stran
|
|
$wp_customize->add_section('about_page_section', array(
|
|
'title' => __('About Page Settings', 'grilctours'),
|
|
'description' => __('Customize the About Us page content', 'grilctours'),
|
|
'priority' => 160,
|
|
));
|
|
|
|
// Podnaslov
|
|
$wp_customize->add_setting('about_subtitle', array(
|
|
'default' => 'Get to know our passionate team',
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
));
|
|
|
|
$wp_customize->add_control('about_subtitle', array(
|
|
'label' => __('About Page Subtitle', 'grilctours'),
|
|
'section' => 'about_page_section',
|
|
'type' => 'text',
|
|
));
|
|
|
|
// Nastavitve za člane ekipe
|
|
$team_members = array(
|
|
'nejc' => 'Nejc Dovžan Kukič',
|
|
'matic' => 'Matic Snoj',
|
|
'luka' => 'Luka Dovžan Kukič',
|
|
'jernej' => 'Jernej Antloga',
|
|
'kevin' => 'Kevin Krajnc'
|
|
);
|
|
|
|
foreach ($team_members as $id => $name) {
|
|
// Naslov
|
|
$wp_customize->add_setting('team_' . $id . '_name', array(
|
|
'default' => $name,
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
));
|
|
|
|
$wp_customize->add_control('team_' . $id . '_name', array(
|
|
'label' => sprintf(__('%s - Name', 'grilctours'), $name),
|
|
'section' => 'about_page_section',
|
|
'type' => 'text',
|
|
));
|
|
|
|
// Pozicija
|
|
$default_positions = array(
|
|
'nejc' => 'CEO',
|
|
'matic' => 'COO',
|
|
'luka' => 'CFO',
|
|
'jernej' => 'Travel specialist',
|
|
'kevin' => 'Travel specialist'
|
|
);
|
|
|
|
$wp_customize->add_setting('team_' . $id . '_position', array(
|
|
'default' => $default_positions[$id],
|
|
'sanitize_callback' => 'sanitize_text_field',
|
|
));
|
|
|
|
$wp_customize->add_control('team_' . $id . '_position', array(
|
|
'label' => sprintf(__('%s - Position', 'grilctours'), $name),
|
|
'section' => 'about_page_section',
|
|
'type' => 'text',
|
|
));
|
|
|
|
// Bio
|
|
$default_bios = array(
|
|
'nejc' => 'A visionary leader with a passion for innovation and growth. Nejc drives the company\'s strategy with precision and purpose — when not in the office, you\'ll find him exploring mountain trails.',
|
|
'matic' => 'As the backbone of daily operations, Matic ensures everything runs smoothly behind the scenes. He\'s careful and detail-oriented and brings the same dedication to cycling in his free time.',
|
|
'luka' => 'Luka manages the company\'s financial strategy with focus and discipline. Reliable and analytical, he brings the same energy to both numbers and his love for cycling.',
|
|
'jernej' => 'Friendly and knowledgeable, Jernej designs personalized trips with energy and enthusiasm. A history enthusiast, he brings stories to life through travel.',
|
|
'kevin' => 'Creative and detail-oriented, Kevin helps clients plan seamless, custom journeys. He\'s a road trip specialist known for his helpful nature and great communication skills.'
|
|
);
|
|
|
|
$wp_customize->add_setting('team_' . $id . '_bio', array(
|
|
'default' => $default_bios[$id],
|
|
'sanitize_callback' => 'wp_kses_post',
|
|
));
|
|
|
|
$wp_customize->add_control('team_' . $id . '_bio', array(
|
|
'label' => sprintf(__('%s - Bio', 'grilctours'), $name),
|
|
'section' => 'about_page_section',
|
|
'type' => 'textarea',
|
|
));
|
|
|
|
// Slika
|
|
$wp_customize->add_setting('team_' . $id . '_image', array(
|
|
'default' => get_template_directory_uri() . '/images/' . $id . '.webp',
|
|
'sanitize_callback' => 'esc_url_raw',
|
|
));
|
|
|
|
$wp_customize->add_control(new WP_Customize_Image_Control($wp_customize, 'team_' . $id . '_image', array(
|
|
'label' => sprintf(__('%s - Image', 'grilctours'), $name),
|
|
'section' => 'about_page_section',
|
|
'settings' => 'team_' . $id . '_image',
|
|
)));
|
|
}
|
|
}
|
|
add_action('customize_register', 'grilctours_customize_about_page');
|
|
|
|
// ... existing code ...
|
|
|
|
/**
|
|
* Funkcija za obdelavo kontaktnega obrazca
|
|
*/
|
|
function handle_contact_form() {
|
|
// Beležimo začetek funkcije
|
|
error_log('Contact form submission started');
|
|
|
|
// Preveri nonce (varnost)
|
|
if (!isset($_POST['security']) || !wp_verify_nonce($_POST['security'], 'contact_form_nonce')) {
|
|
error_log('Invalid security token in contact form');
|
|
wp_send_json_error('Invalid security token');
|
|
return;
|
|
}
|
|
|
|
// Pridobi podatke iz obrazca
|
|
$name = isset($_POST['name']) ? sanitize_text_field($_POST['name']) : '';
|
|
$email = isset($_POST['email']) ? sanitize_email($_POST['email']) : '';
|
|
$subject = isset($_POST['subject']) ? sanitize_text_field($_POST['subject']) : '';
|
|
$message = isset($_POST['message']) ? sanitize_textarea_field($_POST['message']) : '';
|
|
|
|
// Beleži prejete podatke
|
|
error_log('Contact form data: Name=' . $name . ', Email=' . $email . ', Subject=' . $subject);
|
|
error_log('Contact form message: ' . substr($message, 0, 50) . (strlen($message) > 50 ? '...' : ''));
|
|
|
|
// Preveri obvezna polja
|
|
if (empty($name) || empty($email) || empty($subject) || empty($message)) {
|
|
error_log('Missing required fields in contact form');
|
|
wp_send_json_error('Please fill in all required fields.');
|
|
return;
|
|
}
|
|
|
|
// Nastavi fiksni e-poštni naslov prejemnika
|
|
$admin_email = 'info@europewonder.com'; // Fiksni e-poštni naslov
|
|
$to = $admin_email;
|
|
error_log('Sending message to admin email: ' . $to);
|
|
|
|
// Nastavi zadevo
|
|
$email_subject = 'New Contact Form Message: ' . $subject;
|
|
|
|
// Priprava sporočila za administratorja
|
|
$admin_body = "
|
|
<html>
|
|
<head>
|
|
<title>New Contact Form Message</title>
|
|
<style>
|
|
body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
|
|
h2 { color: #0073aa; }
|
|
table { border-collapse: collapse; width: 100%; }
|
|
th, td { padding: 10px; text-align: left; border-bottom: 1px solid #ddd; }
|
|
th { background-color: #f2f2f2; width: 30%; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h2>New Contact Form Message</h2>
|
|
<p>A new message has been submitted through your website's contact form:</p>
|
|
|
|
<table>
|
|
<tr>
|
|
<th>Name:</th>
|
|
<td>" . esc_html($name) . "</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Email:</th>
|
|
<td>" . esc_html($email) . "</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Subject:</th>
|
|
<td>" . esc_html($subject) . "</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Message:</th>
|
|
<td>" . nl2br(esc_html($message)) . "</td>
|
|
</tr>
|
|
</table>
|
|
</body>
|
|
</html>
|
|
";
|
|
|
|
// Nastavi glave
|
|
$headers = array(
|
|
'Content-Type: text/html; charset=UTF-8',
|
|
'From: Europe Wonder <info@europewonder.com>',
|
|
'Reply-To: ' . esc_html($name) . ' <' . esc_html($email) . '>'
|
|
);
|
|
|
|
// Beleži podrobnosti e-pošte pred pošiljanjem
|
|
error_log('Attempting to send email with subject: ' . $email_subject);
|
|
error_log('Email headers: ' . print_r($headers, true));
|
|
|
|
// Pošlji e-pošto in zapiši več informacij
|
|
add_action('wp_mail_failed', function($wp_error) {
|
|
error_log('WP Mail failed: ' . $wp_error->get_error_message());
|
|
});
|
|
|
|
// Pošlji e-pošto administratorju
|
|
$sent = wp_mail($to, $email_subject, $admin_body, $headers);
|
|
|
|
// Beleži rezultat pošiljanja
|
|
if (!$sent) {
|
|
// Beleži napako pri pošiljanju
|
|
global $phpmailer;
|
|
if (isset($phpmailer) && isset($phpmailer->ErrorInfo) && !empty($phpmailer->ErrorInfo)) {
|
|
error_log('PHPMailer error: ' . $phpmailer->ErrorInfo);
|
|
} else {
|
|
error_log('Email sending failed but no PHPMailer error available');
|
|
}
|
|
error_log('WordPress admin email setting: ' . get_option('admin_email'));
|
|
error_log('Email sending result: FAILED');
|
|
} else {
|
|
error_log('Email sending result: SUCCESS');
|
|
}
|
|
|
|
// Pošlji tudi e-pošto stranki
|
|
if ($sent) {
|
|
$customer_subject = 'Thank you for contacting Europe Wonder';
|
|
$customer_body = "
|
|
<html>
|
|
<head>
|
|
<title>Thank You for Your Message</title>
|
|
<style>
|
|
body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
|
|
h2 { color: #0073aa; }
|
|
p { margin-bottom: 15px; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h2>Thank You for Your Message</h2>
|
|
<p>Dear " . esc_html($name) . ",</p>
|
|
<p>Thank you for contacting Europe Wonder. We have received your message and will get back to you as soon as possible.</p>
|
|
<p>Here's a copy of the message you sent us:</p>
|
|
<p><strong>Subject:</strong> " . esc_html($subject) . "</p>
|
|
<p><strong>Message:</strong><br>" . nl2br(esc_html($message)) . "</p>
|
|
<p>If you have any additional questions, please feel free to reply to this email.</p>
|
|
<p>Best regards,<br>Europe Wonder Team</p>
|
|
</body>
|
|
</html>
|
|
";
|
|
|
|
$customer_headers = array(
|
|
'Content-Type: text/html; charset=UTF-8',
|
|
'From: Europe Wonder <info@europewonder.com>'
|
|
);
|
|
|
|
error_log('Attempting to send customer confirmation email to: ' . $email);
|
|
error_log('Customer email headers: ' . print_r($customer_headers, true));
|
|
|
|
$customer_sent = wp_mail($email, $customer_subject, $customer_body, $customer_headers);
|
|
|
|
if (!$customer_sent) {
|
|
// Beleži napako pri pošiljanju potrditvenega e-sporočila
|
|
global $phpmailer;
|
|
if (isset($phpmailer) && isset($phpmailer->ErrorInfo) && !empty($phpmailer->ErrorInfo)) {
|
|
error_log('Customer email PHPMailer error: ' . $phpmailer->ErrorInfo);
|
|
} else {
|
|
error_log('Customer email sending failed but no PHPMailer error available');
|
|
}
|
|
error_log('Customer email sending result: FAILED');
|
|
} else {
|
|
error_log('Customer email sending result: SUCCESS');
|
|
}
|
|
}
|
|
|
|
// Vrni odgovor
|
|
if ($sent) {
|
|
error_log('Contact form submission completed successfully');
|
|
wp_send_json_success('Thank you for your message! We will contact you shortly.');
|
|
} else {
|
|
error_log('Contact form submission failed - email not sent');
|
|
wp_send_json_error('There was an error sending your message. Please try again.');
|
|
}
|
|
}
|
|
add_action('wp_ajax_contact_form_submit', 'handle_contact_form');
|
|
add_action('wp_ajax_nopriv_contact_form_submit', 'handle_contact_form');
|
|
|
|
/**
|
|
* Funkcija za pridobivanje nonce vrednosti za obrazec Custom Journey Inquiry
|
|
*/
|
|
function get_inquiry_nonce() {
|
|
wp_send_json_success(wp_create_nonce('custom_inquiry_nonce'));
|
|
}
|
|
add_action('wp_ajax_get_inquiry_nonce', 'get_inquiry_nonce');
|
|
add_action('wp_ajax_nopriv_get_inquiry_nonce', 'get_inquiry_nonce');
|
|
|
|
/**
|
|
* Dodamo AJAX URL v JavaScript za plavajoči gumb obrazca
|
|
*/
|
|
function add_inquiry_ajax_object() {
|
|
wp_localize_script('grilctours-script', 'inquiry_ajax_object', array(
|
|
'ajax_url' => admin_url('admin-ajax.php')
|
|
));
|
|
}
|
|
add_action('wp_enqueue_scripts', 'add_inquiry_ajax_object', 20);
|
|
|
|
/**
|
|
* Obdelava povpraševanja za ture brez cene
|
|
*/
|
|
function send_tour_inquiry() {
|
|
check_ajax_referer('send_tour_inquiry', 'security');
|
|
|
|
try {
|
|
// Preveri obvezna polja
|
|
$required_fields = [
|
|
'name' => 'Full Name',
|
|
'email' => 'Email',
|
|
'date' => 'Departure Date',
|
|
'participants' => 'Number of Participants',
|
|
'tour_name' => 'Tour Name'
|
|
];
|
|
|
|
$missing_fields = [];
|
|
foreach ($required_fields as $field => $label) {
|
|
if (empty($_POST[$field])) {
|
|
$missing_fields[] = $label;
|
|
}
|
|
}
|
|
|
|
if (!empty($missing_fields)) {
|
|
throw new Exception('The following fields are required: ' . implode(', ', $missing_fields));
|
|
}
|
|
|
|
// Preveri veljavnost e-pošte
|
|
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
|
|
throw new Exception('Please enter a valid email address.');
|
|
}
|
|
|
|
// Pripravi vsebino e-pošte
|
|
$to = 'info@europewonder.com';
|
|
$subject = 'New Tour Inquiry: ' . sanitize_text_field($_POST['tour_name']);
|
|
|
|
$message = "A new tour inquiry has been received:\n\n";
|
|
$message .= "Tour: " . sanitize_text_field($_POST['tour_name']) . "\n";
|
|
$message .= "Name: " . sanitize_text_field($_POST['name']) . "\n";
|
|
$message .= "Email: " . sanitize_email($_POST['email']) . "\n";
|
|
$message .= "Departure Date: " . sanitize_text_field($_POST['date']) . "\n";
|
|
$message .= "Number of Participants: " . intval($_POST['participants']) . "\n\n";
|
|
|
|
// Dodaj sporočilo, če obstaja
|
|
if (!empty($_POST['message'])) {
|
|
$message .= "Additional Message:\n" . sanitize_textarea_field($_POST['message']) . "\n\n";
|
|
}
|
|
|
|
$message .= "This is an inquiry for a tour without a fixed price.";
|
|
|
|
$headers = array(
|
|
'Content-Type: text/plain; charset=UTF-8',
|
|
'From: ' . get_bloginfo('name') . ' <' . get_bloginfo('admin_email') . '>',
|
|
'Reply-To: ' . sanitize_text_field($_POST['name']) . ' <' . sanitize_email($_POST['email']) . '>'
|
|
);
|
|
|
|
// Pošlji e-pošto
|
|
$sent = wp_mail($to, $subject, $message, $headers);
|
|
|
|
if (!$sent) {
|
|
throw new Exception('Failed to send inquiry email. Please try again later.');
|
|
}
|
|
|
|
// Pošlji potrditveno e-pošto stranki
|
|
$customer_subject = 'Your Tour Inquiry - ' . get_bloginfo('name');
|
|
$customer_message = "Dear " . sanitize_text_field($_POST['name']) . ",\n\n";
|
|
$customer_message .= "Thank you for your inquiry about our tour:\n";
|
|
$customer_message .= sanitize_text_field($_POST['tour_name']) . "\n\n";
|
|
$customer_message .= "We have received your request with the following details:\n";
|
|
$customer_message .= "Departure Date: " . sanitize_text_field($_POST['date']) . "\n";
|
|
$customer_message .= "Number of Participants: " . intval($_POST['participants']) . "\n";
|
|
|
|
// Dodaj sporočilo v potrditveno e-pošto
|
|
if (!empty($_POST['message'])) {
|
|
$customer_message .= "\nYour Message:\n" . sanitize_textarea_field($_POST['message']) . "\n";
|
|
}
|
|
|
|
$customer_message .= "\nWe will review your inquiry and get back to you as soon as possible with pricing and availability information.\n\n";
|
|
$customer_message .= "Best regards,\n";
|
|
$customer_message .= get_bloginfo('name') . " Team";
|
|
|
|
wp_mail(sanitize_email($_POST['email']), $customer_subject, $customer_message, $headers);
|
|
|
|
wp_send_json_success(['message' => 'Your inquiry has been sent successfully.']);
|
|
|
|
} catch (Exception $e) {
|
|
wp_send_json_error(['message' => $e->getMessage()]);
|
|
}
|
|
}
|
|
add_action('wp_ajax_send_tour_inquiry', 'send_tour_inquiry');
|
|
add_action('wp_ajax_nopriv_send_tour_inquiry', 'send_tour_inquiry');
|
|
|
|
// Enqueue popup scripts and styles
|
|
function enqueue_popup_assets() {
|
|
if (is_front_page() || is_singular('individual_tour')) {
|
|
wp_enqueue_style('popup-styles', get_template_directory_uri() . '/css/popup.css');
|
|
wp_enqueue_script('popup-script', get_template_directory_uri() . '/js/popup.js', array('jquery'), '', true);
|
|
}
|
|
}
|
|
add_action('wp_enqueue_scripts', 'enqueue_popup_assets');
|
|
|
|
// Add popup HTML to footer
|
|
function add_popup_html() {
|
|
?>
|
|
<div id="email-popup" class="popup-overlay" style="display: none;">
|
|
<div class="popup-content">
|
|
<button class="close-button" onclick="closePopup()">×</button>
|
|
|
|
<!-- Sekcija za podatke o vodiču -->
|
|
<div id="guide-image-data"
|
|
data-guide-image="<?php echo esc_attr(get_post_meta(get_the_ID(), '_guide_image', true)); ?>"
|
|
data-guide-name="<?php echo esc_attr(get_post_meta(get_the_ID(), '_guide_name', true)); ?>"
|
|
data-guide-title="<?php echo esc_attr(get_post_meta(get_the_ID(), '_guide_title', true)); ?>">
|
|
</div>
|
|
<div class="popup-guide-info"></div>
|
|
|
|
<h2 class="popup-title">DON'T MISS OUT!</h2>
|
|
<h3 class="popup-subtitle">Get €100 OFF Your Next Tour!</h3>
|
|
<form id="email-form" onsubmit="submitEmail(event)">
|
|
<input type="email" id="popup-email" placeholder="Your email address" required>
|
|
<button type="submit" class="claim-button">CLAIM OFFER</button>
|
|
</form>
|
|
<p class="">The promotional code will be valid for 7 days from the date of issue.</p>
|
|
<button class="skip-button" onclick="closePopup()">CONTINUE WITHOUT OFFER</button>
|
|
<p class="terms-text">By sharing your email address, you agree to receive marketing emails and consent to our Terms & Conditions and Privacy Policy. Offer valid for first-time subscribers only. The promotional code will be valid for 7 days from the date of issue.</p>
|
|
<div id="success-message" style="display: none;">
|
|
<p>Thank you! Check your email for your €100 discount code.</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php
|
|
}
|
|
add_action('wp_footer', 'add_popup_html');
|
|
|
|
// Handle email submission
|
|
function handle_popup_email() {
|
|
if (!isset($_POST['email'])) {
|
|
wp_send_json_error('Email is required');
|
|
return;
|
|
}
|
|
|
|
$email = sanitize_email($_POST['email']);
|
|
|
|
// Preveri, če uporabnik že obstaja
|
|
if (email_exists($email)) {
|
|
wp_send_json_error('This email is already subscribed');
|
|
return;
|
|
}
|
|
|
|
// Generiraj naključno geslo
|
|
$random_password = wp_generate_password(12, true);
|
|
|
|
// Ustvari uporabniško ime iz e-pošte (pred @ delom)
|
|
$username = sanitize_user(current(explode('@', $email)), true);
|
|
|
|
// Če uporabniško ime že obstaja, dodaj naključno številko
|
|
$original_username = $username;
|
|
$counter = 1;
|
|
while (username_exists($username)) {
|
|
$username = $original_username . $counter;
|
|
$counter++;
|
|
}
|
|
|
|
// Ustvari novega uporabnika
|
|
$user_id = wp_create_user($username, $random_password, $email);
|
|
|
|
if (is_wp_error($user_id)) {
|
|
error_log('Error creating new user: ' . $user_id->get_error_message());
|
|
wp_send_json_error('Failed to create user');
|
|
return;
|
|
}
|
|
|
|
// Nastavi vlogo uporabnika na "subscriber"
|
|
$user = new WP_User($user_id);
|
|
$user->set_role('subscriber');
|
|
|
|
// Dodaj meta podatek, da je bil uporabnik ustvarjen preko popup-a
|
|
update_user_meta($user_id, 'signup_source', 'popup_subscription');
|
|
update_user_meta($user_id, 'signup_date', current_time('mysql'));
|
|
|
|
wp_send_json_success('Subscription successful');
|
|
}
|
|
add_action('wp_ajax_save_popup_email', 'handle_popup_email');
|
|
add_action('wp_ajax_nopriv_save_popup_email', 'handle_popup_email');
|