Localização de tema de “slugs” (tipos de postes personalizados, taxonomias)

13

No meu tema, quero definir uma série de tipos de postagens personalizadas e taxonomias personalizadas, cada uma com seu próprio slug personalizado; o idioma base do meu tema é o inglês, portanto os slugs estarão no idioma inglês

por exemplo, ao definir o slug do tipo de postagem personalizada "product" args:

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

existe alguma maneira de traduzir o "slug" através de arquivos po / mo? posso colocá-lo como:

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

ou não vai funcionar? qual é a prática atual para localizar lesmas?

    
por unfulvio 02.10.2011 / 13:02

5 respostas

18

Eu não tentaria localizar suas lesmas. Em vez disso, por que não dar aos seus usuários a opção de alterá-los adicionando outro campo à página de configurações do permalink?

Conecte-se a load-options-permalink.php e configure algumas coisas para capturar os dados $_POST para salvar seu slug. Adicione também um campo de configurações à página.

<?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' );
}

Em seguida, a função de retorno de chamada para o campo de configurações:

<?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" />';
}

Então, quando você registrar seu tipo de postagem, pegue o slug com get_option . Se não estiver lá, use seu padrão.

<?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 );
}

Aqui está a parte do campo de configurações como um plugin enlace

EDIT: Outra opção

Você também pode alterar o slug com base no que está definido na constante WPLANG .

Basta escrever uma função rápida que contenha dados ...

<?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];
}

Então pegue o slug onde você registra seu tipo de postagem personalizado.

<?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 );
}

A melhor opção, IMO, seria oferecer ao usuário uma opção e fornecer padrões sólidos:

<?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 );
}
    
por chrisguitarguy 10.10.2011 / 19:27
2

Se isso não funcionar, por que não? Simplesmente faça:

$post_slug=  __('product', 'mytextdomain');
'rewrite' => array( 'slug' => $post_slug );
    
por chifliiiii 10.10.2011 / 16:53
2

Eu estou fazendo exatamente isso em um tema que estamos desenvolvendo. Está disponível em 5 idiomas distintos e cada idioma tem um conjunto de categorias traduzido. O primeiro componente da URL no tema é analisado para determinar qual idioma é usado, no formato de idioma do país:

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

As categorias traduzidas são analisadas como componentes adicionais do URL.

O URL é analisado na fase 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' );

Este exemplo é desprovido de verificações necessárias, mas destina-se apenas como um exemplo.

Há desvantagens nessa abordagem, é claro, mas permite URLs naturais em todos os idiomas. As principais desvantagens que vejo são:

1) Não faz uso do mecanismo permalink. Isso poderia ser estendido para que as regras permalink apropriadas para todos os idiomas sejam geradas e parse_request não seja necessário, mas para todos os idiomas seria necessário carregar um arquivo MO após outro em um loop, e eu não sabe quão bem suportado isso é.

2) Se um tradutor alterar um slug, os links serão invalidados.

    
por Bendoh 13.10.2011 / 21:46
0

Você pode tentar isso no seu 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;
});
?>

como visto aqui

    
por Junior M 25.03.2015 / 23:43
-1

Eu recomendaria não tornar as lesmas traduzíveis .

A tradução é para o conteúdo do site do usuário . Os slugs são usados internamente e são apenas marginalmente "voltados para o público" por meio de reescritas de URL - e os URLs também não devem ser traduzíveis .

Então: deixe suas lesmas em paz, conforme você as define. Crie somente sequências traduzíveis destinadas ao consumo público .

    
por Chip Bennett 12.10.2011 / 19:06