Localização de temas de "lesmas" (tipos de postagem personalizados, taxonomias)

16

no meu tema, quero definir uma série de tipos de postagem personalizados e taxonomias personalizadas, cada um com sua própria lesma personalizada; o idioma base do meu tema é inglês, portanto, as lesmas estarão no idioma inglês

por exemplo, ao definir a lesma do args personalizado do tipo "produto":

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

existe alguma maneira de traduzir o "slug" através de arquivos po / mo? posso colocar como:

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

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

unfulvio
fonte
Não sei se estamos lidando com o mesmo problema, mas parece que sim. Para ilustrá-lo melhor aqui, há um link para uma página de índice original de um tipo de postagem personalizado chamado prensacom uma lesma definida como prensa. Usando o WPML, o slug da página traduzida é presscomo não pode ser prensanovamente: / pt / press / que não exibe nada (observe que agora, clicar no link ES não o leva de volta a / prensa /). MAS, se você visitar / pt / prensa / ele funciona ...
Naoise Golden 10/10
Decidi redirecionar as páginas de / en / pressione para / en / prensa, para que o link provavelmente não funcione mais como mencionado. Pena que eu não poderia usar a lesma localizada, mas trabalha-on-time é melhor thant url-localização amigável
Naoise de Ouro
Veja minha resposta Naoise, acho que lhe dará uma solução funcional.
Chrisguitarguy 10/10
Eu tive esse problema por horas. Finalmente encontrei um hack: github.com/stouch/wp-plugin-polylang-localized-taxonomy-slug/… Atenciosamente.
Sylvain Tch

Respostas:

19

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

Conecte-se load-options-permalink.phpe configure algumas coisas para capturar os $_POSTdados e salvar sua lesma. 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 a lesma com get_option. Se não estiver lá, use o 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 plug-in https://gist.github.com/1275867

EDIT: Outra opção

Você também pode alterar a lesma com base no que é definido na WPLANGconstante.

Basta escrever uma função rápida que armazena 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];
}

Em seguida, obtenha a lesma 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 );
}
chrisguitarguy
fonte
2
+1 para o plug-in no gist e o código bem documentado. No entanto, no meu caso, isso derrota o objetivo, que é não dar poder ao usuário, mas criar URLs com reconhecimento de localização (seo friendly) para tipos de postagem personalizados
Naoise Ouro
1
Não sei ao certo por que você deseja remover uma opção do seu usuário. Além disso, executar uma lesma através de um filtro de tradução oferece a mesma opção: alterar a lesma. Apenas não com um campo de formulário bonito para preencher.
Chrisguitarguy 12/10
só por curiosidade, por quê wpse30021?
Naoise Golden 17/10/11
Parece que esta opção é para uma localização baseada em WPLANG. Mas e se você estiver trabalhando com um site multilíngue? (por exemplo, plug-in WPML). A questão é mais sobre a exibição de uma lesma diferente, dependendo da localização do cliente, do que ser capaz de definir uma lesma de tipo de postagem personalizada a partir das opções do servidor.
Naoise Golden
wpse = troca de pilha do WordPress. 30021 é o número do URL. Boa sorte com sua busca; Eu dei a minha resposta. A complexidade adicional que você está adicionando e a aparente mudança completa da pergunta original - originalmente sobre as lesmas de CPT, justificam apenas a permissão do usuário final escolher sua própria lesma.
Chrisguitarguy 17/10/11
2

Se isso não funcionar, por que você simplesmente não faz:

$post_slug=  __('product', 'mytextdomain');
'rewrite' => array( 'slug' => $post_slug );
chifliiiii
fonte
isso não funcionou para mim #
1140 Naoise Golden
é basicamente o mesmo código em outro estilo
Naoise Golden 10/10
Você adicionou o domínio de texto adequado? <? php load_theme_textdomain (meu_texto_domínio);?>?
chifliiiii
Essa é de longe a melhor solução.
Al Rosado
2

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

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

E as categorias traduzidas são analisadas como componentes adicionais da URL.

O URL é analisado na parse_requestfase:

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 serve apenas como exemplo.

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

1) Não utiliza o mecanismo de ligação permanente. Provavelmente, isso pode ser estendido para que as regras de permalink adequadas para todos os idiomas sejam geradas e o parse_request não seja necessário, mas fazê-lo para todos os idiomas envolveria carregar um arquivo MO após outro em um loop, e eu não saber o quão bem isso é suportado.

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

Bendoh
fonte
0

Você poderia 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

Junior M
fonte
-1

Eu recomendaria não fazer slugs traduzíveis .

A tradução é voltada para o usuário conteúdo do site . As lesmas são usadas internamente e são marginalmente "voltadas para o público" por meio de reescritas de URL - e os URLs não devem ser traduzíveis .

Então: deixe suas lesmas em paz, como você as define. Crie apenas strings traduzíveis destinadas ao consumo público .

Chip Bennett
fonte
11
lesmas traduzidos, tanto do seo e uma perspectiva de experiência do usuário, fazer um monte de sentido ...
Naoise de Ouro
Eu discordo que as lesmas afetam a experiência do usuário de qualquer maneira. Se uma lesma for usada como parte de um link, o texto âncora link será traduzido, para que o usuário não saiba a diferença. E quando as pessoas começam a usar "SEO", geralmente penso " óleo de cobra ". Não sou especialista em SEO, mas não estou comprando impacto no SEO com relação a lesmas traduzidas.
Chip Bennett
3
Discordo com base na experiência. Temos gerentes de conteúdo estrangeiros internamente que são explícitos que os slugs de URL devem ser localizados. É uma questão de criar uma experiência local completa para o usuário estrangeiro. Para alguns países, como o Japão, é literalmente essencial estabelecer um tipo autêntico de confiança e indicar que você é realmente sério em fazer negócios lá.
internetross
URLs devem falar. Portanto, se a lesma é (com a mesma frequência) o nome da entidade ou a taxonomia, a reescrita deve levar em consideração os plurais e as traduções. Isso não é uma opção, tanto para SEO quanto para simplesmente boas práticas para os usuários finais.
Luca Reghellin