在WooCommerce中更新订单元之前的挂钩?

时间:2018-03-28 14:11:20

标签: wordpress woocommerce hook-woocommerce

我只是asked this question关于在订单更新后挂钩订单。不幸的是,虽然我已经意识到之前已经保存了元数据,所以我需要在保存订单之前挂钩订单,以便我在数组中同时拥有原始元数据和新保存的元数据。有谁知道我可以使用什么钩来实现这个目标?这就是我到目前为止的尝试。

我已经编写了下面的代码来挂钩订单保存功能。然后,我进入我的一个WooCommerce订单,并将自定义coverstart元更改为其他日期。然后,下面的代码应该转储分配给covertart的前一个元值,以及当前保存的新值。

//save_post_shop_order
add_action( 'save_post_shop_order', 'process_offline_order' );
function process_offline_order( $post_id, $post, $update ) {

    // Orders in backend only
    if ( ! is_admin() ) {
        return;
    }

    // Get an instance of the WC_Order object (in a plugin)
    $order = new WC_Order( $post_id );

    $trigger_status = get_post_meta( $post_id, '_hook_is_triggered', true );

    if ( $update ) {

        // Not a new order
        if ( 'Create new order' != $trigger_status ) {

            $metaArray = $_POST['meta'];

            foreach ( $metaArray as $meta => $key ) {
                $metaArr[ $key["key"] ] = $key["value"];
            }

            // Data
            $data = new WC_Order( $order );
            $meta = get_post_meta( $order->ID );

            // These should be different when altering an order and changing it
            // ... but it's showing the same value for both 
            var_dump( $meta['coverstart'][0] );
            var_dump( $metaArr['coverstart'] );
            die();

        }

    }

}

1 个答案:

答案 0 :(得分:1)

我找到了一个适合你的转身。我将 coverstart 值第二次保存在其他不同的后元数据键中。因此,这样我的初始 coverstart 值...您甚至可以在此附加自定义元字段中存储的数组中创建更改历史记录。

代码:

// Save an additional coverstart value in in the order post meta dat
add_action( 'woocommerce_checkout_create_order', 'initial_coverstart_custom_field_save', 20, 1 );
function initial_coverstart_custom_field_save( $order ) {
    if( ! isset($_POST['coverstart']) ) return;

    if( ! empty($_POST['coverstart']) ){
        $order->update_meta_data( '_coverstart0', sanitize_text_field( $_POST['coverstart'] ) );
    }
}

// Backend: Updating Order data
add_action( 'save_post_shop_order', 'process_offline_order' );
function process_offline_order( $post_id, $post, $update ) {

    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id; // Exit if it's an autosave

    // Initial coverstart value
    $initial_coverstart = get_post_meta( $post_id, '_coverstart0', true );

    // Updated coverstart value
    $updated_coverstart = get_post_meta( $post_id, 'coverstart', true );

    // RAW OUTPUT
    var_dump( $initial_coverstart );
    var_dump( $updated_coverstart );
    die();
}

代码放在活动子主题(或活动主题)的function.php文件中。经过测试和工作。