我正在尝试在 WooCommerce 订单页面中添加自定义订单操作。
我想在 WooCommerce 的批量订单操作下拉列表中添加两个新选项
非常感谢在这方面的任何帮助。
这个目标有两个部分要解决。
第一部分是在单个订单页面的元数据框中获取自定义订单操作。我试图完成同样的事情,但没有找到任何确定的东西,所以我在这里创建了一个教程:
http://neversettle.it/add-custom-order-action-woocommerce/
第二部分是在主订单页面的批量操作下拉列表中添加自定义订单操作。 Skyverge 在这里有一个很好的教程:
http://www.skyverge.com/blog/add-custom-bulk-action/
您需要注意的唯一具体事项是使用正确的
post_type
。对于 WooCommerce 订单,您需要使用它来代替该教程中的第一个示例:
add_action('admin_footer-edit.php', 'custom_bulk_admin_footer');
function custom_bulk_admin_footer() {
global $post_type;
if($post_type == 'shop_order') {
?>
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery('<option>').val('export').text('<?php _e('Export')?>').appendTo("select[name='action']");
jQuery('<option>').val('export').text('<?php _e('Export')?>').appendTo("select[name='action2']");
});
</script>
<?php
}
}
注意
shop_order
替换了用于条件检查的帖子 post_type
添加批量操作。
但从根本上说,@brasofilo 是正确的——在大多数情况下,WooCommerce 使用标准的 WordPress 结构、
post_type
机制和分类法。向订单页面添加批量操作的过程与向帖子页面添加批量操作的过程相同。
但是,您对单个订单页面上的自定义订单操作是正确的 - 这仅适用于 WooCommerce,您需要参考第一个教程以了解如何解决该部分。
这里是使用最新的 WooCommerce(撰写本文时为 7.5.1)创建自定义订单操作的示例
add_filter('woocommerce_order_actions', 'my_custom_woocommerce_order_actions', 10, 2);
add_action('woocommerce_process_shop_order_meta', 'my_custom_woocommerce_order_action_execute', 50, 2);
/**
* Filter: woocommerce_order_actions
* Allows filtering of the available order actions for an order.
*
* @param array $actions The available order actions for the order.
* @param WC_Order|null $order The order object or null if no order is available.
* @since 2.1.0 Filter was added.
* @since 5.8.0 The $order param was added.
*/
function my_custom_woocommerce_order_actions($actions, $order)
{
$actions['my-custom-order-action'] = __('Execute my custom order action', 'my-custom-order-action');
return $actions;
}
/**
* Save meta box data.
*
* @param int $post_id Post ID.
* @param WP_Post $post Post Object.
*/
function my_custom_woocommerce_order_action_execute(int $post_id, WP_Post $post)
{
if (filter_input(INPUT_POST, 'wc_order_action') !== 'my-custom-order-action') {
return;
}
$order = wc_get_order($post_id);
$order->add_order_note(__('My Custom Order Action was executed', 'my-custom-order-action'));
}