Заменить валюту заказа при создании заказа вручную в Woocommerce admin - PullRequest
0 голосов
/ 21 апреля 2019

В WooCommerce при создании и сохранении ручного заказа через Admin я пытаюсь заменить значение валюты заказа на пользовательское значение метаданных (мета-ключ _wcj_order_currency)

Вот 2 скриншота связанных метаданных (пары ключ / значение):

  • Валюта заказа:

    enter image description here

  • Пользовательская валюта (из плагина Booster) :

    enter image description here

Поэтому я хотел бы заменить валюту заказа EUR на пользовательскую валюту USD с _order_currency мета-ключ при сохранении .

Ссылки, которые я использовал:

Моя попытка кода:

// Saving (Updating) or doing an action when submitting
add_action( 'save_post', 'update_order_custom_field_value' );
function update_order_custom_field_value( $post_id ){

    // Only for shop order
 //    if ( 'shop_order' != $_POST[ 'post_type' ] ) 
    if ( 'shop_order')
        return $post_id;

    // Checking that is not an autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;

    // Check the user’s permissions (for 'shop_manager' and 'administrator' user roles)
    if ( ! current_user_can( 'edit_shop_order', $post_id ) )
        return $post_id;

//Up to above is fine for Admin order

    // Updating custom field data
    if( isset( $_POST['_wcj_order_currency'] ) ) {
        $order = wc_get_order( $post_id );

        // Replacing and updating the value
        update_post_meta( $post_id, '_order_currency', $_POST['_wcj_order_currency'] );
}}

// Testing output in order edit pages (below billing address):
//This displays the existing values well
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_order_custom_field_value' );
function display_order_custom_field_value( $order ){
    echo '<p><strong>'.__('Order Currency').':</strong> <br/>' . get_post_meta( $order->get_id(), '_order_currency', true ) . '</p>';
    echo '<p><strong>'.__('Booster Order Currency').':</strong> <br/>' . get_post_meta( $order->get_id(), '_wcj_order_currency', true ) . '</p>';
}

Проверка вывода в страницах редактирования заказа (ниже адреса для выставления счета).Код работает хорошо.

Testing output in order edit pages (below billing address)

Но я не могу заставить его работать и обновлять валюту заказа при создании заказа.

Любая помощь по этому вопросу приветствуется.

1 Ответ

1 голос
/ 21 апреля 2019

Чтобы ваш скрипт работал только при создании нового заказа, попробуйте следующий повторный код (с комментариями):

// Save order data
add_action( 'save_post_shop_order', 'update_order_currency_on_creation', 1000 );
function update_order_currency_on_creation( $order_id ){
    // Ensure that this is a manual new order 
    if( $created = get_post_meta( $order_id, '_created_via', true ) ) {
        return $order_id;
    }

    // Checking that is not an autosave  (not sure that this is really needed on Woocommerce orders)
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return $order_id;
    }

    // Check the user’s permissions (for 'shop_manager' and 'administrator' user roles)
    if ( ! current_user_can( 'edit_shop_order', $order_id ) ) {
        return $order_id;
    }

    ## ---- Updating order currency ---- ##

    // Get the WC_Order object
    $order    = wc_get_order($order_id); 

    // HERE below the Booster meta key for Order currency
    $meta_key = '_wcj_order_currency';

    // If Booster currency is already in database (in case of, to be sure)
    if ( $value = $order->get_meta($meta_key) ) {
        $order->set_currency( esc_attr($value) );
        $order->save(); // Save order data
    }
    // If not, we get the posted Booster currency value (else)
    elseif ( isset($_POST[$meta_key]) && ( $value = esc_attr($_POST[$meta_key]) ) ) {
        $order->set_currency( esc_attr($_POST[$meta_key]) );
        $order->save(); // Save order data
    }
}


// Testing output in order edit pages (below billing address): This displays the existing values as well.
add_action( 'woocommerce_admin_order_data_after_billing_address', 'display_specific_order_details' );
function display_specific_order_details( $order ){
    echo '<div><p><strong>'.__('Order Currency').':</strong> ' . $order->get_currency() . '</p>
    <p><strong>'.__('Booster Order Currency').':</strong> ' . $order->get_meta( '_wcj_order_currency' ) . '</p></div>';
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы).Проверено и работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...