Wordpress hiding Plugin Menu Page - wordpress

I am having this problem that I have a Plugin which has two sub menus: Escape Submitter and Event Submitter. But the thing is I created the Plugin pages like this:
add_action( 'admin_menu', 'my_plugin_menu' );
function my_plugin_menu() {
add_menu_page('Submission Requests', "Submission Requests", 'add_users',"submission-requests/show.php",'',PRO_URL."/images/icon.png",27);
add_submenu_page( 'submission-requests/show.php', "Escape Submitter", "Escape Submitter", 'manage_options', 'escape_submit','escapeSub' );
add_submenu_page( 'submission-requests/show.php', "Event Submitter", "Event Submitter", 'manage_options', 'event_submit','eventSub' );
}
and it Look like this in Wordpress plugin Page
But the thing is that I don't want to add the main menu page 'Submission Requests' to show in the main menu I just want to see something like this:
How can I do this do I have to call other type of add_menu_page function? Or do I have to give some parameters to the same. Because I want to show Escape Submitter as first Page when a user clicks on my Plugin.
P.S: Sorry for my Bad English i hope you understood the problem and please forget about those Numberings after those Menu Names

You add_menu_page slug and your first add_submenu_page slug need to be the same.
For example:
public function RWSDevBlip_add_admin_menu() {
add_menu_page('Blip.tv Interface','Blip.tv API','manage_options','rwsdev-blip',array($this,'RWSDevBlip_admin_page'),$this->pluginurl.'images/RWSDevBlip.png',3);
add_submenu_page('rwsdev-blip','Blip.tv Interface Options','Settings','manage_options','rwsdev-blip',array($this,'RWSDevBlip_admin_page'));
add_submenu_page('rwsdev-blip','Blip.tv Interface Upload','Upload','manage_options','rwsdev-blip-upload',array($this,'RWSDevBlip_upload_page'));
add_submenu_page('rwsdev-blip','Blip.tv Interface Videos','Videos','manage_options','rwsdev-blip-videos',array($this,'RWSDevBlip_videos_page'));
}
Hope this helps.

Related

Wordpress: add_submenu_page() creating error

When I try to create a main menu, with this line
add_menu_page("page title","menu name",10,"test-slug");
Wordpress loads just fine and displays the new menu, but when I try to add a submenu,
add_menu_page("page title","menu name",10,"test-slug");
add_submenu_page("test-slug","sub title","sub menu",10,"test-sub-slug");
only an empty page is displayed, right after half a second. Seems like a php-error, but I can't see the error. Does anyone see what I am doing wrong?
Try the code below in your functions.php file. It should work correctly.
add_menu_page(
'Menu Page Title', // page title
'Menu Menu Text', // menu link text
'manage_options', // capability to access the page
'menu_slug', // page URL slug
'menu_callback_function', // callback function to display the content on options page
'dashicons-format-status', // menu icon
2 // priority
);
add_submenu_page(
'menu_slug', // page URL slug
'Sub Menu Title', // page title
'Sub Menu Text', // menu link text
'manage_options', // capability to access the page
'submenu_slug', // page URL slug
'submenu_callback_function', // callback function to display the content on options page
1 // priority
);
function menu_callback_function(){
echo "This is menu page...";
}
function submenu_callback_function(){
echo "This is submenu page...";
}
Problem solved. add_submenu_page() obviously must be called using a hook. Hence, this way it works and will not cause Wordpress to crash:
function dp_menu_item()
{
add_menu_page("page title","menu name","manage_options","mypage.php");
add_submenu_page("edit.php?post_type=cpt_people","sub title","sub menu","manage_options","mysubpage.php");
}
add_action("admin_menu", "dp_menu_item");

WordPress shows menu page when hooking into admin_menu but not admin_init

