Как отправить код отслеживания заказа WooCommerce с помощью SMS

Я написал плагин WooCommerce для отправки кодов отслеживания с помощью SMS на Billing_phone каждого клиента на странице редактирования заказа.

После того, как посылка отправлена ​​компанией-отправителем (например, Post, Tipax, FedEx и т. д.), от них поступает код отслеживания. И я хочу отправить этот код клиенту по SMS.

<?php
/*
Plugin Name: Order Tracking Plugin
Plugin URI: #
Description: A plugin for sending order tracking codes via SMS.
Version: 1.0
Author: Paul Vek
*/

// Add order tracking fields after shipping address
add_action('woocommerce_admin_order_data_after_shipping_address', 'display_order_tracking_fields');
function display_order_tracking_fields($order) {
    // Retrieve order and customer information
    $order_id = $order->get_id();
    $billing_first_name = $order->get_billing_first_name();
    $billing_last_name = $order->get_billing_last_name();
    $customer_phone = $order->get_billing_phone();
    $order_number = $order->get_order_number();
    $tracking_code = get_post_meta($order_id, 'tracking_code', true);

    // Display order tracking fields
    ?>
    <div class = "order_tracking_container">
        <h3><?php esc_html_e('Order Tracking', 'your-textdomain'); ?></h3>
        <p>
            <label for = "tracking_code"><?php esc_html_e('Tracking Code:', 'your-textdomain'); ?></label>
            <input type = "text" id = "tracking_code" name = "tracking_code" value = "<?php echo esc_attr($tracking_code); ?>">
        </p>
        <p>
            <label for = "sending_method"><?php esc_html_e('Sending Method:', 'your-textdomain'); ?></label>
            <select id = "sending_method" name = "sending_method">
                <option value = "tipax">Tipax</option>
                <option value = "post">Post</option>
                <option value = "chapar">Chapar</option>
            </select>
        </p>
        <p>
            <label for = "tracking_address"><?php esc_html_e('Tracking Address:', 'your-textdomain'); ?></label>
            <select id = "tracking_address" name = "tracking_address">
                <option value = "trcking.post.ir">trcking.post.ir</option>
                <option value = "tipaxco.com">tipaxco.com</option>
            </select>
        </p>
        <p>
            <button id = "send_tracking_code" class = "button"><?php esc_html_e('Send Tracking Code', 'your-textdomain'); ?></button>
        </p>
        <div id = "tracking_code_message"></div>
    </div>

    <script>
        jQuery(document).ready(function($) {
            $('#send_tracking_code').click(function() {
                var tracking_code = $('#tracking_code').val();
                var sending_method = $('#sending_method').val();
                var tracking_address = $('#tracking_address').val();
                var order_id = $('input[name = "post_ID"]').val();

                $.ajax({
                    type: 'POST',
                    url: '<?php echo admin_url('admin-ajax.php'); ?>',
                    data: {
                        action: 'send_tracking_code',
                        tracking_code: tracking_code,
                        sending_method: sending_method,
                        tracking_address: tracking_address,
                        order_id: order_id
                    },
                    success: function(response) {
                        $('#tracking_code_message').html(response);
                    },
                    error: function(xhr, status, error) {
                        console.info(xhr.responseText);
                    }
                });
            });
        });
    </script>
    <?php
}

