274 lines
6.8 KiB
PHP
274 lines
6.8 KiB
PHP
<?php
|
|
|
|
add_action('rest_api_init', function () {
|
|
|
|
/* ----------------
|
|
BUILDING ROUTES
|
|
-----------------*/
|
|
|
|
|
|
// ################ FILTER ARTICLES ################
|
|
register_rest_route('carhop-datas/v1/build', '/posts', array(
|
|
'methods' => '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',
|
|
));
|
|
|
|
/* ----------------
|
|
INTERACTIONS ROUTES
|
|
-----------------*/
|
|
|
|
// ################ LIKE POST ################
|
|
|
|
register_rest_route('carhop-datas/v1/interactions', '/posts/like', array(
|
|
'methods' => 'POST',
|
|
'callback' => 'carhop_like_post',
|
|
'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 '<p>Aucun article trouvé.</p>';
|
|
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 '<p>Aucune archive trouvée commençant par la lettre ' . '<span class="font-extrabold">' . $start_letter . '</span></p>';
|
|
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 carhop_like_post($request)
|
|
{
|
|
|
|
$post_id = $request->get_param('post_id');
|
|
|
|
|
|
if (!$post_id) {
|
|
return new WP_Error('post_id_required', 'Post ID is required', array('status' => 400));
|
|
}
|
|
|
|
|
|
$post_id = intval($post_id);
|
|
|
|
// Vérifier que le post existe
|
|
if (!get_post($post_id)) {
|
|
return new WP_Error('post_not_found', 'Post non trouvé', array('status' => 404));
|
|
}
|
|
|
|
|
|
$likes_count = get_post_likes_count($post_id);
|
|
|
|
// Incrémenter le compteur
|
|
$new_likes = $likes_count + 1;
|
|
|
|
// Mettre à jour la meta
|
|
update_post_meta($post_id, 'likes_count', $new_likes);
|
|
|
|
$response_data = array(
|
|
'success' => true,
|
|
'post_id' => $post_id,
|
|
'likes_count' => $new_likes,
|
|
'message' => 'Like ajouté avec succès'
|
|
);
|
|
|
|
$response = new WP_REST_Response($response_data);
|
|
|
|
$response->set_status(200);
|
|
|
|
return $response;
|
|
}
|