我写了一个woocommerce插件发送跟踪代码与短信为客户的计费_电话每个在订单编辑页面.

包裹被发送公司(例如,Post、Tipax、Fedex等)发送后,从他们那里接收跟踪代码.我想通过短信将代码发送给客户.

<?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.log(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'));
}

fields show correct

enter image description here

But my code has two problems

  1. 不是通过Ajax发送并显示发送结果,例如,在同一页面上以消息的形式,页面被更新,订单被更新!如果我不想做任何更新,也不想对数据库做任何更改.只需要发送代码.

  2. 短信是不发送在所有和我的插件不工作

以下是我的Web服务FarazSms/ipanel(一家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;


?>

您也可以在this link处看到更多细节.

推荐答案

在你的第一个功能中有一些缺失的东西,以避免你面临的问题(avoiding the order post update with a reload).

此外,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.log(xhr.responseText);
                }
            });
        });
    });
    </script>
    <?php
    endif;
}

代码将在子主题的functions.php文件中(或插件中).它应该能解决问题.

您的代码更改:

  • 添加type="button"到按钮HTML.
  • 添加preventDefault()到jQuery点击事件.
  • 从你的第一个函数中删除了jQuery代码,通过一个挂在admin_footer action hook中的函数将其添加到页脚中.

Php相关问答推荐

邮箱打开跟踪器不工作时发送邮件使用laravel调度程序

如何在不指定symfony列的情况下从数据库中获取行数组

在Google云存储对象上从PHP设置缓存控制TTL会更改错误的元数据

在WooCommerce产品中按类型对产品属性术语进行分类以供显示

如何删除Foreach语句中的重复值?

如何在Foreach语句中使用php和li按降序排序?

将部分产品排除在WooCommerce的计算附加费之外

基于自定义域的每个购物车项目的WooCommerce定制数量输入步骤

用GUZLE模拟Read_Timeout

既然setSQLLogger()已被弃用,如何使用中间件在 Doctrine 3 中记录查询执行时间?

在 WooCommerce 中应用优惠券时显示购物车商品折扣金额

simplexml_load_file 和 simplexml_load_string 返回具有不同编码的相同数据

Firefox 115 会话行为:为什么页面无法找到要加载的现有会话 ID?

URL中包含"&"与DirectoryIterator不兼容

yii2 sql迁移覆盖新更改的记录

正则表达式抓取递归括号的内容

如何在供应商名称后将自定义徽章添加到商品详情

PHP Remedy API 调用以创建附件无效的条目(使用 Postman Works!)

将参数传递给 laravel 9 工厂

递归数组处理