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.

  • What do you mean 'evaluate'? Analyze the text and detect the language? Or get the language assigned when post was created?
    – Max Yudin
    Commented Feb 11, 2013 at 13:42
  • Get the language assigned when the post/page was created. There will be pages written in, say French and Dutch. If my chosen language is Dutch, I don't want links to the pages in French to be visible. Commented Feb 11, 2013 at 13:56
  • Simply remove pll_the_languages() from templates or delete the Language Switcher widget. Depends where it comes from.
    – Max Yudin
    Commented Feb 11, 2013 at 14:04
  • Tried that to no effect, unfortunately. My menus are still not language-specific. The language is ignored especially when browsing content by category, if that helps diagnose the issue. Commented Feb 11, 2013 at 14:25
  • If you mean Custom Menus you have to create one menu per language. See Polylang Navigations menus.
    – Max Yudin
    Commented Feb 11, 2013 at 14:37

2 Answers 2


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.


Here is a very simple example for a language selector. It will be visible on every post type with a Publish metabox.

enter image description here

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 )
            '<option value="%1$s" %2$s>%3$s</option>',
            selected( $key, $current, FALSE ),

    print '</select></div>';

function t5_save_language( $id )
    if ( defined( 'DOING_AJAX' ) && DOING_AJAX )

    if ( ! current_user_can( 'edit_post', $id ) )

    if ( ! isset ( $_POST['t5_language'] ) )
        return delete_post_meta( $id, '_language' );

    if ( ! in_array( $_POST['t5_language'], array ( 'en', 'de', 'ja' ) ) )

    update_post_meta( $id, '_language', $_POST['t5_language'] );
  • Thanks for the response, is it possible to add the custom field to the pages post_type as well? Commented Feb 11, 2013 at 13:57
  • @user27302 See my update. I have added an example.
    – fuxia
    Commented Feb 11, 2013 at 14:26
  • You rock! Thanks a million, am definitely on the right track now. Commented Feb 11, 2013 at 15:09

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.