在我的插件中,我有一个对象“Settings”(用于在Wordpress设置中显示内容)。
Settings.php
<?php
namespace FooNamespace\\Admin\\Settings;
class Settings {
public $menu_slug;
public function __construct(){
$this->menu_slug = \'settings-\'.PLUGIN_DOMAIN ;
// Initialize the component
$this->init();
}
protected function init(){
// output method
add_action( \'_output_content_submenu_page_\' . $this->menu_slug, array( $this, \'html_page_template\' ) );
}
public function html_page_template(){
include_once \'views/view-settings.php\';
}
}
在“查看设置”中。php”,我通常可以使用所有基本的wordpress函数。
view-settings.php
<div class="wrap">
<h1 class="wp-heading-inline">
<?php _e(\'Settings for \'.PLUGIN_TITLE, PLUGIN_DOMAIN); ?>
</h1>
<hr wp-header-end />
<h2 class="nav-tab-wrapper">
...
</h2>
<?php foreach ($tabs as $tab ){ ?>
<?php include_once $tab["path"]; ?>
<?php } ?>
</div>
但在我包含的文件中(
include_once $tab["path"];
), 我不能像这样使用wordpress函数
__()
或
_e()
.
Included file
<form id="form-settings-recaptach" method="post">
<table class="widefat fixed">
<tbody>
<tr>
<td>
<label class="label"><?php _e( "Foo", PLUGIN_DOMAIN ); ?></label>
</td>
</tr>
</tbody>
</table>
</form>
所以我得到了这个错误:
致命错误:未捕获错误:调用未定义的函数\\u e()
Notice : 如果我将子php文件直接包含在设置中。php,调用函数。因此,Wordpress的iclude和levels中的包含是一个真正的问题
为什么?我如何调试这个?
最合适的回答,由SO网友:J.BizMai 整理而成
我发现了问题并找到了解决方案:为了包含子文件,在使用localhost时,我更改了路径:
My error :
plugin_dir_path( __FILE__ ).\'my-child-template.php\' //<-- \\path\\to\\file/my-child-template.php
//Changed by
plugin_dir_url( __FILE__ ).\'my-child-template.php\' //<-- http://localhost/wordpress/wp-content/plugins/my-plugin/path/to/file/my-child-template.php
对于第二条路径,它在localhost上工作,它设法包含模板,但无法调用worpdress函数。
因此,我必须找到一个解决方案,以包含路径文件而不是url,但要与localhost兼容。
The solution is :
public function html_page_template(){
ob_start();
$ipAddress = gethostbyname($_SERVER[\'SERVER_NAME\']);
if( $ipAddress === "127.0.0.1"){
$base_path = dirname( __FILE__ )."\\\\templates\\\\";
}else{
$base_path = plugin_dir_path( __FILE__ )."templates/";
}
$a_settings_tab = array(
0 => array(
"key" => "foo",
"path" => $base_path ."foo.php"
),
1 => array(
"key" => "bar",
"path" => $base_path ."bar.php"
)
);
include_once \'views/view-settings.php\';
$html = ob_get_clean();
echo $html;
}
SO网友:Akash K.
我以前也有过这个问题
尝试使用include
具有locate_template
:我不记得确切的原因,但此代码仍然有效:
示例:include(locate_template(YOUR_TEMPLATE_PATH));
Here\'s 如果您需要更多帮助,也可以使用相同的想法进行完整的演示。
For Admin Panel
include
只需在管理面板中工作即可。
您可能希望修改代码,如下所示:
public function init(){
add_menu_page( \'Your Plugin Name\' , \'Your Plugin Settings\' , \'manage_options\' , \'your_plugin_settings\' , array( $this, \'settings_page\' ) );
}
public function html_page_template(){
ob_start();
include(\'views/view-settings.php\');
$html = ob_get_clean();
echo $html;
}
如果
init
函数正在调用自定义挂钩,请不要修改它,并确保代码正常工作。你的
html_page_template
函数现在应该输出表单。