'GET', 'callback' => 'build_posts', 'permission_callback' => '__return_true', )); register_rest_route('carhop-datas/v1/build', '/fonds-archives', array( 'methods' => 'GET', 'callback' => 'build_fonds_archives_posts_by_letter', 'permission_callback' => '__return_true', )); }); function carhop_posts_where_starts_with_letter($where, $query) { global $wpdb; $start_letter = $query->get('carhop_start_letter'); if (empty($start_letter)) { return $where; } $start_letter = mb_substr((string) $start_letter, 0, 1); $like = $wpdb->esc_like($start_letter) . '%'; return $where . $wpdb->prepare(" AND {$wpdb->posts}.post_title LIKE %s", $like); } // ################ FILTER POSTS ################ function build_posts($request) { $post_type = esc_html($request->get_param('post_type')); $etiquette = esc_html($request->get_param('etiquette')); $auteur = esc_html($request->get_param('auteur')); $sort_by = esc_html($request->get_param('sort_by')); $recherche = esc_html($request->get_param('recherche')); $offset = esc_html($request->get_param('offset')) ?? 0; $posts_per_page = esc_html($request->get_param('posts_per_page')) ?? -1; // Construire les arguments de la query WordPress $args = array( 'post_type' => $post_type, 'offset' => $offset, 'posts_per_page' => $posts_per_page, ); // Gestion du tri switch ($sort_by) { case 'date_desc': $args['orderby'] = 'date'; $args['order'] = 'DESC'; break; case 'date_asc': $args['orderby'] = 'date'; $args['order'] = 'ASC'; break; case 'title_asc': $args['orderby'] = 'title'; $args['order'] = 'ASC'; break; default: $args['orderby'] = 'date'; $args['order'] = 'DESC'; } // Filtre par étiquette (taxonomie) if (!empty($etiquette) && $etiquette != '1') { $args['tax_query'] = array( array( 'taxonomy' => 'etiquettes', 'field' => 'slug', 'terms' => $etiquette, ), ); } // Filtre par auteur (authors = relation multiple, main_author = auteur principal) if (!empty($auteur) && $auteur != '1') { $args['meta_query'] = array( 'relation' => 'OR', array( 'key' => 'authors', 'value' => '"' . $auteur . '"', 'compare' => 'LIKE', ), array( 'key' => 'main_author', 'value' => $auteur, 'compare' => 'LIKE', ), ); } // Recherche par mot-clé if (!empty($recherche)) { $args['s'] = $recherche; } $posts_query = new WP_Query($args); ob_start(); if ($posts_query->have_posts()) : while ($posts_query->have_posts()) : $posts_query->the_post(); get_template_part('template-parts/components/cards/post-card', null, array( 'ID' => get_the_ID(), 'current_post_type' => $post_type )); endwhile; else : echo '
Aucun article trouvé.
'; endif; wp_reset_postdata(); $html_template = ob_get_clean(); $response_data = array( 'html_template' => $html_template, 'post_count' => $posts_query->found_posts, 'query_args' => $args, // Pour debug ); $response = new WP_REST_Response($response_data); $response->set_status(200); return $response; } function build_fonds_archives_posts_by_letter($request) { $post_type = 'fonds-archives'; $sort_by = esc_html($request->get_param('sort_by')); $offset = esc_html($request->get_param('offset')) ?? 0; $posts_per_page = esc_html($request->get_param('posts_per_page')) ?? -1; $start_letter = sanitize_text_field($request->get_param('start_letter')); $show_all_letters = filter_var($request->get_param('show_all_letters'), FILTER_VALIDATE_BOOLEAN); // Construire les arguments de la query WordPress $args = array( 'post_type' => $post_type, 'offset' => $offset, 'posts_per_page' => $posts_per_page, ); // Si "show all" est actif, on n'applique aucun filtre alphabétique. if (!$show_all_letters && !empty($start_letter)) { $args['carhop_start_letter'] = $start_letter; } if ($show_all_letters) { remove_filter('posts_where', 'carhop_posts_where_starts_with_letter', 10); } // Gestion du tri switch ($sort_by) { case 'date_desc': $args['orderby'] = 'date'; $args['order'] = 'DESC'; break; case 'date_asc': $args['orderby'] = 'date'; $args['order'] = 'ASC'; break; case 'title_asc': $args['orderby'] = 'title'; $args['order'] = 'ASC'; break; default: $args['orderby'] = 'date'; $args['order'] = 'DESC'; } add_filter('posts_where', 'carhop_posts_where_starts_with_letter', 10, 2); $posts_query = new WP_Query($args); remove_filter('posts_where', 'carhop_posts_where_starts_with_letter', 10); ob_start(); if ($posts_query->have_posts()) : while ($posts_query->have_posts()) : $posts_query->the_post(); get_template_part('template-parts/components/cards/post-card', null, array( 'ID' => get_the_ID(), 'current_post_type' => $post_type )); endwhile; else : echo 'Aucune archive trouvée commençant par la lettre ' . '' . $start_letter . '
'; endif; wp_reset_postdata(); $html_template = ob_get_clean(); $response_data = array( 'html_template' => $html_template, 'post_count' => $posts_query->found_posts, 'query_args' => $args, // Pour debug ); $response = new WP_REST_Response($response_data); $response->set_status(200); return $response; }