$item ) { if ( is_array( $item ) && isset( $item['url'] ) && is_string( $item['url'] ) && '' !== $item['url'] ) { $items[ $code ]['url'] = remove_query_arg( self::EDIT_LANG_ARG, $item['url'] ); } } return $items; } public function carry_admin_bar(): void { global $wp_admin_bar; if ( ! $wp_admin_bar instanceof \WP_Admin_Bar ) { return; } $page = $GLOBALS['plugin_page'] ?? ''; $paged = is_string( $page ) && str_starts_with( $page, 'rooster-' ) ? Request::int( 'paged' ) : 0; foreach ( (array) $wp_admin_bar->get_nodes() as $node ) { if ( ! is_object( $node ) || ( 'languages' !== $node->id && 'languages' !== $node->parent ) || ! is_string( $node->href ) || '' === $node->href ) { continue; } $was = html_entity_decode( $node->href, ENT_QUOTES | ENT_HTML5, 'UTF-8' ); $href = remove_query_arg( self::EDIT_LANG_ARG, $was ); if ( $paged > 1 ) { $href = add_query_arg( 'paged', $paged, $href ); } if ( $href !== $was ) { $wp_admin_bar->add_node( array( 'id' => $node->id, 'href' => $href, ) ); } } } public function register(): void { if ( self::$registered ) { return; } self::$registered = true; add_filter( 'wpml_ls_language_url', array( $this, 'carry' ), 10, 2 ); add_filter( 'pll_translation_url', array( $this, 'carry' ), 10, 2 ); add_filter( 'wpml_active_languages', array( $this, 'carry_list' ), 20 ); add_filter( 'icl_ls_languages', array( $this, 'carry_list' ), 20 ); } public function carry_list( $languages ) { if ( ! is_array( $languages ) || is_admin() || wp_doing_ajax() ) { return $languages; } $args = self::args(); if ( array() === $args ) { return $languages; } foreach ( $languages as $code => $lang ) { if ( is_array( $lang ) && isset( $lang['url'] ) && is_string( $lang['url'] ) && '' !== $lang['url'] ) { $languages[ $code ]['url'] = add_query_arg( $args, $lang['url'] ); } } return $languages; } public function carry( $url, $lang = null ) { unset( $lang ); if ( ! is_string( $url ) || '' === $url ) { return $url; } $args = self::args(); return array() === $args ? $url : add_query_arg( $args, $url ); } private const PORTAL_INTS = array( 'rl_org', 'rl_tpl', 'rl_per_page', 'rl_user', 'rl_course', 'rl_job_role', 'rl_location', 'rl_unit', 'rl_quiz' ); private const PORTAL_KEYS = array( 'rl_tab', 'rl_view', 'rl_orderby', 'rl_order', 'rl_status', 'rl_staff', 'rl_role', 'rl_result' ); public static function args(): array { $args = array( 'rl_cat' => Request::category(), 'rl_sort' => Request::sort(), 'rl_page' => Request::int( 'rl_page' ), ); foreach ( self::PORTAL_INTS as $key ) { $args[ $key ] = Request::is_list( $key ) ? Request::ints( $key ) : Request::int( $key ); } foreach ( self::PORTAL_KEYS as $key ) { $args[ $key ] = Request::is_list( $key ) ? Request::keys( $key ) : Request::key( $key ); } $after = Request::cursor( 'rl_after' ); $after = '' !== $after ? $after : Request::opaque( 'rl_after' ); if ( '' !== $after ) { $args['rl_after'] = $after; } return array_filter( $args, static fn( $value ): bool => 0 !== $value && '' !== $value && array() !== $value ); } }