Artikel ini menjelaskan cara kerja dua jenis script pada WooCommerce: menambahkan status pesanan kustom dan membuat formulir konfirmasi pembayaran. Kedua script ini dirancang untuk meningkatkan fungsionalitas toko online dengan mengelola status pembayaran secara lebih efektif dan memungkinkan pelanggan mengonfirmasi pembayaran dengan mengunggah bukti pembayaran.
1. Script Status Pesanan Kustom
Menambahkan dan Mendaftarkan Status Pesanan
Script pertama bertujuan untuk menambahkan dua status pesanan baru: “Pengecekan Pembayaran” dan “Menunggu Pelunasan”. Status ini didaftarkan melalui fungsi register_post_status
, yang memungkinkan status ini tampil di daftar status pesanan di admin WooCommerce.
Selain itu, status ini juga ditambahkan ke dalam daftar status pesanan menggunakan filter wc_order_statuses
. Dengan begitu, admin dapat melihat dan mengelola pesanan dengan status baru ini.
Integrasi dengan Bulk Actions dan Order Actions
Script ini juga menambahkan status kustom tersebut ke dalam daftar tindakan massal (bulk actions) dan tindakan pesanan (order actions) di WooCommerce. Ini memungkinkan admin untuk mengubah status pesanan menjadi “Pengecekan Pembayaran” atau “Menunggu Pelunasan” dengan mudah, baik secara individu maupun massal.
Script (PHP):
// Add custom order statuses
add_action('init', 'register_custom_order_statuses');
function register_custom_order_statuses() {
register_post_status('wc-checking-payment', array(
'label' => _x('Pengecekan Pembayaran', 'Order status', 'woocommerce'),
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('Pengecekan Pembayaran <span class="count">(%s)</span>', 'Pengecekan Pembayaran <span class="count">(%s)</span>', 'woocommerce')
));
register_post_status('wc-waiting-payment', array(
'label' => _x('Menunggu Pelunasan', 'Order status', 'woocommerce'),
'public' => true,
'exclude_from_search' => false,
'show_in_admin_all_list' => true,
'show_in_admin_status_list' => true,
'label_count' => _n_noop('Menunggu Pelunasan <span class="count">(%s)</span>', 'Menunggu Pelunasan <span class="count">(%s)</span>', 'woocommerce')
));
}
// Add to list of WC Order statuses
add_filter('wc_order_statuses', 'add_custom_order_statuses');
function add_custom_order_statuses($order_statuses) {
$new_order_statuses = array();
// add new order statuses after processing
foreach ($order_statuses as $key => $status) {
$new_order_statuses[$key] = $status;
if ('wc-processing' === $key) {
$new_order_statuses['wc-checking-payment'] = _x('Pengecekan Pembayaran', 'Order status', 'woocommerce');
$new_order_statuses['wc-waiting-payment'] = _x('Menunggu Pelunasan', 'Order status', 'woocommerce');
}
}
return $new_order_statuses;
}
// Add custom statuses to the bulk actions dropdown
add_filter('bulk_actions-edit-shop_order', 'add_bulk_actions_for_custom_statuses');
function add_bulk_actions_for_custom_statuses($bulk_actions) {
$bulk_actions['mark_checking-payment'] = __('Mark as Pengecekan Pembayaran', 'woocommerce');
$bulk_actions['mark_waiting-payment'] = __('Mark as Menunggu Pelunasan', 'woocommerce');
return $bulk_actions;
}
// Add custom statuses to the actions dropdown
add_filter('woocommerce_admin_order_actions', 'add_custom_statuses_to_order_actions', 10, 2);
function add_custom_statuses_to_order_actions($actions, $order) {
if ($order->get_status() == 'processing') {
$actions['mark_checking-payment'] = array(
'url' => wp_nonce_url(admin_url('admin-ajax.php?action=woocommerce_mark_order_status&status=checking-payment&order_id=' . $order->get_id()), 'woocommerce-mark-order-status'),
'name' => __('Mark as Pengecekan Pembayaran', 'woocommerce'),
'action' => 'mark_checking-payment',
);
$actions['mark_waiting-payment'] = array(
'url' => wp_nonce_url(admin_url('admin-ajax.php?action=woocommerce_mark_order_status&status=waiting-payment&order_id=' . $order->get_id()), 'woocommerce-mark-order-status'),
'name' => __('Mark as Menunggu Pelunasan', 'woocommerce'),
'action' => 'mark_waiting-payment',
);
}
return $actions;
}
Tampilan
2. Script Formulir Konfirmasi Pembayaran
Membuat Shortcode untuk Formulir
Script kedua bertujuan untuk membuat formulir konfirmasi pembayaran yang dapat diakses oleh pelanggan melalui shortcode [konfirmasi_pembayaran]
. Formulir ini memungkinkan pelanggan yang telah login untuk memilih pesanan mereka dan mengunggah bukti pembayaran.
Pengelolaan Formulir dan Proses Pengunggahan
Formulir ini dirancang untuk menampilkan pesanan yang masih dalam status “on-hold”, “pending”, atau “waiting-payment”. Jika tidak ada pesanan yang tersedia, formulir akan menampilkan pesan bahwa tidak ada pesanan yang dapat dikonfirmasi. Pelanggan dapat memilih ID pesanan dan mengunggah bukti pembayaran dalam format gambar atau PDF.
Penanganan Pengiriman Formulir
Ketika formulir dikirim, script ini akan memeriksa validitas data yang dikirimkan dan memastikan bahwa pesanan yang dipilih memang milik pelanggan yang sedang login. Bukti pembayaran yang diunggah akan disimpan di direktori server, dan jalur file tersebut akan disimpan sebagai metadata pesanan. Setelah itu, status pesanan akan diubah menjadi “Pengecekan Pembayaran”, menandakan bahwa bukti pembayaran sedang diverifikasi oleh admin.
Script (PHP):
// Shortcode untuk formulir konfirmasi pembayaran
add_shortcode('konfirmasi_pembayaran', 'konfirmasi_pembayaran_shortcode');
function konfirmasi_pembayaran_shortcode() {
if (!is_user_logged_in()) {
return '<p>Anda harus login untuk mengkonfirmasi pembayaran.</p>';
}
// Get current user orders with status 'on-hold', 'pending', and 'waiting-payment'
$customer_orders = wc_get_orders(array(
'customer_id' => get_current_user_id(),
'status' => array('on-hold', 'pending', 'waiting-payment')
));
// If there are no orders, return a message
if (empty($customer_orders)) {
return '<p>Tidak ada pesanan yang bisa dikonfirmasi pembayarannya.</p>';
}
// Form HTML
ob_start();
?>
<form action="" method="post" enctype="multipart/form-data">
<label for="order_id">ID Order:</label>
<select name="order_id" id="order_id" required>
<option value="">Pilih ID Order</option>
<?php foreach ($customer_orders as $order) : ?>
<option value="<?php echo $order->get_id(); ?>"><?php echo $order->get_id(); ?></option>
<?php endforeach; ?>
</select>
<br><br>
<label for="payment_proof">Upload Bukti Pembayaran:</label>
<input type="file" name="payment_proof" id="payment_proof" accept="image/*,application/pdf" required>
<br><br>
<button type="submit" name="submit_payment_confirmation">Kirim</button>
</form>
<?php
return ob_get_clean();
}
// Handle form submission
add_action('wp', 'handle_payment_confirmation_form_submission');
function handle_payment_confirmation_form_submission() {
if (isset($_POST['submit_payment_confirmation'])) {
if (!isset($_POST['order_id']) || !is_user_logged_in()) {
return;
}
$order_id = intval($_POST['order_id']);
$order = wc_get_order($order_id);
// Check if the order belongs to the current user
if ($order->get_user_id() !== get_current_user_id()) {
return;
}
// Check if file is uploaded
if (!isset($_FILES['payment_proof'])) {
return;
}
$uploaded_file = $_FILES['payment_proof'];
$upload_dir = wp_upload_dir();
$target_dir = $upload_dir['basedir'] . '/payment_proofs/';
// Create directory if not exists
if (!file_exists($target_dir)) {
mkdir($target_dir, 0755, true);
}
$target_file = $target_dir . basename($uploaded_file['name']);
move_uploaded_file($uploaded_file['tmp_name'], $target_file);
// Attach file to order
update_post_meta($order_id, '_payment_proof', $target_file);
// Change order status to 'checking-payment'
$order->update_status('checking-payment', 'Bukti pembayaran telah diunggah.');
wc_add_notice('Konfirmasi pembayaran berhasil dikirim.', 'success');
wp_redirect('https://alter-trial.online/trial2/terimakasih/');
exit;
}
}
Tampilan
Penutup
Dengan implementasi kedua script ini, WooCommerce dapat mengelola proses verifikasi pembayaran dengan lebih baik dan memberikan pengalaman yang lebih baik bagi pelanggan dalam mengonfirmasi pembayaran mereka. Admin dapat dengan mudah melacak dan mengelola pesanan berdasarkan status pembayaran yang lebih rinci dan spesifik, sementara pelanggan memiliki alat yang mudah digunakan untuk mengonfirmasi pembayaran mereka.