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?
Thread Starter
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
Thread Starter
art.mu
(@artmu)
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);