Skip to content

Instantly share code, notes, and snippets.

@nylen
Last active February 24, 2016 22:42
Show Gist options
  • Save nylen/d3a1fe15e8589b98f2e7 to your computer and use it in GitHub Desktop.
Save nylen/d3a1fe15e8589b98f2e7 to your computer and use it in GitHub Desktop.
WPCOM rewrite-rules API test
<?php
/*
* Plugin Name: WPCOM-specific hacks for WP-API rewrite rules
*/
// Make sure the rewrite rules are in place
function wpcom_rest_api_v2_prepend_rewrite_rules( $rewrite_rules ) {
if ( ! is_array( $rewrite_rules ) || empty( $rewrite_rules ) ) {
return $rewrite_rules;
}
$rest_url_prefix = rest_get_url_prefix();
unset( $rewrite_rules[ '^' . $rest_url_prefix . '/?$' ] );
unset( $rewrite_rules[ '^' . $rest_url_prefix . '/(.*)?' ] );
$rule_src = '^' . $rest_url_prefix . '/sites/([\w.]+)(/.*)?/?$';
$rule_dst = 'index.php?wpcom_site=$matches[1]&rest_route=$matches[2]';
return array_merge( array( $rule_src => $rule_dst ), $rewrite_rules );
}
add_filter( 'option_rewrite_rules', 'wpcom_rest_api_v2_prepend_rewrite_rules' );
add_filter( 'query_vars', function( $query_vars ) {
$query_vars[] = 'wpcom_site';
return $query_vars;
} );
add_action( 'parse_request', function() {
global $wp;
if ( empty( $wp->query_vars['rest_route'] ) || empty( $wp->query_vars['wpcom_site'] ) ) {
return;
}
global $wp_rest_server;
$wp_rest_server_class = apply_filters( 'wp_rest_server_class', 'WP_REST_Server' );
$wp_rest_server = new $wp_rest_server_class;
do_action( 'rest_api_init', $wp_rest_server );
$fake_response = false;
$fake_handler = null;
$fake_request = (object) array(
'params' => $wp->query_vars
);
// This is definitely not the best way to structure this code, just the
// easiest way to make it work with the other stuff that already exists.
$fake_response = apply_filters( 'parse_request_before_callbacks', $fake_response, $fake_handler, $fake_request );
if ( is_wp_error( $fake_response ) ) {
$data = $fake_response->get_error_data();
if ( $data['status'] ) {
status_header( $data['status'] );
} else {
status_header( 500 );
}
die( wp_json_encode( $fake_response ) );
}
// Fire off the request.
$wp_rest_server->serve_request( $GLOBALS['wp']->query_vars['rest_route'] );
$fake_response = apply_filters( 'parse_request_after_callbacks', $fake_response, $fake_handler, $fake_request );
// Done
die();
}, 5, 1 );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment