Фатальная ошибка при попытке получить email администратора в контактной форме

29 июн. 2013 г., 21:48:50
Просмотры: 34.9K
Голосов: 2

Я создаю контактную форму, которая должна отправлять все запросы на email адрес администратора.

PHP файл, который обрабатывает введенные данные и отправляет email, содержит только этот код:

<?php
$admin_email = get_option('admin_email');

if($_POST["name"] != "" && $_POST["contact"] != ""  && $_POST["comments"] != "")
{
    echo "Ваше сообщение отправлено! ";
    $name = $_POST["name"];
    $contactOption = $_POST["contactoption"];

    $msg = "Сообщение от: \n";
    $msg .= "Имя: " .$name;
    $msg .= "\nEmail или телефон: " .$contactOption;
    $msg .= "\n\n";
    $msg .= "Сообщение: \n";
    $msg .= $_POST["comments"];
    $msg .= "\n\n";

    $subject = utf8_decode("Сообщение через контактную форму");
    $headers = utf8_decode("От: " .$name."\r\n");

    mail($mailTo, $subject, utf8_decode($msg), $headers);

}
?>

Проблема в том, что я не могу использовать get_option или get_bloginfo для получения email адреса администратора. Это всегда приводит к фатальной ошибке.

Этот файл находится в папке дочерней темы. Почему я не могу использовать эти функции? Я также пробовал добавить get_header() и get_footer() в файл, но эти функции тоже не распознаются.

Я относительно новичок в WordPress. Возможно, я упускаю что-то очевидное?

3
Комментарии

Где отображается форма?

onetrickpony onetrickpony
29 июн. 2013 г. 22:12:44

@OneTrickPony : в текстовом виджете, согласно комментарию к моему ответу.

s_ha_dum s_ha_dum
30 июн. 2013 г. 02:04:41

можно просто получить email администратора используя это: get_bloginfo('admin_email')

alright alright
14 окт. 2019 г. 10:21:16
Все ответы на вопрос 2
3
24

Чтобы получить email администратора WordPress, просто выполните:

$admin_email = get_option('admin_email');
24 июл. 2018 г. 16:42:59
Комментарии

У них уже есть этот код, который не работает по причинам, описанным в принятом ответе.

Jacob Peattie Jacob Peattie
24 июл. 2018 г. 17:35:11

Возможно, для того, кто задал вопрос, но не для 18 тысяч человек, которые пришли сюда в поисках этого ответа и не нашли его, верно?

Lucas Bustamante Lucas Bustamante
24 июл. 2018 г. 17:36:09

Да, этот вопрос был плохо озаглавлен, из-за чего сюда попало много людей, которые просто искали эту простую строку кода.

Gavin Gavin
21 сент. 2019 г. 09:13:48
10

Просто наличие файла в папке темы не означает, что WordPress загрузит этот файл или что при обращении к нему он будет загружен в контексте WordPress.

Есть два подхода, которые я могу предложить:

Для использования функций WordPress необходимо, чтобы WordPress был загружен. Самый простой способ сделать это - позволить WordPress загрузить файл. Разместите ваш код выше в том же шаблоне, где находится ваша форма - предположительно, он доступен, и WordPress знает о странице. Просто отправляйте форму на ту же страницу, а не на другую. При отсутствии веских причин делать иначе, я бы поступил именно так.

Вы также можете использовать AJAX API для обработки вашей формы.

Примечание: Существует своего рода хак для загрузки WordPress во внешних файлах путем включения wp-load.php, но не используйте этот метод, если вы не уверены в своих действиях.

Обновление:

На основании дополнительной информации я считаю, что лучшее решение - создать правильный виджет для формы.

class Form_Widget_wpse_104728 extends WP_Widget {
  function __construct() {
    $opts = array(
      'description' => 'Отображает и обрабатывает мою форму'
    );
    parent::WP_Widget(
      'my-form-content',
      'Некоторый PHP',
      $opts
    );
  }
  function widget($args,$instance) {
    // PHP-код здесь
    // Ваш код для обработки формы
    // Сама форма
  }
}
function register_my_widgets() {
  register_widget('Form_Widget_wpse_104728');
}
add_action('widgets_init','register_my_widgets');

Еще лучше было бы поместить весь код в плагин, чтобы можно было обрабатывать форму независимо через хук в начале загрузки страницы.

29 июн. 2013 г. 22:08:44
Комментарии

Для первого решения, ты имеешь в виду, что я могу поместить этот код в свой page.php? Страница с формой не является физическим php-файлом. Дай знать, если это то, что ты имел в виду. А пока я посмотрю AJAX API и wp-load хак :)

Forza Forza
30 июн. 2013 г. 01:11:02

Ты можешь поместить код в файл шаблона, который обрабатывает форму — желательно кастомный шаблон специально для формы. Твоя форма не шорткод, верно?

s_ha_dum s_ha_dum
30 июн. 2013 г. 01:14:30

Нет, форма находится в текстовом виджете внутри плагина (pagebuilder)[http://wordpress.org/plugins/siteorigin-panels/]. Но я попробую создать файл шаблона. Дам знать, если сработает :)

Forza Forza
30 июн. 2013 г. 01:55:30

Не думаю, что это сработает. Вы хотите разместить всю контактную форму в новом шаблоне или только этот код, который я привел выше? Вся контактная форма не будет работать, так как я не могу просто вызвать шаблон из текстового виджета :P

Forza Forza
30 июн. 2013 г. 02:05:50

То, что ваша форма находится в текстовом виджете, усложняет ситуацию. AJAX-решение лучше из двух вариантов — работа с виджетом считается "веской причиной сделать иначе". Тем не менее, это довольно грязное решение из-за особенностей текстового виджета. Я отредактирую ответ, добавив то, что теперь кажется лучшим решением.

s_ha_dum s_ha_dum
30 июн. 2013 г. 02:09:24

Что ж, я решил эту проблему, используя wp-load.php. Знаю, вы посоветовали бы этого не делать, но так как я использую это строго для данного сайта, и расположение wp-load никогда не изменится, это самый простой вариант :)

Forza Forza
30 июн. 2013 г. 02:46:03

Однако остается одна проблема: если пользователь заполнит форму неправильно, ему показывается пустая страница. У меня, конечно, есть валидация, но есть ли способ передать сообщения об ошибках обратно в контактную форму внутри текстового виджета? Можно ли это сделать с помощью JavaScript?

Forza Forza
30 июн. 2013 г. 02:47:49

Я забыл посмотреть твои правки, лол. Ты опубликовал там кое-что интересное, возможно, мне лучше использовать этот вариант.

Forza Forza
30 июн. 2013 г. 02:49:46

С этим виджетом от тебя я могу обрабатывать валидацию прямо в самой форме :P Это очень круто! Спасибо, s_ha_dum!

Forza Forza
30 июн. 2013 г. 02:52:56

У меня уже работает виджет :)

Forza Forza
30 июн. 2013 г. 03:50:10
Показать остальные 5 комментариев