Want more features on Pastebin? Sign Up, it's FREE!
Guest

Auto translate for Polylang

By: Chouby on Jan 31st, 2013  |  syntax: PHP  |  size: 4.53 KB  |  views: 259  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. <?php
  2. /*
  3. Plugin name: auto translate for Polylang
  4. */
  5.  
  6. class Polylang_Auto_Translate {
  7.         function __construct() {
  8.                 add_action('pre_get_posts', array(&$this, 'pre_get_posts')); // after Polylang
  9.         }
  10.  
  11.         function pre_get_posts($query) {
  12.                 if (!$lang = pll_current_language())
  13.                         return;
  14.  
  15.                 global $wpdb, $polylang;
  16.                 $qv = &$query->query_vars;
  17.  
  18.                 $sign = create_function('$n', 'return $n > 0 ? 1 : ($n < 0 ? -1 : 0);');
  19.  
  20.                 // /!\ always keep untranslated as is
  21.  
  22.                 // term ids separated by a comma
  23.                 $arr = array();
  24.                 if (!empty($qv['cat'])) {
  25.                         foreach (explode(',', $qv['cat']) as $cat)
  26.                                 $arr[] = ($tr = $sign($cat) * pll_get_term(abs($cat))) ? $tr : $cat;
  27.  
  28.                         $qv['cat'] = implode(',', $arr);
  29.                 }
  30.  
  31.                 // category_name
  32.                 $arr = array();
  33.                 if (!empty($qv['category_name'])) {
  34.                         foreach (explode(',', $qv['category_name']) as $slug)
  35.                                 $arr[] = (($cat = get_category_by_slug($slug)) && ($tr_id = pll_get_term($cat->term_id)) && !is_wp_error($tr = get_category($tr_id))) ?
  36.                                         $tr->slug : $slug;
  37.  
  38.                         $qv['category_name'] = implode(',', $arr);
  39.                 }
  40.  
  41.                 // array of term ids
  42.                 foreach (array('category__and', 'category__in', 'category__not_in', 'tag__and', 'tag__in', 'tag__not_in') as $key) {
  43.                         $arr = array();
  44.                         if (!empty($qv[$key])) {
  45.                                 foreach ($qv[$key] as $cat)
  46.                                         $arr[] = ($tr = pll_get_term($cat)) ? $tr : $cat;
  47.  
  48.                                 $qv[$key] = $arr;
  49.                         }
  50.                 }
  51.  
  52.                 // tag
  53.                 $arr = array();
  54.                 if (!empty($qv['tag'])) {
  55.                         $sep = strpos($qv['tag'], ',') !== false ? ',' : '+'; // two possible separators for tag slugs
  56.                         foreach (explode($sep, $qv['tag']) as $slug)
  57.                                 $arr[] = (($tag = get_term_by('slug', $slug, 'post_tag')) && ($tr_id = pll_get_term($tag->term_id)) && !is_wp_error($tr = get_tag($tr_id))) ?
  58.                                         $tr->slug : $slug;
  59.  
  60.                         $qv['tag'] = implode($sep, $arr);
  61.                 }
  62.  
  63.                 // tag_id can only take one id
  64.                 if (!empty($qv['tag_id']) && $tr_id = pll_get_term($qv['tag_id']))
  65.                         $qv['tag_id'] = $tr_id;
  66.  
  67.  
  68.                 // array of tag slugs
  69.                 foreach (array('tag_slug__and', 'tag_slug__in') as $key) {
  70.                         $arr = array();
  71.                         if (!empty($qv[$key])) {
  72.                                 foreach ($qv[$key] as $slug)
  73.                                         $arr[] = (($tag = get_term_by('slug', $slug, 'post_tag')) && ($tr_id = pll_get_term($tag->term_id)) && !is_wp_error($tr = get_tag($tr_id))) ?
  74.                                                 $tr->slug : $slug;
  75.  
  76.                                 $qv[$key] = $arr;
  77.                         }
  78.                 }
  79.  
  80.                 // custom taxonomies
  81.                 // according to codex, this type of query is deprecated as of WP 3.1 but it does not appear in WP 3.5 source code
  82.                 foreach (array_diff($polylang->taxonomies, array('category', 'post_tag')) as $taxonomy) {
  83.                         $tax = get_taxonomy($taxonomy);
  84.                         $arr = array();
  85.                         if (!empty($qv[$tax->query_var])) {
  86.                                 $sep = strpos($qv[$tax->query_var], ',') !== false ? ',' : '+'; // two possible separators
  87.                                 foreach (explode($sep, $qv[$tax->query_var]) as $slug)
  88.                                         $arr[] = (($tag = get_term_by('slug', $slug, $taxonomy)) && ($tr_id = pll_get_term($tag->term_id)) && !is_wp_error($tr = get_term($tr_id, $taxonomy))) ?
  89.                                                 $tr->slug : $slug;
  90.  
  91.                                 $qv[$tax->query_var] = implode($sep, $arr);
  92.                         }
  93.                 }
  94.  
  95.                 // tax_query since WP 3.1
  96.                 if (!empty($qv['tax_query']) && is_array($qv['tax_query'])) {
  97.                         foreach ($qv['tax_query'] as $key => $q) {
  98.                                 $arr = array();
  99.                                 $field = empty($q['field']) ? 'id' : $q['field'];
  100.                                 foreach (explode(',', $q['terms']) as $t)
  101.                                         $arr[] = (($tag = get_term_by($field, $t, $taxonomy)) && ($tr_id = pll_get_term($tag->term_id)) && !is_wp_error($tr = get_term($tr_id, $taxonomy))) ?
  102.                                                 $tr->$field : $t;
  103.  
  104.                                 $qv['tax_query'][$key]['terms'] = implode(',', $arr);
  105.                         }
  106.                 }
  107.  
  108.                 // p, page_id, post_parent can only take one id
  109.                 foreach (array('p', 'page_id', 'post_parent') as $key)
  110.                         if (!empty($qv[$key]) && $tr_id = pll_get_post($qv[$key]))
  111.                                 $qv[$key] = $tr_id;
  112.  
  113.                 // name, pagename can only take one slug
  114.                 foreach (array('name', 'pagename') as $key) {
  115.                         if (!empty($qv[$key])) {
  116.                                 // no function to get post by name
  117.                                 $post_type = empty($qv['post_type']) ? 'post' : $qv['post_type'];
  118.                                 $id = $wpdb->get_var($wpdb->prepare("SELECT ID from $wpdb->posts WHERE post_type=%s AND post_name=%s", $post_type, $qv[$key]));
  119.                                 $qv[$key] = ($id && ($tr_id = pll_get_post($id)) && $tr = get_post($tr_id)) ? $tr->post_name : $qv[$key];
  120.                         }
  121.                 }
  122.  
  123.                 // array of post ids
  124.                 foreach (array('post__in', 'post__not_in') as $key) {
  125.                         $arr = array();
  126.                         if (!empty($qv[$key])) {
  127.                                 foreach ($qv[$key] as $p)
  128.                                         $arr[] = ($tr = pll_get_post($p)) ? $tr : $p;
  129.  
  130.                                 $qv[$key] = $arr;
  131.                         }
  132.                 }
  133.         }
  134. }
  135.  
  136. add_action('pll_language_defined', create_function('', 'new Polylang_Auto_Translate();'));
clone this paste RAW Paste Data