Ajout d'un lien arbitraire au menu Admin?

20

Existe-t-il un moyen d'ajouter un hyperlien arbitraire au menu d'administration WordPress (je veux dire le menu de gauche lorsque vous vous connectez au tableau de bord d'administration)? Par exemple, peut-on ajouter un lien vers Google?

Dans mon cas particulier, je voudrais ajouter une page de guide de style pour un thème Wordpress sur lequel je travaille afin que je puisse montrer à l'utilisateur comment les différents éléments HTML sont stylisés avec le thème et pour montrer comment styler diverses choses de manière agréable.

Voici le code que j'ai jusqu'à présent ( remarque: il est incomplet ): Dans functions.php, j'ai ajouté un nouvel élément de menu dans la section Apparence :

add_action('admin_menu', 'create_theme_style_page');

function create_theme_style_page() {
  add_theme_page('Theme Styleguide', 'Theme Styleguide', 'administrator', basename(__FILE__),'build_styleguide_page');
}

function build_styleguide_page() {
 echo "Not sure what goes here to redirect admin to a arbitrary url?";
}

Dans build_styleguide_page(), la tentative de redirection avec header()donne une erreur ( impossible de modifier les informations d'en-tête ).

À M
la source

Réponses:

13

Salut @ Tom ,

Si je comprends bien votre question, vous n'avez pas tellement besoin de savoir comment ajouter un lien au menu (il semble que vous le sachiez déjà), mais au lieu de cela, vous devez apprendre à faire rediriger votre lien correctement, non?

Redirection vers une URL externe à partir d'un élément du menu Admin

Si c'est le cas, ce que vous devez faire est de ne pas utiliser la fonction d'élément de menu, mais de "connecter" WordPress suffisamment tôt pour qu'il ne produise rien, sauf éventuellement des en-têtes HTTP. Le premier crochet lors de l'appel /wp-admin/themes.phpsemble être after_setup_themeet il semble bien fonctionner.

Utilisez un "Menu Slug" afin que vous puissiez le tester dans un crochet

Mais pour le faire fonctionner, nous devons d'abord modifier votre appel add_theme_pagedans le admin_menuhook / votre create_theme_style_page()fonction. Nous avons laissé tomber le cinquième paramètre (la fonction à appeler pour implémenter l'option admin) parce que nous n'en avons pas besoin, et avons changé le quatrième paramètre (le "slug de menu" ) pour être themes.php?goto=build-styleguide-page.

Bien que nous aurions pu choisir pratiquement n'importe quoi pour le quatrième paramètre, étant donné que nous allons rediriger j'ai routé vers la même page ( themes.php) que d'autres options d'apparence pour la cohérence. J'ai aussi juste arbitrairement trouvé le nom gotoparce que WordPress ne l'utilise pas et cela semble logique.

add_action('admin_menu', 'create_theme_style_page');
function create_theme_style_page() {
  add_theme_page(
    'Theme Styleguide',
    'Theme Styleguide',
    'administrator',
    'themes.php?goto=build-styleguide-page'
  );
}

BTW, nous nous sommes débarrassés de votre build_styleguide_page()fonction car nous n'en avons pas besoin pour cette solution.

Rediriger dans le premier crochet pour themes.php:after_setup_theme

Comme notre dernier morceau de code, nous implémentons notre after_setup_themehook dans notre redirect_from_admin_menu()fonction. Nous l'avons testé pour voir si la page actuelle est themes.phpet pour nous assurer qu'un paramètre d'URL a gotoété transmis à l'URL. Ensuite, il teste la valeur de l' gotoutilisation d'une instruction switch/ casepour voir si elle a une valeur de 'build-styleguide-page'; si c'est le cas, il redirige vers votre hypothétique déclarée, par exemple Google, sinon nous redirigeons simplement vers le tableau de bord d'administration:

add_action('after_setup_theme', 'redirect_from_admin_menu');
function redirect_from_admin_menu($value) {
  global $pagenow;
  if ($pagenow=='themes.php' && !empty($_GET['goto'])) {
    switch ($_GET['goto']) {
      case 'build-styleguide-page':
        wp_redirect("http://www.google.com");
        break;
      default:
        wp_safe_redirect('/wp-admin/');
        break;
    }
    exit;
  }
}

Remarques:

  1. J'ai choisi d'utiliser l' instruction switch/ casedans la fonction after_setup_themehook / redirect_from_admin_menu()afin qu'il soit plus facile d'ajouter des gotoredirections supplémentaires si vous en avez besoin; ajoutez simplement plus de déclarations de cas.

  2. les fonctions wp_redirect()et wp_safe_redirect()ne se terminent pas réellement; vous devez explicitement émettre une instruction de sortie pour que WordPress s'arrête et ne remplace pas votre redirection.

J'espère que cela t'aides!

MikeSchinkel
la source
22

Si vous ajoutez votre article dans le menu en l'ajoutant $submenudirectement au tableau, vous éviterez la nécessité de faire la redirection et vous pourrez utiliser une URL hors site complète comme lien de menu (je le fais moi-même).

add_action( 'admin_menu' , 'admin_menu_new_items' );
function admin_menu_new_items() {
    global $submenu;
    $submenu['index.php'][500] = array( 'Menu item name', 'manage_options' , 'http://example.com' ); 
}  

index.phpreprésente la clé / le lien du menu parent, donc dans l'exemple, j'ajoute essentiellement un élément au menu Dashboard .

Bien sûr, ce n'est pas aussi joli que d'utiliser les add_{type}_pagefonctions, mais cela contourne le fait que WordPress empêche les URL hors site dans les liens du menu administrateur.

J'utilise quelque chose de similaire pour ajouter mes différents hôtes virtuels dans le menu, donc je peux passer à d'autres installations directement depuis le menu admin (tout est fait avec un script, mais utilise essentiellement une version glorifiée du code ci-dessus).

REMARQUE: si vous décidez d'utiliser le code, veillez simplement à ne pas affecter une clé en cours d'utilisation (la clé du tableau 500 dans l'exemple de code).

CONSEIL: Vous pouvez réellement utiliser des valeurs négatives dans les touches de menu pour, de sorte que vous pouvez forcer vos éléments de menu à s'asseoir avant l'un des éléments WordPress natifs.

t31os
la source
REMARQUE: je pense que vous devrez définir cette clé négative comme une chaîne, c'est-à-dire. '-5'et non -5, sinon la clé est considérée comme invalide (je pense) .. (les chaînes négatives fonctionnent bien, si je ne me trompe pas) ..
t31os
Merci, ça craint que vous ne puissiez pas le faire avec les vraies fonctions, mais c'est bien mieux que d'avoir à ajouter un combo crochet / redirection juste pour avoir un lien.
El Yobo
2
Cette réponse particulière m'a aidé avec mon plugin Post Status Menu Items (vous pouvez probablement deviner ce qu'il fait). Quoi qu'il en soit, parce que je ne savais pas quels autres plugins ajouteraient des éléments à quels menus, je pensais simplement ajouter que j'avais l'habitude array_push()d'ajouter les éléments de menu pour éviter d'entrer en collision avec d'autres plugins.
mrwweb
Fonctionne comme un charme, plus un point bonus pour l'utilisation d'un si petit extrait.
João
2
+1. Plutôt que de choisir une clé et d'espérer, saisissez simplement la dernière clé et incrémentez. Par exemple, lors de l'ajout d'un élément de sous-menu au menu Outils: global $submenu; $key = end(array_keys($submenu['tools.php'])) + 1; $submenu['tools.php'][$key++] = etc.
Webaware
3

J'ai réalisé la même chose avec ceci:

function add_custom_menu_item(){
    add_menu_page( 'Menu Item Title', 'Page Title', 'manage_options', 'page_slug', 'function', 'dashicons-icon', 1 );
}
add_action( 'admin_menu', 'add_custom_menu_item' );

function custom_menu_item_redirect() {

    $menu_redirect = isset($_GET['page']) ? $_GET['page'] : false;

    if($menu_redirect == 'page_slug' ) {
        wp_safe_redirect( home_url('/my-page') );
        exit();
    }

}
add_action( 'admin_init', 'custom_menu_item_redirect', 1 );

Ce que vous faites ici est d'ajouter un élément de menu et de définir un slug, puis sur 'admin_init', vous vérifiez si le slug existe et vous redirigez vers l'emplacement souhaité.

Bobz
la source