Ajouter un lien arbitraire au menu Admin?
3 réponses
- votes
-
- 2010-08-30
Bonjour @Tom ,
Sije comprendsbien votre question,vousn'avezpastellementbesoin de savoir comment ajouter un lien vers lemenu (il semble que vous le sachiez déjà)mais avezplutôtbesoin d'apprendre commentfaire rediriger votre lien correctement,n'est-cepas?
Redirection vers une URLexterne àpartir d'un élément demenu Admin
Si c'est le cas,ce que vous devezfaireest dene pas utiliser lafonction d'élément demenumais à laplace de "hook" WordPress suffisammenttôtpour qu'iln'ait rienproduit sauf éventuellement lesen-têtes HTTP. Lepremier hook lors de l'appel de
/wp-admin/themes.php
semble êtreafter_setup_theme
et il semblebien fonctionner.Utilisez un "Menu Slug" pourpouvoir letester dans un hook
Maispour que celafonctionne,nous devons d'abordmodifier votre appel à
add_theme_page
dans le hookadmin_menu
/votrefonctioncreate_theme_style_page ()
. Nous avons abandonné le cinquièmeparamètre (lafonction à appelerpourimplémenter l'option admin)parce quenousn'en avonspasbesoin,et avons changé le quatrièmeparamètre (le "menu slug" )en thèmes.php?goto=build-styleguide-page
.Bien quenous aurionspu choisirpresque littéralementn'importe quoipour le quatrièmeparamètre,étant donné quenous allons rediriger,j'ai routé vers lamêmepage (
themes.php
) que les autres options d'apparencepour la cohérence. J'ai aussi arbitrairementproposé lenomgoto
parce que WordPressne l'utilisepaset cela semble logiquepour cela.add_action ('admin_menu','create_theme_style_page'); function create_theme_style_page () { add_theme_page ( 'Guide de style dethème', 'Guide de style dethème', 'administrateur', 'themes.php?goto=build-styleguide-page' ); }
BTW,nous avons supprimé votrefonction
build_styleguide_page ()
carnousn'en avonspasbesoinpour cette solution.Redirection dans lepremier hookpour
themes.php
:after_setup_theme
Comme dernierbit de code,nousimplémentonsnotre hook
after_setup_theme
dansnotrefonctionredirect_from_admin_menu ()
. Nous l'avonstestépour voir si lapage actuelleestthemes.php
et pournous assurer qu'unparamètre d'URL degoto
a ététransmis à l'URL. Ensuite,ilteste la valeur degoto
en utilisant uneinstructionswitch
/case
pour voir sielle a une valeur de'build-styleguide-page '
; si c'est le cas,il redirige vers votre hypothétique déclaré,parexemple Google sinonnous redirigeons simplement vers letableau debord d'administration:add_action ('after_setup_theme','redirect_from_admin_menu'); function redirect_from_admin_menu ($ value) { global $pagenow; if ($pagenow=='themes.php' & amp; & amp;! vide ($ _ GET ['goto'])) { commutateur ($ _GET ['goto']) { case 'build-styleguide-page': wp_redirect ("http://www.google.com"); Pause; défaut: wp_safe_redirect ('/wp-admin/'); Pause; } sortie; } }
-
J'ai choisi d'utiliser l'instruction
switch
/case
dans le hookafter_setup_theme
/redirect_from_admin_menu ()
fonctionpour qu'il soitplusfacile d'ajouter des redirectionsgoto
supplémentaires si vousen avezbesoin; ajoutez simplementplus de déclarations de cas. -
lesfonctions
wp_redirect ()
etwp_safe_redirect ()
ne seterminentpas réellement; vous devez émettreexplicitement une déclaration de sortiepour que WordPress s'arrêteet ne remplacepas votre redirection.
J'espère que cela vous aidera!
Hi @Tom,
If I understand your question correctly you don't so much need to know how to add a link to the menu (it seems you already know that) but instead need to learn how to get your link to redirect correctly, right?
Redirecting to an External URL from an Admin Menu Item
If so what you need to do is to not use the menu item function but instead "hook" WordPress early enough such that it hasn't output anything except possibly HTTP headers. The earliest hook when calling
/wp-admin/themes.php
appears to beafter_setup_theme
and it appears to work well.Use a "Menu Slug" So You Can Test for it in a Hook
But to get it to work we first need to modify your call to
add_theme_page
in theadmin_menu
hook / yourcreate_theme_style_page()
function. We dropped the fifth parameter (the function to call to implement the admin option) because we don't need it, and changed the fourth parameter (the "menu slug") to bethemes.php?goto=build-styleguide-page
.Although we could have chosen almost literally anything for the fourth parameter, given we are going to redirect I routed to the same page (
themes.php
) as other appearance options for consistency. I also just arbitrarily came up with the namegoto
because WordPress doesn't use it and it seems to make sense for this.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, we got rid of your
build_styleguide_page()
function because we don't need it for this solution.Redirect in the Earliest Hook for
themes.php
:after_setup_theme
As our last bit of code we implement our
after_setup_theme
hook in ourredirect_from_admin_menu()
function. We have it test to see if the current page isthemes.php
and to ensure a URL parameter ofgoto
was passed on the URL. Then it tests the value ofgoto
using aswitch
/case
statement to see if it has a value of'build-styleguide-page'
; if so it redirects to your stated hypothetical e.g. Google otherwise we just redirect back to the admin dashboard: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:
I chose to use the
switch
/case
statement in theafter_setup_theme
hook /redirect_from_admin_menu()
function so that it would be easier to add additionalgoto
redirects if you need to; just add more case statements.the
wp_redirect()
andwp_safe_redirect()
functions don't actually terminate; you need to explicit issue an exit statement to get WordPress to stop and not override your redirect.
Hope this helps!
-
- 2010-11-09
Si vous ajoutez votre élément dans lemenuen l'ajoutant directement autableau
$submenu
,vous éviterez de devoireffectuer la redirectionet pourrez utiliser une URL hors site complète comme lien demenu (jefais çamoi-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 dumenuparent,donc dans l'exemple,j'ajouteessentiellement un élément aumenu Tableau debord ..Bien sûr,cen'estpas aussijoli que d'utiliser lesfonctions
add_{type}_page
,mais cela contourne lefait que WordPressempêche les URL hors site dans les liens dumenu d'administration.J'utilise quelque chose de similairepour ajoutermes différents hôtes virtuels dans lemenu,doncje peuxpasser à d'autresinstallations directement àpartir dumenu d'administration (letoutfait avec un script,mais utiliseessentiellement une versionglorifiée du code ci-dessus).
REMARQUE: Si vous décidez d'utiliser le code,veillez simplement àne pas attribuer une cléen cours d'utilisation (la clé detableau 500 dans l'exemple de code).
CONSEIL: Vouspouvezen fait utiliser des valeursnégatives dans lestouches demenu à,de sorte que vouspouvezforcer vos éléments demenu à s'asseoir avant l'un des élémentsnatifs de WordPress.
If you add your item into the menu by adding it to the
$submenu
array directly you'll avoid the need to do the redirect and be able to use a complete offsite URL as the menu link (i do this myself).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
represents the key/link of the parent menu, so in the example i'm basically adding an item to the Dashboard menu..Sure, it's not quite as pretty as using the
add_{type}_page
functions, but it does work-around the fact WordPress prevents off-site URLs in admin menu links..I use something similar to add my various virtual hosts into the menu, so i can switch to other installations directly from the admin menu (all done with a script, but basically uses a glorified version of the above code).
NOTE: If you decide to use the code, just be careful not to assign a key that's in use(the 500 array key in the example code).
TIP: You can actually use negative values in the menu keys to, so you can force you menu items to sit before any of the native WordPress items.
-
** REMARQUE: ** Jepense 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 commeinvalide (jepense) .. (les chaînesnégativesfonctionnent cependant,sije neme trompepas) ..**NOTE:** I think you will need to set that negative key as a string though, ie. `'-5'` and not `-5`, else the key is regarded invalid(i think).. (negative strings works though, if i'm not mistaken)..
- 0
- 2010-12-09
- t31os
-
Merci,c'estnul que vousne puissiezpas lefaire avec les vraiesfonctions,mais c'estbeaucoupmieux que d'avoir à ajouter un combo hook/redirectionjustepour avoir un lien.Thanks, sucks that you can't do it with the real functions, but this is a whole lot better than having to add a hook/redirect combo just to have a link.
- 0
- 2011-09-12
- El Yobo
-
Cette réponseparticulièrem'a aidé avecmonplugin Post Status Menu Items (vouspouvezprobablement deviner ce qu'ilfait).Quoi qu'ilen soit,parce queje ne savaispas quels autresplugins ajouteraient des éléments à quelsmenus,j'aipensé simplement ajouter quej'avais utilisé `array_push ()`pour ajouter les éléments demenu afin d'évitertoute collision avec d'autresplugins.This particular answer helped me with my plugin Post Status Menu Items (you can probably guess what it does). Anyway, because I didn't know what other plugins would be adding stuff to what menus, I thought I'd just add that I used `array_push()` to append the menu items to avoid colliding with any other plugins.
- 2
- 2012-04-28
- mrwweb
-
Fonctionne comme un charme,plus unpointbonuspour l'utilisation d'un sipetit extrait.Works like a charm, plus bonus point for using such a small snippet.
- 0
- 2012-11-07
- João
-
+1.Plutôt que de choisir une cléet d'espérer,saisissez simplement la dernière cléet augmentez.Parexemple,lors de l'ajout d'un élément de sous-menu aumenu Outils: `global $ submenu;$ key=end (array_keys ($ submenu ['tools.php'])) + 1;$ submenu ['tools.php'] [$ key ++]=`etc.+1. Rather than picking a key and hoping, just grab the last key and increment. For example, when adding a submenu item to the Tools menu: `global $submenu; $key = end(array_keys($submenu['tools.php'])) + 1; $submenu['tools.php'][$key++] = ` etc.
- 2
- 2013-05-29
- webaware
-
Mercibeaucoup :) J'aiessayé d'utiliser à lafois Jqueryet la redirectionet j'aieu desproblèmes.C'estparfait.Thanks alot :) I tried using both Jquery and redirection and had issues. This is perfect.
- 0
- 2013-11-23
- user1632018
-
J'ai une question cependant,comment ajouter un autre lien?J'aiessayé d'utiliser untableaumultidimensionnel,mais cen'estpas autorisé.I have one question though, how would I add another link? I tried using a multidimensional array, but it is not allowed.
- 0
- 2013-11-23
- user1632018
-
J'ai volontairement évité l'approcheparincrément,carje nepeuxpastoujours dire queje veux ajouter ou ajouter l'index,et la questionn'avaitpas cetteexigence,mais ce serait un choixjudicieux si vous vouliez ajouterparprogramme aumenu.I purposely avoided the increment approach because i can't always say i want to append or prepend the index, nor did the question have that requirement, but it would be a smart choice if you wanted to programmatically add to the menu.
- 0
- 2014-01-24
- t31os
-
- 2015-01-21
J'ai réalisé lamê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 vousfaitesiciest d'ajouter un élément demenuet de définir slug,puis sur 'admin_init' vous vérifiez si le slugexisteet redirigez vers l'emplacement souhaité.
I have achieved same with this:
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 );
What you do here is you add menu item and define slug, then on 'admin_init' you check if slug exists and redirect to your desired location.
Existe-t-il unmoyen d'ajouter un lien hypertexte arbitraire vers lemenu d'administration de WordPress (je veux dire lemenu degauche lorsque vous vous connectez autableau debord d'administration)? Parexemple,peut-on ajouter un lien vers Google?
Dansmon casparticulier,j'aimerais ajouter unepage deguide de stylepour unthème Wordpress sur lequelje travaille afin queje puissemontrer à l'utilisateur comment les différents éléments HTML sont stylisés avec lethèmeet montrer comment styliser diverses chosesjoliment .
Voici le code quej'aijusqu'àprésent (note:ilestincomplet ): Dans functions.php j'ai ajouté unnouvel élément demenu dans Apparence section:
Dans
build_styleguide_page()
,latentative de redirection avecheader()
donne uneerreur ( Impossible demodifier lesinformations d'en-tête ).