web-dev-qa-db-fra.com

Localisation thématique des "slugs" (types d'articles personnalisés, taxonomies)

dans mon thème, je souhaite définir une série de types de publications et de taxonomies personnalisées, chacun ayant son propre slug personnalisé; la langue de base de mon thème est l'anglais, donc les slugs seront en anglais

par exemple, lors de la définition du slug de type de produit personnalisé "product" args:

'rewrite' => array( 'slug' => 'product' ),

y at-il un moyen de traduire le "slug" à travers des fichiers po/mo? puis-je le mettre comme:

'rewrite' => array( 'slug' => __('product', 'mytextdomain') )

ou ça ne marchera pas? Quelle est la pratique actuelle pour localiser les limaces?

15
unfulvio

Je ne chercherais pas à localiser tes limaces. Pourquoi ne pas donner à vos utilisateurs la possibilité de les modifier en ajoutant un autre champ à la page de paramètres de permalien?

Accrochez-vous dans load-options-permalink.php et configurez quelques éléments pour récupérer les données $_POST afin de sauvegarder votre slug. Ajoutez également un champ de paramètres à la page.

<?php
add_action( 'load-options-permalink.php', 'wpse30021_load_permalinks' );
function wpse30021_load_permalinks()
{
    if( isset( $_POST['wpse30021_cpt_base'] ) )
    {
        update_option( 'wpse30021_cpt_base', sanitize_title_with_dashes( $_POST['wpse30021_cpt_base'] ) );
    }

    // Add a settings field to the permalink page
    add_settings_field( 'wpse30021_cpt_base', __( 'CPT Base' ), 'wpse30021_field_callback', 'permalink', 'optional' );
}

Ensuite, la fonction de rappel pour le champ des paramètres:

<?php
function wpse30021_field_callback()
{
    $value = get_option( 'wpse30021_cpt_base' );    
    echo '<input type="text" value="' . esc_attr( $value ) . '" name="wpse30021_cpt_base" id="wpse30021_cpt_base" class="regular-text" />';
}

Ensuite, lorsque vous enregistrez votre type de message, saisissez le slug avec get_option. Si ce n'est pas là, utilisez votre valeur par défaut.

<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
    $slug = get_option( 'wpse30021_cpt_base' );
    if( ! $slug ) $slug = 'your-default-slug';

    // register your post type, reference $slug for the rewrite
    $args['rewrite'] = array( 'slug' => $slug );

    // Obviously you probably need more $args than one....
    register_post_type( 'wpse30021_pt', $args );
}

Voici la partie du champ des paramètres en tant que plugin https://Gist.github.com/1275867

EDIT: une autre option

Vous pouvez également modifier le slug en fonction de ce qui est défini dans la constante WPLANG.

Il suffit d'écrire une fonction rapide qui contient des données ...

<?php
function wpse30021_get_slug()
{
    // return a default slug
    if( ! defined( 'WPLANG' ) || ! WPLANG || 'en_US' == WPLANG ) return 'press';

    // array of slug data
    $slugs = array( 
        'fr_FR' => 'presse',
        'es_ES' => 'prensa'
        // etc.
    );

    return $slugs[WPLANG];
}

Ensuite, récupérez le slug où vous enregistrez votre type de message personnalisé.

<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
    $slug = wpse30021_get_slug();

    // register your post type, reference $slug for the rewrite
    $args['rewrite'] = array( 'slug' => $slug );

    // Obviously you probably need more $args than one....
    register_post_type( 'wpse30021_pt', $args );
}

La meilleure option, IMO, serait de donner à l'utilisateur une option et de fournir des valeurs par défaut solides:

<?php
add_action( 'init', 'wpse30021_register_post_type' );
function wpse30021_register_post_type()
{
    $slug = get_option( 'wpse30021_cpt_base' );
    // They didn't set up an option, get the default
    if( ! $slug ) $slug = wpse30021_get_slug();

    // register your post type, reference $slug for the rewrite
    $args['rewrite'] = array( 'slug' => $slug );

    // Obviously you probably need more $args than one....
    register_post_type( 'wpse30021_pt', $args );
}
18
chrisguitarguy

Je le fais exactement dans un thème que nous développons. Il est disponible en 5 langues distinctes et chaque langue est traduite par un ensemble de catégories. Le premier composant de l'URL dans le thème est analysé pour déterminer la langue utilisée, au format de pays:

/uk-en
/fr-fr
/it-it

Les catégories traduites sont ensuite analysées en tant que composants supplémentaires de l'URL.

L'URL est analysée dans la phase parse_request:

function my_parse_request( $wp ) {
    $path = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );

    $components = preg_split('|/|', $path, null, PREG_SPLIT_NO_EMPTY );

    // Determine language from $components[0]
    $language = array_shift( $components );
    ...

    // Load translations file...
    $mofile = get_stylesheet_directory()."/$language.mo";

    load_textdomain( 'mydomain', $mofile );

    ...

    // Determine category from $components[0]
    if( __( 'some-category', 'mydomain' ) == $components[0] )
      $wp->query_vars['category'] = 'some-category';

    ...
}
add_action( 'parse_request', 'my_parse_request' );

Cet exemple est dépourvu des vérifications requises, mais n'est présenté qu'à titre d'exemple.

Bien sûr, cette approche présente des inconvénients, mais elle permet de créer des URL naturelles dans toutes les langues. Les principaux inconvénients que je vois sont:

1) Il ne fait pas usage du mécanisme de permalien. Cela pourrait probablement être étendu pour que les règles de permalien appropriées pour toutes les langues soient générées et que parse_request ne soit pas nécessaire, mais le faire pour toutes les langues impliquerait le chargement d'un fichier MO après l'autre dans une boucle, et je ne le fais pas. Sachez à quel point c'est bien soutenu.

2) Si un traducteur modifie un slug, les liens sont invalidés.

2
Bendoh

Si cela ne fonctionne pas, pourquoi ne pas simplement faire:

$post_slug=  __('product', 'mytextdomain');
'rewrite' => array( 'slug' => $post_slug );
2
chifliiiii

Vous pouvez essayer ceci dans votre functions.php

<?php
add_filter('rewrite_slugs', function($translated_slugs) {
    // the possible translations for your slug 'product'
    $translated_slugs = array(
        'product' => array(
            'pt' => array(
                'has_archive' => true,'rewrite' => array('slug' => 'produto'),
            ),
            'es' => array(
                'has_archive' => true,'rewrite' => array('slug' => 'producto'),
            ),
        ),
    );
    return $translated_slugs;
});
?>

comme vu ici

0
Junior M