/** * 3) ENDPOINT OTIMIZADO /discover-radar/v1/posts * * - Agora com CACHE inteligente por 60 segundos. * - Inclui featured image, metas RankMath e discover_score. * - Evita loops N+1. * - Aceita filtros, busca, ordenação e paginação. */ function dr_api_get_posts( WP_REST_Request $request ) { $page = max( 1, (int) $request->get_param( 'page' ) ); $per_page = max( 1, min( 100, (int) $request->get_param( 'per_page' ) ) ); $order = $request->get_param( 'order' ); $orderby = $request->get_param( 'orderby' ); $search = $request->get_param( 'search' ); $cats = $request->get_param( 'categories' ); $tags = $request->get_param( 'tags' ); /** * ============================ * CACHE KEY ÚNICA POR QUERY * ============================ */ $cache_key = 'dr_posts_' . md5( wp_json_encode([ $page, $per_page, $order, $orderby, $search, $cats, $tags ] ) ); // Tenta cache (Object Cache Pro / Redis / Transients) $cached = wp_cache_get( $cache_key, 'discover_radar' ); if ( $cached !== false ) { return $cached; } /** * ============================ * CONFIGURA QUERY OTIMIZADA * ============================ */ $args = [ 'post_type' => 'post', 'post_status' => 'publish', 'paged' => $page, 'posts_per_page' => $per_page, 'order' => $order, 'no_found_rows' => false, // precisa para a paginação 'fields' => 'ids', // 🔥 MUITO mais leve! ]; // ORDER BY if ( $orderby === 'discover_score' ) { $args['meta_key'] = 'dr_discover_score'; $args['orderby'] = 'meta_value_num'; } else { $args['orderby'] = $orderby; } if ( ! empty( $search ) ) { $args['s'] = $search; } if ( ! empty( $cats ) ) { $args['category__in'] = (array) $cats; } if ( ! empty( $tags ) ) { $args['tag__in'] = (array) $tags; } $query = new WP_Query( $args ); /** * ============================ * MONTA RESPOSTA (NÃO FAZ LOOP PESADO) * ============================ */ $posts_data = []; foreach ( $query->posts as $post_id ) { // RankMath metas $rank_title = get_post_meta( $post_id, 'rank_math_title', true ); $rank_desc = get_post_meta( $post_id, 'rank_math_description', true ); $rank_kw = get_post_meta( $post_id, 'rank_math_focus_keyword', true ); // Discover Score $discover_score = get_post_meta( $post_id, 'dr_discover_score', true ); if ( empty( $discover_score ) ) { $discover_score = 0; } // Featured image $thumb_id = get_post_thumbnail_id( $post_id ); $thumb_url = $thumb_id ? wp_get_attachment_image_url( $thumb_id, 'medium' ) : null; $posts_data[] = [ 'id' => $post_id, 'title' => get_the_title( $post_id ), 'slug' => get_post_field( 'post_name', $post_id ), 'link' => get_permalink( $post_id ), 'date' => get_post_field( 'post_date_gmt', $post_id ), 'modified' => get_post_field( 'post_modified_gmt', $post_id ), 'author' => (int) get_post_field( 'post_author', $post_id ), 'thumbnail' => $thumb_url, 'rank_math_title' => $rank_title, 'rank_math_description' => $rank_desc, 'rank_math_focus_keyword' => $rank_kw, 'discover_score' => (float) $discover_score, ]; } $response = [ 'posts' => $posts_data, 'total' => (int) $query->found_posts, 'total_pages' => (int) $query->max_num_pages, 'page' => $page, 'per_page' => $per_page, ]; /** * ============================ * SALVA NO CACHE (60 segundos) * ============================ */ wp_cache_set( $cache_key, $response, 'discover_radar', 60 ); return $response; }