PluginProbe
Polylang / 2.8
Polylang v2.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.8, at include/widget-languages.php

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