Support » Plugin: Polylang » Any way to get translated post through WP REST API ?

Viewing 11 replies - 1 through 11 (of 11 total)
  • Poptartica

    (@poptartica)

    Hi, I just wanted to add that I too am very interested in this. Especially since WP-API will be merged into core.

    Chouby has done an awesome job so far making a great and full featured plugin for us, since I am sure he will also add WP-API support, I think the biggest questions from me are …

    Does anyone know when this plans to be implemented? or ..
    Is there a way to grab the translated post already?

    art.mu

    (@artmu)

    After some works I manage to make it works by passing a lang parameter to my WP REST API request (?lang=en for example) with this hook :

    function polylang_json_api_init() {
    
    	global $polylang;
    
    	$default = pll_default_language();
    	$langs = pll_languages_list();
    
    	$cur_lang = $_GET['lang'];
    
    	if (!in_array($cur_lang, $langs)) {
    		$cur_lang = $default;
    	}
    
    	$polylang->curlang = $polylang->model->get_language($cur_lang);
    	$GLOBALS['text_direction'] = $polylang->curlang->is_rtl ? 'rtl' : 'ltr';
    }
    
    add_action('rest_api_init', 'polylang_json_api_init');
    Plugin Author Chouby

    (@chouby)

    Hi!

    I did not look at the REST API yet. However, what you did is very similar to what’s already done for ajax requests. Is there a constant set by the REST API that I could use to detect it and apply the same code as for ajax?

    Plugin Author Chouby

    (@chouby)

    Would replacing

    if (PLL_AJAX_ON_FRONT || false === stripos($_SERVER['SCRIPT_FILENAME'], 'index.php'))

    by

    if (defined('REST_REQUEST') || PLL_AJAX_ON_FRONT || false === stripos($_SERVER['SCRIPT_FILENAME'], 'index.php'))

    at line 28 in include/choose-lang.php do the trick?

    Hey guys,

    Sorry for the delay in reply – I got pulled to a different project for a while.

    @art.mu: Thank you for the suggestion!
    I tried adding the code you suggested to my functions file, however, it still only seems to return the results in the default language (which for me is EN/English). It might be because my Polylang is set up to use the language code as a subdirectory in the URL for pretty permalinks (for example “http://www.website.com/ru/the-post/” for RU/Russian) rather than language parameters.

    @chouby: Thanks for checking on this, Chouby! Sorry, I was having trouble finding “include/choose-lang.php” .. I did find it though, for me it ended up in the “frontend” folder.

    I tried adding the line you suggested in place of the current one, but for me it still seemed to return only the default language, English. As I told Art though, it might be because my language display is set to pretty permalinks instead of parameter. Do you have any suggestion for pulling the language if I am using this setting?

    Same here: I really need a way to retrieve data based on language (including custom posts/taxonomies/metaboxes). The best thing should be teh ability to use the url part, just as always.. Ex.

    http://mydomain.com/en/wp-json/wp/v2/pages/

    or

    http://mydomain.com/wp-json/en/wp/v2/pages/

    Regards

    A REALLY RAW example to get lang content with custom routes, but it could be a starting point.

    function get_lang_pages($data){
      $posts = get_posts(array(
        'post_type' => 'page'
        ,'lang' => $data['lang']
        ,'showposts' => 10
      ));
    
      if(empty($posts)){ return null; }
      return $posts;
    }
    
    add_action('rest_api_init', function(){
      register_rest_route('yournamespace/v1', '/(?P<lang>.+)/pages', array(
        'methods' => 'GET'
        ,'callback' => 'get_lang_pages'
        )//end options array
      );
    });

    Now, assuming you have english content other than default, just visit http://yoursite.com/wp-json/yournamespace/en/pages

    Or, substitute ‘en’ with some other lang.

    As I wrote, this is RAW, so one should for example use a better regexp to match ONLY language slugs, eventually add validation and error handling and so on…

    Hope it helps

    Hi !

    @chouby: I think that what you post is correct, but it seems that defined(‘REST_REQUEST’) is never defined. For testing I use defined( ‘REST_API_VERSION’) and it works.

    Plugin Author Chouby

    (@chouby)

    I found the REST_REQUEST at https://core.trac.wordpress.org/browser/tags/4.4/src/wp-includes/rest-api.php#L141

    The problem is that REST_API_VERSION is defined on every pages and so does not differentiate REST requests from others.

    The snippet from art.mu above works here on WP 4.4 with Rest API 2.0-beta.11. For instance: /wp-json/wp/v2/posts?lang=de will return German posts instead of the default English.

    I’d like to request a lang property on all (also custom) posts/pages as well as a way to fetch translations for any given post/page?

    @oskarrough

    using rest_prepare_xxxx filter where xxxx is the name of post type you want modify its response.

    add_filter('rest_prepare_post', function($response, $post, $request){
    	$response->data['lang'] = pll_get_post_language($post->ID);
    	return $response;
    }, 99, 3);
Viewing 11 replies - 1 through 11 (of 11 total)
  • The topic ‘Any way to get translated post through WP REST API ?’ is closed to new replies.