Поддержка Проблемы и решения PHP 8 не работает WP_mail

  • Решено conscience5

    (@conscience5)


    Добрый день, на сайте при переходе на PHP 8 перестала отправляться почтовая форма, если обратно откатываем к 7.2, все нормально отправляет.

    код в function.php

    function true_add_ajaxform(){
    
    $multiple_to_recipients = array(
    	'test@yandex.ru',
    );
    
    add_filter('wp_mail_content_type', 'set_html_content_type' );
    
    $message = 'Страница, с которой была отправлена заявка: '.$_POST['page']."\n";
    
    $message .= 'Имя: '.$_POST['name']."\n";
    
    $message .= 'Номер телефона: '.$_POST['phone']."\n";
    
    wp_mail($multiple_to_recipients, $_POST['nameForm'], $message);
    
    remove_filter( 'wp_mail_content_type', 'set_html_content_type' );
    
    function set_html_content_type() {
    	return 'text/html';
    }
    
    }
     
    add_action('wp_ajax_ajaxform', 'true_add_ajaxform');
    add_action('wp_ajax_nopriv_ajaxform', 'true_add_ajaxform'); 

    В дебаге следующие

    PHP Fatal error:  Uncaught TypeError: call_user_func_array(): Argument #1 ($function) must be a valid callback, function "set_html_content_type" not found or invalid function name in /public_html/wp-includes/class-wp-hook.php:292
    Stack trace:
    #0 /public_html/wp-includes/plugin.php(212): WP_Hook->apply_filters('text/plain', Array)
    #1 /public_html/wp-includes/pluggable.php(469): apply_filters('wp_mail_content...', 'text/plain')
    #2 /public_html/wp-content/themes/honestRepair/functions.php(1234): wp_mail(Array, '\xD0\x9E\xD1\x81\xD1\x82\xD0\xB0\xD0\xB2\xD0\xB8\xD1\x82\xD1...', '\xD0\xA1\xD1\x82\xD1\x80\xD0\xB0\xD0\xBD\xD0\xB8\xD1\x86\xD0...')
    #3 /public_html/wp-includes/class-wp-hook.php(292): true_add_ajaxform('')
    #4 /public_html/wp-includes/class-wp-hook.php(316): WP_Hook->apply_filters('', Array)
    #5 /public_html/wp-includes/plugin.php(484): WP_Hook->do_action(Array)
    #6 /public_html/wp-admin/admin-ajax.php(187): do_action('wp_ajax_ajaxfor...')
    #7 {main}
      thrown in /home/p/progress55/public_html/wp-includes/class-wp-hook.php on line 292

    Быть может кто-то сталкивался с подобной проблемой?

    • Тема изменена 3 недели, 3 дня назад пользователем conscience5. Причина: Не верно определена тема
    • Тема изменена 3 недели, 3 дня назад пользователем Yui. Причина: redundant link(s) deleted

    Страница, с которой нужна помощь: [войдите, чтобы увидеть ссылку]

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • Попробуйте запустить такой код:

    <?php
    
    foo();
    
    function foo() {
            bar();
            function bar() {
                    echo "привет";
            }
    }

    У вас в тексте ошибки написано, что вы пытаетесь вызвать функцию которая еще не определена.

    На php 7 это работает потому, что там генерируется Warning, а не Error. Но set_html_content_type и там естественно не вызывается.

    Функцию set_html_content_type нужно вынести из функции true_add_ajaxform.

    Почитайте как работают вложенные функции

    • Ответ изменён 3 недели, 3 дня назад пользователем pluginfactory.
    • Ответ изменён 3 недели, 3 дня назад пользователем pluginfactory.
    • Ответ изменён 3 недели, 3 дня назад пользователем pluginfactory.

    Это же function.php она (функция) в таком случае будет всегда отрабатывать

    Да, если бы вы set_html_content_type на верхнем уровне определили, а вы её засунули внутрь true_add_ajaxform. Её нужно оттуда высунуть.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    она (функция) в таком случае будет всегда отрабатывать

    Не всегда, а только если её вызвать, что и делает add_filter() (точнее, apply_filters() в нужный момент).

    Как верно заметили выше, определение функции нужно вынести из true_add_ajaxform().

    да, вы правы, спасибо за наводку

    вынесли функцию и все заработало, спасибо вам

    function true_add_ajaxform(){
    
    $multiple_to_recipients = array(
    	'test@yandex.ru',
    );
    
    add_filter('wp_mail_content_type', 'set_html_content_type' );
    
    $message = 'Страница, с которой была отправлена заявка: '.$_POST['page']."\n";
    
    $message .= 'Имя: '.$_POST['name']."\n";
    
    $message .= 'Номер телефона: '.$_POST['phone']."\n";
    
    wp_mail($multiple_to_recipients, $_POST['nameForm'], $message);
    
    remove_filter( 'wp_mail_content_type', 'set_html_content_type' );
    
    }
     
    function set_html_content_type() {
    	return 'text/html';
    }
    
    add_action('wp_ajax_ajaxform', 'true_add_ajaxform');
    add_action('wp_ajax_nopriv_ajaxform', 'true_add_ajaxform');
    • Ответ изменён 3 недели, 3 дня назад пользователем conscience5.
Просмотр 5 ответов — с 1 по 5 (всего 5)