// AJAX handler for sending tracking code
add_action('wp_ajax_send_tracking_code', 'send_tracking_code');
function send_tracking_code() {
    // Check if the request is coming from an AJAX call
    if (!defined('DOING_AJAX') || !DOING_AJAX) {
        wp_die();
    }

    // Get the order ID and tracking details from the AJAX request
    $order_id = isset($_POST['order_id']) ? intval($_POST['order_id']) : 0;
    $tracking_code = isset($_POST['tracking_code']) ? sanitize_text_field($_POST['tracking_code']) : '';
    $sending_method = isset($_POST['sending_method']) ? sanitize_text_field($_POST['sending_method']) : '';
    $tracking_address = isset($_POST['tracking_address']) ? sanitize_text_field($_POST['tracking_address']) : '';

    // Check if all required data is present
    if (empty($order_id) || empty($tracking_code) || empty($sending_method) || empty($tracking_address)) {
        wp_send_json_error(__('Missing required parameters.', 'order-tracking-plugin'));
    }

    // Compose message
    $order = wc_get_order($order_id);
    $billing_first_name = $order->get_billing_first_name();
    $billing_last_name = $order->get_billing_last_name();
    $order_id = $order->get_order_id();
    $message = sprintf(__('Hello %s %s dear. The order %s was sent through %s. Tracking code: %s. To track it, go to this address: %s.', 'order-tracking-plugin'), $billing_first_name, $billing_last_name, $order_id, $sending_method, $tracking_code, $tracking_address);

    // Send SMS using API
    $api_key = '';
    $sender_number = '3000505';
    $username = '';
    $password = '';
    $rcpt_nm = array($billing_phone); // Use customer's phone number as recipient

    $url = "https://ippanel.com/services.jspd";
    $params = array(
        'uname' => $username,
        'pass' => $password,
        'from' => $sender_number,
        'message' => $message,
        'to' => json_encode($rcpt_nm), // Use rcpt_nm as recipients
        'op' => 'send'
    );

    $handler = curl_init($url);
    curl_setopt($handler, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($handler, CURLOPT_POSTFIELDS, $params);
    curl_setopt($handler, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($handler);
    $response = json_decode($response);

    // Check if SMS was sent successfully
    if ($response[0] != 200) {
        wp_send_json_error(__('Failed to send tracking code.', 'order-tracking-plugin'));
    }

    // Prevent order from being saved during AJAX request
    add_filter('woocommerce_before_order_object_save', 'disable_order_save_during_ajax');

    // Return success message
    wp_send_json_success(__('Tracking code sent successfully.', 'order-tracking-plugin'));
}

поля показывают правильно

Но у моего кода есть две проблемы

  1. Вместо отправки по Ajax и отображения результата отправки, например, в виде сообщения на той же странице, происходит обновление страницы и обновление заказа! Если я не хочу, чтобы выполнялись какие-либо обновления и не вносились изменения в базу данных. Необходимо отправить только код.

  2. СМС вообще не отправляются и у меня плагин не работает

Вот пример кода моего веб-сервиса FarazSms/ippanel (компания, предоставляющая услуги SMS) для отправки SMS. Правильно ли я использовал этот метод в своем плагине или нет?

<?php
        $url = "https://ippanel.com/services.jspd";

        $rcpt_nm = array('9121111111','9122222222');
        $param = array
                    (
                        'uname'=>'',
                        'pass'=>'',
                        'from'=>'',
                        'message'=>'test',
                        'to'=>json_encode($rcpt_nm),
                        'op'=>'send'
                    );

        $handler = curl_init($url);
        curl_setopt($handler, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($handler, CURLOPT_POSTFIELDS, $param);
        curl_setopt($handler, CURLOPT_RETURNTRANSFER, true);
        $response2 = curl_exec($handler);

        $response2 = json_decode($response2);
        $res_code = $response2[0];
        $res_data = $response2[1];

        echo $res_data;
?>

Более подробную информацию вы также можете увидеть по по этой ссылке.

Эта строка $response = json_decode($response); почему вы не проверяете, что она расшифрована? Нет никаких гарантий, что curl_exec() вернет строку json. Он вполне мог бы вернуть html, если бы возникла проблема с сетью. Вероятно, в вашем коде есть другие проблемы. Что вам нужно, так это стратегически настроить отладку, чтобы вы могли видеть возникающие проблемы. Подумайте «журналы».

GetSet 27.03.2024 13:29

Я предполагаю, что добавленный вами HTML-код, вероятно, находится внутри формы редактирования заказа? Затем ваша кнопка отправит эту форму, отменяя ваш запрос AJAX. Добавьте type = "button", чтобы сделать это кнопкой «нажмите» вместо кнопки «Отправить», или запретите использование события по умолчанию в функции обработчика кликов.

CBroe 27.03.2024 14:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
2
130
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В вашей первой функции есть некоторые недостающие вещи, чтобы избежать проблемы, с которой вы столкнулись (избегая обновления публикации заказа с перезагрузкой).

Кроме того, код JavaScript желательно размещать в нижнем колонтитуле.

Замените вашу первую функцию следующей:

// Add order tracking fields after shipping address
add_action('woocommerce_admin_order_data_after_shipping_address', 'display_order_tracking_fields');
function display_order_tracking_fields($order) {
    // Retrieve order and customer information
    $order_id = $order->get_id();
    $billing_first_name = $order->get_billing_first_name();
    $billing_last_name = $order->get_billing_last_name();
    $customer_phone = $order->get_billing_phone();
    $order_number = $order->get_order_number();
    $tracking_code = get_post_meta($order_id, 'tracking_code', true);

    // Display order tracking fields
    ?>
    <div class = "order_tracking_container">
        <h3><?php esc_html_e('Order Tracking', 'your-textdomain'); ?></h3>
        <p>
            <label for = "tracking_code"><?php esc_html_e('Tracking Code:', 'your-textdomain'); ?></label>
            <input type = "text" id = "tracking_code" name = "tracking_code" value = "<?php echo esc_attr($tracking_code); ?>">
        </p>
        <p>
            <label for = "sending_method"><?php esc_html_e('Sending Method:', 'your-textdomain'); ?></label>
            <select id = "sending_method" name = "sending_method">
                <option value = "tipax">Tipax</option>
                <option value = "post">Post</option>
                <option value = "chapar">Chapar</option>
            </select>
        </p>
        <p>
            <label for = "tracking_address"><?php esc_html_e('Tracking Address:', 'your-textdomain'); ?></label>
            <select id = "tracking_address" name = "tracking_address">
                <option value = "trcking.post.ir">trcking.post.ir</option>
                <option value = "tipaxco.com">tipaxco.com</option>
            </select>
        </p>
        <p>
            <button type = "button" id = "send_tracking_code" class = "button"><?php esc_html_e('Send Tracking Code', 'your-textdomain'); ?></button>
        </p>
        <div id = "tracking_code_message"></div>
    </div>
    <?php    
}

// Jquery code
add_action( 'admin_footer', 'wc_order_admin_footer_script' );
function wc_order_admin_footer_script() {
    global $pagenow, $typenow;

    if ( $pagenow === 'post.php' && $typenow === 'shop_order' ) :
    ?>
    <script>
    jQuery( function($) {
        $('#send_tracking_code').click(function(e) {
            e.preventDefault();

            var tracking_code = $('#tracking_code').val();
            var sending_method = $('#sending_method').val();
            var tracking_address = $('#tracking_address').val();
            var order_id = $('input[name = "post_ID"]').val();

            $.ajax({
                type: 'POST',
                url: '<?php echo admin_url('admin-ajax.php'); ?>',
                data: {
                    action: 'send_tracking_code',
                    tracking_code: tracking_code,
                    sending_method: sending_method,
                    tracking_address: tracking_address,
                    order_id: order_id
                },
                success: function(response) {
                    $('#tracking_code_message').html(response);
                },
                error: function(xhr, status, error) {
                    console.info(xhr.responseText);
                }
            });
        });
    });
    </script>
    <?php
    endif;
}

Код находится в файле function.php вашей дочерней темы (или в плагине). Это должно решить проблему.

Изменения в вашем коде:

  • Добавлен type = "button" к кнопке HTML.
  • Добавлен preventDefault() к событию клика jQuery.
  • Удален код jQuery из вашей первой функции, чтобы добавить его в нижний колонтитул с помощью функции, подключенной к хуку действия admin_footer.

Спасибо @LoicTheAztec за исправление первой функции.

Теперь, чтобы исправить вторую функцию и решить проблему не отправки СМС, просто используйте следующий код. Проверено и работает.

// AJAX handler for sending tracking code
add_action('wp_ajax_send_tracking_code', 'send_tracking_code');
function send_tracking_code() {
    // Check if the request is coming from an AJAX call
    if (!defined('DOING_AJAX') || !DOING_AJAX) {
        wp_die();
    }

    // Get the order ID and tracking details from the AJAX request
    $order_id = isset($_POST['order_id']) ? intval($_POST['order_id']) : 0;
    $tracking_code = isset($_POST['tracking_code']) ? sanitize_text_field($_POST['tracking_code']) : '';
    $sending_method = isset($_POST['sending_method']) ? sanitize_text_field($_POST['sending_method']) : '';
    $tracking_address = isset($_POST['tracking_address']) ? sanitize_text_field($_POST['tracking_address']) : '';

    // Check if all required data is present
    if (empty($order_id) || empty($tracking_code) || empty($sending_method) || empty($tracking_address)) {
        wp_send_json_error(__('Missing required parameters.', 'order-tracking-plugin'));
    }

    // Compose message
    $order = wc_get_order($order_id);
    $billing_first_name = $order->get_billing_first_name();
    $billing_last_name = $order->get_billing_last_name();
    $billing_phone = $order->get_billing_phone(); // Retrieve billing phone
    $order_id = $order->get_order_number();
    $message = sprintf(__('Hello %s %s dear. The order %s was sent through %s. Tracking code: %s. To track it, go to this address: %s.', 'order-tracking-plugin'), $billing_first_name, $billing_last_name, $order_id, $sending_method, $tracking_code, $tracking_address);

    // Send SMS using API
    $api_key = '';
    $sender_number = '3000505';
    $username = '';
    $password = '';
    $rcpt_nm = array($billing_phone); // Use customer's phone number as recipient

    $url = "https://ippanel.com/services.jspd";
    $params = array(
        'uname' => $username,
        'pass' => $password,
        'from' => $sender_number,
        'message' => $message,
        'to' => json_encode($rcpt_nm), // Use rcpt_nm as recipients
        'op' => 'send'
    );

    $handler = curl_init($url);
    curl_setopt($handler, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($handler, CURLOPT_POSTFIELDS, $params);
    curl_setopt($handler, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($handler);
    $response = json_decode($response);

    // Check if SMS was sent successfully
    if ($response[0] != 200) {
        wp_send_json_error(__('Failed to send tracking code.', 'order-tracking-plugin'));
    }

    // Return success message
    wp_send_json_success(__('Tracking code sent successfully.', 'order-tracking-plugin'));
}
  1. Я забыл это использовать $billing_phone = $order->get_billing_phone(); // Retrieve billing phone И теперь я добавил ниже раздел // Написать сообщение.

  2. Я изменил $order_id = $order->get_order_id(); на $order_id = $order->get_order_number();

  3. Я удалил // Prevent order from being saved during AJAX request add_filter('woocommerce_before_order_object_save', 'disable_order_save_during_ajax'); из кода.

Другие вопросы по теме