解决woocommerce钩子woocommerce_email_footer函数导致递归

时间:2019-06-29 03:41:28

标签: recursion woocommerce

我正在使用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)不必错过某些执行实例,而这些实例会丢失附加到挂钩上的自定义代码。

0 个答案:

没有答案