Вопрос или проблема
Существует ли способ оценить, на каком языке написан пост/страница? Я строю многоязычный сайт и почти теряю терпение, пытаясь сделать так, чтобы навигация на фронтенде учитывала выбранный язык. До сих пор плагин 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()
.
Ответ или решение
Определение языка поста на многопользовательском сайте
В процессе разработки многоязычного сайта важно правильно определять язык контента, чтобы обеспечить пользователям удобный интерфейс и качественный опыт взаимодействия. Ошибки в определении языка могут вызвать путаницу и снизить уровень удовлетворенности наших клиентов. Давайте рассмотрим, как можно эффективно выявить язык написания поста.
Сохраняем язык в метаполе поста
Один из эффективных способов управления языком контента — использование пользовательских метаполей в WordPress. Для этого вы можете воспользоваться следующей реализацией, которая поможет вам сохранить информацию о языке поста и получить к ней доступ при необходимости.
-
Создание пользовательского метаполя: В первую очередь, создайте метаполе
lang
, в которое будет сохраняться информация о языке поста:$language = get_post_meta(get_the_ID(), 'lang', TRUE);
-
Добавление селектора языка в админ-панели: Чтобы редакторы постов могли легко выбрать язык, добавьте селектор языка в 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']); }
-
Использование для REST API: Для работы с REST API, вы можете использовать следующий код, чтобы получить язык поста:
wp_get_post_terms($post->ID, 'language')[0]->slug;
-
Использование функции Polylang: Если вы используете плагин Polylang, вы также можете воспользоваться специальной функцией для получения языка поста:
$post_language = pll_get_post_language($post_id);
Заключение
Таким образом, используя метаполя и адаптируя интерфейс администрирования, вы можете не только сохранять информацию о языке поста, но и предоставлять редакторам удобный способ её изменения. Данный подход позволяет минимизировать ошибки, связанные с определением языка контента, и улучшает общий пользовательский опыт на вашем многоязычном сайте.
Этот метод не только упрощает управление контентом, но и способствует SEO-оптимизации, упрощая индексацию постов на различных языках для поисковых систем. Важно следить за актуальностью метаполей и при необходимости обновлять логику вашего сайта, чтобы учитывать изменения в требованиях ползователей и технологий.