5

The AJAX, which is part of Elasticpress, looks like this

$.ajax( {
    url: epas.endpointUrl,
    type: 'GET',
    dataType: 'json',
    crossDomain: true,
    data: JSON.stringify( query )
} );

Additionally I registered my endpoint

add_action( 'rest_api_init', function ( $data ) {
    register_rest_route( 'elasticpress', '/autosuggest/', [
        'methods' => 'GET',
        'callback' => 'ep_autosuggest'
    ] );
} );

The callback looks like this

function ep_autosuggest( $data ) {
    // Elasticsearch PHP Client
    $client = ClientBuilder::create()->build();
    $params = [
        'index' => 'index',
        'type' => 'post',
        'body' => $data
    ];
    $response = $client->search( $params );
    return $response;
}

The different parts work as they should. I'm struggling with getting the data from the passed object. Any ideas?

  • What data? You're already passing data with the jQuery.ajax call. What other data do you want to send, and at what stage? – janh Jan 25 '18 at 8:06
  • Is it being sent correctly, have you checked your browser's dev tools? – janh Jan 25 '18 at 8:40
6

After some inspecting the WP_REST_Request, it turned out, that the get_body() method was the one I'm looking for. Anyhow, this is what I ended up with:

add_action( 'rest_api_init', function() {
    register_rest_route( 'ep', '/as/', [
        'methods' => \WP_REST_Server::CREATABLE,
        'callback' => 'ep_autosuggest',
    ] );
} );
function ep_autosuggest( WP_REST_Request $data ) {
    // Elasticsearch PHP Client
    $client = ClientBuilder::create()->build();
    $params = [
        'index' => 'ep-test',
        'type' => 'post',
        'body' => $data->get_body()
    ];
    $response = $client->search( $params );
    return $response;
}

For anyone interested, I made a plugin out of it:

https://github.com/grossherr/elasticpress-autosuggest-endpoint

2

Thanks for the plugin Nicolai! Just wanted to point out a couple of things that weren't clear to me:

Once the plugin is installed, modify ep_autosuggest() in elasticpress-autosuggest-endpoint.php:

$params = [
    'index' => ep_get_index_name(), // get name of ES index dynamically
    'type' => 'post',
    'body' => $data->get_body()
];

Then, use http(s)://yourdomainname.com/wp-json/elasticpress/autosuggest/ (or whatever is specified in register_rest_route()) as the endpoint URL in the admin / ElasticPresss / Autosuggest / Settings.

  • Update - you don't have to modify ep_autosuggest anymore. I created a pull request that has been merged into master. Now, these updates are included in the plugin! – Dmitriy Apr 25 at 22:34

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.