PluginProbe
Polylang / 2.7
Polylang v2.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 / switcher.php

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

219 lines 8.3 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 strings or default values
19 */
20 public static function get_switcher_options( $type = 'widget', $key = 'string' ) {
21 $options = array(
22 'dropdown' => array( 'string' => __( 'Displays as a dropdown', 'polylang' ), 'default' => 0 ),
23 'show_names' => array( 'string' => __( 'Displays language names', 'polylang' ), 'default' => 1 ),
24 'show_flags' => array( 'string' => __( 'Displays flags', 'polylang' ), 'default' => 0 ),
25 'force_home' => array( 'string' => __( 'Forces link to front page', 'polylang' ), 'default' => 0 ),
26 'hide_current' => array( 'string' => __( 'Hides the current language', 'polylang' ), 'default' => 0 ),
27 'hide_if_no_translation' => array( 'string' => __( 'Hides languages with no translation', 'polylang' ), 'default' => 0 ),
28 );
29
30 return wp_list_pluck( $options, $key );
31 }
32
33 /**
34 * Get the language elements for use in a walker
35 *
36 * @see list of parameters accepted in $args documented for PLL_Switcher::the_languages
37 *
38 * @since 1.2
39 *
40 * @param object $links instance of PLL_Frontend_Links
41 * @param array $args
42 * @return array
43 */
44 protected function get_elements( $links, $args ) {
45 $first = true;
46 $out = array();
47
48 foreach ( $links->model->get_languages_list( array( 'hide_empty' => $args['hide_if_empty'] ) ) as $language ) {
49 $id = (int) $language->term_id;
50 $order = (int) $language->term_group;
51 $slug = $language->slug;
52 $locale = $language->get_locale( 'display' );
53 $classes = array( 'lang-item', 'lang-item-' . $id, 'lang-item-' . esc_attr( $slug ) );
54 $url = null; // Avoids potential notice
55
56 if ( $current_lang = $links->curlang->slug == $slug ) {
57 if ( $args['hide_current'] && ! ( $args['dropdown'] && ! $args['raw'] ) ) {
58 continue; // Hide current language except for dropdown
59 } else {
60 $classes[] = 'current-lang';
61 }
62 }
63
64 if ( null !== $args['post_id'] && ( $tr_id = $links->model->post->get( $args['post_id'], $language ) ) && $links->model->post->current_user_can_read( $tr_id ) ) {
65 $url = get_permalink( $tr_id );
66 } elseif ( null === $args['post_id'] ) {
67 $url = $links->get_translation_url( $language );
68 }
69
70 if ( $no_translation = empty( $url ) ) {
71 $classes[] = 'no-translation';
72 }
73
74 /**
75 * Filter the link in the language switcher
76 *
77 * @since 0.7
78 *
79 * @param string $url the link
80 * @param string $slug language code
81 * @param string $locale language locale
82 */
83 $url = apply_filters( 'pll_the_language_link', $url, $slug, $language->locale );
84
85 // Hide if no translation exists
86 if ( empty( $url ) && $args['hide_if_no_translation'] ) {
87 continue;
88 }
89
90 $url = empty( $url ) || $args['force_home'] ? $links->get_home_url( $language ) : $url; // If the page is not translated, link to the home page
91
92 $name = $args['show_names'] || ! $args['show_flags'] || $args['raw'] ? ( 'slug' == $args['display_names_as'] ? $slug : $language->name ) : '';
93 $flag = $args['raw'] && ! $args['show_flags'] ? $language->flag_url : ( $args['show_flags'] ? $language->flag : '' );
94
95 if ( $first ) {
96 $classes[] = 'lang-item-first';
97 $first = false;
98 }
99
100 $out[ $slug ] = compact( 'id', 'order', 'slug', 'locale', 'name', 'url', 'flag', 'current_lang', 'no_translation', 'classes' );
101 }
102
103 return $out;
104 }
105
106 /**
107 * Displays a language switcher
108 * or returns the raw elements to build a custom language switcher
109 *
110 * List of parameters accepted in $args:
111 *
112 * dropdown => the list is displayed as dropdown if set, defaults to 0
113 * echo => echoes the list if set to 1, defaults to 1
114 * hide_if_empty => hides languages with no posts ( or pages ) if set to 1, defaults to 1
115 * show_flags => displays flags if set to 1, defaults to 0
116 * show_names => show language names if set to 1, defaults to 1
117 * display_names_as => whether to display the language name or its slug, valid options are 'slug' and 'name', defaults to name
118 * force_home => will always link to home in translated language if set to 1, defaults to 0
119 * hide_if_no_translation => hide the link if there is no translation if set to 1, defaults to 0
120 * hide_current => hide the current language if set to 1, defaults to 0
121 * post_id => returns links to translations of post defined by post_id if set, defaults not set
122 * raw => return a raw array instead of html markup if set to 1, defaults to 0
123 * item_spacing => whether to preserve or discard whitespace between list items, valid options are 'preserve' and 'discard', defaults to preserve
124 *
125 * @since 0.1
126 *
127 * @param object $links instance of PLL_Frontend_Links
128 * @param array $args
129 * @return string|array either the html markup of the switcher or the raw elements to build a custom language switcher
130 */
131 public function the_languages( $links, $args = '' ) {
132 $defaults = array(
133 'dropdown' => 0, // display as list and not as dropdown
134 'echo' => 1, // echoes the list
135 'hide_if_empty' => 1, // hides languages with no posts ( or pages )
136 'menu' => 0, // not for nav menu ( this argument is deprecated since v1.1.1 )
137 'show_flags' => 0, // don't show flags
138 'show_names' => 1, // show language names
139 'display_names_as' => 'name', // valid options are slug and name
140 'force_home' => 0, // tries to find a translation
141 'hide_if_no_translation' => 0, // don't hide the link if there is no translation
142 'hide_current' => 0, // don't hide current language
143 'post_id' => null, // if not null, link to translations of post defined by post_id
144 'raw' => 0, // set this to true to build your own custom language switcher
145 'item_spacing' => 'preserve', // 'preserve' or 'discard' whitespace between list items
146 );
147 $args = wp_parse_args( $args, $defaults );
148
149 /**
150 * Filter the arguments of the 'pll_the_languages' template tag
151 *
152 * @since 1.5
153 *
154 * @param array $args
155 */
156 $args = apply_filters( 'pll_the_languages_args', $args );
157
158 // Prevents showing empty options in dropdown
159 if ( $args['dropdown'] ) {
160 $args['show_names'] = 1;
161 }
162
163 $elements = $this->get_elements( $links, $args );
164
165 if ( $args['raw'] ) {
166 return $elements;
167 }
168
169 if ( $args['dropdown'] ) {
170 $args['name'] = 'lang_choice_' . $args['dropdown'];
171 $walker = new PLL_Walker_Dropdown();
172 $args['selected'] = $links->curlang->slug;
173 }
174 else {
175 $walker = new PLL_Walker_List();
176 }
177
178 /**
179 * Filter the whole html markup returned by the 'pll_the_languages' template tag
180 *
181 * @since 0.8
182 *
183 * @param string $html html returned/outputted by the template tag
184 * @param array $args arguments passed to the template tag
185 */
186 $out = apply_filters( 'pll_the_languages', $walker->walk( $elements, -1, $args ), $args );
187
188 // Javascript to switch the language when using a dropdown list
189 if ( $args['dropdown'] ) {
190 $urls = array();
191
192 foreach ( $links->model->get_languages_list() as $language ) {
193 $url = $links->get_translation_url( $language );
194 $urls[ $language->slug ] = $args['force_home'] || empty( $url ) ? $links->get_home_url( $language ) : $url;
195 }
196
197 // Accept only few valid characters for the urls_x variable name ( as the widget id includes '-' which is invalid )
198 $out .= sprintf(
199 '<script type="text/javascript">
200 //<![CDATA[
201 var %1$s = %2$s;
202 document.getElementById( "%3$s" ).onchange = function() {
203 location.href = %1$s[this.value];
204 }
205 //]]>
206 </script>',
207 'urls_' . preg_replace( '#[^a-zA-Z0-9]#', '', $args['dropdown'] ),
208 wp_json_encode( $urls ),
209 esc_js( $args['name'] )
210 );
211 }
212
213 if ( $args['echo'] ) {
214 echo $out; // phpcs:ignore WordPress.Security.EscapeOutput
215 }
216 return $out;
217 }
218 }
219