Фатальная ошибка при попытке получить email администратора в контактной форме
Я создаю контактную форму, которая должна отправлять все запросы на 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. Возможно, я упускаю что-то очевидное?
У них уже есть этот код, который не работает по причинам, описанным в принятом ответе.

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

Просто наличие файла в папке темы не означает, что 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');
Еще лучше было бы поместить весь код в плагин, чтобы можно было обрабатывать форму независимо через хук в начале загрузки страницы.

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

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

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

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

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

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

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

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

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