web-dev-qa-db-fra.com

Comment ajouter une classe dans un plugin uniquement pour un site réseau?

J'ai créé un champ de saisie dans General - Settings. C'est dans un plugin pour un site de réseau d'ONG local.

Cela ressemble à ceci et cela fonctionne très bien.

$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 . '" />';
    }
}

Cependant, je souhaite uniquement qu'il soit créé pour le site réseau (principal) sur une installation WPMU.

Alors j'ai fait ça;

    // 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 . '" />';
        }
    }
}

Cependant, je reçois cette erreur lors du rechargement de la page:

Fatal error: Uncaught Error: Class 'ngob_sitelist_slug' not found...(shortened the output, since it's mostly path:s)

Pourquoi donc? Im assez novis sur les classes pour commencer, mais quand pas sur le site réseau, la classe n'est pas exécutée, donc pas de problème, comme prévu. Mais quand sur le site réseau , j'obtiens l'erreur ci-dessus ..

Comment réparer cela afin que je puisse obtenir ce champ de saisie, mais uniquement sur le site principal (réseau)?

Je ne comprends pas tout à fait le problème et il semble difficile de trouver quoi que ce soit sur Google à ce sujet. Je suppose que vous ne pouvez pas envelopper un cours dans un si? Mais pourquoi pas et surtout comment résoudre le problème?

1
George Bredberg

Comment appelez-vous ngob_sitelist_slug?

Je vais deviner que vous faites quelque chose comme $my_class = new ngob_sitelist_slug;. Pour le faire de cette façon, il faudrait que votre classe ait un constructeur . si ce n'est pas le cas, vous obtiendrez une erreur.

Vous pouvez toujours appeler vos méthodes de classe de manière statique:

$my_thing = ngob_sitelist_slug::my_method();

Bien que techniquement, vous devriez ajouter le mot clé static à vos méthodes dans ce cas.

De plus, je vois que dans votre cas, vous utilisez $ this, vous avez donc vraiment besoin d'un constructeur.

EDIT: Je réalise maintenant que vous avez un constructeur - même s’il est obsolète.

2
vancoder

J'ai résolu le problème en faisant cela;

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' ) );
        }
    }

Le reste du code est le même. Mais je suppose qu'il doit y avoir une meilleure approche? Comment devrait le faire?

0
George Bredberg