Formulár na zopakovanie objednávky cez shortcode

Niekedy zákazník nepotrebuje prehľadávať celý katalóg, aby si kúpil to isté čo minule. Stačí mu číslo predchádzajúcej objednávky a e-mail. Tento snippet vytvorí jednoduchý formulár, ktorý po overení údajov automaticky naplní košík identickými produktmi a presmeruje zákazníka k pokladni.

Ako to funguje?

Tento kód zaregistruje shortcode [repeat_order_form], ktorý môžete vložiť kamkoľvek – do stránky, príspevku alebo do widgetu.

  1. Formulár: Zobrazí dve polia (E-mail a Číslo objednávky).
  2. Overenie: Cez AJAX (bez obnovenia stránky) skontroluje, či objednávka s daným číslom existuje a či k nej prislúcha zadaný e-mail.
  3. Akcia: Ak údaje sedia, systém vyprázdni aktuálny košík, pridá doň položky z pôvodnej objednávky a pošle zákazníka priamo do pokladne.
PHP
function zopakovat_objednavku_formular() {
    ob_start();
    ?>
    <style>
    #repeat-order-form .form-grid {
      display: grid;
      grid-template-columns: 1fr 1fr;
      column-gap: 1rem;
      row-gap: 0.5rem;
      margin-bottom: 1.5rem;
    }
    #repeat-order-form .form-group {
      display: flex;
      flex-direction: column;
    }
    #repeat-order-form button {
      margin-bottom: 0.5rem;
    }
    #repeat-order-form #response-message {
      display: none;
    }
    </style>

    <form id="repeat-order-form">
      <div class="form-grid">
        <div class="form-group">
          <label for="email">Váš e-mail:</label>
          <input type="email" name="email" id="email" required class="input-text" />
        </div>

        <div class="form-group">
          <label for="order_id">Číslo objednávky:</label>
          <input type="text" name="order_id" id="order_id" required class="input-text" />
        </div>
      </div>

      <button type="submit" class="button alt">Zopakovať objednávku</button>
      <p id="response-message" class="woocommerce-error"></p>
    </form>

    <script>
    jQuery(document).ready(function($) {
      $('#repeat-order-form').submit(function(e) {
        e.preventDefault();

        var email = $('#email').val();
        var order_id = $('#order_id').val();

        $.ajax({
          type: "POST",
          url: "<?php echo admin_url('admin-ajax.php'); ?>",
          data: {
            action: "repeat_order",
            email: email,
            order_id: order_id
          },
          success: function(response) {
            if (response.success) {
              // Tu zmeňte URL na vašu stránku pokladne/košíka
              window.location.href = "https://vasadomena.sk/pokladna/";
            } else {
              $('#response-message')
                .text(response.data)
                .show();
            }
          }
        });
      });
    });
    </script>
    <?php
    return ob_get_clean();
}
add_shortcode('repeat_order_form', 'zopakovat_objednavku_formular');

// AJAX proces na pozadí
function zopakovat_objednavku_ajax() {
    if (!isset($_POST['email']) || !isset($_POST['order_id'])) {
        wp_send_json_error("Neplatné údaje.");
    }

    $email = sanitize_email($_POST['email']);
    $order_id = intval($_POST['order_id']);
    $order = wc_get_order($order_id);

    if ($order && $order->get_billing_email() === $email) {
        WC()->cart->empty_cart(); // Vyčistíme košík pred pridaním nových vecí

        foreach ($order->get_items() as $item) {
            WC()->cart->add_to_cart($item->get_product_id(), $item->get_quantity());
        }

        wp_send_json_success();
    } else {
        wp_send_json_error("Objednávka nebola nájdená alebo e-mail nesedí.");
    }
}
add_action('wp_ajax_repeat_order', 'zopakovat_objednavku_ajax');
add_action('wp_ajax_nopriv_repeat_order', 'zopakovat_objednavku_ajax');

Na čo si dať pozor?

  • URL adresa presmerovania (riadok 60): V skripte (riadok s window.location.href) je nastavená statická adresa. Pred nasadením ju nezabudnite zmeniť na vašu reálnu adresu pokladne (checkout).
  • Štýlovanie: Pridal som základné CSS, aby polia boli vedľa seba, ale snippet preberá vizuál vašej témy (tlačidlá, fonty). Ak to nevyzerá podľa vašich predstáv, CSS v hlavičke funkcie si upravte.
  • Bezpečnosť: Snippet kontroluje zhodu e-mailu a ID objednávky. To bráni tomu, aby niekto náhodne „skúšal“ čísla objednávok a pozeral, čo v nich bolo.

Zanechať odpoveď

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *