Как передать массив данных из одной подключенной функции в другую в WooCommerce

Я делаю вызов партнерскому API, используя данные, содержащиеся в полях проверки woocommerce, а также в корзине. Этот первый вызов выполняется с использованием хука процесса оформления заказа для проверки данных через API. если вызов возвращает, что он действителен, процесс продолжается, в противном случае он останавливается.

Затем мне нужно дождаться завершения платежа, чтобы сделать еще один вызов, чтобы фактически создать план с использованием тех же данных. Есть ли способ передать массив, который я создаю при первом вызове хука процесса оформления заказа, на хук завершения оплаты, чтобы не перестраивать массив?

Код будет выглядеть следующим образом:

add_action('woocommerce_checkout_process', 'apicall_verif');  
function apicall_verif () {
    $_ids      = array(...);

    $billing_fields = [
      'billing_first_name'  => '',
      'billing_last_name'   => '',
      'billing_email'       => '',
      'billing_phone'       => '',
      'insurance-birthdate' => '',
      'gender-selection'    => '',
        'billing_address_1' => '',
        'billing_address_2' => '',
        'billing_postcode'  => '',
        'billing_city'      => ''  
    ];
    
    foreach( $fields as $field_name => $value ) {
        if ( !empty( $_POST[$field_name] ) ) {
            $fields[$field_name] = sanitize_text_field( $_POST[$field_name] );
        } 
    }
     
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        if ( in_array( $cart_item['product_id'],  $_ids ) ) {
            $_product_id = $cart_item['product_id'];
        }
    }
    
    $_product       =  wc_get_product( $_product_id );
    $billingcountry = WC()->customer->get_billing_country();
    $cur_lang       = pll_current_language();
    
    $data_verif = array(
        "refs"         =>  array(
            "country"  => $billingcountry,
        ),
        "settings"     =>  array(
            "language" => $cur_lang
        ),
        "policyholder" =>  array(
            "firstName"  => $fields['billing_first_name'] ,
            "lastName"   => $fields['billing_last_name'],
            "email"      => $fields['billing_email'],
            "phone"      => $fields['billing_phone'],
            "birthdate"  => $fields['insurance-birthdate'],
            "gender"     => $fields['gender-selection' ],
            "address"    =>  array(
                "country"  => $billingcountry,
                "zip"      => $fields['billing_postcode'],
                "city"     => $fields['billing_city'],
                "street"   => $fields['billing_address_1'],
                "number"   => $fields['billing_address_2'],
                "box"      => "box"
            ),
            "entityType" => "ENTITY_TYPE_PERSON"
        ), 
        "risk"         => array(
             "model"            => $_product -> get_title(),
             "originalValue"    =>  $_product -> get_price() * 100,
             "antiTheftMeasure" => "ANTI_THEFT_MEASURE_NONE",
        ),
        "terms"        => array(
            "depreciation" => false
        ),
    );
    
    // Set the array to a custom WC_Session variable (to be used afterwards)
    WC()->session->set('data_verif', $data_verif);
    
    // API CALL HERE AND CHECK WHETHER VALID OR NOT
}


//After payment is completed
add_action( 'woocommerce_payment_complete', 'apicall_create' );
function apicall_create() {
    //Somehow get $data_verif here and do another API call
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
202
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете просто установить свой массив в пользовательской переменной WC_Session, которую вы сможете использовать впоследствии, например:

$data_verif = array(
    "refs"         =>  array(
        "country"  => $billingcountry,
    ),
    "settings"     =>  array(
        "language" => $cur_lang
    ),
    "policyholder" =>  array(
        "firstName"  => $fields['billing_first_name'] ,
        "lastName"   => $fields['billing_last_name'],
        "email"      => $fields['billing_email'],
        "phone"      => $fields['billing_phone'],
        "birthdate"  => $fields['insurance-birthdate'],
        "gender"     => $fields['gender-selection' ],
        "address"    =>  array(
            "country"  => $billingcountry,
            "zip"      => $fields['billing_postcode'],
            "city"     => $fields['billing_city'],
            "street"   => $fields['billing_address_1'],
            "number"   => $fields['billing_address_2'],
            "box"      => "box"
        ),
        "entityType" => "ENTITY_TYPE_PERSON"
    ), 
    "risk"         => array(
         "model"            => $_product -> get_title(),
         "originalValue"    =>  $_product -> get_price() * 100,
         "antiTheftMeasure" => "ANTI_THEFT_MEASURE_NONE",
    ),
    "terms"        => array(
        "depreciation" => false
    ),
);

// Set the array to a custom WC_Session variable (to be used afterwards)
WC()->session->set('data_verif', $data_verif);

// API CALL HERE AND CHECK WHETHER VALID OR NOT

Затем вы сможете вызывать этот массив в woocommerce_payment_complete подключенной функции, используя:

$data_verif = WC()->session->get('data_verif');

Это должно работать.


Теперь лучше удалить (удалить) эту пользовательскую переменную сеанса, как только вы закончите ее использовать… Вы можете сделать это с помощью метода __unset(), например:

WC()->session->__unset('data_verif');

Итак, в вашей второй подключенной функции:

//After payment is completed
add_action( 'woocommerce_payment_complete', 'apicall_create' );
function apicall_create() {
    // Get the data array
    WC()->session->get('data_verif');

    // Do the API CALL HERE
    
    // Remove the session variable
    WC()->session->__unset('data_verif');
}

Другие вопросы по теме