如何在仅适用于网络站点的插件中添加类?

时间:2016-09-29 作者:George Bredberg

我在general-settings中创建了一个输入字段。它位于本地ngo网络站点的插件中。

看起来是这样的,效果很好。

$ngob_sitelist_slug = new ngob_sitelist_slug();

class ngob_sitelist_slug {
    function ngob_sitelist_slug( ) {
        add_filter( \'admin_init\' , array( &$this , \'ngob_register_slug\' ) );
    }
    function ngob_register_slug() {
        register_setting( \'general\', \'sitelist_slug\', \'esc_attr\' );
        add_settings_field(\'sitelist_slug\', \'<label for="sitelist_slug">\'.__(\'Slug för site-lista\' , \'ngo-branding\' ).\'</label>\' , array(&$this, \'ngob_slug_html\') , \'general\' );
    }
    function ngob_slug_html() {
        $value = get_option( \'sitelist_slug\', \'\' );
        echo \'<input type="text" id="sitelist_slug" name="sitelist_slug" value="\' . $value . \'" />\';
    }
}
然而,我只想在WPMU安装上为网络(主)站点创建它。

所以我这样做了;

    // Get site id
$blog_id = get_current_blog_id();

// Check if we are on network site
if( is_main_site( $blog_id ) ) {

    $ngob_sitelist_slug = new ngob_sitelist_slug();

    class ngob_sitelist_slug {
        function ngob_sitelist_slug( ) {
            add_filter( \'admin_init\' , array( &$this , \'ngob_register_slug\' ) );
        }
        function ngob_register_slug() {
            register_setting( \'general\', \'sitelist_slug\', \'esc_attr\' );
            add_settings_field(\'sitelist_slug\', \'<label for="sitelist_slug">\'.__(\'Slug för site-lista\' , \'ngo-branding\' ).\'</label>\' , array(&$this, \'ngob_slug_html\') , \'general\' );
        }
        function ngob_slug_html() {
            $value = get_option( \'sitelist_slug\', \'\' );
            echo \'<input type="text" id="sitelist_slug" name="sitelist_slug" value="\' . $value . \'" />\';
        }
    }
}
但是,我在重新加载页面时出现以下错误:

Fatal error: Uncaught Error: Class \'ngob_sitelist_slug\' not found...(shortened the output, since it\'s mostly path:s)
为什么会这样?Im一开始对类很陌生,但当网络站点上没有时,类不会被执行,所以没有问题,正如预期的那样。但是当我在网络站点上时,我得到了上面的错误。。

如何修复这个问题,以便我可以获得输入字段,但只能在主(网络)站点上?

我不完全明白问题是什么,在谷歌上似乎很难找到与此相关的任何信息。我想你不能用if来包装一个类?但为什么不呢?最重要的是,如何解决这个问题?

2 个回复
SO网友:vancoder

您如何调用ngob_sitelist_slug?

我猜你在做$my_class = new ngob_sitelist_slug;. 这样做需要你的班级有一个constructor. 如果没有,您将得到一个错误。

您仍然可以静态调用类方法:

$my_thing = ngob_sitelist_slug::my_method();
虽然从技术上讲,您应该添加static 在本例中,将关键字添加到您的方法。

我还看到,在您的示例中,您使用的是$this,因此您确实需要一个构造函数。

编辑:我现在意识到您确实有一个构造函数——尽管它是一个不推荐使用的构造函数。

SO网友:George Bredberg

我这样做解决了问题;

class ngob_sitelist_slug {
    function ngob_sitelist_slug( ) {
        // Check if we are on network site
        if( is_main_site( $blog_id ) ) {
            add_filter( \'admin_init\' , array( &$this , \'ngob_register_slug\' ) );
        }
    }
代码的其余部分是相同的。但我想一定有更好的办法?你应该怎么做?