1

As the title says, I'm trying to populate my main menu from an external JSON API that changes quite frequently, so I need the entire menu to be dynamic. I managed to insert the API like this:

$content = file_get_contents( 'https://www.motobuykers.es/apih/menus/desktop/' ); $json = json_decode( $content ); $menuname = 'Test'; $menulocation = 'primary'; // Does the menu exist already? $menu_exists = wp_get_nav_menu_object( $menuname ); // If it doesn't exist, let's create it. if ( ! $menu_exists ) { $menu_id = wp_create_nav_menu( $menuname ); foreach ( $json->_embedded->menuitem as $menuitem ) { wp_update_nav_menu_item( $menu_id, 0, array( 'menu-item-title' => $menuitem->title, 'menu-item-classes' => $menuitem->class, 'menu-item-url' => $menuitem->url, 'menu-item-status' => 'publish' ) ); } if ( ! has_nav_menu( $menulocation ) ) { $locations = get_theme_mod( 'nav_menu_locations' ); $locations[ $menulocation ] = $menu_id; set_theme_mod( 'nav_menu_locations', $locations ); } } 

The problem with this code is that once I make the menu, I can no longer update it from the API. I've also tried to use Daggerhart's solution, but the foreach in the next snippet returns:

Warning: Invalid argument supplied for foreach()

Even though I pass the exact same JSON as the first snippet:

function custom_nav_menu_items( $items, $menu ) { // only add item to a specific menu if ( $menu->slug == 'menu-1' ) { //if (is_array($json->_embedded->menuitem)) { //if (is_array($values) || is_object($values)){ foreach ( $json->_embedded->menuitem as $menuitem ) { $items[] = _custom_nav_menu_item( $menuitem->name, $menuitem->url, addID() ); } return $items; } } add_filter( 'wp_get_nav_menu_items', 'custom_nav_menu_items', 20, 2 ); 

Any ideas?

    1 Answer 1

    1

    I would not bother creating a nav menu for this, I would just write a code that takes JSON as input and spits out menu markup with the data. WP's menu data structures are quite unwieldy and aren't too convenient to work with.

    There are also issues of persistence and performance (network request is usually crazy heavy operation) so you would probably want to cache data for a while and only update cache if request succeeds.

      Start asking to get answers

      Find the answer to your question by asking.

      Ask question

      Explore related questions

      See similar questions with these tags.