it-swarm.com.de

Plugin-Menü-Zusatz in 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' ),
        ) );

Nehmen wir an, ich habe ein Plugin, das dem Blog-Menü einen neuen Menüeintrag für einen benutzerdefinierten Beitragstyp hinzufügt. Das Problem ist, wenn ich viele Blogs habe, aber dieses Plugin auf nur 1 Blog aktiviert ist. Es wird nur angezeigt, wenn ich in diesem Blog bin und füge jeder Blog-Menügruppe ein Beispielmenü hinzu, auch wenn dieses Plugin in diesen Blogs nicht aktiviert ist.

Beispiel: Ich habe das Plugin in Blogid: 2 aktiviert, aber nicht in Blogid: 3 oder Blogid: 4. Wenn ich in blogid bin: Plugin 2, das dieses Menü allen Blogs hinzufügt. Wenn ich in blogid: 3 oder blogid: 4 bin, kann ich dieses Menü in der Liste von blogid: 2 nicht sehen. Was ist der richtige Weg, um dies zu beheben?

Update: Ich versuche, diese Links für jedes Blog hinzuzufügen, das dieses Plugin in der Liste "Meine Websites" aktiviert

1
Ünsal Korkmaz

Die Antwort wurde neu erstellt und funktioniert nun wie in den Frage-Spezifikationen angegeben.

Um jedem Standort des Netzwerks einen Menüeintrag hinzuzufügen, wenn ein bestimmtes Plugin auf diesem Standort aktiv ist, verwende ich ein Muss-Plugin . Es wird nur ausgeführt, wenn is_multisite() und is_admin_bar_showing().

In diesem Beispiel wird das Plugin mit den folgenden Werten instanziiert, die nach dem Plugin Analytics360º suchen und alle Standardmenüelemente entfernen:

  • Titel des Menüelements : Analytics360
  • Plugin um nach zu suchen: analytics360/analytics360.php
  • Menüpunkt URL : index.php?page=analytics360.php
  • Entfernen Sie die Standardeinstellungen : 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