Support » Plugin: WP REST API (WP API) » While filtering the API, how to get the id of the post in context?

  • Resolved mompracem


    I want to create a filter to alter the output of custom post meta

    I was able to do so by using the ‘json_prepare_meta’ filter provided by the plugin.

    However, if I attempt to pass $post_id or use get_the_ID() it will retrieve the ID of the post where wp-json.php is called (front-page or first post in index, ie ‘1’ usually)

    instead, I need the post_id of the post relative where json_prepare_meta is being applied

    how to do that?

    thank you

Viewing 15 replies - 1 through 15 (of 16 total)
  • I haven’t looked for the method that parses the routs into variables, but it’s very probably in the server class. You can go there and call the method if it’s public to get the rout id from the url, or you can use php to parse the url yourself and get the post id. The filter you’re using is not passed the post id, only the meta (and only those which are unprotected).

    thanks but doesn’t look like to be there (in the WP_JSON_Server class) –
    I’m still searching and trying to figure it

    I need to use this when I’m in a collection of posts (ie archive), therefore there could be many IDs in a paged json document

    there’s something in WP_JSON_Posts class with public function getPosts… this seems to be used to get the post object(s) and therefore the ID as well, will give a try

    no it seems I can’t still get it…

    I’m looking to get $post_id variable or something equivalent to get_the_ID()

    I see $post_id everywhere in wp-api but I don’t get where it comes from…

    I gave up because there’s no way to access $post_id while in prepare_meta… there’s a way to access it only in prepare_post function

    I suggested the WP-API team to make it accessible there too, at least the ID

    You cant use:
    apply_filters( ‘json_prepare_post’, $_post, $post, $context );

    It is what you stated you tried when you created the support request, however you said you were trying to use a loop function to get the id and some arbitrary variable “$post_id”. You should be able to access the post id with either $_post[‘ID’] or $post[‘ID’] (either of the first two parameters being passed to the filter hook. So:

    function manipulate_meta($_post, $post, $context){
    $thispostID = $_post[‘ID’];
    $thispostMeta = $_post[‘post_meta’];
    sort meta
    do things with post id
    access other $_post data
    return $_post;
    add_filter(‘json_prepare_post’, ‘manipulate_meta’);

    I’m trying to use ‘json_prepare_meta’ which is where the post custom fields are printed in the json object

    yes, that filter refers to a function that is instantiated inside prepare_post function… here:

    I tried to do the following to append the ID to $_post[‘post_meta’] by filtering ‘json_prepare_post’ (pretend it’s a custom field to retrieve in ‘json_prepare_meta’), but it does not work:

    $id = array( 'ID' => $_post['ID'] );
    $_post['post_meta'] = array_merge( $_post['post_meta'], $id );
    return $_post;

    I think doesn’t work because it

    how can I pass the ID inside ‘json_prepare_meta?
    here: I can only access $custom_fields, which is an array of custom fields…

    i think reason why my code above doesn’t work is that prepare_meta in L578 is first filtered by json_prepare_meta… so if I append an ID or whatever there is passed after the filter is executed… but I need the ID before that…

    my json_prepare_meta (not! json_prepare_post) filter has conditionals like

    if ( ‘something’ == get_post_type( $id ) {
    // do something…

    or I need the id to format fields using advanced custom fields function get_field()… but get_field again requires an ID (without ID it will look in main query context, not wp-json)

    There simply is no id relative to the post in question, being passed to the meta. I don’t understand why you want to pass the post id to meta when the post id is available in the same json group that the meta relative to that post is displayed. Still, if you must include the post id with the meta you could do something like this:

    function manipulate_meta($_post, $post, $context){
    $thispostID = $_post['ID'];
    $thispostMeta = $_post['post_meta'];
      foreach($_post['post_meta'] as $k => $v){
       //work with each individual meta data
    $_post['post_meta']['currpostID'] = $_post['ID'];
    return $_post;
    add_filter('json_prepare_post', 'manipulate_meta');

    Once again, I don’t see why this is necessary. The post id is available in the json object being returned.

    sorry for the late reply and many thanks for your help

    I managed to filter $_post[‘post_meta’] directly inside json_prepare_post

    reason I had to do this was to completely rewrite my [‘post_meta’] data

    I’m using Advanced Custom Fields and arrays are natively stored in strings, whereas I needed arrays in the json object

    what I’m doing now is to customise my json object according to my views and serve my wordpress frontend entirely in javascript – sometimes thought there’s a lot of unneccessary stuff in the json object and I want to get rid of unused parts, maybe conditionally (depending on the view I am)

    do you have any hints regarding this? using common WordPress conditionals for query (is_singular, is_archive…) is useless, since the posts looped in the /posts/ route are all individual… I should filter the /posts/ route or should I create an entirely new route?
    I’m a bit confused since I’m new in working with APIs and WP-API…


    Are you using the json rest api just to have an ajax frontend with no loading? This is not being used to view and manipulate data from external calls such as a mobile device? You don’t need this plugin at all to create a javascript front end. All you need is a combination of wp-ajax and get_template_part (as one of probably hundreds of ways of doing this). The api is extreme overkill and a separation from native wordpress use for just creating a js front-end, no reloading.

    no, not quite
    I need raw data, no html; because I use that data also in non-wp application and – later on – on external websites/mobile

    actually I’m fine with the API, but would like if I could format the json object in different ways, also to make it lighter

Viewing 15 replies - 1 through 15 (of 16 total)
  • The topic ‘While filtering the API, how to get the id of the post in context?’ is closed to new replies.