определить язык, на котором написан пост

Вопрос или проблема

Существует ли способ оценить, на каком языке написан пост/страница? Я строю многоязычный сайт и почти теряю терпение, пытаясь сделать так, чтобы навигация на фронтенде учитывала выбранный язык. До сих пор плагин polylang http://wordpress.org/extend/plugins/polylang/ прекрасно работал для всего остального.

Основной язык поста должен сохраняться в метаполе поста. Автоматически это определить невозможно. Даже эвристика Google регулярно с этим не справляется.

Поэтому добавьте настраиваемое поле lang и проверьте с помощью …

$language = get_post_meta( get_the_ID(), 'lang', TRUE );

… на каком языке был написан пост.

Обновление

Вот очень простой пример для селектора языка. Он будет виден в любом типе поста с метабоксом Опубликовать.

вставьте описание изображения здесь

get_post_meta( get_the_ID(), '_language', TRUE ); 

… вернет язык поста, если он доступен.

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">Язык</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'] );
}

Для rest api, wp-graphql и команды wp-cli wp eval-file мне нужно было сделать

wp_get_post_terms( $post->ID, 'language' )[0]->slug

Функция, которая вам нужна – pll_get_post_language().

Источник: https://polylang.pro/doc/function-reference/

Ответ или решение

Определение языка поста на многопользовательском сайте

В процессе разработки многоязычного сайта важно правильно определять язык контента, чтобы обеспечить пользователям удобный интерфейс и качественный опыт взаимодействия. Ошибки в определении языка могут вызвать путаницу и снизить уровень удовлетворенности наших клиентов. Давайте рассмотрим, как можно эффективно выявить язык написания поста.

Сохраняем язык в метаполе поста

Один из эффективных способов управления языком контента — использование пользовательских метаполей в WordPress. Для этого вы можете воспользоваться следующей реализацией, которая поможет вам сохранить информацию о языке поста и получить к ней доступ при необходимости.

  1. Создание пользовательского метаполя: В первую очередь, создайте метаполе lang, в которое будет сохраняться информация о языке поста:

    $language = get_post_meta(get_the_ID(), 'lang', TRUE);
  2. Добавление селектора языка в админ-панели: Чтобы редакторы постов могли легко выбрать язык, добавьте селектор языка в UI:

    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">Язык</label>
           <select name="t5_language" id="t5_language_id">';
    
       $current = get_post_meta(get_the_ID(), '_language', TRUE);
       $languages = array(
           'en' => 'Английский',
           'de' => 'Немецкий',
           'ja' => 'Японский'
       );
    
       foreach ($languages as $key => $language) {
           printf(
               '<option value="%1$s" %2$s>%3$s</option>',
               esc_attr($key),
               selected($key, $current, FALSE),
               esc_html($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']);
    }
  3. Использование для REST API: Для работы с REST API, вы можете использовать следующий код, чтобы получить язык поста:

    wp_get_post_terms($post->ID, 'language')[0]->slug;
  4. Использование функции Polylang: Если вы используете плагин Polylang, вы также можете воспользоваться специальной функцией для получения языка поста:

    $post_language = pll_get_post_language($post_id);

Заключение

Таким образом, используя метаполя и адаптируя интерфейс администрирования, вы можете не только сохранять информацию о языке поста, но и предоставлять редакторам удобный способ её изменения. Данный подход позволяет минимизировать ошибки, связанные с определением языка контента, и улучшает общий пользовательский опыт на вашем многоязычном сайте.

Этот метод не только упрощает управление контентом, но и способствует SEO-оптимизации, упрощая индексацию постов на различных языках для поисковых систем. Важно следить за актуальностью метаполей и при необходимости обновлять логику вашего сайта, чтобы учитывать изменения в требованиях ползователей и технологий.

Оцените материал
Добавить комментарий

Капча загружается...