Устранить хук woocommerce, функция woocommerce_email_footer, вызывающая рекурсию - PullRequest
0 голосов
/ 29 июня 2019

Я использую хук 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) без необходимости пропустить некоторые случаи выполнения, пропуская пользовательский код, прикрепленный к хуку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...