Вопрос или проблема
В данный момент я работаю над кодом, который должен добавлять ссылки на страницы состояния заказа в электронные письма с подтверждением заказов 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>';
//}
}
Буду признателен за любую помощь, я изучал это целый день и не могу понять в чем дело.
Ответ или решение
Судя по вашему описанию, проблема, с которой вы сталкиваетесь, может быть вызвана несколькими факторами. Давайте разберемся по шагам:
-
Проверка хуков выполнения: Убедитесь, что хук
woocommerce_email_order_details
вызывается в нужное время и вам действительно нужно выполнять запрос в базе данных. Если хук вызывается до того, как объект$order
инициализирован или заполняется необходимыми значениями, вы можете не получить ожидаемого результата. -
Проверка контекста: Убедитесь, что в момент выполнения хука у вас есть все необходимые данные. Например, вы можете добавить отладочные сообщения (например,
error_log
) для отслеживания значений переменных, чтобы увидеть, извлекаются ли данные корректно. -
Ошибки в запросе: Хотя вы сообщили, что все работает в phpMyAdmin, возможно, запрос формируется некорректно в контексте WordPress. Попробуйте давать более детальное описание ошибки. Например, вместо получения пустого массива можно проверить, возвращает ли WPDB какие-либо ошибки:
if (empty($results)) { error_log('Query failed: ' . $wpdb->last_error); }
-
Тип данных: Убедитесь, что
order_id
в вашей таблице базы данных соответствует типу данных, который передан в ваш запрос. Иногда может возникнуть несовпадение типов, еслиorder_id
— это строка, а вы передаете целое число. -
Экранирование переменных: Вы уже используете метод
prepare()
, что хорошо. Убедитесь, что при этом методе правильно экраниваются переменные. Например, добавьте дополнительный отладочный вывод перед запросом:error_log('Order ID: ' . $order->get_id());
-
Обновление базы данных: Если вы вносили изменения в структуру базы данных или таблиц, убедитесь, что вы проинициализировали их правильно, и они доступны для выполнения запросов. Возможно, имеет смысл протестировать запрос вне хуков, попросту создать отдельный файл для проверки.
Вот ваш код с учетом предложенных исправлений:
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>';
}
}
}
Таким образом, после внесения этих изменений вы сможете лучше отслеживать, что происходит с запросом. Убедитесь также, что у пользователя, от имени которого выполняется код, есть права доступа к этой таблице базы данных.