#php #wordpress
#php #wordpress
Вопрос:
Я новичок в WordPress и PHP, и я пытаюсь добавить страницу пользовательских настроек в свою тему WordPress, определив класс, который используется для создания страницы. Когда я пытаюсь создать объект в functions.php файл для создания страницы, я получаю сообщение об ошибке, в котором говорится, что класс не может быть найден.
Я потратил некоторое время на поиск решений и возился с кодом, но не смог найти ничего, что работает. Файл определенно существует (я могу найти его в указанном месте в проводнике файлов и открыть / отредактировать его в моей IDE). Если я просто вставлю код из моего файла класса непосредственно в functions.php после удаления объявления класса и конструктора все работает, как ожидалось.
Я запускаю XAMPP в Windows.
Сообщение об ошибке:
Fatal error: Uncaught Error: Class 'My_Class' not found in C:xamppmy-path-to-sitemy-themefunctions.php
в my-sitefunctions.php:
include('/folder/class.my-class.php');
$my_options = new My_Class;
$my_options->__construct();
в my-sitefolderclass.my-class.php:
class My_Class
{
private $options;
function __construct() {
add_action( 'admin_menu', array($this, 'option_add_admin_menu'));
add_action( 'admin_init', array($this, 'option_settings_init'));
}
function option_add_admin_menu( ) {
add_options_page('My Options', 'Options', 'manage_options',
'options', array($this, 'option_options_page');
}
// rest of code that registers settings amp; fields
}
РЕДАКТИРОВАТЬ: я изменил «include():» на «require()», как предлагалось, но теперь я получаю два разных сообщения об ошибках:
Warning: require(/setup/class.my-class.php): failed to open stream: No such file or directory in C:xampphtdocsmy-sitewordpresswp-contentthemesmy-themefunctions.php on line 29
Fatal error: require(): Failed opening required '/setup/class.my-class.php' (include_path='C:xamppphpPEAR') in C:xampphtdocsmy-sitewordpresswp-contentthemesmy-themefunctions.php on line 29
Комментарии:
1. Подсказка: попробуйте изменить
include('/folder/class.my-class.php')
наrequire('/folder/class.my-class.php')
2. В методе option_add_admin_menu My_Class ошибка. отсутствует «)» в конце вызова метода add_options_page().
3. Я только что попробовал это. Больше не отображается ошибка, описанная выше, но теперь есть две разные ошибки. «не удалось открыть поток: нет такого файла или каталога» и «require(): требуется неудачное открытие»
4. В чем заключаются ошибки?
5. Эдуардо Джуниор — Хороший улов. Я добавил «)». В сообщениях об ошибках ничего не изменилось.
Ответ №1:
Фактически, у вас нет правильного пути, который include
позволит вам продолжить, если файл не существует.
При включении или запросе файла, если указанный вами путь начинается с /
или
, PHP будет рассматривать его как путь из корня текущей файловой системы. Когда вы указываете путь, который не начинается с одного из этих файлов, PHP считает, что это относительный путь, и попытается угадать, какой файл включить, основываясь на том, где находится текущий файл и другие каталоги, о которых он знает.
Для исправления вы, вероятно, захотите выполнить следующее:
require_once __DIR__.'/folder/class.my-class.php';
Смотрите документы по include
, include_once
и, а также __DIR__
.
Рекомендация:
При каждом включении файла вы должны пытаться использовать require_once
по возможности. Если вы знаете, что этот файл может включаться несколько раз, тогда вы можете использовать require
. Если это файл, который можно опустить, если он по какой-либо причине не существует, тогда вы можете использовать include_once
. Если файл может быть обоими, только тогда вы должны использовать include
.
Однако, как опытный программист, я также могу сказать вам, что если вы используете либо include_once
, либо include
вы делаете что-то неправильно и должны проверить, существует ли файл, прежде чем пытаться включить его вслепую.
Кроме того, я настоятельно рекомендую постоянно использовать приведенный ниже код. Это поможет вам отлавливать ошибки взлома до того, как у них появится шанс на самом деле сломаться. Или, по крайней мере, даст вам лучшее понимание того, почему что-то сломалось.
ini_set('display_errors', '1');
error_reporting(-1);
Комментарии:
1. Это сработало, спасибо за вашу помощь! Я обязательно прочитаю соответствующие документы.
Ответ №2:
Пожалуйста, проверьте мои комментарии внутри кода
в my-sitefolderclass.my-class.php:
<?php
class My_Class
{
private $options; //if you want receive a option
function __construct($options) { //You need receive this option here
$this->options = $options; //and atribut it here
//add_action( 'admin_menu', array($this, 'option_add_admin_menu'));
//add_action( 'admin_init', array($this, 'option_settings_init'));
}
function option_add_admin_menu() {
//add_options_page('My Options', 'Options', 'manage_options',
//'options', array($this, 'option_options_page');
}
// rest of code that registers settings amp; fields
}
в my-sitefunctions.php:
<?php
include_once('folder/class.my-class.php'); //removed the root bar
//You are waiting for a option in the class, so pass this option
$my_options = new My_Class('some option');
//$my_options->__construct(); //You don't need this here, the constructor is used inside the class.