Лучшая практика для перевода терминов таксономии без изменения слизней?
У меня есть одна пользовательская таксономия со странами и штатами. Я хотел бы сделать эти термины переводимыми, но я не уверен, что это был бы лучший способ добиться этого. Прежде всего, я не хочу, чтобы слизни менялись, только метка и, возможно, строки описания.
Я подумал о двух способах. Можно было бы использовать WPML. Но WPML, похоже, заставляет вас также менять слаг для каждого языка, чего я не хочу. Другой мог бы быть wp_insert_term()
но я не уверен, что это эффективный или правильный способ сделать это. Я бы счел более практичным позволить администраторам/редакторам добавлять свои собственные термины, жесткое кодирование всех терминов не позволило бы мне этого сделать, и, кроме того, у меня такое чувство, что это не очень эффективно (в моей таксономии может быть несколько сотен мест)...
Есть какие-нибудь подсказки?
ОБНОВЛЕНИЕ 1: WPML
Я связался со службой поддержки WPML, они объяснили, что WPML создает новые термины таксономии для каждого языка, и поэтому каждый термин должен иметь уникальный слизень... однако мне интересно, есть ли какой-либо другой вариант для достижения этой цели, например, с псевдонимами терминов, например
ОБНОВЛЕНИЕ 2: wp_insert_терм()
Я нашел это: http://tommcfarlin.com/programmatically-create-categories / и он предлагает запустить wp_insert_term()
в пределах действия 'after_theme_setup'
или after_switch_theme
. Однако это не решит проблему перевода. Поскольку действие крючка срабатывает только после настройки темы, даже если я получу текст со всеми строками меток терминов, он будет учитывать только язык на момент настройки темы.
3 answers
Я на самом деле не в курсе WPML и того, как он обрабатывает переводы, но, насколько я понимаю, в большинстве случаев он просто создает дубликаты записей для каждого языка и связывает их вместе с "оригиналом".
Однако недавно у меня возникла аналогичная проблема, когда мне понадобилась возможность добавить "множественную" версию имен терминов (в отличие от поля по умолчанию, в котором я вводил имя в единственном числе). Я решил эту проблему, подключившись к <taxonomy>_add_form_fields
, <taxonomy>_edit_form_fields
, edited_<taxonomy>
и create_<taxonomy>
.
Решение №1 - добавить пользовательское поле таксономии
define('TERM_PLURAL_NAME_KEY', 'term_name_plural');
function setup_taxonomies() {
$taxonomy_name = 'my_tax';
add_action( $taxonomy_name . '_add_form_fields', 'my_tax_add_plural_name_field', 10, 2 );
add_action( $taxonomy_name . '_edit_form_fields', 'my_tax_edit_plural_name_field', 10, 2 );
add_action( 'edited_' . $taxonomy_name, 'save_my_tax_meta', 10, 2 );
add_action( 'create_' . $taxonomy_name, 'save_my_tax_meta', 10, 2 );
}
add_action('init', 'setup_plural_taxonomies')
function my_tax_add_plural_name_field() {
?>
<div class="form-field">
<label for="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]"><?php _e( 'Plural name', 'i18n_key' ); ?></label>
<input type="text" name="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]" id="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]" value="">
<p class="description"><?php _e( 'A pluralized version of the term title, to be used when multiple objects are referred to.', 'i18n_key' ); ?></p>
</div>
<?php
}
function my_tax_edit_plural_name_field($term) {
$t_id = $term->term_id;
$term_meta = get_option( "taxonomy_$t_id" ); ?>
<tr class="form-field">
<th scope="row" valign="top"><label for="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]"><?php _e( 'Plural name', 'i18n_key' ); ?></label></th>
<td>
<input type="text" name="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]" id="term_meta[<?php echo TERM_PLURAL_NAME_KEY; ?>]" value="<?php echo esc_attr( $term_meta[TERM_PLURAL_NAME_KEY] ) ? esc_attr( $term_meta[TERM_PLURAL_NAME_KEY] ) : ''; ?>">
<p class="description"><?php _e( 'A pluralized version of the term title, to be used when multiple objects are referred to.', 'i18n_key' ); ?></p>
</td>
</tr>
<?php
}
function save_my_tax_meta($term_id) {
if ( isset( $_POST['term_meta'] ) ) {
$t_id = $term_id;
$term_meta = get_option( "taxonomy_$t_id" );
$cat_keys = array_keys( $_POST['term_meta'] );
foreach ( $cat_keys as $key ) {
if ( isset ( $_POST['term_meta'][$key] ) ) {
$term_meta[$key] = $_POST['term_meta'][$key];
}
}
update_option( "taxonomy_$t_id", $term_meta );
}
}
Приведенный выше код можно легко изменить, чтобы содержать локализованную строку вместо имени во множественном числе. Затем вы можете просмотреть список активированных языков в WPML и поле a для каждого языка (вам нужно будет настроить все функции выше). Это может быть непрактично, хотя, если у вас в WPML включено много языков, и это может очень сильно загромождать редактор.
Вот почему я также мог представить себе альтернативная реализация...
Решение №2 - Соединить "локализованные" термины с термином "язык по умолчанию"
Не уверен, что WPML сделает это автоматически для вас, но в случае, если это не так, вы можете позволить ему создавать локализованные термины для каждого языка и написать функцию, которая, учитывая термин, возвращает экземпляр локализованного языка этого термина. Затем вы могли бы создать это отношение, используя те же крючки, что и в приведенном выше примере, но вместо этого добавив два поля - первое, содержащее языковая версия термина по умолчанию (с использованием wp_dropdown_categories
), а другая содержит язык локализованного термина.
Как я уже сказал, у меня мало опыта работы с WPML, и можно предположить, что этот тип функциональности уже реализован в самом плагине, поэтому я бы предложил изучить это, прежде чем идти по этому пути.
Вы всегда можете добавить пользовательские поля в термины, каждое пользовательское поле будет представлять перевод, я нашел хороший учебник по этой теме, в нем показано, как добавить пользовательское поле на страницу издания таксономии.
Я не уверен, как вы планируете работать с этими терминами, но я думаю, что вы все еще можете использовать собственный способ WPML для обработки переводов терминов, даже если вы не можете сохранить один и тот же фрагмент.
Когда вам нужно разобраться с термином slug, вы можете положиться на функцию icl_object_id().
Например, предположим, что у вас английский язык по умолчанию, а итальянский - второй язык. Вы определяете термин "Рим" с помощью слова "рим". При переводе его на "Рома", слизняк станет "рома", или "рим-2", если вы попытаетесь использовать ту же самую пулю.
Когда вам нужно работать с текущим термином, вы можете использовать что-то вроде этого:
global $sitepress;
$taxonomy_name = 'cities';
$current_term_slug = 'roma'; //so, that's Italian, for instance;
$current_term = get_term_by( 'slug', $current_term_slug, $taxonomy_name );
//Term exists
if($current_term) {
$default_language = $sitepress->get_default_language();
$current_language = $sitepress->get_current_language();
$term_id = $current_term->term_id;
if ( $default_language != $current_language ) {
//Here you get the default language term id
$term_id = icl_object_id( $term_id, $taxonomy_name, false, $default_language );
}
}
Это всего лишь пример, но я думаю, что он достаточно ясен, чтобы показать вам, как всегда преобразовывать фрагмент данного термина таксономии в тот, который определен на языке по умолчанию.