Is there any way to evaluate the language a post/page is written in? I am building a multilingual site and am almost pulling my hair out trying to get the front-end navigation to take the chosen language into account. So far the polylang plugin http://wordpress.org/extend/plugins/polylang/ has worked fine for everything else.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
The main language of a post should be saved in a post meta field. There is no way to detect that automatically. Even Google’s heuristics fail regularly with that.
So add a custom field lang and check with …
$language = get_post_meta( get_the_ID(), 'lang', TRUE );
… what language the post was written in.
Update
Here is a very simple example for a language selector. It will be visible on every post type with a Publish metabox.

get_post_meta( get_the_ID(), '_language', TRUE );
… will return the post’s language if available.
add_action( 'post_submitbox_misc_actions', 't5_language_selector' );
add_action( 'save_post', 't5_save_language' );
function t5_language_selector()
{
print '<div class="misc-pub-section">
<label for="t5_language_id">Language</label>
<select name="t5_language" id="t5_language_id">';
$current = get_post_meta( get_the_ID(), '_language', TRUE );
$languages = array (
'en' => 'English',
'de' => 'Deutsch',
'ja' => '日本人'
);
foreach ( $languages as $key => $language )
printf(
'<option value="%1$s" %2$s>%3$s</option>',
$key,
selected( $key, $current, FALSE ),
$language
);
print '</select></div>';
}
function t5_save_language( $id )
{
if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
return;
if ( ! current_user_can( 'edit_post', $id ) )
return;
if ( ! isset ( $_POST['t5_language'] ) )
return delete_post_meta( $id, '_language' );
if ( ! in_array( $_POST['t5_language'], array ( 'en', 'de', 'ja' ) ) )
return;
update_post_meta( $id, '_language', $_POST['t5_language'] );
}
Method 2
For the rest api, wp-graphql and wp-cli’s wp eval-file I needed to do
wp_get_post_terms( $post->ID, 'language' )[0]->slug
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0