Advertisement
Chouby

Auto translate for Polylang

Jan 31st, 2013
616
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.53 KB | None | 0 0
  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();'));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement