Search code examples
phpjavascriptwordpressmenuparameters

Wordpress: How can I add url GET parameter to my main menu items


I'm trying to add a URL GET parameter to one of my main menu items in Wordpress(but I don't know how to). So, my approach was to detect a click event on the menu item, then pass a parameter via AJAX to my php page which will process value passed as needed.

My main questions are, looking at my code, how come is not working? is there a better way of doing this in WordPress and not rely on javascript?

Here is the javascript:

        <script type="text/javascript">
            $(document).ready(function() {
                $("#menu-item-128").click(function() {
                    $.ajax({
                        url: 'homepage.php',
                        type: "GET",
                        data: ({ homeclick = true }),
                        success: function() {
                           alert("success!");
                        }
                    });
                 });
             });
       </script>

Here is my PHP:

$homeclick = $_GET['homeclick'];   

if ( !isset( $_COOKIE['hs_user'] ) ) {
    get_header();
} elseif (isset( $_COOKIE['hs_user'] ) && $homeclick == true ) {
    get_header();
} else {
    // Do Something else
    header('Location: homepage-returning-users');        
}

Solution

  • The filter hook wp_get_nav_menu_items is used to manipulate the Nav Menus. The post_title used in the example is the title of the Menu (Navigation Label), not of the post/page.

    home nav menu

    Drop this code in your functions.php file, adjust the post_title and ?my_var=test to your needs. Note that better than functions is to create your own plugin.

    add_filter( 'wp_get_nav_menu_items','nav_items', 11, 3 );
    
    function nav_items( $items, $menu, $args ) 
    {
        if( is_admin() )
            return $items;
    
        foreach( $items as $item ) 
        {
            if( 'Home' == $item->post_title)
                $item->url .= '?my_var=test';
    
        }
        return $items;
    }