ink ) { $permalink = get_permalink(); } // Map endpoint to options. $query_vars = WC()->query->get_query_vars(); $endpoint = ! empty( $query_vars[ $endpoint ] ) ? $query_vars[ $endpoint ] : $endpoint; $value = ( get_option( 'woocommerce_myaccount_edit_address_endpoint', 'edit-address' ) === $endpoint ) ? wc_edit_address_i18n( $value ) : $value; if ( get_option( 'permalink_structure' ) ) { if ( strstr( $permalink, '?' ) ) { $query_string = '?' . wp_parse_url( $permalink, PHP_URL_QUERY ); $permalink = current( explode( '?', $permalink ) ); } else { $query_string = ''; } $url = trailingslashit( $permalink ); if ( $value ) { $url .= trailingslashit( $endpoint ) . user_trailingslashit( $value ); } else { $url .= user_trailingslashit( $endpoint ); } $url .= $query_string; } else { $url = add_query_arg( $endpoint, $value, $permalink ); } return apply_filters( 'woocommerce_get_endpoint_url', $url, $endpoint, $value, $permalink ); } /** * Hide or adjust menu items conditionally. * * @param array $items Navigation items. * @return array */ function wc_nav_menu_items( $items ) { $logout_endpoint = get_option( 'woocommerce_logout_endpoint', 'customer-logout' ); if ( ! empty( $logout_endpoint ) && ! empty( $items ) && is_array( $items ) ) { foreach ( $items as $key => $item ) { if ( empty( $item->url ) ) { continue; } $path = wp_parse_url( $item->url, PHP_URL_PATH ) ?? ''; $query = wp_parse_url( $item->url, PHP_URL_QUERY ) ?? ''; $is_logout_link = strstr( $path, $logout_endpoint ) || strstr( $query, $logout_endpoint ); if ( ! $is_logout_link ) { continue; } if ( is_user_logged_in() ) { $items[ $key ]->url = wp_nonce_url( $item->url, 'customer-logout' ); } else { unset( $items[ $key ] ); } } } return $items; } add_filter( 'wp_nav_menu_objects', 'wc_nav_menu_items', 10 ); /** * Hide menu items in navigation blocks conditionally. * * Does the same thing as wc_nav_menu_items but for block themes. * * @since 9.3.0 * @param \WP_Block_list $inner_blocks Inner blocks. * @return \WP_Block_list */ function wc_nav_menu_inner_blocks( $inner_blocks ) { $logout_endpoint = get_option( 'woocommerce_logout_endpoint', 'customer-logout' ); if ( ! empty( $logout_endpoint ) && $inner_blocks ) { foreach ( $inner_blocks as $inner_block_key => $inner_block ) { $url = $inner_block->parsed_block['attrs']['url'] ?? ''; $path = wp_parse_url( $url, PHP_URL_PATH ) ?? ''; $query = wp_parse_url( $url, PHP_URL_QUERY ) ?? ''; $is_logout_link = strstr( $path, $logout_endpoint ) || strstr( $query, $logout_endpoint ); if ( ! $is_logout_link ) { continue; } if ( is_user_logged_in() ) { $inner_block->parsed_block['attrs']['url'] = wp_nonce_url( $inner_block->parsed_block['attrs']['url'], 'customer-logout' ); } else { unset( $inner_blocks[ $inner_block_key ] ); } } } return $inner_blocks; } add_filter( 'block_core_navigation_render_inner_blocks', 'wc_nav_menu_inner_blocks' ); /** * Fix active class in nav for shop page. * * @param array $menu_items Menu items. * @return array */ function wc_nav_menu_item_classes( $menu_items ) { if ( ! is_woocommerce() ) { return $menu_items; } $shop_page = wc_get_page_id( 'shop' ); $page_for_posts = (int) get_option( 'page_for_posts' ); if ( ! empty( $menu_items ) && is_array( $menu_items ) ) { foreach ( $menu_items as $key => $menu_item ) { $classes = (array) $menu_item->classes; $menu_id = (int) $menu_item->object_id; // Unset active class for blog page. if ( $page_for_posts === $menu_id && isset( $menu_item->object ) && 'page' === $menu_item->object ) { $menu_items[ $key ]->current = false; if ( in_array( 'current_page_parent', $classes, true ) ) { unset( $classes[ array_search( 'current_page_parent', $classes, true ) ] ); } if ( in_array( 'current-menu-item', $classes, true ) ) { unset( $classes[ array_search( 'current-menu-item', $classes, true ) ] ); } } elseif ( is_shop() && $shop_page === $menu_id && 'page' === $menu_item->object ) { // Set active state if this is the shop page link. $menu_items[ $key ]->current = true; $classes[] = 'current-menu-item'; $classes[] = 'current_page_item'; } elseif ( is_singular( 'product' ) && $shop_page === $menu_id ) { // Set parent state if this is a product page. $classes[] = 'current_page_parent'; } $menu_items[ $key ]->classes = array_unique( $classes ); } } return $menu_items; } add_filter( 'wp_nav_menu_objects', 'wc_nav_menu_item_classes', 2 ); /** * Fix active class in wp_list_pages for shop page. * * See details in https://github.com/woocommerce/woocommerce/issues/177. * * @param string $pages Pages list. * @return string */ function wc_list_pages( $pages ) { if ( ! is_woocommerce() ) { return $pages; } // Remove current_page_parent class from any item. $pages = str_replace( 'current_page_parent', '', $pages ); // Find shop_page_id through woocommerce options. $shop_page = 'page-item-' . wc_get_page_id( 'shop' ); if ( is_shop() ) { // Add current_page_item class to shop page. return str_replace( $shop_page, $shop_page . ' current_page_item', $pages ); } // Add current_page_parent class to shop page. return str_replace( $shop_page, $shop_page . ' current_page_parent', $pages ); } add_filter( 'wp_list_pages', 'wc_list_pages' );