I recently got into WordPress plugin development and I would like to add a menu page (the links in the left hand side menu). Previous SO questions and the WordPress codex say that it's as simple as calling:
add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position );
However when I try this in my plugin setup file it tells me that the function is undefined:
PHP Fatal error: Call to undefined function add_menu_page()
This seems like a very simple thing to do according to the documentation but I am totally baffled. Any help would be really appreciated :)
I don't know how your code looks but this is how I just tested and it worked:
add_action('admin_menu', 'my_menu');
function my_menu() {
add_menu_page('My Page Title', 'My Menu Title', 'manage_options', 'my-page-slug', 'my_function');
}
function my_function() {
echo 'Hello world!';
}
Take a look here http://codex.wordpress.org/Administration_Menus
You are getting this error message because either you have used the function add_menu_page outside any hook or hooked it too early.
The function add_menu_page gets capability as a third argument to determine whether or not the user has the required capability to access the menu so the function is only available when the user capability is populated therefore you should use the function in the admin_menu hook as following.
add_action( 'admin_menu', 'register_my_custom_menu_page' );
function register_my_custom_menu_page(){
add_menu_page( __( 'Custom Menu Title' ), 'custom menu', 'manage_options', 'custom-page-slug', 'my_custom_menu_page' );
}
function my_custom_menu_page() {
echo __( 'This is custom menu page.' );
}
See the following WordPress codex page for information about it.
http://codex.wordpress.org/Function_Reference/add_menu_page
Related
I created an admin menu page in WordPress. But it is accessible only to admin. How to make it available to the editor also.
function essof_add_setup_page()
{
add_menu_page(
__('Essof Setup', 'textdomain'),
__('Essof Setup', 'textdomain'),
'manage_options',
'setup',
'essof_setup_page',
'dashicons-admin-tools',
4
);
}
add_action('admin_menu', 'essof_add_setup_page');
You'll need to change the capability to an editor's capability, i.e., editor:
add_menu_page(
'parent_slug',
'page_title',
'menu_title',
'editor',
'menu_slug',
'callback function'
);
Check here for detailed description: https://developer.wordpress.org/reference/functions/add_menu_page/
I'm new to wordpress plugin development & I want to make a plugin. So far I managed to add Menu in Dashboard. Now I want to add a submenu. Menu works when I click on it but submenu doesn't work. It shows this error, You do not have sufficient permissions to access this page. My code is below,
<?php
add_action( 'admin_menu', 'sms_dashmenu');
function sms_dashmenu() {
add_menu_page( 'sms_menu_page', 'SMS Demo','manage_options', __FILE__,'sms_plugin',plugins_url( '/Images/logo.png', __FILE__ ) );
add_submenu_page( __FILE__, 'AdminPanel','Admin', 'manage_options',__FILE__.'/menu1', sms_panel_admin);
}
function sms_plugin(){
echo 'Welcome to the business!';
}
function sms_panel_admin(){
?>
<h2>Admin Panel Design</h2>
<?php
}
?>
Is there something wrong in my code? I need a solution badly. Your help would be appreciated. Tnx.
The fourth parameter in add_menu_page is the menu slug of string type use anything unique you want, and the first parameter of add_submenu_page is the parent slug and that is what you entered for add_menu_page menu slug
add_menu_page( 'sms_menu_page', 'SMS Demo','manage_options', 'smsmenu','sms_plugin',plugins_url( '/Images/logo.png', __FILE__ ) );
add_submenu_page( 'smsmenu', 'AdminPanel','Admin', 'manage_options', 'smsadmin', 'sms_panel_admin');
Check add_menu_page and add_submenu_page
I am trying to develop multiple plugins to fill various needs I have in WordPress. I figured I would create a 'base' plugin, and then other plugins can be installed on top.
I have created a menu page in my base plugin using add_menu_page (all this is in my class obviously, variables replaced with strings for ease of reading)
private function __construct() {
add_action('admin_menu', array($this, 'add_group_page'));
}
public function add_group_page(){
add_menu_page('Group Plugins', 'Group Plugins', 'activate_plugins', 'group-plugins', array($this, 'group_page_callback'), '', 3.1415);
}
public function group_page_callback() { ?>
<div class="wrap">
<h2>Group Plugins</h2>
</div>
<?php
}
That works fine, my menu structure now has: (tags wrong on purpose, for readability of urls)
(Group Plugins)[admin.php?page=group-plugins]
In my second plugin, I try to call add_submenu_page:
private function __construct() {
add_action('admin_menu', array($this, 'add_groupforms_page'));
}
public function add_groupforms_page(){
add_submenu_page('group-plugins', 'Group Forms', 'Group Forms', 'manage_options', 'group-forms', array($this, 'groupforms_page_callback'));
}
public function groupforms_page_callback() { ?>
<div class="wrap">
<h2>Group Forms</h2>
</div>
<?php
}
Which seems like it has worked in adding the new submenu item. But the menu structure changes to:
(Group Plugins)[admin.php?page=**group-forms**]
--(Group Forms)[admin.php?page=**group-forms**]
So both links link to the new submenu page, and when I click on either of them, I just get a backend styled page that says You do not have sufficient permissions to access this page.
I can still access 'Group Plugins' original page if I change the slug in the url to 'group-plugins', but something clearly isn't right, and the only thing that really shows up when I google the error is people saying to check its hooked in the right place: admin_menu, which it is, because I have checked the docs so many times trying to figure this out.
You have to fire the submenu after the menu. This is done with the hook priority, when not declared defaults to 10.
The main menu is setup with default priority:
add_action('admin_menu', array($this, 'add_group_page'));
And the submenu has to be a lower priority:
add_action( 'admin_menu', array($this, 'add_groupforms_page'), 11 );
Is it possible to add a new admin menu to the woocommerce admin section in Wordpress?
I've done this with WP E-commerce with my custom plugin so am wandering if the same is true for Woo commerce.
Thanks
Well, if you use something like this:
add_action('admin_menu', 'register_my_custom_submenu_page');
function register_my_custom_submenu_page() {
add_submenu_page( 'woocommerce', 'My Custom Submenu Page', 'My Custom Submenu Page', 'manage_options', 'my-custom-submenu-page', 'my_custom_submenu_page_callback' );
}
function my_custom_submenu_page_callback() {
echo '<h3>My Custom Submenu Page</h3>';
}
Then you will see a submenu under "Woocommerce" admin menu. For some reason you can´t do same using post_type=shop_order.
"shop_order" is the one you should use to put a submenu under "Woocommerce" one.. but, as i said, don´t know why didn´t work with that particual post_type.
http://codex.wordpress.org/Function_Reference/add_submenu_page
For me the following worked:
add_submenu_page(
'edit.php?post_type=product',
PAGE_TITLE,
MENU_TITLE,
'manage_woocommerce',
'custom_wc_menu'
);
Setting the $parent_slug to edit.php?post_type=product
So what i mean by the above is. I've so far made many plugins but i keep getting this issue which i don't know how to describe and that is why i cant search it on google.
What happen is in many plugin a main menu is required and under it several sub-menus that leads to different pages related to the plugin. you can click on the main menu lets say "car" and that will take you to a add car page. and there will also be a sub-menu called add car.
like: posts - when you click on posts for example it takes you to all post, but there is also a sub-menu that is called all post.
What i am having problem with is the main menu is named one thing and when hover it the first sub-menu is also called the same.
My question is:
How can i make it so that either when creating a main menu it will not automatically add a sub menu or if it does. the name will be different then the main menu.
I hope the explanation is clear - i really tried.
Here is how i define my menus:
function my_plugin_menu() {
add_menu_page( 'add_deal', 'Add Deal', 'manage_options', 'add_deal', 'menuload_add_deal', '', '28');
add_submenu_page( 'add_deal', 'deals', 'Deals', 'manage_options', 'deals', 'menuload_deals');
add_submenu_page( 'add_deal', 'orders', 'Order', 'manage_options', 'orders', 'menuload_orders');
add_submenu_page( 'add_deal', 'gc_options', 'Options', 'manage_options', 'gc_options', 'menuload_gc_options');
}
add_action( 'admin_menu', 'my_plugin_menu' );
The above now display for me:
Add Deal - //opens add deal page
Deals
Orders
Options
I would like to change it to:
Shopping Cart - //opens add deal page
add deal - //opens add deal page
deals
orders
options
Ones again i hope that makes sense.. not trying to waste anyone's time but that's why its so hard for me to find info on googble about this issue. (i don't know how to describe the problem well).
I've found a solution incase anyone interested:
function my_plugin_menu() {
add_menu_page( 'add_product', 'Bass Nation', 'manage_options', 'bass-nation-real-shopping-cart', 'menu_load_add_product', '', '28');
add_submenu_page( 'bass-nation-real-shopping-cart', 'add_product', 'Add Product', 'manage_options', 'bass-nation-real-shopping-cart', 'menu_load_add_product');
add_submenu_page( 'bass-nation-real-shopping-cart', 'products', 'Products', 'manage_options', 'products', 'menu_load_products');
add_submenu_page( 'bass-nation-real-shopping-cart', 'orders', 'Orders', 'manage_options', 'orders', 'menu_load_orders');
add_submenu_page( 'bass-nation-real-shopping-cart', 'bnrsc_options', 'Options', 'manage_options', 'bnrsc_options', 'menu_load_options');
}
add_action( 'admin_menu', 'my_plugin_menu' );
You just name the first sub menu's slugen same as the main menu.
Hope this helps someone out there.