I am trying to create a list of all links in primary navigation on my WordPress site. I am trying to output the link as URL: in a script tag using a foreach loop.
I am stuck trying to list of of the navitems links using $navItem->url in my foreach loop. It doesn’t return anything / false.
Instead of $locations[$menuLocations] I have tried simply just write primary menu name as well: $locations[‘primary’] but no luck so far.
function get_nav_menu_items_by_location( $location, $args = [] ) { $html = '<script type="application/ld+json" alt="hejtest">'; // Get all locations $menuLocations = get_nav_menu_locations(); // Get object id by location $object = wp_get_nav_menu_object( $locations[$menuLocations] ); // Get menu items by menu name $menu_items = wp_get_nav_menu_items($object); foreach ( $menu_items as $navItem ) { $html .= '"url":"' . $navItem->url . '"'; } $html .= "</script>"; echo $html; } add_action('wp_head', 'get_nav_menu_items_by_location');
Advertisement
Answer
Well… I did a refactor of your code and it’s works 😉
Try with this way:
function get_nav_items() { $menu_slug_to_retrieve = 'main'; // This can be main, primary, what ever... $locations = get_nav_menu_locations(); $menu = wp_get_nav_menu_object( $locations[ $menu_slug_to_retrieve ] ); $menu_items = wp_get_nav_menu_items( $menu->term_id ); $menu_items_json = array(); // Prepare the array to convert to json // Loop it if ( $menu_items ) { foreach ( $menu_items as $item ) { $menu_items_json[] = array( 'url' => $item->url ); } $html = sprintf( '<script type="application/ld+json" id="custom-json">%s</script>', json_encode( $menu_items_json ) ); echo $html; } } add_action( 'wp_head', 'get_nav_items' );
Regards!