$wpdb не работает внутри хука woocommerce_email_order_details

Вопрос или проблема

В данный момент я работаю над кодом, который должен добавлять ссылки на страницы состояния заказа в электронные письма с подтверждением заказов WooCommerce.

Существует какая-то странная проблема, из-за которой запрос wpdb всегда возвращает пустой массив. Когда я выводлю запрос и выполняю его вручную из phpMyAdmin, я получаю правильные результаты / данные.

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

add_action( 'woocommerce_email_order_details', 'add_dynamic_link_to_email', 20, 4 );

function add_dynamic_link_to_email( $order, $sent_to_admin, $plain_text, $email ) {

    //if ( 'customer_completed_order' === $email->id ) {
        global $wpdb;

        $query = "SELECT * FROM AMvwzI_12_order_updates WHERE order_id = %s";
        

        $query = $wpdb->prepare($query, $order->get_id());      
        echo $query;
        $results = $wpdb->get_results($query);
        $token = $results[0]->order_token;
        
        $dynamic_link = "https://www.example.com/track_order/?order_token=" . $token;
            
        
        
        echo '<p>Здесь вы можете просмотреть детали своего заказа и информацию о доставке, как только они будут предоставлены: <a href="' . esc_url( $dynamic_link ) . '">здесь</a>.</p>';
    //}
}

Буду признателен за любую помощь, я изучал это целый день и не могу понять в чем дело.

Ответ или решение

Судя по вашему описанию, проблема, с которой вы сталкиваетесь, может быть вызвана несколькими факторами. Давайте разберемся по шагам:

  1. Проверка хуков выполнения: Убедитесь, что хук woocommerce_email_order_details вызывается в нужное время и вам действительно нужно выполнять запрос в базе данных. Если хук вызывается до того, как объект $order инициализирован или заполняется необходимыми значениями, вы можете не получить ожидаемого результата.

  2. Проверка контекста: Убедитесь, что в момент выполнения хука у вас есть все необходимые данные. Например, вы можете добавить отладочные сообщения (например, error_log) для отслеживания значений переменных, чтобы увидеть, извлекаются ли данные корректно.

  3. Ошибки в запросе: Хотя вы сообщили, что все работает в phpMyAdmin, возможно, запрос формируется некорректно в контексте WordPress. Попробуйте давать более детальное описание ошибки. Например, вместо получения пустого массива можно проверить, возвращает ли WPDB какие-либо ошибки:

    if (empty($results)) {
       error_log('Query failed: ' . $wpdb->last_error);
    }
  4. Тип данных: Убедитесь, что order_id в вашей таблице базы данных соответствует типу данных, который передан в ваш запрос. Иногда может возникнуть несовпадение типов, если order_id — это строка, а вы передаете целое число.

  5. Экранирование переменных: Вы уже используете метод prepare(), что хорошо. Убедитесь, что при этом методе правильно экраниваются переменные. Например, добавьте дополнительный отладочный вывод перед запросом:

    error_log('Order ID: ' . $order->get_id());
  6. Обновление базы данных: Если вы вносили изменения в структуру базы данных или таблиц, убедитесь, что вы проинициализировали их правильно, и они доступны для выполнения запросов. Возможно, имеет смысл протестировать запрос вне хуков, попросту создать отдельный файл для проверки.

Вот ваш код с учетом предложенных исправлений:

add_action('woocommerce_email_order_details', 'add_dynamic_link_to_email', 20, 4);

function add_dynamic_link_to_email($order, $sent_to_admin, $plain_text, $email) {
    if ('customer_completed_order' === $email->id) {
        global $wpdb;

        $query = "SELECT * FROM AMvwzI_12_order_updates WHERE order_id = %s";
        $prepared_query = $wpdb->prepare($query, $order->get_id());

        error_log('Prepared Query: ' . $prepared_query);

        $results = $wpdb->get_results($prepared_query);

        if (empty($results)) {
            error_log('Query failed: ' . $wpdb->last_error);
        } else {
            $token = $results[0]->order_token;
            $dynamic_link = "https://www.example.com/track_order/?order_token=" . esc_attr($token);

            echo '<p>Hier können sie ihre bestelldetails und versandinformationen einsehen sobald diese bereitgestellt wurden: <a href="' . esc_url($dynamic_link) . '">here</a>.</p>';
        }
    }
}

Таким образом, после внесения этих изменений вы сможете лучше отслеживать, что происходит с запросом. Убедитесь также, что у пользователя, от имени которого выполняется код, есть права доступа к этой таблице базы данных.

Оцените материал
Добавить комментарий

Капча загружается...