| @@ -2,8 +2,11 @@ | ||
| 2 | 2 | /** |
| 3 | 3 | * @package Polylang |
| 4 | 4 | */ |
| 5 | 5 | |
| 6 | +use WP_Syntex\Polylang\Switcher\Fields\Menu as Fields; | |
| 7 | +use WP_Syntex\Polylang\Switcher\Settings\Menu as Settings; | |
| 8 | + | |
| 6 | 9 | /** |
| 7 | 10 | * Manages custom menus translations as well as the language switcher menu item on admin side |
| 8 | 11 | * |
| 9 | 12 | * @since 1.2 |
| @@ -110,12 +113,19 @@ | ||
| 110 | 113 | |
| 111 | 114 | $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; |
| 112 | 115 | wp_enqueue_script( 'pll_nav_menu', plugins_url( "/js/build/nav-menu{$suffix}.js", POLYLANG_ROOT_FILE ), array(), POLYLANG_VERSION ); |
| 113 | 116 | |
| 117 | + $fields = Fields::get(); | |
| 118 | + $defaults = new Settings( array() ); | |
| 119 | + | |
| 120 | + foreach ( $fields as $key => $field ) { | |
| 121 | + $fields[ $key ]['default'] = $defaults->$key; | |
| 122 | + } | |
| 123 | + | |
| 114 | 124 | $data = array( |
| 115 | - 'strings' => PLL_Switcher::get_switcher_options( 'menu', 'string' ), // The strings for the options | |
| 116 | - 'title' => __( 'Languages', 'polylang' ), // The title | |
| 117 | - 'val' => array(), | |
| 125 | + 'data' => $fields, | |
| 126 | + 'title' => __( 'Languages', 'polylang' ), | |
| 127 | + 'val' => array(), | |
| 118 | 128 | ); |
| 119 | 129 | |
| 120 | 130 | // Get all language switcher menu items |
| 121 | 131 | $items = get_posts( |
| @@ -129,9 +139,15 @@ | ||
| 129 | 139 | ); |
| 130 | 140 | |
| 131 | 141 | // The options values for the language switcher |
| 132 | 142 | foreach ( $items as $item ) { |
| 133 | - $data['val'][ $item ] = get_post_meta( $item, '_pll_menu_item', true ); | |
| 143 | + $meta = get_post_meta( $item, '_pll_menu_item', true ); | |
| 144 | + | |
| 145 | + if ( ! is_array( $meta ) ) { | |
| 146 | + continue; | |
| 147 | + } | |
| 148 | + | |
| 149 | + $data['val'][ $item ] = Fields::filter( new Settings( Fields::remove_legacy_settings( $meta ) ) ); | |
| 134 | 150 | } |
| 135 | 151 | |
| 136 | 152 | // Send all these data to javascript |
| 137 | 153 | wp_localize_script( 'pll_nav_menu', 'pll_data', $data ); |
| @@ -158,21 +174,25 @@ | ||
| 158 | 174 | if ( empty( $_POST['menu-item-url'] ) || ! is_array( $_POST['menu-item-url'] ) || empty( $_POST['menu-item-url'][ $menu_item_db_id ] ) || '#pll_switcher' !== $_POST['menu-item-url'][ $menu_item_db_id ] ) { |
| 159 | 175 | return; |
| 160 | 176 | } |
| 161 | 177 | |
| 162 | - $options = array( 'hide_if_no_translation' => 0, 'hide_current' => 0, 'force_home' => 0, 'show_flags' => 0, 'show_names' => 1, 'dropdown' => 0 ); // Default values. | |
| 163 | - | |
| 164 | - // Our jQuery form has not been displayed. | |
| 178 | + // Our JS form has not been displayed. | |
| 165 | 179 | if ( empty( $_POST['menu-item-pll-detect'][ $menu_item_db_id ] ) ) { |
| 166 | 180 | if ( ! get_post_meta( $menu_item_db_id, '_pll_menu_item', true ) ) { // Our options were never saved. |
| 167 | - update_post_meta( $menu_item_db_id, '_pll_menu_item', $options ); | |
| 181 | + $this->update_menu_meta( $menu_item_db_id, array() ); | |
| 168 | 182 | } |
| 169 | - } else { | |
| 170 | - foreach ( array_keys( $options ) as $opt ) { | |
| 171 | - $options[ $opt ] = empty( $_POST[ 'menu-item-' . $opt ][ $menu_item_db_id ] ) ? 0 : 1; | |
| 183 | + return; | |
| 184 | + } | |
| 185 | + | |
| 186 | + $meta = array(); | |
| 187 | + | |
| 188 | + foreach ( Fields::get() as $name => $field ) { | |
| 189 | + if ( isset( $_POST[ "menu-item-{$name}" ][ $menu_item_db_id ] ) ) { | |
| 190 | + $meta[ $name ] = $_POST[ "menu-item-{$name}" ][ $menu_item_db_id ]; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized | |
| 172 | 191 | } |
| 173 | - update_post_meta( $menu_item_db_id, '_pll_menu_item', $options ); // Allow us to easily identify our nav menu item. | |
| 174 | 192 | } |
| 193 | + | |
| 194 | + $this->update_menu_meta( $menu_item_db_id, $meta ); | |
| 175 | 195 | } |
| 176 | 196 | |
| 177 | 197 | /** |
| 178 | 198 | * Assigns menu languages and translations based on (temporary) locations. |
| @@ -310,6 +330,21 @@ | ||
| 310 | 330 | } |
| 311 | 331 | } |
| 312 | 332 | |
| 313 | 333 | $this->options->set( 'nav_menus', $nav_menus ); |
| 334 | + } | |
| 335 | + | |
| 336 | + /** | |
| 337 | + * Stores the menu data into the database. | |
| 338 | + * | |
| 339 | + * @since 3.9 | |
| 340 | + * | |
| 341 | + * @param int $menu_id Menu ID. | |
| 342 | + * @param array $data Data to store. | |
| 343 | + * @return void | |
| 344 | + */ | |
| 345 | + private function update_menu_meta( int $menu_id, array $data ): void { | |
| 346 | + $validated = Fields::filter( new Settings( $data ) ); | |
| 347 | + $validated = Fields::add_legacy_settings( $validated ); | |
| 348 | + update_post_meta( $menu_id, '_pll_menu_item', $validated ); | |
| 314 | 349 | } |
| 315 | 350 | } |