queried_object_id and sets $query->query_vars['page_id'] to 0 * and does set and use $query->query_vars['page_id'] if permalinks are not used :( * * @since 0.3.2 * * @param WP_Query $query Instance of WP_Query. * @return int page_id */ protected function get_page_id( $query ) { if ( ! empty( $query->query_vars['pagename'] ) && isset( $query->queried_object_id ) ) { return $query->queried_object_id; } if ( isset( $query->query_vars['page_id'] ) ) { return $query->query_vars['page_id']; } return 0; // No page queried. } /** * Fixes query vars on translated front page when the front page displays the shop, my account or the checkout. * * @since 0.3.2 * * @param PLL_Language|false $lang False or language object. * @param WP_Query $query WP_Query object. * @return PLL_Language|false */ public function pll_set_language_from_query( $lang, $query ) { $qvars = $query->query_vars; $languages = PLL()->model->get_languages_list(); $pages = wp_list_pluck( $languages, 'page_on_front' ); // Shop on front. if ( in_array( wc_get_page_id( 'shop' ), $pages ) ) { // Redirect the language page to the homepage when using a static front page. if ( ( PLL()->options['redirect_lang'] || PLL()->options['hide_default'] ) && $query->is_tax( 'language' ) && $this->is_front_page( $query ) ) { $lang = PLL()->model->get_language( $qvars['lang'] ); $query->is_home = false; $query->is_tax = false; $query->is_page = true; $query->is_post_type_archive = true; $query->set( 'page_id', $lang->page_on_front ); $query->set( 'post_type', 'product' ); unset( $query->query_vars['lang'] ); // Reset queried object. $query->queried_object = null; $query->queried_object_id = 0; } // Set the language when requesting a static front page. elseif ( ( $page_id = $this->get_page_id( $query ) ) && false !== $n = array_search( $page_id, $pages ) ) { $lang = $languages[ $n ]; $query->is_home = false; $query->is_page = true; $query->is_post_type_archive = true; $query->set( 'page_id', $page_id ); $query->set( 'post_type', 'product' ); } // Multiple domains (when the url contains the page slug). elseif ( is_post_type_archive( 'product' ) && ! empty( PLL()->curlang ) ) { $query->is_page = true; $query->set( 'page_id', PLL()->curlang->page_on_front ); } // Language set from the content. elseif ( is_post_type_archive( 'product' ) && ! empty( $qvars['lang'] ) && $lang = PLL()->model->get_language( $qvars['lang'] ) ) { $query->is_page = true; $query->set( 'page_id', $lang->page_on_front ); } } // My Account and checkout endpoints. if ( array_intersect( array( wc_get_page_id( 'myaccount' ), wc_get_page_id( 'checkout' ) ), $pages ) && array_intersect( array_keys( $query->query ), WC()->query->get_query_vars() ) ) { if ( ! $this->get_page_id( $query ) ) { if ( empty( $qvars['lang'] ) || ! $lang = PLL()->model->get_language( $qvars['lang'] ) ) { // Language set from the content + language code hidden in the url. $lang = PLL()->model->get_language( PLL()->options['default_lang'] ); } $query->is_home = false; $query->is_tax = false; $query->is_archive = false; $query->is_page = true; $query->is_singular = true; $query->set( 'page_id', $lang->page_on_front ); // Reset queried object. $query->queried_object = null; $query->queried_object_id = 0; } add_filter( 'redirect_canonical', '__return_false' ); add_filter( 'pll_check_canonical_url', '__return_false' ); } return $lang; } /** * Tells if the given query corresponds to the front page. * This method inspects `WP_Query::$query` and uses a list of query vars that can be set without changing the type * of the page displayed. For example, the front page with `?rating_filter=5` is still the front page * (`rating_filter` comes from WC's widget "Products by Rating list"). * * @see WC_Widget_Layered_Nav_Filters * * @since 1.8.1 * * @param WP_Query $query An instance of the main query. * @return bool */ private function is_front_page( WP_Query $query ) { if ( empty( $query->query['lang'] ) ) { // This is not the front page you're looking for (handled by PLL). return false; } $vars = array( // WP. 'cpage', 'orderby', 'page', 'paged', 'preview', // PLL. 'lang', // WC. 'max_price', 'min_price', 'rating_filter', ); foreach ( wc_get_attribute_taxonomies() as $attribute ) { $vars[] = "filter_{$attribute->attribute_name}"; $vars[] = "query_type_{$attribute->attribute_name}"; } /** * Allows to filter the list of query vars that can be set without changing the type of the page displayed. * * @since 1.8.1 * * @param string[] $var The list of query vars. * @param WP_Query $query An instance of the main query. */ $vars = apply_filters( 'pllwc_front_page_query_vars', $vars, $query ); return empty( array_diff_key( $query->query, array_flip( $vars ) ) ); } }