Выполнить sql запрос в шаблоне писем woocommerce (wordpress)

Есть работающий шаблон customer-order-status-email.php , для отправки писем о новом заказе покупателю. Создан плагином "WooCommerce Менеджер Статуса Заказа" от SkyVerge. Лежит в папке wp-content/themes/kidz-child/woocommerce/emails . Работает. Но в нём почему-то не выводится информация о заказанных товарах.

Пробовал такой код

$email_order_items = array(
    'show_purchase_note'  => $show_purchase_note,
    'show_download_links' => $show_download_links,
    'show_sku'            => false,
);

echo wc_get_email_order_items( $order, $email_order_items );

и такой

    echo wc_get_email_order_items( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
        $order,
        array(
            'show_sku'      => $sent_to_admin,
            'show_image'    => false,
            'image_size'    => array( 32, 32 ),
            'plain_text'    => $plain_text,
            'sent_to_admin' => $sent_to_admin,
        )
    );

не работает.

Пробовал написать php код напрямую:

function order_details($id)
{
  $_DB = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); // тут подставлял свои данные
  $sql = "SELECT order_item_id, order_item_name FROM wp_woocommerce_order_items WHERE order_item_type = 'line_item' AND order_id = '".$id."'";
  $query = mysqli_query($_DB, $sql);
  if (mysqli_num_rows($query) > 0)
  {
    //echo '<table border="1" style="border-collapse:collapse;border:1px #CCCCCC solid;" cellpadding="10">';
    //echo '<tr><td><b>Название</b></td><td align="center"><b>Количество</b></td><td align="center"><b>Сумма</b></td></tr>';
    while ($res = mysqli_fetch_assoc($query))
    {
      echo '<tr><td>'.$res['order_item_name'].'</td><td align="center">';
      $order_item_id = $res['order_item_id'];
      $qty_sql = "SELECT * FROM wp_woocommerce_order_itemmeta WHERE order_item_id = '".$order_item_id."' AND meta_key = '_qty'";
      $qty_query = mysqli_query($_DB, $qty_sql);
      $qty_res = mysqli_fetch_assoc($qty_query);
      echo $qty_res['meta_value'];
      echo '</td>';
      echo '<td align="right">';
      $price_sql = "SELECT * FROM wp_woocommerce_order_itemmeta WHERE order_item_id = '".$order_item_id."' AND meta_key = '_line_total'";
      $price_query = mysqli_query($_DB, $price_sql);
      $price_res = mysqli_fetch_assoc($price_query);
      echo number_format($price_res['meta_value'], 0, ',', ' ').' ₽';
      echo '</td></tr>';
    }
    // инфо о доставке
    echo '<tr><td colspan="3"><b>Доставка</b></td></tr>';
    $sql = "SELECT order_item_id, order_item_name FROM wp_woocommerce_order_items WHERE order_item_type = 'shipping' AND order_id = '".$id."'";
    $query = mysqli_query($_DB, $sql);
    $res = mysqli_fetch_assoc($query);
    echo '<tr><td colspan="2">'.$res['order_item_name'].'</td><td align="right">';
    $order_item_id = $res['order_item_id'];
    $delivery_sql = "SELECT * FROM wp_woocommerce_order_itemmeta WHERE order_item_id = '".$order_item_id."' AND meta_key = 'cost'";
    $delivery_query = mysqli_query($_DB, $delivery_sql);
    $delivery_res = mysqli_fetch_assoc($delivery_query);
    if ($delivery_res['meta_value'] == '0.00')
    {
      echo 'бесплатно';
    }else{
      echo $delivery_res['meta_value'];
    }
    echo '</td></tr>';
  }else{
    echo '<tr><td colspan="3">ошибка при получении данных.</td></tr>';
  }
}
order_details($id);

Всегда выводит "ошибка при получении данных." Т.е. результат sql запроса пустой. В то же время, если я сделаю echo $sql и введу этот запрос в phpmyadmin,

SELECT order_item_id, order_item_name FROM wp_woocommerce_order_items WHERE order_item_type = 'line_item' AND order_id = '99908';

то получаю строки.

Делал отдельно тестовую страницу (просто order_details_test.php), она отлично данные подгружает. введите сюда описание изображения

Пробовал через класс $wpdb, причём код из примера

$pages = $wpdb->get_results( 
    "
    SELECT post_title, post_content 
    FROM $wpdb->posts
    WHERE post_status = 'publish' 
    AND post_type = 'page'
    "
);
if( $pages ) {
    foreach ( $pages as $page ) {
        echo $page->post_title;
    }
}

отлично работает, а мой код

$id = $order->get_order_number();

global $wpdb;
$sql = "SELECT order_item_id, order_item_name FROM wp_woocommerce_order_items WHERE order_item_type = 'line_item' AND order_id = '".$id."'";
$order_details = $wpdb->get_results( $sql );

if( $order_details ) {
    foreach ( $order_details as $res ) {
        echo '<tr><td>'.$res['order_item_name'].'</td><td align="center"></td><td></td></tr>';
    }
}else{
  echo '<tr><td colspan="3">ошибка при получении данных wpdb.</td></tr>';
}

всегда возвращает "ошибка при получении данных wpdb.".

Sql запрос возвращает всегда пустое значение. Этот же запрос выполненный в phpmyadmin или в тестовом файле работает.

Пробовал ещё сделать через file_get_contents - тоже пусто.

Отсюда я делаю вывод, что на момент отправки письма в базе данных нет.

Кто-нибудь знает, как мне добавить в шаблон данные о товарах?

Т.е. у меня задача отправлять при оформлении нового заказа письмо со специальным текстов и информацией о заказе, вне зависимости от статуса заказа.


Ответы (0 шт):