无法在Include内调用WordPress函数?

时间:2017-09-25 作者:J.BizMai

在我的插件中,我有一个对象“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中的包含是一个真正的问题

为什么?我如何调试这个?

2 个回复
最合适的回答,由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 函数现在应该输出表单。

结束

相关推荐

Include custom table in query

Im使用事件日历插件,我可以设置帖子的事件日期,并显示在日历小部件中。一切都很顺利,但我也想按活动日期查询帖子。问题是事件日期存储在名为wp_ftcalendar_events. 元密钥的名称为start_datetime. 表以post ID开头,所以它是两个表共享的。不幸的是,加入表格超出了我的知识范围。我的尝试无效: <?php global $wpdb; $date = date(\"Y-m-d\");