Ajout d'un lien arbitraire au menu Admin?

20

Existe-t-il un moyen d’ajouter un lien hypertexte arbitraire au menu administrateur de WordPress (je parle du menu de gauche lorsque vous vous connectez au tableau de bord de l’administrateur)? Par exemple, peut-on ajouter un lien vers Google?

Dans mon cas particulier, j'aimerais ajouter une page de guide de style pour un thème Wordpress sur lequel je travaille afin de pouvoir montrer à l'utilisateur comment les différents éléments HTML sont stylés avec le thème et de montrer comment mettre en forme diverses choses .

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

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() , une tentative de redirection avec header() génère une erreur ( Impossible de modifier les informations d'en-tête ).

    
posée Tom 30.08.2010 - 19:39

3 réponses

13

Bonjour @Tom ,

Si je comprends bien votre question, vous n'avez pas vraiment besoin de savoir comment ajouter un lien au menu (il semble que vous le sachiez déjà), mais vous devez plutôt apprendre à rediriger correctement votre lien, n'est-ce pas?

Redirection vers une URL externe à partir d'un élément de menu de l'administrateur

Si tel est le cas, vous devez ne pas utiliser la fonction d'élément de menu, mais plutôt "accrocher" WordPress suffisamment tôt pour ne générer aucune sortie, à l'exception peut-être des en-têtes HTTP. Lorsque vous appelez /wp-admin/themes.php , le premier crochet semble être after_setup_theme et il semble bien fonctionner.

Utilisez un "Menu Slug" pour pouvoir le tester avec un crochet

Mais pour que cela fonctionne, nous devons d’abord modifier votre appel à add_theme_page dans la fonction admin_menu hook / votre fonction create_theme_style_page() . Nous avons abandonné le cinquième paramètre (la fonction à appeler pour implémenter l'option admin) car nous n'en avions pas besoin et nous avons changé le quatrième paramètre (le "menu slug" ) en themes.php?goto=build-styleguide-page .

Même si nous aurions pu choisir presque littéralement n'importe quoi pour le quatrième paramètre, étant donné que nous allons rediriger mon routage vers la même page ( themes.php ) que d'autres options d'apparence pour la cohérence. J'ai aussi arbitrairement trouvé le nom goto , car 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 fonction build_styleguide_page() car nous n'en avons pas besoin pour cette solution.

Rediriger dans le premier crochet pour themes.php : after_setup_theme

Comme dernier morceau de code, nous implémentons notre crochet after_setup_theme dans notre fonction redirect_from_admin_menu() . Nous l'avons testé pour voir si la page en cours est themes.php et pour nous assurer qu'un paramètre d'URL de goto a été passé sur l'URL. Ensuite, il teste la valeur de goto à l'aide d'une instruction switch / case pour voir si sa valeur est 'build-styleguide-page' ; Si tel est le cas, il renvoie à votre hypothétique hypothèse, par exemple. Sinon, nous redirigeons simplement Google vers le tableau de bord de l'administrateur:

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 / case dans la fonction after_setup_theme hook / redirect_from_admin_menu() afin de pouvoir ajouter plus facilement des redirections goto supplémentaires si vous en avez besoin; il suffit d'ajouter d'autres 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 aide!

    
réponse donnée MikeSchinkel 30.08.2010 - 20:46
21

Si vous ajoutez votre élément au menu en l'ajoutant directement au tableau $submenu , vous éviterez la nécessité d'effectuer la redirection et pourrez utiliser une URL complète hors site 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.php représente la clé / le lien du menu parent. Dans l'exemple, j'ajoute donc un élément au menu Tableau de bord .

Bien sûr, ce n'est pas aussi joli que d'utiliser les fonctions add_{type}_page , mais cela évite 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, afin de pouvoir passer directement à d'autres installations à partir du menu administrateur (le tout est effectué avec un script, mais utilise essentiellement une version enrichie du code ci-dessus).

REMARQUE: si vous décidez d'utiliser le code, veillez simplement à ne pas attribuer une clé utilisée (la clé de tableau 500 dans l'exemple de code).

CONSEIL : vous pouvez utiliser des valeurs négatives dans les touches de menu pour vous permettre de forcer les éléments de menu à s'asseoir avant les éléments natifs de WordPress.

    
réponse donnée t31os 09.11.2010 - 18:14
2

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 que vous ajoutez un élément de menu et définissez slug, puis sur "admin_init", vous vérifiez si le slug existe et redirigez-le vers l'emplacement de votre choix.

    
réponse donnée Bobz 21.01.2015 - 22:15

Lire d'autres questions sur les étiquettes