Fügen Sie eine Administrationsseite hinzu, zeigen Sie sie jedoch nicht im Administratormenü an

8

Ich habe ein benutzerdefiniertes Plugin 'Charts', das ein eigenes Menü hat. In diesem Menü befinden sich Links zu den 3 Seiten des Plugins - "Diagramme", "Diagramm hinzufügen" und "Diagramm bearbeiten". Ich möchte jedoch den Link zu "Diagramm bearbeiten" nicht anzeigen.

So füge ich die betreffende Seite hinzu:

$this->pagehook = add_submenu_page('charts', __('Edit Chart'), __('Edit Chart'), 'edit_charts', 'edit-chart', array(&$this, 'on_show_page'));

Ich habe das Internet durchsucht und kann keinen Weg finden, dies zu tun (das funktioniert). Es ist möglich, ganze Menüs der obersten Ebene zu entfernen (nicht das, was ich brauche), und Sie können einzelne Einträge aus dem $submenuglobalen Menü entfernen (aber dadurch wird auch die registrierte Funktion entfernt), sodass niemand auf die Seite zugreifen kann -

global $submenu;
if(!empty($submenu['charts'])) : foreach($submenu['charts'] as $key => $page) :
        if($page[0] === 'Edit Chart') :

            /** Removes all permissions to access the page */
            //unset($submenu['charts'][$key]);              
            /** Removes the title, but the menu entry still exists, so it looks odd */
            $submenu['charts'][$key][0] = '';

        endif;
    endforeach;
endif;

Ich habe versucht, es über CSS auszublenden, kann aber keinen Weg finden, dies über den von Wordpress generierten HTML-Code zu erreichen.

<li><a href="admin.php?page=edit-chart" tabindex="1">Edit Chart</a></li>

Ich habe auch über jQuery nachgedacht, aber das hat ähnliche Einschränkungen wie die CSS-Route, und ich glaube nicht, dass ich der einzige bin, der dies jemals gewollt hat - es muss einen Weg geben, ich kann ihn einfach nicht finden!

Alle Hinweise und Tipps geschätzt.

Vielen Dank.

David Gard
quelle
Wo hängen Sie diese Funktion an? Welcher Filter / welche Aktion?
s_ha_dum

Antworten:

9

Verwenden Sie eine Untermenüseite als übergeordneten Slug. Das Admin-Menü hat nur zwei Ebenen, sodass die imaginäre dritte Ebene ausgeblendet wird.

Beispielcode, getestet:

add_action( 'admin_menu', 'wpse_73622_register_hidden_page' );

function wpse_73622_register_hidden_page()
{
    add_submenu_page(
        'options-writing.php',
        'Hidden!',
        'Hidden!',
        'exists',
        'wpse_73622',
        'wpse_73622_render_hidden_page'
    );
    # /wp-admin/admin.php?page=wpse_73622
}

function wpse_73622_render_hidden_page()
{
    echo '<p>hello world</p>';
}
Fuxia
quelle
Dies funktioniert, obwohl der aktive Status des übergeordneten Menüelements nicht verloren geht, sodass das Untermenü geschlossen wird und in der linken Seitenleiste kein übergeordnetes Menüelement ausgewählt ist.
Lee
25

In den Dokumenten sehen add_submenu_page()Sie, dass Sie Ihren Untermenü-Link vor einem Menüelement der obersten Ebene, zu dem er gehört, ausblenden können, indem Sie das slug(1. Argument) auf Folgendes setzen null:

add_action( 'admin_menu', 'register_my_custom_submenu_page' );

function register_my_custom_submenu_page() {
    add_submenu_page( 
        null,
        'My Custom Submenu Page',
        'My Custom Submenu Page',
        'manage_options',
        'my-custom-submenu-page',
        'my_custom_submenu_page_callback',
    );
}

Um den gewünschten Menüpunkt hervorzuheben (z. B. "Alle Diagramme" beim Zugriff auf die ausgeblendete Seite "Diagramm bearbeiten"), haben Sie folgende Möglichkeiten:

add_filter( 'submenu_file', function($submenu_file){
    $screen = get_current_screen();
    if($screen->id === 'id-of-page-to-hide'){
        $submenu_file = 'id-of-page-to-higlight';
    }
    return $submenu_file;
});
Lanicor
quelle
Cool, aber das Hervorheben funktioniert nicht richtig. Wenn ich sie einstelle, werden submenu_filesie als aktuell angezeigt. Das Menü der obersten Ebene wurde jedoch nicht geöffnet. Aber wenn ich setze parent_file, wp run Funktion get_admin_page_parent()nach Filtern und ändern Sie es zurück. Für welche wp-Entwickler parent_fileFilter hinzufügen , wenn die Funktion ohnehin wieder geändert wird. Könntest du helfen?
DARK_DIESEL
Auch wenn parent_sluggesetzt als null, page_titlenicht im Titel verwendet.
DARK_DIESEL
Sie können 'options.php'stattdessen aus verwenden null.
RavanH