PluginProbe
Polylang / 3.0.2
Polylang v3.0.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 / walker-dropdown.php

walker-dropdown.php in Polylang 3.0.2, at include/walker-dropdown.php

126 lines 4.5 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 * Displays languages in a dropdown list
8 *
9 * @since 1.2
10 */
11 class PLL_Walker_Dropdown extends Walker {
12 /**
13 * Database fields to use.
14 *
15 * @see https://developer.wordpress.org/reference/classes/walker/#properties Walker::$db_fields.
16 *
17 * @var array
18 */
19 public $db_fields = array( 'parent' => 'parent', 'id' => 'id' );
20
21 /**
22 * Outputs one element
23 *
24 * @since 1.2
25 *
26 * @param string $output Passed by reference. Used to append additional content.
27 * @param stdClass $element The data object.
28 * @param int $depth Depth of the item.
29 * @param array $args An array of additional arguments.
30 * @param int $current_object_id ID of the current item.
31 * @return void
32 */
33 public function start_el( &$output, $element, $depth = 0, $args = array(), $current_object_id = 0 ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
34 $value = $args['value'];
35 $output .= sprintf(
36 "\t" . '<option value="%1$s"%2$s%3$s>%4$s</option>' . "\n",
37 esc_attr( $element->$value ),
38 method_exists( $element, 'get_locale' ) ? sprintf( ' lang="%s"', esc_attr( $element->get_locale( 'display' ) ) ) : '',
39 selected( isset( $args['selected'] ) && $args['selected'] === $element->$value, true, false ),
40 esc_html( $element->name )
41 );
42 }
43
44 /**
45 * Overrides Walker::display_element as expects an object with a parent property
46 *
47 * @since 1.2
48 *
49 * @param stdClass $element Data object.
50 * @param array $children_elements List of elements to continue traversing.
51 * @param int $max_depth Max depth to traverse.
52 * @param int $depth Depth of current element.
53 * @param array $args An array of arguments.
54 * @param string $output Passed by reference. Used to append additional content.
55 * @return void
56 */
57 public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) {
58 $element = (object) $element; // Make sure we have an object
59 $element->parent = $element->id = 0; // Don't care about this
60 parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
61 }
62
63 /**
64 * Starts the output of the dropdown list
65 *
66 * @since 1.2
67 * @since 2.6.7 Use $max_depth and ...$args parameters to follow the move of WP 5.3
68 *
69 * List of parameters accepted in $args:
70 *
71 * flag => display the selected language flag in front of the dropdown if set to 1, defaults to 0
72 * value => the language field to use as value attribute, defaults to 'slug'
73 * selected => the selected value, mandatory
74 * name => the select name attribute, defaults to 'lang_choice'
75 * id => the select id attribute, defaults to $args['name']
76 * class => the class attribute
77 * disabled => disables the dropdown if set to 1
78 *
79 * @param array $elements An array of elements.
80 * @param int $max_depth The maximum hierarchical depth.
81 * @param mixed ...$args Additional arguments.
82 * @return string The hierarchical item output.
83 */
84 public function walk( $elements, $max_depth, ...$args ) { // // phpcs:ignore WordPressVIPMinimum.Classes.DeclarationCompatibility.DeclarationCompatibility
85 $output = '';
86
87 if ( is_array( $max_depth ) ) { // @phpstan-ignore-line
88 // Backward compatibility with Polylang < 2.6.7
89 if ( WP_DEBUG ) {
90 trigger_error( // phpcs:ignore WordPress.PHP.DevelopmentFunctions
91 sprintf(
92 '%s was called incorrectly. The method expects an integer as second parameter since Polylang 2.6.7',
93 __METHOD__
94 )
95 );
96 }
97 $args = $max_depth;
98 $max_depth = -1;
99 } else {
100 $args = isset( $args[0] ) ? $args[0] : array();
101 }
102
103 $args = wp_parse_args( $args, array( 'value' => 'slug', 'name' => 'lang_choice' ) );
104
105 if ( ! empty( $args['flag'] ) ) {
106 $current = wp_list_filter( $elements, array( $args['value'] => $args['selected'] ) );
107 $lang = reset( $current );
108 $output = sprintf(
109 '<span class="pll-select-flag">%s</span>',
110 empty( $lang->flag ) ? esc_html( $lang->slug ) : $lang->flag
111 );
112 }
113
114 $output .= sprintf(
115 '<select name="%1$s"%2$s%3$s%4$s>' . "\n" . '%5$s' . "\n" . '</select>' . "\n",
116 esc_attr( $args['name'] ),
117 isset( $args['id'] ) && ! $args['id'] ? '' : ' id="' . ( empty( $args['id'] ) ? esc_attr( $args['name'] ) : esc_attr( $args['id'] ) ) . '"',
118 empty( $args['class'] ) ? '' : ' class="' . esc_attr( $args['class'] ) . '"',
119 disabled( empty( $args['disabled'] ), false, false ),
120 parent::walk( $elements, $max_depth, $args )
121 );
122
123 return $output;
124 }
125 }
126