Algumas coisas funcionam de forma diferente em um site multilíngue por padrão: uma função do WordPress baseada em um termo do idioma padrão, um sufixo de data que o WordPress não consegue localizar, um slug que o Editor de tradução avançado não inventa. Dúvidas de suporte os apontam como bugs; eles não são. Esta página explica o que acontece, por que e o que fazer em vez disso.
has_category() e outras tags condicionais em posts traduzidos
O has_category() do núcleo do WordPress não é filtrado pelo WPML, de propósito. Em uma tradução, a categoria é o termo traduzido, que tem o seu próprio slug, então has_category('news') é falso no post em francês, mesmo que o post em francês esteja na categoria “news” em francês. O mesmo vale para has_term(), in_category() e qualquer código que compare um slug do idioma padrão ou um ID de termo. Chame a condicional com o slug traduzido ou resolva o ID do termo através do filtro wpml_object_id primeiro.
O que você vê
A função nativa do WordPress has_category não funciona para posts traduzidos.
Um exemplo disso é o seguinte:
- Temos uma categoria com o slug em inglês “test” e sua tradução em francês “test-fr”.
- Esta categoria é atribuída a posts.
- Quando você invoca o
has_category("test")dentro de um loop no arquivo single.php do seu tema, ele retorna true para o idioma padrão, mas false para a tradução.
O que fazer
Defina um novo filtro no arquivo functions.php do seu tema:
function wp_has_category ($category) {
$category = get_term_by('name', $category, 'category');
return has_category($category);
}
add_filter('wp_has_category', 'wp_has_category', 10, 1);Substitua a função has_category por este novo filtro:
apply_filters( 'wp_has_category', 'test' )
Este filtro pega a categoria traduzida com base no nome da original e verifica se a categoria traduzida está atribuída a um post.
Referência: wpmlcore-3024.
Os sufixos de data (1st, 2nd, 3rd) não são traduzíveis
Esta é uma limitação do núcleo do WordPress, não do WPML: o sufixo vem da formatação de data do PHP e nunca passa por uma função de tradução.
O que você vê
Alguns temas ou plugins usam as funções do WordPress wp_date() ou date_i18n() para exibir datas. Essas datas podem usar um sufixo como 1st ou 26th, dependendo dos parâmetros selecionados.
Atualmente, não é possível traduzir sufixos de data devido a uma antiga limitação conhecida no núcleo do WordPress.
O que fazer
Como solução alternativa, você pode usar o filtro wp_date para obter a data e, em seguida, modificar o sufixo antes que ele seja renderizado na página. Faça um backup completo do seu site antes de prosseguir e siga os passos abaixo:
- Adicione um pequeno filtro
wp_dateao arquivo functions.php do seu tema que registra cada sufixo como uma string (icl_register_string) e retorna sua tradução (icl_t) no lugar do sufixo em inglês: - Abra a página onde as datas são exibidas. Isso executará o filtro adicionado.
- Vá para WPML → Tradução de Strings e traduza as datas.
- Você precisará traduzir cada sufixo separadamente (por exemplo, 1st, 2nd...) porque ele pode mudar dependendo do idioma.
Referência: compsupp-5773.
O Editor de tradução avançado não inventa um slug
O editor traduz o campo do slug quando você o preenche e mantém o slug original quando você o deixa vazio. Ele nunca deriva um slug do título traduzido por conta própria.
O que você vê
Se você traduzir um post usando o nosso Editor de tradução avançado, o campo do slug não é preenchido automaticamente. Se você decidir deixar o campo do slug vazio, ele carrega o slug do idioma original no post traduzido.
Referência: wpmlsupp-8574.
Shortcodes de construtor de páginas em uma breve descrição de produto do WooCommerce
A breve descrição é o resumo do post, um campo de texto simples por definição do WordPress, então o WPML não analisa shortcodes de construtor de páginas nele da mesma forma que faz no conteúdo. O WooCommerce acaba renderizando-os, e é por isso que a incompatibilidade surpreende as pessoas.
O que você vê
A breve descrição do produto do WooCommerce é baseada no campo de resumo do post, que normalmente é um campo de texto simples que não lida com shortcodes. Como tal, não é esperado que, se você colar shortcodes de construtor de páginas no resumo do post, eles funcionem, e ao traduzir resumos de posts, o WPML não tenta lidar com esses shortcodes.
Mas o WooCommerce lida com esses “resumos” de forma um pouco diferente, e os shortcodes funcionam, mas o WPML ainda age como se não funcionassem. Se o shortcode incluir atributos que precisam de tradução ou links internos que devam ser tratados automaticamente, isso não será facilmente possível.
O que fazer
Preparamos um código que pode ser adicionado como um plugin para fornecer essa funcionalidade. Copie e cole o código abaixo em um arquivo que você pode nomear como wpmlpb-excerpts.php e salve no seu diretório wp-content/plugins/, e depois ative o plugin.
<?php
/**
* Plugin Name: WPML Page Builders - Proces Excerpts
* Description: Parses shortcode strings in exceprts.
* Version: 1.0
*/
namespace WPMLPB686;
( new Excerpts() )->add_hooks();
class Excerpts {
const SEPARATOR_START = '<!--WPML_EXCERPT_START-->';
const SEPARATOR_END = '<!--WPML_EXCERPT_END-->';
public function add_hooks() {
add_filter( 'wpml_pb_shortcode_content_for_translation', [ $this, 'joinWithContent' ], 10, 2 );
add_filter( 'wpml_tm_translation_job_data', [ $this, 'excludeFromJob' ], 10, 2 );
add_action( 'wpml_pro_translation_completed', [ $this, 'splitFromContent' ], 999 );
}
public function joinWithContent( $content, $id ) {
$post = get_post( $id );
if ( $post && $post->post_excerpt ) {
$content .= self::SEPARATOR_START . $post->post_excerpt . self::SEPARATOR_END;
}
return $content;
}
public function excludeFromJob( $package, $post ) {
if ( preg_match( '/[[^]]+]/', $post->post_excerpt ) ) {
$package['contents']['excerpt']['translate'] = 0;
$package['contents']['excerpt']['data'] = '';
}
return $package;
}
public function splitFromContent( $post_id ) {
$post = get_post( $post_id );
if ( $post && false !== strpos( $post->post_content, self::SEPARATOR_START ) ) {
$start_pos = strpos( $post->post_content, self::SEPARATOR_START );
$end_pos = strpos( $post->post_content, self::SEPARATOR_END, $start_pos );
if ( false !== $end_pos ) {
$content = substr( $post->post_content, 0, $start_pos );
$excerpt = substr( $post->post_content, $start_pos + strlen( self::SEPARATOR_START ), $end_pos - $start_pos - strlen( self::SEPARATOR_START ) );
if ( $excerpt ) {
wp_update_post(
[
'ID' => $post_id,
'post_content' => $content,
'post_excerpt' => $excerpt,
]
);
}
}
}
}
}
Referência: wpmlpb-686.
Um domínio diferente por idioma na hospedagem do WordPress.com
O WordPress.com mapeia um domínio para um site; o formato de URL de “um domínio diferente por idioma” precisa que cada domínio de idioma alcance o mesmo WordPress, o que essa hospedagem não oferece.
O que você vê
Devido a limitações sobre como o mapeamento de domínio funciona com o WordPress.com, não é possível escolher a configuração de URLs do idioma para usar um domínio diferente por idioma quando os sites estão hospedados com eles.
O que fazer
Qualquer uma das outras opções de URL do idioma, com idiomas diferentes em diretórios ou o nome do idioma adicionado como um parâmetro, pode ser usada em vez de um domínio diferente por idioma.
Um host diferente seria necessário se um domínio diferente por idioma fosse um requisito.
Referência: wpmltriage-2045.
Traduções importadas e os editores de tradução
Uma importação grava traduções concluídas; ela não cria trabalhos de tradução, e os editores trabalham a partir de trabalhos de tradução. As traduções ficam completas no front-end e simplesmente não são editáveis no Editor de tradução avançado ou no Editor de tradução clássico.
O que você vê
Sempre que você importar conteúdo usando o WP All Import e o complemento WPML All Import, você verá as traduções de posts importadas perfeitamente no front-end. No entanto, você encontrará problemas se tentar atualizá-las usando os editores de tradução do WPML:
- O Editor de tradução clássico exibe o conteúdo no idioma padrão em vez das traduções importadas
- O Editor de tradução avançado exibe traduções em branco
Isso acontece porque, quando você importa conteúdo multilíngue, o WPML não cria trabalhos de tradução, que são necessários para a segmentação de strings.
O que fazer
Para editar ou atualizar suas traduções importadas, mude para o editor nativo do WordPress e use a tradução manual.
Referência: WPMLAI-168.