rewrite file to wordpress

WordPress rewrite mechanism works in a different way, not like .htaccess rewrite rules. More information about it you can find in codex (Rewrite API, WP_Rewrite, etc.). But fast work around could be the following:

First of all we need to register our query var and rewrite rule:

function myplugin_add_query_var( $vars ) {
    $vars[] = 'myplugin_api';
    return $vars;
}
add_filter( 'query_vars', 'myplugin_add_query_var' );

function myplugin_update_rewrite_rules( $rules ) {
    $newrules = array();
    $newrules['api\/endpoint\.php$'] = 'index.php?pagename=api&myplugin_api=1';
    return $newrules + $rules;
}
add_filter( 'rewrite_rules_array', 'myplugin_update_rewrite_rules' );

To complete registration of rewrite rule, we need to flush rules on activation/deactivation of you plugin:

function myplugin_activate() {
    flush_rewrite_rules();
}
register_activation_hook( __FILE__, 'myplugin_activate' );

function myplugin_deactivate() {
    flush_rewrite_rules();
}
register_deactivation_hook( __FILE__, 'myplugin_deactivate' );

A piece of magic to make rewrite rules working correctly 😀

function myplugin_a_piece_of_magic_on_init() {
    global $wp_rewrite;
    $wp_rewrite->use_verbose_page_rules = !preg_match( "/api\/endpoint\.php$/i", $_SERVER['REQUEST_URI'] );
}
add_action( 'init', 'myplugin_a_piece_of_magic_on_init' );

And finally check if our query var presents on wp action:

function myplugin_check_query_var( $wp ) {
    if ( array_key_exists( 'myplugin_api', $wp->query_vars ) ) {
        // do api stuff here ...
        exit;
    }
}
add_action( 'wp', 'myplugin_check_query_var' );