J'ai une taxonomie personnalisée avec des pays et des États. J'aimerais rendre ces termes traduisibles mais je ne suis pas sûr du meilleur moyen d'y parvenir. Tout d'abord, je ne veux pas que les slugs changent, seulement l'étiquette et peut-être les chaînes de description.
J'ai pensé à deux manières. On pourrait utiliser WPML. Mais WPML semble vous forcer à changer le slug pour chaque langue aussi, ce que je ne veux pas. Un autre pourrait être wp_insert_term()
mais je ne suis pas sûr que ce soit efficace ou la bonne façon de le faire. Je trouverais plus pratique de laisser les administrateurs/éditeurs ajouter leurs propres termes, coder en dur tous les termes ne me permettrait pas de le faire et de plus, j’ai le sentiment que ce n’est pas très efficace (il pourrait y avoir quelques centaines de taxonomie) ...
Des indices?
UPDATE 1: WPML
J'ai contacté le support WPML, ils ont expliqué que WPML créait de nouveaux termes de taxonomie pour chaque langue et que, de ce fait, chaque terme devait avoir un slug unique ... Cependant, je me demande s'il existe une autre option pour y parvenir, par exemple. avec des alias de terme par exemple
UPDATE 2: wp_insert_term ()
J'ai trouvé ceci: http://tommcfarlin.com/programmatically-create-categories/ et il suggère d'exécuter wp_insert_term()
dans un crochet d'action 'after_theme_setup'
ou after_switch_theme
. Cependant, cela ne résoudra pas le problème de traduction. Etant donné que l'action de hook ne se déclenche qu'après la configuration du thème, même si je gettext toutes les étiquettes de termes, il ne tiendra compte que de la langue au moment de la configuration du thème.
Je ne suis pas vraiment au courant de WPML et de la façon dont il gère les traductions, mais ma compréhension générale est que, dans la plupart des cas, il crée simplement des entrées en double pour chaque langue et les lie avec "l'original".
Cependant, j'ai récemment eu un problème similaire dans lequel j'avais besoin de la possibilité d'ajouter une version "plurielle" des noms de terme (par opposition au champ par défaut où je tape le nom au singulier). J'ai résolu cela en accrochant <taxonomy>_add_form_fields
, <taxonomy>_edit_form_fields
, edited_<taxonomy>
et create_<taxonomy>
.
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 );
}
}
Le code ci-dessus pourrait facilement être modifié pour contenir une chaîne localisée au lieu du nom au pluriel. Vous pouvez ensuite parcourir la liste des langues activées dans WPML, ainsi qu'un champ pour chaque langue (vous devez ajuster toutes les fonctions ci-dessus). Cela pourrait ne pas être pratique si vous avez beaucoup de langages activés dans WPML et que vous risquez d'encombrer l'éditeur.
C'est pourquoi je pourrais aussi imaginer une autre implémentation ...
Vous n'êtes pas sûr que WPML le fasse automatiquement pour vous, mais au cas où vous ne le feriez pas, vous pourriez le laisser créer des termes localisés pour chaque langue et écrire une fonction qui, à partir d'un terme, renvoie l'instance de langue localisée de ce terme. Vous pouvez ensuite créer cette relation en utilisant les mêmes points d'ancrage que dans l'exemple ci-dessus, mais en ajoutant deux champs: le premier contenant la version linguistique par défaut du terme (à l'aide de wp_dropdown_categories
) et l'autre contenant la langue du terme localisé.
Comme je l'ai dit, j'ai peu d'expérience avec WPML et on pourrait imaginer que ce type de fonctionnalité est déjà implémenté dans le plugin lui-même, donc je suggérerais de l'investiguer avant de s'engager dans cette voie.
Vous pouvez toujours ajouter des champs personnalisés à des termes, chaque champ personnalisé représente une traduction. J'ai trouvé un bon tutoriel à propos de ce sujet, il montre comment ajouter un champ personnalisé à la page d'édition de taxonomie.
Je ne sais pas comment vous comptez gérer ces termes, mais je pense que vous pouvez toujours utiliser la méthode native de WPML pour gérer les traductions de termes, même si vous ne pouvez pas conserver le même slug.
Lorsque vous avez besoin de gérer un terme slug, vous pouvez vous fier à la fonction icl_object_id ().
Par exemple, supposons que vous ayez l'anglais comme langue par défaut et l'italien comme deuxième langue. Vous définissez un terme "Rome", avec slug "rome". En le traduisant en "Roma", la limace deviendra "roma" ou "rome-2" si vous essayez d'utiliser la même limace.
Lorsque vous devez travailler avec le terme actuel, vous pouvez utiliser quelque chose comme ça:
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 );
}
}
Ce n'est qu'un exemple, mais je pense qu'il est suffisamment clair pour vous montrer comment convertir en permanence le slug d'un terme de taxonomie donné en un terme défini dans la langue par défaut.