• Никакой политики на форуме. Иначе - бан!
  • Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Как вывести данные заказа?

Sylon

Новичок
Пытаюсь для Api вывести данные заказа. Для этого в function.php создаю функцию:
Код:
add_action('woocommerce_thankyou', 'send_order_to_service');

function send_order_to_service( $order_id ){
    // Получить ордер и его детали
    $order = new WC_Order( $order_id );

Выяснил, что это
Код:
new WC_Order
устаревший метод получения деталей заказа.
Подскажите, пожалуйста, как правильно. Задача вывести данные только что сделанного заказа. Буду очень признателен помощи. Также рассмотрю вариант платной консультации, если есть опыт подключения woocommerce к frontpad через api.
 
Последнее редактирование:

Sylon

Новичок
Используйте WC_Checkout
Прочитал документацию, тут это не подойдёт. Нашёл общий список для вывода данных и вариант вывода данных, но старый.
Кто-нибудь может помочь небольшими советами, чтобы постепенно сделать отправку данных по api? Возможно платно.

Получается нужно подготовить вывод данных и привязать их к такому виду:

product – массив артикулов товаров;
product_kol – массив количества товаров;
product_mod – массив модификаторов товаров, где значение элемента массива является ключом родителя (товара в который добавлен модификатор);

А пример подготовки их к отправке:

Код:
//подготовка запроса               
foreach ($param as $key => $value) {
$data .= "&".$key."=".$value;
}
 
//содержимое заказа
foreach ($product as $key => $value){
$data .= "&product[".$key."]=".$value."";
$data .= "&product_kol[".$key."]=".$product_kol[$key]."";
if(isset($product_mod[$key])) {
$data .= "&product_mod[".$key."]=".$product_mod[$key]."";
}
}

//отправка
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://app.frontpad.ru/api/index.php?new_order");
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch);
curl_close($ch);
 
//результат
echo $result;
 

Sylon

Новичок
а правильнее всего - сделайте print_r($order ) - и все увидите
Скажите, пожалуйста, вот в варианте 2015 года ссылка усложнены конструкции. К примеру:
Код:
    // set the address fields
    $user_id = $order->user_id;
    $address_fields = array('country',
        'title',
        'first_name',
        'last_name',
        'company',
        'address_1',
        'address_2',
        'address_3',
        'address_4',
        'city',
        'state',
        'postcode');

    $address = array();
    if(is_array($address_fields)){
        foreach($address_fields as $field){
            $address['billing_'.$field] = get_user_meta( $user_id, 'billing_'.$field, true );
            $address['shipping_'.$field] = get_user_meta( $user_id, 'shipping_'.$field, true );
        }
    }
Это было необходимо из-за того, что на тот момент иначе нельзя было или другие причины?
Просто по логике те же данные можно собрать из $order = wc_get_order($order_id); .

Сейчас пробую собрать нужные данные с помощью списка, наверное есть подвох.
 

Beagler

Опытный
Начнем с того что Вы не показали документацию апи - так что сложно сказать что там требуется.
 

Sylon

Новичок
Начнем с того что Вы не показали документацию апи - так что сложно сказать что там требуется.
API Woocommerce Документация Проблема в том, что в ней нет ничего о подготовке данных к отправке. То есть можно только запросить или отослать. А тут выходит, что нужно собрать и подготовить данные для внешней службы, которая требует иную подачу (выходит за рамки документации):

Документация службы в которую будут отправляться данные. Пример у них конечно затрагивает только три пункта.
Frontpad Api
 
Последнее редактирование:

Sylon

Новичок
Целиком думаю не стоит время тратить всем читать, думаю разбить на маленькие части. А потом целиком напишу весь код для подключения woocommerce к Frontpad по Api. Думаю многим пригодится. Основные вещи как адрес и прочее разобрался как настроить и передать. Остались две части нерешённые:

Получить sku товара в этом массиве:

Код:
    $order = wc_get_order( $order_id );
    foreach ($order->get_items() as $item_key => $item_values):
  
        $item_data = $item_values->get_data();

        $product_name = $item_data['name'];
        $product_id = $item_data['product_id'];
        $variation_id = $item_data['variation_id'];
        $quantity = $item_data['quantity'];
    endforeach;

И видоизменить его, чтобы был похож на этот:

Код:
    //содержимое заказа
    foreach ($product as $key => $value){
        $data .= "&product[".$key."]=".$value."";
        $data .= "&product_kol[".$key."]=".$product_kol[$key]."";
        if(isset($product_mod[$key])) {
            $data .= "&product_mod[".$key."]=".$product_mod[$key]."";
        }
    }

Конечно ещё останется задача непростая вывести данные о дополнительных модификаторах товара от стороннего модуля. Но это отдельно.
 
Последнее редактирование:

Sylon

Новичок
Помогите, пожалуйста, вот с этой частью:

Код:
    //содержимое заказа
    foreach ($product as $key => $value){
        $data .= "&product[".$key."]=".$value."";
        $data .= "&product_kol[".$key."]=".$product_kol[$key]."";
        if(isset($product_mod[$key])) {
            $data .= "&product_mod[".$key."]=".$product_mod[$key]."";
        }
    }

Она не относится к woocommerce и переменная $product тоже. В данном коде $product должно быть артикулом товара.
 

Beagler

Опытный
В этом коде берут массив данных о товаре и собирают его в строку индекс -> значение для передачи методом GET
также туда добавляют данные из массивов $product_kol и $product_mod

У Вас массив $product - это
$item_data = $item_values->get_data();
 

Sylon

Новичок
В этом коде берут массив данных о товаре и собирают его в строку индекс -> значение для передачи методом GET
также туда добавляют данные из массивов $product_kol и $product_mod

У Вас массив $product - это
$item_data = $item_values->get_data();
Массив $product - это артикул товара в данном случае.

Скажите, пожалуйста, как можно вытянуть meta в этом массиве?

Код:
    $order = wc_get_order( $order_id );
    foreach ($order->get_items() as $item_key => $item_values):

        $item_data = $item_values->get_data();

        $product_name = $item_data['name'];
        $product_id = $item_data['product_id'];
        $variation_id = $item_data['variation_id'];
        $quantity = $item_data['quantity'];
    endforeach;

Как оказалось реальная проблема - это получить кастомные добавки к товару. К примеру есть кофе, а к нему можно добавить сахар на странице товара. Так вот модуль Fields Factory не предусматривать Api. И данные подаются единым массивом в стандартом meta. То есть тут получается будет настоящая сложность вывести эти данные и раскидать их так, чтобы добавка к товару получила свой артикул.

Код:
    //содержимое заказа
    foreach ($product as $key => $value){
        $data .= "&product[".$key."]=".$value."";
        $data .= "&product_kol[".$key."]=".$product_kol[$key]."";
        if(isset($product_mod[$key])) {
            $data .= "&product_mod[".$key."]=".$product_mod[$key]."";
        }
    }
В данном случае &product_mod - это добавка к товару, которая будет иметь свой артикул. Его можно назначить и в коде, единственно нужно будет ему назначить переменную $product тоже. И тогда возникает вопрос не будет ли конфликта потому, что переменная имеет числовые ключи.

В общем если разбить на более мелкие задачи, для начала необходимо вывести массив метаданных заказа, а там уже смотреть как их приготовить.
 
Последнее редактирование:
Сверху Снизу