it-swarm.com.de

Rolle, die nur Widgets bearbeiten kann, keine anderen Designoptionen

Wie kann ich ein bestimmtes Menü zur Verwaltung von Rollenzugriffs-Widgets (wp-admin/widgets.php) einrichten, aber nicht auf andere Themenverwaltung Menüelemente zugreifen?.

Ich bin soweit gekommen, um Aussehen Menü anzuzeigen, das mit widgets.php verknüpft ist, indem ich an _admin_menu event binde und die globale Variable $ submenu ändere. . Obwohl das offensichtlich nicht funktioniert, da ich diesen Code in wp-admin/widgets.php selbst sehe:

    if ( ! current_user_can('edit_theme_options') )
            wp_die( __( 'Cheatin’ uh?' ));

Es ist klar - Sie dürfen NICHT auf diese Seite zugreifen, es sei denn, Sie haben eindeutig edit_theme_options -Fähigkeit. Aber was ist zu tun, wenn ich nicht möchte, dass andere Elemente dieser Funktion, abgesehen von Widgets, vom aktuellen Benutzer (Rolle) geändert werden können?

Es ist einfach, andere Optionen im Menü "auszublenden". Aber das lässt Benutzer, die wissen, wie WP funktioniert (versteht zumindest die Adressierung), frei, auf sie zuzugreifen, und das möchte ich eindeutig vermeiden.

Vielen Dank für jede Hilfe im Voraus.

3
Justas Butkus

Bestätigung…

Ja, es gibt derzeit (WP 3.4.1) keine Möglichkeit, die Zugriffsargumente für Admin-Menüseiten zu ändern. Das einzige, das Sie über die öffentliche WP-API ändern können, ist der Menüpunkt "Kommentare". Alle anderen werden von Hand registriert.

Aber es gibt Hilfe von @scribu (lesen Sie mehr im Trac-Ticket) , der sich bisher viel Mühe gegeben hat, etwas Nützlicheres in den Kern zu bringen.

Erläuterung

Wenn Sie tiefer in den Kern schauen, sehen Sie die Funktion wp_widgets_add_menu() innerhalb von ~/wp-includes/functions.php. Dieser fügt im Grunde genommen den Untermenüpunkt hinzu, seit WP 2.2…

function wp_widgets_add_menu() {
    global $submenu;
    $submenu['themes.php'][7] = array( __( 'Widgets' ), 'edit_theme_options', 'widgets.php' );
    ksort( $submenu['themes.php'], SORT_NUMERIC );
}

Diese Funktion wird der Aktion _admin_menu durch die Funktion wp_maybe_load_widgets() hinzugefügt.

Fortgeschrittene Umgehung für die Seite mit den Menüelementen und Widgets

Derzeit wird die Funktion, die die Standard-Widgets lädt und den Untermenüpunkt (nämlich wp_maybe_load_widgets) registriert, während des Hooks plugins_loaded mit der Priorität 0 aufgerufen.

Das macht es schwierig, es mit einem normalen Plugin abzumelden. Dazu musst du ein Plugin in deinem mu-plugins Ordner verwenden.

<?php
/* Plugin Name: »Kaisers« Deny Widgets page access */
! defined( 'ABSPATH' ) AND exit;

// Init the plugin
add_action( 'muplugins_loaded', array( 'wpse6106_deny_widgets', 'init' ), 0 );

class wpse6106_deny_widgets
{
    static public $instance;

    public $required_cap = 'SET_CUSTOM_CAP_HERE';

    /**
     * Get the instance of the plugin
     * @since  2012-08-07.1505
     * @return void
     */
    static function init()
    {
        null === self :: $instance AND self :: $instance = new self;
        return self :: $instance;
    }

    /**
     * Setup
     * Removes the default function that registers the widgets.php sub menu item.
     * @since  2012-08-07.1505
     * @return void
     */
    function __construct()
    {
        // remove core function...
        remove_action( 'plugins_loaded', 'wp_maybe_load_widgets', 0 );

        // ...and add our own
        add_action( 'admin_head', array( $this, 'widgets_menu_access' ), 0 );

        // Then abort any attempt to access the widgets page
        add_action( 'load-widgets.php', array( $this, 'widgets_page_access' ), 0 );
    }

    /**
     * Adds an action, that re-registers the sub menu item with a custom capability.
     * @since  2012-08-07.1505
     * @return void
     */
    function widgets_menu_access()
    {
        global $submenu;

        // Call default widgets file
        require_once( ABSPATH . WPINC . '/default-widgets.php' );

        $submenu['themes.php'][7] = array( 
             __( 'Widgets' )
            ,$this->required_cap
            ,'widgets.php'
        );
        ksort( $submenu['themes.php'], SORT_NUMERIC );
    }

    /**
     * Does a second check if someone without the custom cap entered the widgets page and dies.
     * @since  2012-08-07.1505
     * @return void
     */
    function widgets_page_access()
    {
        get_currentuserinfo();
        global $current_user;

        if ( ! current_user_can( $this->required_cap ) )
            wp_die( __( 'Cheatin&#8217; uh?' ) );
    }
}

Legen Sie dies einfach in Ihrem MU-Plugins-Ordner ab, passen Sie den SET_CUSTOM_CAP_HERE-String im Plugin an (Klassenvariable oben ↑) und Sie können loslegen. Stellen Sie sicher, dass Sie einen Rollenmanager verwenden (z. B. Mitglieder ), mit dem Sie diese Rolle nur denjenigen zuweisen können, die auf die Widgetseite zugreifen sollen, oder fügen Sie sie manuell mit einem eigenen/benutzerdefinierten Plugin hinzu.

