php - 在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 中显示数据。
请帮忙。
解决方案
在这种情况下,您需要将您的函数包含在 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/
希望对您有所帮助,您需要自己做额外的工作。对整个插件进行编程可能需要一段时间,如果您的项目需要完整的插件,我愿意招聘。
推荐阅读
- sql - 当日期为时间戳时,在指定日期之间抓取记录
- verilog - 时钟块层次结构中的信号延迟与波形中的 RTL 层次结构
- c++ - 为什么这个 SQL 查询似乎没有失败,但实际上失败了?
- javascript - Is there is a way to check a word is same to another word?
- python - PGAdmin4 虚拟主机不适用于 Apache2 + WSGI
- r - 如何对齐闪亮的输入框,特别是 selectInput 和 numericInput
- html - 如何使用 CSS 将搜索图标 (
- c# - 泛型和重载多态
- javascript - React Hooks:如何访问自定义属性值?
- c# - 如何解决字符串上可为空的 C# SqlNull 异常?