我是WordPress和PHP的初学者,并且我试图通过定义用于生成该页面的类,将自定义设置选项页面添加到WordPress主题中。当我尝试在functions.php文件中创建对象以生成页面时,收到一条错误消息,指出找不到该类。
我花了一段时间寻找解决方案并弄乱了代码,但是找不到任何有效的方法。该文件肯定存在(我可以在文件资源管理器中的指定位置找到它,然后在我的IDE中打开/编辑它)。如果我只是将类文件中的代码直接粘贴到functions.php中,并且删除了类声明和构造函数,则一切都会按预期进行。
我正在Windows上运行XAMPP。
错误消息:
Fatal error: Uncaught Error: Class 'My_Class' not found in C:\xampp\my-path-to-site\my-theme\functions.php
在\ my-site \ functions.php中:
include('/folder/class.my-class.php');
$my_options = new My_Class;
$my_options->__construct();
在\ my-site \ folder \ class.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 & fields
}
编辑:我按照建议将“ include():”更改为“ require()”,但是现在我得到了两种不同的错误消息:
Warning: require(/setup/class.my-class.php): failed to open stream: No such file or directory in C:\xampp\htdocs\my-site\wordpress\wp-content\themes\my-theme\functions.php on line 29
Fatal error: require(): Failed opening required '/setup/class.my-class.php' (include_path='C:\xampp\php\PEAR') in C:\xampp\htdocs\my-site\wordpress\wp-content\themes\my-theme\functions.php on line 29
答案 0 :(得分: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 :(得分:0)
请在代码中检查我的评论
在\ my-site \ folder \ class.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 & fields
}
在\ my-site \ functions.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.