I created a plugin and was writing the code for the page on the admin menu. The link in the backend menu appeared and was working fine (the link on the left hand toolbar). However, when I tried to click on it, the url loaded but I got the message on the page 'Sorry, you are not allowed to access this page.'
My initial code was below:
add_action('admin_init', 'settings_menu_page');
function settings_menu_page() {
add_menu_page(
__('Settings Page', 'wpplugin'),
__('Custom Settings', 'wpplugin'),
'manage_options',
'wpplugin',
'settings_page_callback',
'',
85
);
}
function settings_page_callback() {
esc_html_e( 'Settings page text', 'wpplugin' );
}
And then I decided to change the action hook to 'admin_menu' so the code looked like:
add_action('admin_menu', 'settings_menu_page');
function settings_menu_page() {
add_menu_page(
__('Settings Page', 'wpplugin'),
__('Custom Settings', 'wpplugin'),
'manage_options',
'wpplugin',
'settings_page_callback',
'',
85
);
}
function settings_page_callback() {
esc_html_e( 'Settings page text', 'wpplugin' );
}
And with this code I can see the page. The only thing that changed was the hook.
I've referenced the docs for admin_menu and admin_init and I'm at a bit of a loss as to what the difference between them is that is causing them to allow one with permissions but not the other.
Note: I was the same WordPress user for both of these with Administrator rights.
Does anyone know what the difference is here?
The difference between the two hooks are when they are triggered. The admin_menu is triggered when a basic menu structure is in place and a basic admin panel has been initialized.
The hook admin_init on the other hand is triggered before any other admin side hooks that are triggered when the user accesses the admin area. Moreover, the admin_init hook does not run on user facing admin screens. It runs on admin-ajax.php and admin-post.php
You can read up more about these hooks and run sequence on the links mentioned below:
admin_init
admin_menu
Default actions Run on front and admin
Good Luck!!!

How to Show WP Plugin Menu for Editor User Roles in WordPress

I'm trying to show my plugin menu / options page for the "Editor" role,
but it's not showing up. How to solve this ? Thank you.
Here's my code :
function jowct_add_plugin_for_editors(){
if (!current_user_can('manage_options')) {
add_menu_page(
'Menu Page Title',
'Menu Title',
'delete_others_pages',
'jowct-wpplugin-menu',
'jowct_menu_option_page',
'dashicons-admin-generic',
'3',
);
}
}
if(is_admin()) {
add_action( 'admin_menu', 'jowct_add_plugin_for_editors' );
}
You can remove the if entirely. (both of them)
You don't need too check for manage_options as you are already checking delete_others_pages
More info https://codex.wordpress.org/Roles_and_Capabilities
function jowct_add_plugin_for_editors(){
add_menu_page(
'Menu Page Title',
'Menu Title',
'delete_others_pages', //this will restrict access
'jowct-wpplugin-menu',
'jowct_menu_option_page',
'dashicons-admin-generic',
'3' // this comma was incorrect syntax
);
}
// action admin_menu will only trigger in the admin, no need for the if.
add_action( 'admin_menu', 'jowct_add_plugin_for_editors' );
Thanks everyone, I just solved this issue.
On this case, I want to show the plugin main menu & sub menu to the administrator role. While the editor role only have access to the main menu.
The key is to set the main menu capability to editor capability such as "moderate_comments", this way both administrator and editor can access this main menu.
For the sub menu, set the capability to "manage_options". This way, only administrator will be able to see this sub menu.
Check out this table :
https://codex.wordpress.org/Roles_and_Capabilities

How do you make a Wordpress plugin have "per post" options?

I'm building a Wordpress blog that requires a custom slideshow system with an admin panel on each post admin page (sort of like how Yoast's SEO plugin has options on each page).
How would I make the admin options appear on the post admin page?
Thanks,
Charlie
You are not providing much detail about your project but you probably want to make some meta_boxes and save the data to as custom fields.
Here is a truncated example culled from something I put together for a question at wordpress.stackexchange. The details of some of the functions are not important for your question here but it illustrates the general 'how'. Follow the link for working but sincerely beta code.
// author checkboxes
add_action( 'add_meta_boxes', 'assisting_editor' );
function assisting_editor() {
add_meta_box(
'assisting_editor', // id, used as the html id att
__( 'Editorial Tasks' ), // meta box title
'editor_tasks', // callback function, spits out the content
'post', // post type or page. This adds to posts only
'side', // context, where on the screen
'low' // priority, where should this go in the context
);
}
// this is the callback that creates the meta box content
function editor_tasks( $post ) {
// function details skipped; follow the link
}
// to save the data
add_action( 'save_post', 'save_metadata');
// callback for the save hook ^^
function save_metadata($postid) {
// function details skipped; follow the link
}

