web-dev-qa-db-fra.com

Ajout de menu de plugin dans multisite

    $wp_admin_bar->add_menu( array(
            'parent' => $menu_id,
            'id'     => $menu_id . '-example',
            'title'  => __( 'Example Menu Item', 'example' ),
            'href'   => get_admin_url( $blog->userblog_id, 'edit.php?post_type=example' ),
        ) );

Disons que j'ai un plugin qui ajoute un nouvel élément de menu pour un exemple de type de message personnalisé au menu blog. Le problème, c’est que j’ai beaucoup de blogs mais que ce plugin soit activé sur un seul blog, il n’apparaît que lorsque je suis dans ce blog et que j’ajoute un exemple de menu à chaque groupe de menus de blog, même si ce plugin n’est pas activé dans ces blogs.

Exemple: J'active le plugin dans blogid: 2 mais je ne l’active pas dans blogid: 3 ou blogid: 4. Quand je suis dans blogid: 2 plugin en ajoutant ce menu à tous les blogs. Quand je suis dans blogid: 3 ou blogid: 4, je ne peux pas voir ce menu dans la liste de blogid: 2 Quelle est la bonne façon de résoudre ce problème?

Mise à jour: J'essaie d'ajouter ces liens pour chaque blog activé par ce plugin dans la liste "Mes sites".

1
Ünsal Korkmaz

Réponse refaite et fonctionne maintenant selon les spécifications de la question.

Pour ajouter un élément de menu à chaque site du réseau si un plugin spécifique est actif sur ce site, j'utilise un plugin doit utiliser . Il ne fonctionne que si is_multisite() et si is_admin_bar_showing().

Dans cet exemple, le plug-in est instancié avec les valeurs suivantes qui recherchent le plug-in Analytics360º et suppriment tous les éléments de menu par défaut:

  • Titre de l'élément de menu : Analytics360
  • Plugin à vérifier pour : analytics360/analytics360.php
  • URL d'élément de menu : index.php?page=analytics360.php
  • Supprimer les valeurs par défaut : array( 'newpost', 'comments', 'visit', 'dashboard' )

plugin in action

plugin in action

<?php
/**
 * Plugin Name: Modify My Sites admin menu
 * Plugin URI: http://wordpress.stackexchange.com/q/55724/12615
 * Description: Add an admin menu link to specific plugin, if it is active in the site. Can remove default items as well.
 * Author: Rodolfo Buaiz
 * Author URI: http://wordpress.stackexchange.com/users/12615/brasofilo
 * License: GPLv3
 *  
 * Class based in http://wordpress.stackexchange.com/a/77236/12615
 **/


WPSE_55724_My_Sites_Extra_Items::init( 
    'Analytics360', // Menu item title
    'analytics360/analytics360.php', // Plugin to check for
    'index.php?page=analytics360.php', // Menu item URL
    array( 'newpost', 'comments', 'visit', 'dashboard' ) // Remove defaults
);

class WPSE_55724_My_Sites_Extra_Items
{
    private static $ins = null;

    private static $title = null;
    private static $plugin_file = null;
    private static $plugin_page = null;
    private static $remove_defaults = null;

    public static function instance()
    {
        is_null( self::$ins ) && self::$ins = new self;
        return self::$ins;
    }

    public static function init( $title, $plugin_file, $plugin_page, $remove_defaults )
    {
        self::$title = $title;
        self::$plugin_file = $plugin_file;
        self::$plugin_page = $plugin_page;
        self::$remove_defaults = $remove_defaults;

        if( is_multisite() )
            add_action( 'plugins_loaded', array( self::instance(), '_setup' ) );
    }

    public function _setup()
    {
        if( is_admin_bar_showing() )
            add_action( 'admin_bar_menu', array( $this, 'add_items' ), 9999 );          
    }

    /**
     * The global var is passed by reference in a do_action_ref_array
     */
    public function add_items( $wp_admin_bar ) 
    {
        foreach ( (array) $wp_admin_bar->user->blogs as $blog ) 
        {
            switch_to_blog( $blog->userblog_id );

            // Current menu ID
            $menu_id  = 'blog-' . $blog->userblog_id;

            // Add URL to current-site/wp-admin/plugins.php
            $wp_admin_bar->add_menu( array(
                'parent' => $menu_id,
                'id'     => $menu_id . '-p',
                'title'  => __( 'Plugins' ),
                'href'   => admin_url( 'plugins.php' ),
            ) );

            // Remove default menu items
            $this->remove_items( 
                &$wp_admin_bar, 
                self::$remove_defaults,
                $menu_id
            );

            // Add custom menu for chosen Plugin it active in current site or network activated 
            if( current_user_can( 'manage_options' ) && ( $this->is_plugin_active( self::$plugin_file ) || $this->is_plugin_active_for_network( self::$plugin_file ) ) )
            {
                $wp_admin_bar->add_menu( array(
                    'parent' => $menu_id,
                    'id'     => $menu_id . '-my-p',
                    'title'  => self::$title,
                    'href'   => admin_url( self::$plugin_page ),
                ) );
            }

            restore_current_blog();
        }
    }   

    /**
     * 
     */
    private function remove_items( $wp_admin_bar, $items, $menu_id )
    {
        if( in_array( 'newpost', $items ) )
            $wp_admin_bar->remove_menu( $menu_id . '-n' ); // New Post

        if( in_array( 'comments', $items ) )
            $wp_admin_bar->remove_menu( $menu_id . '-c' ); // Comments

        if( in_array( 'visit', $items ) )
            $wp_admin_bar->remove_menu( $menu_id . '-v' ); // Visit Site

        if( in_array( 'dashboard', $items ) )
            $wp_admin_bar->remove_menu( $menu_id . '-d' ); // Dashboard
    }


    /**
     * WP function uses is_plugin_active_for_network 
     * which doesn't work in frontend
     */
    private function is_plugin_active( $plugin )
    {
        return in_array( $plugin, (array) get_option( 'active_plugins', array() ) );
    }

    private function is_plugin_active_for_network( $plugin )
    {
        $plugins = get_site_option( 'active_sitewide_plugins');
        if ( isset($plugins[$plugin]) )
            return true;
        return false;
    }
}
1
brasofilo