Я использую хук Woocommerce woocommerce_email_footer()
, и внутри моей функции мне нужно вызвать $email->get_content()
, что вызывает рекурсию и ошибку памяти PHP, а WordPress завершается с системной ошибкой
Попытался снять ловушку перед вызовом $email->get_content()
и добавить ловушку обратно сразу после этого вызова. Тем не менее, это не может быть надежным решением, поскольку некоторые другие сеансы, которые выполняются точно в то время, когда моя функция удалила действие, могут полностью пропустить пользовательское действие ловушки
Я написал следующий код в functions.php моей темы, чтобы записать содержимое почты (тело письма) в локальный файл непосредственно перед отправкой при получении нового заказа
//
// Capture the contents of the Emails sent and save into local files
// These Local files are used for further messaging through different channels
//
function Save_Email_Contents_into_Local_File ( $email ) {
if ( $email->id == 'customer_processing_order' ) {
// Remove the action temporarily so as not to cause Recursion while we refer to $email functions
remove_action( 'woocommerce_email_footer', 'Save_Email_Contents_into_Local_File', 20, 1 );
$TargetFilename = '/home/users/....../Sent_Mail.html' ;
$html_message = $email->get_content();
$formatted_message = $email->style_inline($html_message);
file_put_contents($TargetFilename, $formatted_message);
}
// Put the action back to original state
add_action( 'woocommerce_email_footer', 'Save_Email_Contents_into_Local_File', 20, 1 );
};
// add the action
add_action( 'woocommerce_email_footer', 'Save_Email_Contents_into_Local_File', 20, 1 );
Обратите внимание, в приведенной выше функции я ссылаюсь на публичную функцию $ email-> get_content ().
Если я не сделаю remove_action( 'woocommerce_email_footer', 'Save_Email_Contents_into_Local_File', 20, 1 );
, эта функция станет рекурсивной и завершится с ошибкой памяти PHP.
Хотя это и является работоспособным решением, удаление действия может привести к тому, что другой экземпляр customer_processing_order
от другого пользователя может пропустить действие и не перейти к этой функции, если этот сеанс срабатывает точно в то время, когда этот текущий сеанс удален действие и перед добавлением действия снова.
Я уверен, что я делаю это неправильно! Есть ли лучший способ выполнить то, что мне нужно - в основном мне нужно точно отформатированный почтовый контент, который будет храниться в локальном файле при получении заказа. Точно так же мне понадобится локальный файл, который будет храниться для выполнения и удержания заказа и т. Д., Но в более поздний момент времени.
Хотите добиться сохранения отформатированной электронной почты в локальном файле a) без возникновения ошибок рекурсии / памяти PHP b) без необходимости пропустить некоторые случаи выполнения, пропуская пользовательский код, прикрепленный к хуку.