首页 > 解决方案 > 在woocommerce订单列中单击按钮时如何执行curl命令

问题描述

我正在为快递服务创建一个插件,以从 woocommerce 订单管理页面预订和跟踪发货。我正在创建一个列名 Trax,这是代码

add_action( 'manage_shop_order_posts_custom_column', 'trax_value_function', 2 );
    function trax_value_function($column) {

    if ($column == 'trax') {

    global $post;
    $data = get_post_meta($post->ID);
    $apiKey  = get_option('trax_api');
    $dvs_courier_tracking = get_post_meta( $post->ID, '_dvs_courier_tracking', true );

    //model box
    add_thickbox();
    echo '<a href="#TB_inline?width=600&height=550&inlineId=modal-window-id" class="thickbox">Track Order</a>';
    echo '<div id="modal-window-id" style="display:none;">';
    
    $apiUrl = "https://sonic.pk/api/shipment/track?tracking_number=".$dvs_courier_tracking."&type=0";
    $headers = ['Authorization:' . $apiKey, 'Accepts:' . 'application/json'];

    $curl = curl_init();
    curl_setopt($curl,CURLOPT_URL, $apiUrl);
    curl_setopt($curl,CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    $buffer = curl_exec($curl);
    curl_close($curl);

    // Display Trax Courier Tracking;
    $data = json_decode($buffer, true);
    echo '<div class="dvs-right-50">';
    echo '<strong>Tracking Details</strong>';
        foreach ($data['details']['tracking_history'] as $a) {
            echo '<br>';
            echo '<strong>Date: </strong>' . $a['date_time'];
            echo '<br>';
            echo '<strong>Status: </strong>' . $a['status'];
            echo '<br>';
            echo '<strong>Reason: </strong>' . $a['status_reason'];
            echo '<br>';
        }
    echo '</div>';
    }
}

该代码工作正常并给我输出,但是当我访问此链接 https://mywebsite.com/wp-admin/edit.php?post_type=shop_order时,它使 Woocommerce 管理订单页面非常慢

加载页面需要很长时间,因为每个订单 curl api 都会运行并捕获 json 数据。我想要当我单击“跟踪订单”按钮然后 curl 命令运行并在thickbox 中显示数据。

请帮忙。

标签: phpjsonwordpresswoocommercethickbox

解决方案


在这种情况下,您需要将您的函数包含在 Ajax 函数中,并且仅在单击该按钮时触发它。为此,您需要在 Woocommerce 的管理页面中插入一些 js 代码。

1 - 将您的函数插入 Ajax fn:

add_action ( 'wp_ajax_' . 'track_order_now', 'trax_value_function' );

2 - 将JS插入订单页面:

function js_enqueue() {
          jQuery(document).ready( function($) {
          var valueCheck;
          $('#ProductNameID').on( 'change', function () {
          valueSelect = $(this).val();
          if ( parseInt ( valueSelect ) > 0 ) {
          $.ajax( 
                     ajaxurl, // The remote URL address that starts the remote execution of WP
                     {
            type: 'POST',                       // you can choose among any of HTTP request methods
            data: { action: 'track_order_now', // The name of the WP action
                value:  valueSelect,       // The dataValues
                                // if you need it, other dataValues as elements of the object data
            },
            dataType: 'json', // we inform that we are going to receive PHP results as a JSON array
                        // ... other parameters for configuring the AJAX call if you need it
                        // Here the third section
            });
         }
    });
});
  }
 add_action('admin_enqueue_scripts', 'js_enqueue');

3 - 添加“跟踪订单按钮”

function portals_link($actions, $post)
{
  global $post;
 // Check if the post type is Woocommerce order
   if ($post->post_type=='shop_order') 
   {
   $actions['request_portal'] = '<a class='track_order' href="'.$URL.'?ui=request" title="" rel="permalink">Request Portal</a>';
   }
    return $actions;
}
add_filter('post_row_actions', 'track_order', 10, 2);

更多细节在这里: http ://www.joanmiquelviade.com/how-to-create-an-ajax-call-in-wordpress-step-by-step/

希望对您有所帮助,您需要自己做额外的工作。对整个插件进行编程可能需要一段时间,如果您的项目需要完整的插件,我愿意招聘。


推荐阅读