How do you add a WordPress admin page without adding it to the menu?

I'm building a WordPress plugin and I'd like to have an edit-item page that can't be reached via the submenu (because then the item wouldn't be specified).
This resource (http://codex.wordpress.org/Adding_Administration_Menus) shows how to associate an admin page with a function, but not how to do so without adding it as a menu item.
Can this be done?
Thanks!
Best solution here http://wordpress.org/support/topic/add-backend-page-without-menu-item
use add_submenu_page with parent slug = null
I have finally discovered a way to do this that isn't an ugly hack, doesn't require JS to highlight the desired menu item (and submenu item), and works for regular menus registered by plugins (#Josh's answer only works for custom post types).
Essentially, you just need to register your submenu normally, but then hook into the 'submenu_file' filter to deregister it and optionally also set another submenu item to highlight instead.
function so3902760_wp_admin_menu() {
// Register the parent menu.
add_menu_page(
__( 'Parent title', 'textdomain' )
, __( 'Parent', 'textdomain' )
, 'manage_options'
, 'my_parent_slug'
, 'display_my_menu'
);
// Register the hidden submenu.
add_submenu_page(
'my_parent_slug' // Use the parent slug as usual.
, __( 'Page title', 'textdomain' )
, ''
, 'manage_options'
, 'my_hidden_submenu'
, 'display_my_submenu'
);
}
add_action( 'admin_menu', 'so3902760_wp_admin_menu' );
function so3902760_wp_admin_submenu_filter( $submenu_file ) {
global $plugin_page;
$hidden_submenus = array(
'my_hidden_submenu' => true,
);
// Select another submenu item to highlight (optional).
if ( $plugin_page && isset( $hidden_submenus[ $plugin_page ] ) ) {
$submenu_file = 'submenu_to_highlight';
}
// Hide the submenu.
foreach ( $hidden_submenus as $submenu => $unused ) {
remove_submenu_page( 'my_parent_slug', $submenu );
}
return $submenu_file;
}
add_filter( 'submenu_file', 'so3902760_wp_admin_submenu_filter' );
Yes, this can be done (well, technically, it would be more like registering the whole thing and then removing the menu item later), but It would just be easiest (I think) to check for parameters in the $_GET super-global to indicate that the user wishes to edit a specific item.
For example, you could have a page that lists items to edit, and clicking 'edit' only adds the item's ID to the current URL(query-string).
In the function that displays this page, if ID is defined, give them the page to edit that item.
Otherwise, give them the list view. That's how posts, pages, and other custom post types do it.
add_submenu_page with parent slug = null
OR
add_submenu_page with menu title = null
use this code for creating new page without adding in menu
add_action( 'admin_menu', 'register_newpage' );
function register_newpage(){
add_menu_page($appname, $appname, 'administrator','custompage', 'custom');
remove_menu_page('custom');
}
function custom()
{
echo "hai";
}
Note: This solution doesn't automatically set the current menu and submenu item. If you want to highlight a particular menu as current when the hidden page is viewed, see my other answer.
From the answers that come before me, you can see that there are many ways to do this. However, there is another way that I think may be the best.
Loading the page differently based on the value of a $_GET query var is one option, but it may not be what some people are looking for.
The suggestions regarding add_submenu_page() are on the right track, but each of the previous suggestions have problems. Setting $menu_title to null doesn't keep the menu item from being displayed, it just makes it so the link doesn't have any text. The link still takes up some room in the menu though, so it looks funny. Setting the $parent_slug to null doesn't have this problem, but I noticed that the page's HTML title doesn't display the $page_title text.
My solution was to set $parent_slug to a fake menu slug, like 'i_dont_exist'. The menu item won't be displayed, and when viewing the admin screen the page title will be filled out properly.
add_submenu_page(
'_doesnt_exist'
,__( 'Page title', 'textdomain' )
,''
,'manage_options'
,'menu_slug'
,'display_my_menu'
);
Yes. It is very possible to make a page cannot be reach via submenu, or even the main menu in the WP admin panel. See the code snippet below.
function myplugin_render_edit_page() {
// Code contains the UI for edit page.
}
/**
* Manage menu items and pages.
*/
function myplugin_register_admin_page() {
global $_registered_pages;
$menu_slug = plugin_basename('myplugin.php');
$hookname = get_plugin_page_hookname($menu_slug,'');
if (!empty($hookname)) {
add_action($hookname, 'myplugin_render_edit_page');
}
$_registered_pages[$hookname] = true;
}
add_action('admin_menu', 'myplugin_register_admin_page');
Hopefully, this will help.
Create sub menu page and parent slug leave it empty like this:
// Create page were you can add new users.
public function add_create_user_menu() {
add_submenu_page(
'',
'Create User',
'Create User',
'manage_options',
'create-user',
array( $this, 'add_create_user_page' )
);
}
You can access it like this:
Add New
I've tried all of the suggestions here but with various issues associated with each.
The WordPress codex for add_submenu_page now gives the correct answer, which is to use options.php as your parent slug. I tried the trick of using a made up name but that gives permissions errors, equally use of null at various locations either causes the menu text to simply be missing (but still clickable) or for the browser title to go missing.
Using options.php worked and I've not seen any issues as a result of its use.
Using add_submenu_page with a parent of NULL definitely works, however if you want to keep the non-linked page associated with a particular menu (say a custom post type menu), you have to use a variation of #Boopathi's answer:
function my_hidden_submenu_page(){
//add the submenu page the usual way
add_submenu_page('edit.php?post_type=custom-type', 'My Page Title', 'My Page Title', 'manage_options', 'my-page-slug', 'my_page_callback');
//then remove it
remove_submenu_page('edit.php?post_type=custom-type','my-page-slug');
}
add_action('admin_menu', 'my_hidden_submenu_page');
It looks as though the two actions would cancel each other out, however remove_submenu_page does not unregister the callback function; it merely removes the link.
This way when someone is viewing your non-linked page, the correct navigation menu (our custom post type menu in this example) will still show as active.
One of the problems I found with merely adding null as the parent slug for a sub menu item is that if you're currently viewing that specific page the submenu itself won't display (at least it didn't for me (along with the page title not showing).
What I did was add an empty span element inside the menu title and use jquery to traverse the parent elements and hide it.
It seems this need is still valid for nowadays version.
I am using WordPress 5.3.2 and I used the following methods to remove the parent named menu from the submenu.
add_action( 'admin_menu', 'submenus' );
function submenus()
{
global $submenu;
$parent_slug = 'parent_slug_name';
// remove parent named menu from submenu because it is always the first one in the submenu array, so the offset is 0 and remove just 1
array_splice( $submenu[$parent_slug], 0, 1 ); // with reindex
// or unset( $submenu[$parent_slug][0] ); // without reindex
}
Hope it helps others who want to achieve the same goal.
About php array_splice()
this method could be found in the source of WP function remove_submenu_page() which is available since WP 3.1.0
Edit / Added
Apart from submenu, parent menu could also be updated in similar way.
For parent menu, the global variable is $menu.
example for reference:
add_action( 'admin_menu', array( $this, 'modify_menu_title' ) );
function modify_menu_title() {
global $menu;
$page = 'some-page-slug';
$new_menu_title = 'New Title Name';
foreach( $menu as $key => $value ) {
if( $menu[$key][2] === $page ) {
$menu[$key][0] = $new_menu_title;
}
}
}
I find you can do it by reusing the insert id, like so:
add_menu_page( 'User AS Packages', 'User AS', 'manage_options', 'myplugin/editaspackages.php', 'UserASPackages', '', 8);
add_menu_page( 'User ARP Packages', 'User ARP', 'manage_options', 'myplugin/editarppackages.php', 'UserARPPackages', '', 8);
add_menu_page( 'AS Packages', 'AS Packages', 'manage_options', 'myplugin/ars-s2.php', 'ARPPackages', '', 8);
The last 3 using position 8 and the last one overrides the two before so the two before do not appear.

Resources