Фатальная ошибка: Вызов неопределенной функции get_option()

5 мая 2014 г., 16:44:22
Просмотры: 15.6K
Голосов: -1

При попытке отправить письмо появляется ошибка:

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 'Ваше письмо уже в моем почтовом ящике, мне осталось только проверить его.';
    }
}
?>
3
Комментарии

Танвир, пожалуйста, покажите нам, где вы вызываете этот код. Подсказка: здесь используется wp_mail(), которую следует применять вместо нативной PHP-функции mail().

kaiser kaiser
5 мая 2014 г. 17:23:32

Исходя из этого — //проверим, является ли запрос ajax-запросом, если нет — выходим — и других подсказок в вопросе и коде, я почти уверен, что это дубликат: http://wordpress.stackexchange.com/q/108143/21376

s_ha_dum s_ha_dum
5 мая 2014 г. 17:40:09

минусую, так как код не соответствует ошибке

Mark Kaplun Mark Kaplun
15 сент. 2017 г. 10:54:19
Все ответы на вопрос 2
3

Я не вижу функции get_option() на строке 9 или где-либо еще в вашем коде.

После быстрого поиска в Google, я предполагаю, что ваша проблема такая же, как в этом вопросе на stackoverflow

РЕДАКТИРОВАНИЕ

Как предложил @Ray в указанном вопросе, вставьте этот код для проверки, включен ли файл wp-includes/option.php:

$includedStuff = get_included_files();
print_r($includedStuff);

Если он не включен, добавьте его вручную:

include_once('wp-includes\option.php');

Если это сработает, не забудьте проголосовать за ответ Рэя.

5 мая 2014 г. 16:56:10
Комментарии

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

Pieter Goosen Pieter Goosen
5 мая 2014 г. 17:13:43

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

Petr Cibulka Petr Cibulka
5 мая 2014 г. 18:09:36

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

Mark Kaplun Mark Kaplun
15 сент. 2017 г. 10:57:39
6
-1

Если ваш файл 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. Это избавит вас от необходимости подключать нужные зависимости вручную. Такой подход был бы наилучшим, тогда как приведенные выше решения — это лишь быстрые/упрощенные обходные пути.

15 сент. 2017 г. 09:18:21
Комментарии

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

Mark Kaplun Mark Kaplun
15 сент. 2017 г. 10:48:25

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

Frits Frits
15 сент. 2017 г. 10:54:30

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

Mark Kaplun Mark Kaplun
15 сент. 2017 г. 10:59:43

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

Mark Kaplun Mark Kaplun
15 сент. 2017 г. 11:02:44

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

Frits Frits
15 сент. 2017 г. 11:17:21

это нормально, просто потому, что что-то получило минусы, не значит, что это нужно удалять.

Mark Kaplun Mark Kaplun
15 сент. 2017 г. 11:46:25
Показать остальные 1 комментариев