wpml

El plugin de WordPress WPML es casi un estándar para quienes necesitan realizar un sitio WordPress multi-idioma. Sin embargo a pesar de ir ya por su versión 4, al momento de escribir este artículo, el plugin presenta varias inconsistencias a las que hemos tenido que enfrentarnos en el desarrollo de Betizen.

Por ejemplificar una idea ellas. WPML crea un post con un ID diferente para cada traducción; y por lo tanto los comentarios quedan vinculados a dicho ID. Esto tiene varias consecuencias como que si un artículo (y sus traducciones) tiene 5 comentarios en total, y solo 2 en el idioma español, se imprimirán por defecto solo 2 comentarios en la sección en español de ese artículo.

Esta no es una inconsistencia en sí misma pero cuando utilizamos, por ejemplo, la función wp_count_comments, obtendremos el número total de artículos en vez del total por idioma como sería esperable, y esto sí representa un problema.

Por otro lado Betizen es una comunidad de jugadores de casino que basa sus rankings (además de los rankings de bonos, de juegos y de programas de afiliados) según las valoraciones de los comentarios de los jugadores. Y esta característica hizo que fuera necesario que estos se combinaran. Es decir, que en la sección de comentarios de un casino, como por ejemplo 1xBet, aparecieran las valoraciones de los jugadores independientemente del idioma del artículo donde lo hayan publicado.

Para lograrlo es necesario por lo tanto modificar los filtros de dos funciones vinculadas a los comentarios.

Los filtros

// filter to display all comments in posts, independent from languages
add_filter( 'comments_clauses', 'aipim_wpmlc_query_wpml_comments', 99, 2 );
add_filter( 'get_comments_number', 'aipim_wpmlc_change_comment_number', 200);

Las funciones

function aipim_wpmlc_query_wpml_comments( $arr, $query ){
  global $wpdb;

  // Get all active languages
  $languages = $wpdb->get_results("SELECT code FROM ".$wpdb->prefix."icl_languages WHERE active=1", ARRAY_A);
  $post_id = (!empty($query->query_vars["post_id"]) ? $query->query_vars["post_id"] : get_the_ID());
  $post_type = get_post_type($post_id);
  $lang_ids = [];
  // Foreach active language get the post_id
  foreach( $languages as $lang ){
    $lang_ids[] = "comment_post_ID = '".icl_object_id($post_id, $post_type, false, $lang['code'])."'";
  }
  //var_dump($lang_ids);
  // Edit the query to include all 'post_id's'
  $arr['where'] = str_replace("AND icltr2.language_code = '".ICL_LANGUAGE_CODE."'", '', $arr['where']);
  $arr['where'] = str_replace("AND comment_post_ID = ".$post_id."", '', $arr['where']);

  $arr['where'] .= ' AND ('.implode(" OR ", $lang_ids).')';



  return $arr;
}
function aipim_wpmlc_change_comment_number(){
  	return count( get_comments() );
}




user-avatar
Escribió para DevOps
Nicolás Erramuspe
Product developer @ Mínimo