Функция Ajax, которая извлекает шаблон электронной почты и отправляет его

Я пытаюсь создать функцию ajax, которая получает шаблон электронной почты и отправляет его. Это мой код до сих пор:

<?php
add_action('wp_ajax_nopriv_test_function', 'test_function');
add_action('wp_ajax_test_function', 'test_function');
function test_function() {

        $content = Array(
            "name"=>$_POST['name'],
            "email"=>$_POST['email'],
        );

        ob_start();
        include("../emails/email_template.php");
        $message = ob_get_contents();
        ob_end_clean();

        $headers[] = 'Content-Type: text/html; charset=UTF-8';

        wp_mail($_POST['email'], "[E-mail subject] This is a test", $message, $headers);

    $result['feedback'] = "All OK!";
  }

    wp_send_json($result);
    die();
}
?>
  1. Аякс вызов работает. Я получаю response.feedback правильно, даже зная, что это не "Все в порядке!".
  2. Вы можете проанализировать email_template.php нажав здесь. Это в основном шаблон электронной почты, который получает некоторые переменные PHP от $contents, Смотрите строку 313.

К сожалению, я получаю эту ошибку:

PHP Fatal error: Unknown: Cannot use output buffering in output buffering display handlers in Unknown on line 0, referer: http://example.com/,

Я искал здесь и в других источниках, но не нашел правильного ответа. Я что-то пропустил? Это вообще возможно?

Заранее спасибо:)

2 ответа

Решение

Извините, что опубликовал это как ответ, но у меня недостаточно очков, чтобы оставить комментарий. Я следил за этим вопросом в течение нескольких недель, поскольку мне крайне любопытно узнать о критической разнице между рабочим кодом и нерабочим кодом. Я абсолютно не понимаю, что не так с оригинальным решением. Для моего любопытства вы можете добавить следующий код перед вызовом ob_start()

error_log( 'before ob_start(): ' . print_r( debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ), true ) );

Полученная ошибка должна возникать только в том случае, если в обратном вызове буферизации вывода вызывается ob_start(). Я действительно не понимаю, как это может произойти в вашем коде, но, возможно, обратная трассировка покажет что-то.

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

Заранее спасибо за любое рассмотрение.

ОБНОВЛЕНИЕ: я проверил ваш код, используя следующий плагин:

<?php
/*
Plugin Name: Gruby's Problem
*/

add_action('wp_ajax_nopriv_test_function', 'test_function');
add_action('wp_ajax_test_function', 'test_function');
function test_function() {

        $content = Array(
            "name"=>$_POST['name'],
            "email"=>$_POST['email'],
        );

        ob_start();
        include("email_template.php");
        $message = ob_get_contents();
        ob_end_clean();

        $headers[] = 'Content-Type: text/html; charset=UTF-8';

        wp_mail($_POST['email'], "[E-mail subject] This is a test", $message, $headers);

    $result['feedback'] = "All OK!";

    wp_send_json($result);
    die();
}

add_shortcode( 'send_gruby_ajax_test', function() {
?>
<button id="gruby_send_ajax_test">Send Gruby Ajax Test</button>
<script>
    jQuery( 'button#gruby_send_ajax_test' ).click( function() {
        jQuery.post( '<?php echo admin_url( 'admin-ajax.php' ); ?>', { action: 'test_function', name: 'Magenta', email: 'xxx@xxx.com' }, function( r ) {
            console.log( r );
        } );
    } );
</script>
<?php
} );
?>

Мне пришлось решить 2 проблемы - убрал посторонний '}' после строки

$result['feedback'] = "All OK!";

и изменил строку 313 в email_template.php

Your order has shipped, <?php echo $content['nome'];?>!

в

Your order has shipped, <?php echo $content['name'];?>!

После этих изменений код работал как положено. Итак, ваш оригинальный код работает в моей среде. Мне все еще любопытно, как вы получаете ваш код, чтобы потерпеть неудачу. Можете ли вы запустить мой плагин и посмотреть, вызывает ли он ту же ошибку, что и раньше. Чтобы протестировать плагин, вам нужно создать страницу с содержимым публикации:

[send_gruby_ajax_test]

Появится кнопка, которая при нажатии отправит запрос AJAX для "test_function".

Изменил мой код на:

<?php
add_action('wp_ajax_nopriv_test_function', 'test_function');
add_action('wp_ajax_test_function', 'test_function');
function test_function() {

      ob_start();

        $content = Array(
            "nome"=>$_POST['nome_registro'],
            "email"=>$_POST['email_registro'],
        );?>

    <?php include(ABS_PATH_DEFINED_ELSEWHERE."my-plugin/inc/emails/email_template.php"); ?>

    <?php

    $message = ob_get_contents();
    ob_end_clean();

    $headers[] = 'Content-Type: text/html; charset=UTF-8';

    wp_mail($_POST['email'], "[E-mail subject] This is a test", $message, $headers);

    $result['feedback'] = "All OK!";
  }

  wp_send_json($result);
  die();
}
?>

И работал как шарм:)

У кого-нибудь есть объяснение, почему предыдущий код не работал?

Другие вопросы по тегам