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


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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.