{"id":18984134,"date":"2026-08-05T03:42:12","date_gmt":"2026-08-05T03:42:12","guid":{"rendered":"https:\/\/wordpress.org\/support\/topic\/menu-priority\/"},"modified":"2026-08-05T03:42:12","modified_gmt":"2026-08-05T03:42:12","slug":"menu-priority","status":"publish","type":"topic","link":"https:\/\/wordpress.org\/support\/topic\/menu-priority\/","title":{"rendered":"Menu priority"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Recently, a choice was made to change the Matomo&#8217;s admin menu priority to a very low weight, showing it in most cases under the Dashboard:<br \/><code>add_menu_page( 'Matomo Analytics', 'Matomo Analytics', <em>self<\/em>::CAP_NOT_EXISTS, 'matomo', null, $matomo_logo_url, 2 );<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This choice is arguably bad UX: in most cases, on a Content Management System, the user&#8217;s first goal is to manage content (it&#8217;s in the name), not to browse Analytics. Having the menu so high up disrupts their experience. If not lowered altogether, this should be configurable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Please find below a snippet (works with &#8220;Code Snippets&#8221; plugin) for anyone interested in making the high priority optional in the meantime. This can also be adapted by the plugins&#8217; maintainers, used as a base to actually make it optional in the plugin itself.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php<br \/>\/**<br \/> * Makes the Matomo WordPress admin-menu position configurable.<br \/> *<br \/> * @package Override_Matomo_Menu_Position<br \/> *\/<br \/><br \/>defined( 'ABSPATH' ) || exit;<br \/><br \/>\/** Adds a standalone menu-position setting for Matomo. *\/<br \/>final class Override_Matomo_Menu_Position {<br \/>\tconst OPTION_NAME   = 'override_matomo_menu_after';<br \/>\tconst NONCE_ACTION  = 'override_matomo_menu_position';<br \/>\tconst FORM_ACTION   = 'override_save_matomo_menu_position';<br \/>\tconst DEFAULT_AFTER = 'index.php';<br \/><br \/>\t\/** Registers the integration after Matomo has loaded. *\/<br \/>\tpublic static function register() {<br \/>\t\tif ( ! defined( 'MATOMO_ANALYTICS_FILE' ) ) {<br \/>\t\t\treturn;<br \/>\t\t}<br \/><br \/>\t\tadd_filter( 'matomo_setting_tabs', array( __CLASS__, 'add_settings_tab' ), 20 );<br \/>\t\tadd_filter( 'custom_menu_order', '__return_true' );<br \/>\t\tadd_filter( 'menu_order', array( __CLASS__, 'reorder_menu' ), PHP_INT_MAX );<br \/>\t}<br \/><br \/>\t\/**<br \/>\t * Adds this class as a Matomo settings tab.<br \/>\t *<br \/>\t * Matomo settings tabs use objects exposing get_title() and show_settings().<br \/>\t *\/<br \/>\tpublic static function add_settings_tab( $tabs ) {<br \/>\t\t$tabs&#091;'menu-position'] = new self();<br \/><br \/>\t\treturn $tabs;<br \/>\t}<br \/><br \/>\t\/** Returns the Matomo settings-tab title. *\/<br \/>\tpublic function get_title() {<br \/>\t\treturn 'Menu position';<br \/>\t}<br \/><br \/>\t\/** Renders and processes the settings tab. *\/<br \/>\tpublic function show_settings() {<br \/>\t\tif ( ! current_user_can( 'superuser_matomo' ) ) { \/\/ phpcs:ignore WordPress.WP.Capabilities.Unknown<br \/>\t\t\twp_die( esc_html__( 'You are not allowed to manage Matomo settings.', 'matomo' ) );<br \/>\t\t}<br \/><br \/>\t\t$was_updated = false;<br \/><br \/>\t\tif (<br \/>\t\t\tisset( $_POST&#091;'override_matomo_menu_action'] )<br \/>\t\t\t&amp;&amp; self::FORM_ACTION === sanitize_key( wp_unslash( $_POST&#091;'override_matomo_menu_action'] ) )<br \/>\t\t) {<br \/>\t\t\tcheck_admin_referer( self::NONCE_ACTION );<br \/><br \/>\t\t\t$requested_position = isset( $_POST&#091; self::OPTION_NAME ] )<br \/>\t\t\t\t? sanitize_text_field( wp_unslash( $_POST&#091; self::OPTION_NAME ] ) )<br \/>\t\t\t\t: self::DEFAULT_AFTER;<br \/><br \/>\t\t\t$positions = self::get_positions();<br \/><br \/>\t\t\tif ( ! array_key_exists( $requested_position, $positions ) ) {<br \/>\t\t\t\t$requested_position = self::DEFAULT_AFTER;<br \/>\t\t\t}<br \/><br \/>\t\t\tself::update_position( $requested_position );<br \/>\t\t\t$was_updated = true;<br \/>\t\t}<br \/><br \/>\t\t$current_position = self::get_position();<br \/>\t\t$positions        = self::get_positions();<br \/><br \/>\t\tif ( $was_updated ) {<br \/>\t\t\t?&gt;<br \/>\t\t\t&lt;div class=\"matomo-notice notice notice-success is-dismissible\"&gt;<br \/>\t\t\t\t&lt;p&gt;&lt;?php esc_html_e( 'Menu position updated.', 'matomo' ); ?&gt;&lt;\/p&gt;<br \/>\t\t\t&lt;\/div&gt;<br \/>\t\t\t&lt;?php<br \/>\t\t}<br \/>\t\t?&gt;<br \/><br \/>\t\t&lt;form method=\"post\"&gt;<br \/>\t\t\t&lt;?php wp_nonce_field( self::NONCE_ACTION ); ?&gt;<br \/><br \/>\t\t\t&lt;input<br \/>\t\t\t\ttype=\"hidden\"<br \/>\t\t\t\tname=\"override_matomo_menu_action\"<br \/>\t\t\t\tvalue=\"&lt;?php echo esc_attr( self::FORM_ACTION ); ?&gt;\"<br \/>\t\t\t\/&gt;<br \/><br \/>\t\t\t&lt;table class=\"matomo-tracking-form widefat\"&gt;<br \/>\t\t\t\t&lt;tbody&gt;<br \/>\t\t\t\t\t&lt;tr&gt;<br \/>\t\t\t\t\t\t&lt;th width=\"20%\" scope=\"row\"&gt;<br \/>\t\t\t\t\t\t\t&lt;label for=\"&lt;?php echo esc_attr( self::OPTION_NAME ); ?&gt;\"&gt;<br \/>\t\t\t\t\t\t\t\t&lt;?php esc_html_e( 'Show Matomo Analytics after', 'matomo' ); ?&gt;:<br \/>\t\t\t\t\t\t\t&lt;\/label&gt;<br \/>\t\t\t\t\t\t&lt;\/th&gt;<br \/><br \/>\t\t\t\t\t\t&lt;td&gt;<br \/>\t\t\t\t\t\t\t&lt;select<br \/>\t\t\t\t\t\t\t\tid=\"&lt;?php echo esc_attr( self::OPTION_NAME ); ?&gt;\"<br \/>\t\t\t\t\t\t\t\tname=\"&lt;?php echo esc_attr( self::OPTION_NAME ); ?&gt;\"<br \/>\t\t\t\t\t\t\t&gt;<br \/>\t\t\t\t\t\t\t\t&lt;?php foreach ( $positions as $menu_slug =&gt; $label ) { ?&gt;<br \/>\t\t\t\t\t\t\t\t\t&lt;option<br \/>\t\t\t\t\t\t\t\t\t\tvalue=\"&lt;?php echo esc_attr( $menu_slug ); ?&gt;\"<br \/>\t\t\t\t\t\t\t\t\t\t&lt;?php selected( $current_position, $menu_slug ); ?&gt;<br \/>\t\t\t\t\t\t\t\t\t&gt;<br \/>\t\t\t\t\t\t\t\t\t\t&lt;?php echo esc_html( $label ); ?&gt;<br \/>\t\t\t\t\t\t\t\t\t&lt;\/option&gt;<br \/>\t\t\t\t\t\t\t\t&lt;?php } ?&gt;<br \/>\t\t\t\t\t\t\t&lt;\/select&gt;<br \/>\t\t\t\t\t\t&lt;\/td&gt;<br \/><br \/>\t\t\t\t\t\t&lt;td width=\"50%\"&gt;<br \/>\t\t\t\t\t\t\t&lt;?php esc_html_e( 'Choose which WordPress admin-menu item Matomo Analytics should follow.', 'matomo' ); ?&gt;<br \/>\t\t\t\t\t\t&lt;\/td&gt;<br \/>\t\t\t\t\t&lt;\/tr&gt;<br \/><br \/>\t\t\t\t\t&lt;tr&gt;<br \/>\t\t\t\t\t\t&lt;td colspan=\"3\"&gt;<br \/>\t\t\t\t\t\t\t&lt;p class=\"submit\"&gt;<br \/>\t\t\t\t\t\t\t\t&lt;input<br \/>\t\t\t\t\t\t\t\t\ttype=\"submit\"<br \/>\t\t\t\t\t\t\t\t\tclass=\"button-primary\"<br \/>\t\t\t\t\t\t\t\t\tvalue=\"&lt;?php esc_attr_e( 'Save Changes', 'matomo' ); ?&gt;\"<br \/>\t\t\t\t\t\t\t\t\/&gt;<br \/>\t\t\t\t\t\t\t&lt;\/p&gt;<br \/>\t\t\t\t\t\t&lt;\/td&gt;<br \/>\t\t\t\t\t&lt;\/tr&gt;<br \/>\t\t\t\t&lt;\/tbody&gt;<br \/>\t\t\t&lt;\/table&gt;<br \/>\t\t&lt;\/form&gt;<br \/>\t\t&lt;?php<br \/>\t}<br \/><br \/>\t\/** Moves Matomo immediately after the configured menu item. *\/<br \/>\tpublic static function reorder_menu( $menu_order ) {<br \/>\t\tif ( ! is_array( $menu_order ) ) {<br \/>\t\t\treturn $menu_order;<br \/>\t\t}<br \/><br \/>\t\t$matomo_index = array_search( 'matomo', $menu_order, true );<br \/><br \/>\t\tif ( false === $matomo_index ) {<br \/>\t\t\treturn $menu_order;<br \/>\t\t}<br \/><br \/>\t\tunset( $menu_order&#091; $matomo_index ] );<br \/>\t\t$menu_order = array_values( $menu_order );<br \/><br \/>\t\t$after_slug = self::get_position();<br \/><br \/>\t\tif ( '__bottom__' === $after_slug ) {<br \/>\t\t\t$menu_order&#091;] = 'matomo';<br \/><br \/>\t\t\treturn $menu_order;<br \/>\t\t}<br \/><br \/>\t\t$after_index = array_search( $after_slug, $menu_order, true );<br \/><br \/>\t\tif ( false === $after_index ) {<br \/>\t\t\t$after_index = array_search( self::DEFAULT_AFTER, $menu_order, true );<br \/>\t\t}<br \/><br \/>\t\tif ( false === $after_index ) {<br \/>\t\t\tarray_unshift( $menu_order, 'matomo' );<br \/><br \/>\t\t\treturn $menu_order;<br \/>\t\t}<br \/><br \/>\t\tarray_splice( $menu_order, $after_index + 1, 0, array( 'matomo' ) );<br \/><br \/>\t\treturn $menu_order;<br \/>\t}<br \/><br \/>\t\/** Returns the supported placement targets. *\/<br \/>\tprivate static function get_positions() {<br \/>\t\treturn array(<br \/>\t\t\t'index.php'               =&gt; 'Dashboard',<br \/>\t\t\t'edit.php'                =&gt; 'Posts',<br \/>\t\t\t'upload.php'              =&gt; 'Media',<br \/>\t\t\t'edit.php?post_type=page' =&gt; 'Pages',<br \/>\t\t\t'edit-comments.php'       =&gt; 'Comments',<br \/>\t\t\t'themes.php'              =&gt; 'Appearance',<br \/>\t\t\t'plugins.php'             =&gt; 'Plugins',<br \/>\t\t\t'users.php'               =&gt; 'Users',<br \/>\t\t\t'tools.php'               =&gt; 'Tools',<br \/>\t\t\t'options-general.php'     =&gt; 'Settings',<br \/>\t\t\t'__bottom__'              =&gt; 'Bottom of the menu',<br \/>\t\t);<br \/>\t}<br \/><br \/>\t\/** Gets the saved position for the current administration context. *\/<br \/>\tprivate static function get_position() {<br \/>\t\t$position = is_network_admin()<br \/>\t\t\t? get_site_option( self::OPTION_NAME, self::DEFAULT_AFTER )<br \/>\t\t\t: get_option( self::OPTION_NAME, self::DEFAULT_AFTER );<br \/><br \/>\t\treturn array_key_exists( $position, self::get_positions() )<br \/>\t\t\t? $position<br \/>\t\t\t: self::DEFAULT_AFTER;<br \/>\t}<br \/><br \/>\t\/** Saves the position for the current administration context. *\/<br \/>\tprivate static function update_position( $position ) {<br \/>\t\tif ( is_network_admin() ) {<br \/>\t\t\tupdate_site_option( self::OPTION_NAME, $position );<br \/>\t\t\treturn;<br \/>\t\t}<br \/><br \/>\t\tupdate_option( self::OPTION_NAME, $position, false );<br \/>\t}<br \/>}<br \/><br \/>add_action( 'init', array( 'Override_Matomo_Menu_Position', 'register' ) );<\/code><\/pre>\n","protected":false},"template":"","class_list":["post-18984134","topic","type-topic","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/support\/wp-json\/wp\/v2\/topic\/18984134","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/support\/wp-json\/wp\/v2\/topic"}],"about":[{"href":"https:\/\/wordpress.org\/support\/wp-json\/wp\/v2\/types\/topic"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.org\/support\/wp-json\/wp\/v2\/topic\/18984134\/revisions"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/support\/wp-json\/wp\/v2\/media?parent=18984134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}