Фатальная ошибка: Вызов неопределенной функции get_option()
При попытке отправить письмо появляется ошибка:
Fatal error: Call to undefined function get_option() in /home/junkie/public_html/sub_demo/wp-content/themes/scroller/includes/contact-form.php on line 9
Мой код => contact-form.php
<?php
if($_POST)
{
//проверяем AJAX-запрос, выходим если это не AJAX
if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') {
die();
}
$to_Email = "tanvir.focus@gmail.com"; //Замените на email получателя
$subject = 'Ah!! My email from Somebody out there...'; //Тема письма
//проверяем наличие $_POST переменных, выходим если какие-то отсутствуют
if(!isset($_POST["userName"]) || !isset($_POST["userEmail"]) || !isset($_POST["userPhone"]) || !isset($_POST["userMessage"]))
{
die();
}
//Очищаем входные данные с помощью filter_var()
$user_Name = filter_var($_POST["userName"], FILTER_SANITIZE_STRING);
$user_Email = filter_var($_POST["userEmail"], FILTER_SANITIZE_EMAIL);
$user_Phone = filter_var($_POST["userPhone"], FILTER_SANITIZE_STRING);
$user_Message = filter_var($_POST["userMessage"], FILTER_SANITIZE_STRING);
//дополнительная валидация
if(strlen($user_Name)<4) //Если длина меньше 4 - выдаем ошибку
{
header('HTTP/1.1 500 Имя слишком короткое или пустое!');
exit();
}
if(!filter_var($user_Email, FILTER_VALIDATE_EMAIL)) //валидация email
{
header('HTTP/1.1 500 Пожалуйста, введите корректный email!');
exit();
}
if(!is_numeric($user_Phone)) //проверка что введены только цифры
{
header('HTTP/1.1 500 В поле телефона допускаются только цифры');
exit();
}
if(strlen($user_Message)<5) //проверка пустого сообщения
{
header('HTTP/1.1 500 Сообщение слишком короткое! Пожалуйста, введите что-нибудь.');
exit();
}
//отправляем письмо
$headers = 'From: '.$user_Email.'' . "rn" .
'Reply-To: '.$user_Email.'' . "rn" .
'X-Mailer: PHP/' . phpversion();
@$sentMail = mail($to_Email, $subject, $user_Message .' -'.$user_Name, $headers);
if(!$sentMail)
{
header('HTTP/1.1 500 Не удалось отправить письмо! Извините..');
exit();
}else{
echo 'Привет '.$user_Name .', Спасибо за ваше письмо! ';
echo 'Ваше письмо уже в моем почтовом ящике, мне осталось только проверить его.';
}
}
?>

Я не вижу функции get_option()
на строке 9 или где-либо еще в вашем коде.
После быстрого поиска в Google, я предполагаю, что ваша проблема такая же, как в этом вопросе на stackoverflow
РЕДАКТИРОВАНИЕ
Как предложил @Ray в указанном вопросе, вставьте этот код для проверки, включен ли файл wp-includes/option.php
:
$includedStuff = get_included_files();
print_r($includedStuff);
Если он не включен, добавьте его вручную:
include_once('wp-includes\option.php');
Если это сработает, не забудьте проголосовать за ответ Рэя.

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

@PieterGoosen, спасибо за исправление! Надеюсь, моя правка решает эту проблему.

Если ваш файл contact-form.php находится за пределами установки WordPress, вам нужно убедиться, что вы подключаете файл wp-load.php перед вашим кодом, например так:
<?php include '../../../wp-load.php'; ?>
/* Остальная часть вашего кода здесь */
Вышеприведенный код работает для файла в корневой папке темы, но если вы не уверены, где может оказаться ваш .php файл в структуре каталогов, вы всегда можете использовать следующий скрипт созданный Frankie Jarret:
$parse_uri = explode( 'wp-content', $_SERVER['SCRIPT_FILENAME'] );
require_once( $parse_uri[0] . 'wp-load.php' );
/* Остальная часть вашего кода здесь */
РЕДАКТИРОВАНИЕ:
Обратите внимание, что структура установки WP может быть изменена таким образом, что файл wp-content
окажется за пределами дерева установки. В этом случае второй блок кода также не сработает. Это редкий случай, но такая функциональность существует, и её необходимо учитывать в возможных сценариях.
Есть и другие варианты, которые потребуют переработки вашего кода для использования действий, фильтров и встроенных функций WordPress. Это избавит вас от необходимости подключать нужные зависимости вручную. Такой подход был бы наилучшим, тогда как приведенные выше решения — это лишь быстрые/упрощенные обходные пути.

вы никогда не должны пытаться угадывать, где установлены основные файлы WordPress, просто не пишите код, который зависит от таких знаний

@MarkKaplun приношу извинения, если я вас неправильно понял, но именно это и решает второй фрагмент кода? Первый блок кода показывает, что я предлагаю использовать для достижения требуемой цели, второй блок кода учитывает тот факт, что основной файл может не всегда находиться на 3 уровня выше (../../../wp-load.php
), так как это зависит от расположения вашего пользовательского .php файла, а затем предлагает расширенное решение, которое устраняет эту проблему. Или я неверно понимаю вашу претензию?

в общем случае wp-content
может располагаться вне дерева установки WordPress. За исключением, возможно, wp-admin, всё остальное может находиться в любом случайном месте

... и хотя вы, возможно, сможете делать такие предположения для конкретного сайта, в целом это плохая привычка в программировании

@MarkKaplun хотя это справедливое замечание, я оставлю этот ответ здесь, так как он помог мне и, надеюсь, поможет кому-то в будущем. Возможно, это не лучшее решение, но всё же допустимое. Я учёл ваше замечание, добавив 'редактирование', спасибо, что указали на это. Признаюсь, я никогда не работал с сайтом на WP, где структура была бы настолько изменена, что приведённое решение не сработало бы. Тем не менее, я знаю, что такое возможно, и мне было бы интересно увидеть ваш вариант решения в этом конкретном случае.
