PluginProbe
Polylang / 1.6.2
Polylang v1.6.2
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 / switcher.php

switcher.php in Polylang 1.6.2, at include/switcher.php

194 lines 7.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /*
4 * a class to display a language switcher on frontend
5 *
6 * @since 1.2
7 */
8 class PLL_Switcher {
9
10 /*
11 * returns options available for the language switcher - menu or widget
12 * either strings to display the options or default values
13 *
14 * @since 0.7
15 *
16 * @param string $type optional either 'menu' or 'widget', defaults to 'widget'
17 * @param string $key optional either 'string' or 'default', defaults to 'string'
18 * @return array list of switcher options srings or default values
19 */
20 static public function get_switcher_options($type = 'widget', $key ='string') {
21 $options = array(
22 'show_names' => array('string' => __('Displays language names', 'polylang'), 'default' => 1),
23 'show_flags' => array('string' => __('Displays flags', 'polylang'), 'default' => 0),
24 'force_home' => array('string' => __('Forces link to front page', 'polylang'), 'default' => 0),
25 'hide_current' => array('string' => __('Hides the current language', 'polylang'), 'default' => 0),
26 );
27
28 if ($type != 'menu')
29 $options = array('dropdown' => array('string' => __('Displays as dropdown', 'polylang'), 'default' => 0)) + $options;
30
31 return array_map(create_function('$v', "return \$v['$key'];"), $options);
32 }
33
34 /*
35 * get the language elements for use in a walker
36 *
37 * list of parameters accepted in $args:
38 * @see PLL_Switcher::the_languages
39 *
40 * @since 1.2
41 *
42 * @param object $links instance of PLL_Frontend_Links
43 * @param array $args
44 * @return array
45 */
46 protected function get_elements($links, $args) {
47 foreach ($links->model->get_languages_list(array('hide_empty' => $args['hide_if_empty'])) as $language) {
48 $id = (int) $language->term_id;
49 $slug = $language->slug;
50 $classes = array('lang-item', 'lang-item-' . esc_attr($id), 'lang-item-' . esc_attr($slug));
51
52 if ($current_lang = pll_current_language() == $slug) {
53 if ($args['hide_current'] && !$args['dropdown'])
54 continue; // hide current language except for dropdown
55 else
56 $classes[] = 'current-lang';
57 }
58
59 $url = $args['post_id'] !== null && ($tr_id = $links->model->get_post($args['post_id'], $language)) && $links->current_user_can_read($tr_id) ? get_permalink($tr_id) :
60 ($args['post_id'] === null && !$args['force_home'] ? $links->get_translation_url($language) : null);
61
62 if ($no_translation = empty($url))
63 $classes[] = 'no-translation';
64
65 $url = apply_filters('pll_the_language_link', $url, $slug, $language->locale);
66
67 // hide if no translation exists
68 if (empty($url) && $args['hide_if_no_translation'])
69 continue;
70
71 $url = empty($url) ? $links->get_home_url($language) : $url ; // if the page is not translated, link to the home page
72
73 $name = $args['show_names'] || !$args['show_flags'] || $args['raw'] ? ($args['display_names_as'] == 'slug' ? $slug : $language->name) : '';
74 $flag = $args['raw'] && !$args['show_flags'] ? $language->flag_url : ($args['show_flags'] ? $language->flag : '');
75
76 $out[] = compact('id', 'slug', 'name', 'url', 'flag', 'current_lang', 'no_translation', 'classes');
77 }
78 return empty($out) ? array() : $out;
79
80 }
81
82 /*
83 * displays a language switcher
84 * or returns the raw elements to build a custom language switcher
85 *
86 * list of parameters accepted in $args:
87 *
88 * dropdown => the list is displayed as dropdown if set to 1, defaults to 0
89 * echo => echoes the list if set to 1, defaults to 1
90 * hide_if_empty => hides languages with no posts (or pages) if set to 1, defaults to 1
91 * show_flags => displays flags if set to 1, defaults to 0
92 * show_names => show language names if set to 1, defaults to 1
93 * display_names_as => wether to display the language name or its slug, valid options are 'slug' and 'name', defaults to name
94 * force_home => will always link to home in translated language if set to 1, defaults to 0
95 * hide_if_no_translation => hide the link if there is no translation if set to 1, defaults to 0
96 * hide_current => hide the current language if set to 1, defaults to 0
97 * post_id => returns links to translations of post defined by post_id if set, defaults not set
98 * raw => return a raw array instead of html markup if set to 1, defaults to 0
99 *
100 * @since 0.1
101 *
102 * @param object $links instance of PLL_Frontend_Links
103 * @param array $args
104 * @return string|array either the html markup of the switcher or the raw elements to build a custom language switcher
105 */
106 public function the_languages($links, $args = '') {
107 $defaults = array(
108 'dropdown' => 0, // display as list and not as dropdown
109 'echo' => 1, // echoes the list
110 'hide_if_empty' => 1, // hides languages with no posts (or pages)
111 'menu' => 0, // not for nav menu (this argument is deprecated since v1.1.1)
112 'show_flags' => 0, // don't show flags
113 'show_names' => 1, // show language names
114 'display_names_as' => 'name', // valid options are slug and name
115 'force_home' => 0, // tries to find a translation
116 'hide_if_no_translation' => 0, // don't hide the link if there is no translation
117 'hide_current' => 0, // don't hide current language
118 'post_id' => null, // if not null, link to translations of post defined by post_id
119 'raw' => 0, // set this to true to build your own custom language switcher
120 );
121 $args = wp_parse_args($args, $defaults);
122 $args = apply_filters('pll_the_languages_args', $args);
123 $elements = $this->get_elements($links, $args);
124
125 if ($args['raw'])
126 return $elements;
127
128 if ($args['dropdown']) {
129 $walker = new PLL_Walker_Dropdown();
130 $args['selected'] = pll_current_language();
131 }
132 else
133 $walker = new PLL_Walker_List();
134
135 $out = apply_filters('pll_the_languages', $walker->walk($elements, $args), $args);
136
137 if ($args['echo'])
138 echo $out;
139 return $out;
140 }
141 }
142
143 /*
144 * displays a language list
145 *
146 * @since 1.2
147 */
148 class PLL_Walker_List extends Walker {
149 var $db_fields = array ('parent' => 'parent', 'id' => 'id');
150
151 /*
152 * outputs one element
153 *
154 * @since 1.2
155 *
156 * @see Walker::start_el
157 */
158 function start_el( &$output, $element, $depth = 0, $args = array(), $current_object_id = 0 ) {
159 $output .= sprintf(
160 "\t".'<li class="%s"><a hreflang="%s" href="%s">%s</a></li>'."\n",
161 implode(' ', $element->classes),
162 esc_attr($element->slug),
163 esc_url($element->url),
164 $args['show_flags'] && $args['show_names'] ? $element->flag.'&nbsp;'.esc_html($element->name) : $element->flag.esc_html($element->name)
165 );
166 }
167
168 /*
169 * overrides Walker::display_element as it expects an object with a parent property
170 *
171 * @since 1.2
172 *
173 * @see Walker::display_element
174 */
175 function display_element( $element, &$children_elements, $max_depth, $depth = 0, $args, &$output ) {
176 $element = (object) $element; // make sure we have an object
177 $element->parent = $element->id = 0; // don't care about this
178 parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
179 }
180
181 /*
182 * overrides Walker:walk to set depth argument
183 *
184 * @since 1.2
185 *
186 * @param array $elements elements to display
187 * @param array $args
188 * @return string
189 */
190 function walk($elements, $args = array()) {
191 return parent::walk($elements, -1, $args);
192 }
193 }
194