Stellen Sie außerdem sicher, dass Benutzer keine verbliebenen Funktionen haben. Wenn es nicht funktioniert, deaktivieren Sie alle Plugins, wechseln Sie zurück zu TwentyTen/Eleven und setzen Sie Ihre lokale Datenbank mit einem Plugin wie "WordPress Reset" zurück.

Bewährtes Ergebnis

enter image description here

Hinweis: Das Plugin ist getestet und funktioniert in einer einfachen Vanilla-Installation.


Deaktivieren Sie Standard-Widgets und die Untermenüelemente

Hinweis: Dies ist nur für spätere Leser, die alles loswerden möchten.

Wenn Sie alle Standard-Widgets vollständig entfernen möchten, können Sie einen einfachen Filter aufrufen, der die ~/wp-includes/default-widgets.php-Datei nicht mehr enthält und die Registrierung der Seite deaktiviert:

add_filter( 'load_default_widgets', '__return_false' );
3
kaiser

ÜBERSICHT

Während es um die Beschränkung der Editorrollen für den Zugriff auf Widgets ging, wird im folgenden Beispiel gezeigt, wie der Zugriff nur auf Menüs beschränkt wird. Wie Sie jedoch sehen werden, kann es leicht geändert werden, um nur Widgets oder mehr zuzulassen!

Ich habe Schritt 3 hinzugefügt, weil ich die Admin-Leiste vergessen habe. Hoppla! Unabhängig davon, ob Sie im Dashboard oder auf der Website WP angemeldet sind, haben Sie nun die volle Kontrolle darüber, was einem Editor für die Untermenüs "edit_theme_capablity" zur Verfügung steht.

Wenn Sie kein Roles & Capabilities-Plugin installiert haben, können Sie dies tun:

(Wenn Sie dies tun, überspringen Sie Nr. 1 und gehen Sie zu Nr. 2, dann zu Nr. 3)

(1) Füge dies zu dem functions.php deines Themas hinzu:

// Add all Editors the privilege to edit Themes, Widgets, Menus, Backgrounds

// get the the role object - editor, author, etc. (or those specially created)
$role_object = get_role( 'editor' );

// add $cap capability to this role object
// 'edit_theme_options' enables Dashboard APPEARANCE sub-menus
// for Themes, Widgets, Menus, and Backgrounds for users with that role
$role_object->add_cap( 'edit_theme_options' );


(2) Fügen Sie dies zu admin-footer.php hinzu: (im Verzeichnis wp-admin)
Damit können Sie auswählen, welche Option Editoren in ihrem Dashboard haben sollen.
LESEN SIE DIESES , um weitere Informationen vom Autor des jQuery-Snippets zu erhalten.

<?php
  //  Using jQuery: How to allow Editors to edit only Menus (or more!)
  //  Placed in admin-footer.php as Dashboard comes from the wp-admin files

  if ( is_user_logged_in() ) { // This IF may be redundant, but safe is better than sorry...
    if ( current_user_can('edit_theme_options') && !current_user_can('manage_options') ) { // Check if non-Admin
?>
      <script>
    jQuery.noConflict();
    jQuery(document).ready(function() {
      //  Comment out the line you WANT to enable, so it displays (is NOT removed).
      //  For example, the jQuery line for MENUS is commented out below so it's not removed.

      // THEMES:  If you want to allow THEMES, also comment out APPEARANCE if you want it to display Themes when clicked. (Default behaviour)
      jQuery('li#menu-appearance.wp-has-submenu li a[href="themes.php"]').remove();
      jQuery('li#menu-appearance.wp-has-submenu a.wp-has-submenu').removeAttr("href");

      // WIDGETS:
      jQuery('li#menu-appearance.wp-has-submenu li a[href="widgets.php"]').remove();

      // MENUS:
      // jQuery('li#menu-appearance.wp-has-submenu li a[href="nav-menus.php"]').remove();

      // BACKGROUND:
      jQuery('li#menu-appearance.wp-has-submenu li a[href="themes.php?page=custom-background"]').remove();
    });
      </script>
<?php
    } // End IF current_user_can...
  } // End IF is_user_logged_in...
?>


(3) Fügen Sie dies zum footer.php des Themas hinzu:
Damit können Sie auswählen, welche Option die Bearbeiter in ihrer Admin-Leiste haben sollen.

<?php
  //  Using jQuery: How to allow Editors to edit only Menus (or more!)
  //  Placed in THEME's footer.php as the Admin Bar is added when a user is logged in

  if ( is_user_logged_in() ) { // This IF may be redundant, but safe is better than sorry...
    if ( current_user_can('edit_theme_options') && !current_user_can('manage_options') ) { // Check if non-Admin
?>
      <script>
    jQuery.noConflict();
    jQuery(document).ready(function() {
      //  Comment out the line you WANT to enable, so it displays (is NOT removed).
      //  For example, the jQuery line for MENUS is commented out below so it's not removed.

      // THEMES:
      jQuery('li#wp-admin-bar-themes').remove();

      // CUSTOMIZE:
      jQuery('li#wp-admin-bar-customize').remove();

      // WIDGETS:
      jQuery('li#wp-admin-bar-widgets').remove();

      // MENUS:
      // jQuery('li#wp-admin-bar-menus').remove();

      // BACKGROUND:
      jQuery('li#wp-admin-bar-background').remove();
    });
      </script>
<?php
    } // End IF current_user_can...
  } // End IF is_user_logged_in...
?>
1
Chris Lemke