' . esc_html__( 'Smart Matching setting saved.', 'ai-search' ) . '
'; } } ?> true, 'exclude_from_search' => false ], 'objects' ); unset( $ai_status_types['attachment'] ); $ai_status_cache_key = 'ai_search_index_status_v1'; $ai_status_cached = get_transient( $ai_status_cache_key ); if ( is_array( $ai_status_cached ) && isset( $ai_status_cached['rows'], $ai_status_cached['models'] ) ) { $ai_status_rows = $ai_status_cached['rows']; $ai_status_by_model = $ai_status_cached['models']; } else { $ai_status_rows = $wpdb->get_results( "SELECT p.post_type, COUNT(*) AS total, SUM( CASE WHEN pm.post_id IS NULL THEN 0 ELSE 1 END ) AS indexed FROM {$wpdb->posts} p LEFT JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID AND pm.meta_key = '_ai_search_embedding' WHERE p.post_status = 'publish' GROUP BY p.post_type", OBJECT_K ); // v1.35.0: per-model breakdown per post type. Posts embedded before 1.35 // do not have the _ai_search_embedding_model sidecar - they show up in // the "unknown" bucket and get resolved the moment the user regenerates. $ai_model_rows = $wpdb->get_results( "SELECT p.post_type, COALESCE( mm.meta_value, '' ) AS model, COUNT(*) AS c FROM {$wpdb->posts} p INNER JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID AND pm.meta_key = '_ai_search_embedding' LEFT JOIN {$wpdb->postmeta} mm ON mm.post_id = p.ID AND mm.meta_key = '_ai_search_embedding_model' WHERE p.post_status = 'publish' GROUP BY p.post_type, model" ); $ai_status_by_model = []; foreach ( (array) $ai_model_rows as $r ) { $pt = (string) $r->post_type; $model = (string) $r->model; $bucket = 'unknown'; if ( 'text-embedding-3-large' === $model ) { $bucket = 'large'; } elseif ( 'text-embedding-3-small' === $model ) { $bucket = 'small'; } if ( ! isset( $ai_status_by_model[ $pt ] ) ) { $ai_status_by_model[ $pt ] = [ 'large' => 0, 'small' => 0, 'unknown' => 0 ]; } $ai_status_by_model[ $pt ][ $bucket ] += (int) $r->c; } set_transient( $ai_status_cache_key, [ 'rows' => $ai_status_rows, 'models' => $ai_status_by_model, ], HOUR_IN_SECONDS ); } $ai_status_pending = 0; ?>| labels->name ); ?> | —'; } else { $parts = []; if ( $models['large'] > 0 ) { $parts[] = '' . esc_html( number_format_i18n( $models['large'] ) ) . ' ' . esc_html__( 'on large', 'ai-search' ); } if ( $models['small'] > 0 ) { $parts[] = '' . esc_html( number_format_i18n( $models['small'] ) ) . ' ' . esc_html__( 'on small', 'ai-search' ); } if ( $models['unknown'] > 0 ) { $parts[] = '' . esc_html( number_format_i18n( $models['unknown'] ) ) . ' ' . esc_html__( 'unknown', 'ai-search' ) . ''; } echo wp_kses( implode( ' · ', $parts ), [ 'strong' => [], 'span' => [ 'class' => true ] ] ); } ?> | 0 ) { echo '' . esc_html( number_format_i18n( $missing ) ) . ''; } else { echo '' . esc_html__( 'Up to date', 'ai-search' ) . ''; } ?> |
' . esc_html( number_format_i18n( $ai_status_unknown_total ) ) . '' ); ?>
0 ) : ?>' . esc_html( number_format_i18n( $ai_status_pending ) ) . '' ); ?>