WPML
Status
Resolvido pelo autor
Resolvido em
Bricks 2.0
Plugin/tema relacionado
Bricks
Tags de tópico
Compatibility

Visão geral do problema

No Bricks Theme, quando uma condição de template é configurada para ser exibida apenas para termos específicos (por exemplo, uma determinada categoria), a condição não se aplica corretamente nos templates traduzidos.

Solução alternativa

Por favor, certifique-se de ter um backup completo do site antes de prosseguir.

Parte I


  • Vá para WPML > Configurações > Campos personalizados.

  • Procure a linha do campo _bricks_template_settings.

  • Defina-o como Copiar

Parte II


  • Abra o arquivo functions.php do seu tema.

  • Adicione o seguinte código:
    /**
     * WPML Workaround for compsupp-7667
     */
    add_filter('get_post_metadata', 'wpml_compsupp7667_bricks_translate_template_conditions', 10, 4);
    function wpml_compsupp7667_bricks_translate_template_conditions($value, $post_id, $key, $single) {
        if ($key !== '_bricks_template_settings') {
            return $value;
        }
    
        // Remove filter temporarily to avoid infinite loop
        remove_filter('get_post_metadata', 'wpml_compsupp7667_bricks_translate_template_conditions', 10);
        
        // Get all meta values
        $raw_values = get_post_meta($post_id, $key, false);
        
        // Add filter back
        add_filter('get_post_metadata', 'wpml_compsupp7667_bricks_translate_template_conditions', 10, 4);
    
        // If we have no values, return the original
        if (empty($raw_values)) {
            return $value;
        }
    
        // Process the array structure
        foreach ($raw_values as &$settings) {
            if (is_array($settings) && isset($settings['templateConditions'])) {
                foreach ($settings['templateConditions'] as &$condition) {
                    if (!empty($condition['archiveTerms']) && is_array($condition['archiveTerms'])) {
                        foreach ($condition['archiveTerms'] as &$termString) {
                            if (strpos($termString, '::') !== false) {
                                list($taxonomy, $termId) = explode('::', $termString);
                                $translatedId = apply_filters('wpml_object_id', intval($termId), $taxonomy, true);
                                if ($translatedId) {
                                    $termString = $taxonomy . '::' . $translatedId;
                                }
                            }
                        }
                    }
                }
            }
        }
    
        return $raw_values;
    }

Todos os problemas conhecidos →