You can use the `nav_menu_css_class` filter to alter the classes added to navigation items. You need to check the current menu items URL against the URL of the page you are on.


    add_filter( 'nav_menu_css_class', 'wpse_217882_menu_class', 10, 2 );
    function wpse_217882_menu_class( $classes = array(), $item = false ) {

        // Get current URL
        $current_url = wpse_217882_current_url();

        // Get homepage URL
        $homepage_url = trailingslashit( get_bloginfo( 'url' ) );

        // Don't do anything on 404s or the homepage
        if( is_404() || $item->url == $homepage_url || $item->url == '/' )
            return $classes;

        // Check if the current URL contains the items URL
        // This should match paginated pages for example
        if ( strstr( $current_url, $item->url ) ) {
            // Add the '.current-menu-item' class
            $classes[] = 'current-menu-item';
        }

        // You can use this to match different URLs
        // This will add the .current-menu-item class to the /blog/ nav item
        // when viewing /category/ pages
        if ( strstr( $item->url, '/blog/' ) && strstr( $current_url, '/category/' ) ) {
            // Add the '.current-menu-item' class
            $classes[] = 'current-menu-item';
        }

        return $classes;
    }

- [`nav_menu_css_class`](https://codex.wordpress.org/Plugin_API/Filter_Reference/nav_menu_css_class)

- [PHP `strstr` Manual](http://php.net/manual/en/function.strstr.php)

This is the function to get the current URL used in the `wpse_217882_menu_class` function. It uses the global `$_SERVER` to build the URL.

    function wpse_217882_current_url() {

        // Protocol
        $url = ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) ? 'https://' : 'http://';
        // Server
        $url .= $_SERVER['SERVER_NAME'];
        // Port
        $url .= ( '80' == $_SERVER['SERVER_PORT'] ) ? '' : ':' . $_SERVER['SERVER_PORT'];
        // URI
        $url .= $_SERVER['REQUEST_URI'];

        return trailingslashit( $url );
    }

This may not be the best way to get the current URL but I have used this in the past. You can read more about getting the current URL here:

 - [Get the full URL in PHP](http://stackoverflow.com/questions/6768793/get-the-full-url-in-php)

 - [PHP `$_SERVER` Manual](http://php.net/manual/en/reserved.variables.server.php)