PluginProbe
Polylang / 0.7
Polylang v0.7
3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 3.8.3 2.7 2.7.0.1 2.7.1 2.7.2 2.7.3 2.7.4 2.8 2.8.1 2.8.2 2.8.3 2.8.4 2.9 2.9.1 2.9.2 3.0 3.0.1 3.0.2 3.0.3 All 233 releases
polylang / include / base.php

base.php in Polylang 0.7, at include/base.php

192 lines 7.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 // setups basic functions used for admin and frontend
4 abstract class Polylang_Base {
5 var $strings; // strings to translate
6
7 // returns the query variables of the referer
8 function get_referer_vars() {
9 $qvars = array();
10 $referer = wp_get_referer();
11 if ($referer) {
12 $urlparts = parse_url($referer);
13 if (isset($urlparts['query'])) {
14 parse_str($urlparts['query'], $qvars);
15 }
16 }
17 return $qvars;
18 }
19
20 // returns the list of available languages
21 function get_languages_list($hide_empty = false) {
22 return get_terms('language', array('hide_empty'=>$hide_empty, 'orderby'=>'term_group' ));
23 }
24
25 // retrieves the dropdown list of the languages
26 function dropdown_languages($args) {
27 $defaults = array('name' => 'lang_choice', 'class' => '', 'show_option_none' => false, 'show_option_all' => false,
28 'hide_empty' => false, 'value' => 'slug', 'selected' => '');
29 extract(wp_parse_args($args, $defaults));
30
31 $out = sprintf('<select name="%1$s" id="%1$s"%2$s>'."\n", esc_attr($name), $class ? ' class="'.esc_attr($class).'"' : '');
32 $out .= $show_option_none ? "<option value='0'></option>\n" : '';
33 $out .= $show_option_all ? "<option value='0'>".__('All languages', 'polylang')."</option>\n" : '';
34 foreach ($this->get_languages_list($hide_empty) as $language) {
35 $out .= sprintf("<option value='%s'%s>%s</option>\n",
36 esc_attr($language->$value),
37 $language->$value == $selected ? ' selected="selected"' : '',
38 esc_html($language->name)
39 );
40 }
41 $out .= "</select>\n";
42 return $out;
43 }
44
45 // returns the language by its id or its slug
46 // Note: it seems that a numeric value is better for performance (3.2.1)
47 function get_language($value) {
48 if (is_object($value))
49 return $value;
50 if (is_numeric($value) || (int) $value)
51 return get_term((int) $value, 'language');
52 elseif (is_string($value))
53 return get_term_by('slug', $value , 'language'); // seems it is not cached in 3.2.1
54 return null;
55 }
56
57 // saves translations for posts or terms
58 // the underscore in '_lang' hides the post meta in the Custom Fields metabox in the Edit Post screen
59 // $type: either 'post' or 'term'
60 // $id: post id or term id
61 // $translations: an associative array of translations with language code as key and translation id as value
62 function save_translations($type, $id, $translations) {
63 $lang = call_user_func(array(&$this, 'get_'.$type.'_language'), $id);
64 if (!$lang)
65 return;
66
67 if (isset($translations) && is_array($translations)) {
68 $tr = serialize(array_merge(array($lang->slug => $id), $translations));
69 update_metadata($type, $id, '_translations', $tr);
70
71 foreach($translations as $key=>$p)
72 update_metadata($type, (int) $p, '_translations', $tr);
73 }
74 }
75
76 // deletes a translation of a post or term
77 function delete_translation($type, $id) {
78 $translations = unserialize(get_metadata($type, $id, '_translations', true));
79 if (is_array($translations)) {
80 $slug = array_search($id, $translations);
81 unset($translations[$slug]);
82 $tr = serialize($translations);
83 foreach($translations as $key=>$p)
84 update_metadata($type, (int) $p, '_translations', $tr);
85 delete_metadata($type, $id, '_translations');
86 }
87 }
88
89 // returns the id of the translation of a post or term
90 // $type: either 'post' or 'term'
91 // $id: post id or term id
92 // $lang: object or slug (in the order of preference latest to avoid)
93 function get_translation($type, $id, $lang) {
94 $translations = unserialize(get_metadata($type, $id, '_translations', true));
95 $slug = $this->get_language($lang)->slug;
96 return isset($translations[$slug]) ? (int) $translations[$slug] : '';
97 }
98
99 // store the post language in the database
100 function set_post_language($post_id, $lang) {
101 wp_set_post_terms($post_id, $this->get_language($lang)->slug, 'language' );
102 }
103
104 // returns the language of a post
105 function get_post_language($post_id) {
106 $lang = get_the_terms($post_id, 'language' );
107 return ($lang) ? reset($lang) : null; // there's only one language per post : first element of the array returned
108 }
109
110 // among the post and its translations, returns the id of the post which is in $lang
111 function get_post($post_id, $lang) {
112 $lang = $this->get_language($lang);
113 return $this->get_post_language($post_id)->term_id == $lang->term_id ? $post_id : $this->get_translation('post', $post_id, $lang);
114 }
115
116 // store the term language in the database
117 function set_term_language($term_id, $lang) {
118 update_metadata('term', $term_id, '_language', $this->get_language($lang)->term_id);
119 }
120
121 // remove the term language in the database
122 function delete_term_language($term_id) {
123 delete_metadata('term', $term_id, '_language');
124 }
125
126 // returns the language of a term
127 function get_term_language($value, $taxonomy = '') {
128 if (is_numeric($value))
129 $term_id = $value;
130 elseif (is_string($value) && $taxonomy)
131 $term_id = get_term_by('slug', $value , $taxonomy)->term_id;
132 return $term_id ? $this->get_language(get_metadata('term', $term_id, '_language', true)) : null;
133 }
134
135 // among the term and its translations, returns the id of the term which is in $lang
136 function get_term($term_id, $lang) {
137 $lang = $this->get_language($lang);
138 return $this->get_term_language($term_id)->term_id == $lang->term_id ? $term_id : $this->get_translation('term', $term_id, $lang);
139 }
140
141 // returns the html link to the flag if exists
142 // $lang: object
143 function get_flag($lang) {
144 if (file_exists(POLYLANG_DIR.($file = '/flags/'.$lang->description.'.png')))
145 $url = POLYLANG_URL.$file;
146
147 // overwrite with custom flags
148 if (!is_admin() && ( // never use custom flags on admin side
149 file_exists(PLL_LOCAL_DIR.($file = '/'.$lang->description.'.png')) ||
150 file_exists(PLL_LOCAL_DIR.($file = '/'.$lang->description.'.jpg')) ))
151 $url = PLL_LOCAL_URL.$file;
152
153 $title = apply_filters('pll_flag_title', $lang->name, $lang->slug, $lang->description);
154 return isset($url) ? '<img src="'.esc_url($url).'" title="'.esc_attr($title).'" alt="'.esc_attr($lang->name).'" />' : '';
155 }
156
157 // adds terms clauses to get_terms - used in both frontend and admin
158 function _terms_clauses($clauses, $lang, $display_all = false) {
159 global $wpdb;
160 if (isset($lang) && !is_wp_error($lang)) {
161 $clauses['join'] .= $wpdb->prepare(" LEFT JOIN $wpdb->termmeta AS pll_tm ON t.term_id = pll_tm.term_id");
162 $where_lang = $wpdb->prepare("pll_tm.meta_key = '_language' AND pll_tm.meta_value = %d", $lang->term_id); // add terms in the right language
163 $where_all = $wpdb->prepare("t.term_id NOT IN (SELECT term_id FROM $wpdb->termmeta WHERE meta_key IN ('_language'))"); // add terms with no language set
164 $clauses['where'] .= $display_all ? " AND (($where_lang) OR ($where_all))" : " AND $where_lang";
165 }
166 return $clauses;
167 }
168
169 // returns all page ids *not in* language defined by $lang_id
170 function exclude_pages($lang_id) {
171 $q = array(
172 'numberposts'=>-1,
173 'post_type' => 'page',
174 'fields' => 'ids',
175 'tax_query' => array(array(
176 'taxonomy'=>'language',
177 'fields' => 'id',
178 'terms'=>$lang_id,
179 'operator'=>'NOT IN'
180 ))
181 );
182 return get_posts($q);
183 }
184
185 // register strings for translation
186 function register_string($name, $string) {
187 $this->strings[] = array('name'=> $name, 'string' => $string);
188 }
189
190 } //class Polylang_Base
191 ?>
192