> */ public static function extract_all(): array { global $wpdb; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Background job; one query for all menu items. $rows = $wpdb->get_results( $wpdb->prepare( "SELECT p.ID, p.post_title, url.meta_value AS url FROM {$wpdb->posts} p INNER JOIN {$wpdb->postmeta} type ON type.post_id = p.ID AND type.meta_key = '_menu_item_type' AND type.meta_value = %s INNER JOIN {$wpdb->postmeta} url ON url.post_id = p.ID AND url.meta_key = %s WHERE p.post_type = 'nav_menu_item' AND p.post_status = 'publish'", 'custom', self::META_KEY ) ); $home = home_url( '/' ); $result = array(); foreach ( (array) $rows as $row ) { $url = Url::normalize( (string) $row->url, $home ); if ( null === $url ) { continue; } $menus = wp_get_post_terms( (int) $row->ID, 'nav_menu', array( 'fields' => 'names' ) ); $menu = is_array( $menus ) && ! empty( $menus ) ? (string) reset( $menus ) : ''; /* translators: %s: menu name. */ $context = '' !== $menu ? sprintf( __( 'Menu: %s', 'unbreak' ), $menu ) : __( 'Menu', 'unbreak' ); $result[ (int) $row->ID ] = array( array( 'url' => $url, 'element' => 'a', 'anchor_text' => HtmlParser::truncate( HtmlParser::squash( wp_strip_all_tags( (string) $row->post_title ) ), 255 ), 'context' => $context, 'source_key' => self::META_KEY, ), ); } return $result; } }