web-dev-qa-db-fra.com

Ajouter un lien arbitraire au menu Admin?

Est-il possible d'ajouter un lien hypertexte arbitraire au menu d'administration 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 montrer à l'utilisateur comment les différents éléments HTML sont stylés avec le thème et de montrer comment mettre en forme différentes choses.

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

20
Tom

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 votre lien correctement, n'est-ce pas?

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

Si c'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 dans un crochet

Mais pour que cela fonctionne, nous devons d’abord modifier votre appel en add_theme_page dans la fonction admin_menu hook/your 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.

Bien que nous aurions pu choisir presque littéralement n'importe quoi pour le quatrième paramètre, étant donné que nous allons rediriger, je suis dirigé vers la même page (themes.php) que d'autres options d'apparence pour plus de cohérence. Je viens aussi de trouver arbitrairement le nom goto parce que WordPress ne l'utilise pas et cela semble logique pour cela.

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'
  );
}

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

Redirection dans le premier crochet pour themes.php:after_setup_theme

Comme dernier morceau de code, nous implémentons notre hook 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 vous redirigera vers votre hypothétique hypothétique 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;
  }
}

Notes:

  1. J'ai choisi d'utiliser l'instruction switch/case dans la fonction after_setup_theme hook/redirect_from_admin_menu() afin qu'il soit plus facile d'ajouter 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 t'aides!

13
MikeSchinkel

Si vous ajoutez votre élément au menu en l'ajoutant directement au tableau $submenu, vous éviterez le besoin de faire 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 Tableau de bord menu ..

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, ce qui me permet de passer directement à d'autres installations à partir du menu administrateur (le tout est fait 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 réellement 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.

21
t31os

J'ai réalisé pareil 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 souhaité.

3
Bobz