/**
* 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;
}
Nego Di anuncia nova música "Amiga da Onça"