PluginProbe
Polylang / 2.6.8
Polylang v2.6.8
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 / widget-languages.php

widget-languages.php in Polylang 2.6.8, at include/widget-languages.php

157 lines 5.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * The language switcher widget
5 *
6 * @since 0.1
7 */
8 class PLL_Widget_Languages extends WP_Widget {
9
10 /**
11 * Constructor
12 *
13 * @since 0.1
14 */
15 public function __construct() {
16 parent::__construct(
17 'polylang',
18 __( 'Language switcher', 'polylang' ),
19 array(
20 'description' => __( 'Displays a language switcher', 'polylang' ),
21 'customize_selective_refresh' => true,
22 )
23 );
24 }
25
26 /**
27 * Displays the widget
28 *
29 * @since 0.1
30 *
31 * @param array $args Display arguments including before_title, after_title, before_widget, and after_widget.
32 * @param array $instance The settings for the particular instance of the widget
33 */
34 public function widget( $args, $instance ) {
35 // Sets a unique id for dropdown
36 $instance['dropdown'] = empty( $instance['dropdown'] ) ? 0 : $args['widget_id'];
37
38 if ( $list = pll_the_languages( array_merge( $instance, array( 'echo' => 0 ) ) ) ) {
39 $title = empty( $instance['title'] ) ? '' : $instance['title'];
40 /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
41 $title = apply_filters( 'widget_title', $title, $instance, $this->id_base );
42
43 echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput
44 if ( $title ) {
45 echo $args['before_title'] . $title . $args['after_title']; // phpcs:ignore WordPress.Security.EscapeOutput
46 }
47 if ( $instance['dropdown'] ) {
48 echo '<label class="screen-reader-text" for="' . esc_attr( 'lang_choice_' . $instance['dropdown'] ) . '">' . esc_html__( 'Choose a language', 'polylang' ) . '</label>';
49 echo $list; // phpcs:ignore WordPress.Security.EscapeOutput
50 } else {
51 echo "<ul>\n" . $list . "</ul>\n"; // phpcs:ignore WordPress.Security.EscapeOutput
52 }
53 echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput
54 }
55 }
56
57 /**
58 * Updates the widget options
59 *
60 * @since 0.4
61 *
62 * @param array $new_instance New settings for this instance as input by the user via form()
63 * @param array $old_instance Old settings for this instance
64 * @return array Settings to save or bool false to cancel saving
65 */
66 public function update( $new_instance, $old_instance ) {
67 $instance['title'] = sanitize_text_field( $new_instance['title'] );
68 foreach ( array_keys( PLL_Switcher::get_switcher_options( 'widget' ) ) as $key ) {
69 $instance[ $key ] = ! empty( $new_instance[ $key ] ) ? 1 : 0;
70 }
71
72 return $instance;
73 }
74
75 /**
76 * Displays the widget form
77 *
78 * @since 0.4
79 *
80 * @param array $instance Current settings
81 */
82 public function form( $instance ) {
83 // Default values
84 $instance = wp_parse_args( (array) $instance, array_merge( array( 'title' => '' ), PLL_Switcher::get_switcher_options( 'widget', 'default' ) ) );
85
86 // Title
87 printf(
88 '<p><label for="%1$s">%2$s</label><input class="widefat" id="%1$s" name="%3$s" type="text" value="%4$s" /></p>',
89 esc_attr( $this->get_field_id( 'title' ) ),
90 esc_html__( 'Title:', 'polylang' ),
91 esc_attr( $this->get_field_name( 'title' ) ),
92 esc_attr( $instance['title'] )
93 );
94
95 foreach ( PLL_Switcher::get_switcher_options( 'widget' ) as $key => $str ) {
96 printf(
97 '<div%5$s%6$s><input type="checkbox" class="checkbox %7$s" id="%1$s" name="%2$s"%3$s /><label for="%1$s">%4$s</label></div>',
98 esc_attr( $this->get_field_id( $key ) ),
99 esc_attr( $this->get_field_name( $key ) ),
100 checked( $instance[ $key ], true, false ),
101 esc_html( $str ),
102 in_array( $key, array( 'show_names', 'show_flags', 'hide_current' ) ) ? sprintf( ' class="no-dropdown-%s"', esc_attr( $this->id ) ) : '',
103 ( ! empty( $instance['dropdown'] ) && in_array( $key, array( 'show_names', 'show_flags', 'hide_current' ) ) ? ' style="display:none;"' : '' ),
104 esc_attr( 'pll-' . $key )
105 );
106 }
107
108 // FIXME echoing script in form is not very clean
109 // but it does not work if enqueued properly :
110 // clicking save on a widget makes this code unreachable for the just saved widget ( ?! )
111 $this->admin_print_script();
112 }
113
114 /**
115 * Add javascript to control the language switcher options
116 *
117 * @since 1.3
118 */
119 public function admin_print_script() {
120 static $done = false;
121
122 if ( $done ) {
123 return;
124 }
125
126 $done = true;
127 ?>
128 <script type='text/javascript'>
129 //<![CDATA[
130 jQuery( document ).ready( function( $ ) {
131 function pll_toggle( a, test ) {
132 test ? a.show() : a.hide();
133 }
134
135 // Remove all options if dropdown is checked
136 $( '.widgets-sortables,.control-section-sidebar' ).on( 'change', '.pll-dropdown', function() {
137 var this_id = $( this ).parent().parent().parent().children( '.widget-id' ).attr( 'value' );
138 pll_toggle( $( '.no-dropdown-' + this_id ), 'checked' != $( this ).attr( 'checked' ) );
139 } );
140
141 // Disallow unchecking both show names and show flags
142 var options = ['-show_flags', '-show_names'];
143 $.each( options, function( i, v ) {
144 $( '.widgets-sortables,.control-section-sidebar' ).on( 'change', '.pll' + v, function() {
145 var this_id = $( this ).parent().parent().parent().children( '.widget-id' ).attr( 'value' );
146 if ( 'checked' != $( this ).attr( 'checked' ) ) {
147 $( '#widget-' + this_id + options[ 1-i ] ).prop( 'checked', true );
148 }
149 } );
150 } );
151 } );
152 //]]>
153 </script>
154 <?php
155 }
156 }
157