Construction d’une WP Query / Filtres AJAX pour custom post

  • WordPress :4.8.3
  • Statut : non résolu
3 sujets de 1 à 3 (sur un total de 3)
  • Auteur
    Messages
  • #2036582
    guillome
    Participant
    Initié WordPress
    2 contributions

    Bonjour,

    Voila, je suis un petit nouveau ici… après 10 ans de travail sur Magento, je débarque seulement cette année pour faire mes premiers pas sur WordPress. Euh… tout d’abord, whoua, qu’elle simplicité a côté de cette bête farouche à dompter qu’est Magento.

    Sinon, je suis un genre hybride, à la base chef de projet, mais tout de même passionné d’informatique depuis le plus jeune âge, j’ai développé au fur et à mesure des compétences en infogérance serveur, en CSS, en PHP, en BDD…  mais clairement je ne suis pas un développeur, donc parfois ça devient malheureusement compliqué et même en « tatonant » je n’arrive pas toujours à mes fins 🙂

    C’est pourquoi je tente ma chance ici. Merci d’avance.

    Ma configuration WP actuelle

    • Version de PHP/MySQL : 5.6.33-0+deb8u1
    • Thème utilisé : Custom / Basé sur une grille knacss CSS
    • Extensions en place : (pas mal, mais je ne pense pas qu’elles rentrent en ligne de compte pour la demande 🙂
    • Nom de l’hébergeur : OVH
    • Adresse du site : lien officiel (surf-lodges.com) / Je travaille actuellement sur une preprod

    Problème(s) rencontré(s) : Construction d’une WP Query pour plusieurs taxonomies / Problématique rencontrée après la mise en place d’un système de filtres AJAX pour Custom Post à partir d’un excellent tuto trouvé sur le net.

    Sur mon site wordpress j’ai des custom post auxquels sont associés des taxonomies.

    Comme je disais j’ai trouvé ce super tuto permettant de mettre en place sur un template type archive une filtration sur les taxo. en ajax.
    https://rudrastyh.com/wordpress/ajax-post-filters.html

    Actuellement le système propose de filtrer sur UNE taxonomie mais moi je souhaite pouvoir associer plusieurs taxonomies.

    Bien entendu, dans le cas ou l’internaute ne choisi de filtrer qu’avec une seule taxonomie, je veux tout de même pouvoir lui offrir des résultats.

    J’ai réussi à modifier la fonction pour filtrer deux taxo en même temps MAIS dès qu’il n’y en a plus qu’une seule, je bloque.

    Je ne pense pas que la construction de la Query soit si compliqué mais là c’est le manque de compétence qui fait que je suis dans une impasse.

    Je vous propose de vous mettre :

    • le code originel
    • le code modifié
    • la proposition faite par l’auteur suite à ma demande

    SI quelqu’un pouvait m’aider à finaliser la construction de la requête, ce serait un peu mon noël après l’heure ou largement avant l’heure 😉

    function misha_filter_function(){
    $args = array(
        'orderby' => 'date', // we will sort posts by date
        'order' => $_POST['date'] // ASC или DESC
    );
    
    // for taxonomies / categories
    if( isset( $_POST['categoryfilter'] ) )
        $args['tax_query'] = array(
            array(
                'taxonomy' => 'category',
                'field' => 'id',
                'terms' => $_POST['categoryfilter']
            )
        );
    
    // create $args['meta_query'] array if one of the following fields is filled
    if( isset( $_POST['price_min'] ) && $_POST['price_min'] || isset( $_POST['price_max'] ) && $_POST['price_max'] || isset( $_POST['featured_image'] ) && $_POST['featured_image'] == 'on' )
        $args['meta_query'] = array( 'relation'=>'AND' ); // AND means that all conditions of meta_query should be true
    
    // if both minimum price and maximum price are specified we will use BETWEEN comparison
    if( isset( $_POST['price_min'] ) && $_POST['price_min'] && isset( $_POST['price_max'] ) && $_POST['price_max'] ) {
        $args['meta_query'][] = array(
            'key' => '_price',
            'value' => array( $_POST['price_min'], $_POST['price_max'] ),
            'type' => 'numeric',
            'compare' => 'between'
        );
    } else {
        // if only min price is set
        if( isset( $_POST['price_min'] ) && $_POST['price_min'] )
            $args['meta_query'][] = array(
                'key' => '_price',
                'value' => $_POST['price_min'],
                'type' => 'numeric',
                'compare' => '>'
            );
    
        // if only max price is set
        if( isset( $_POST['price_max'] ) && $_POST['price_max'] )
            $args['meta_query'][] = array(
                'key' => '_price',
                'value' => $_POST['price_max'],
                'type' => 'numeric',
                'compare' => '<'
            );
    }
    
    
    // if post thumbnail is set
    if( isset( $_POST['featured_image'] ) && $_POST['featured_image'] == 'on' )
        $args['meta_query'][] = array(
            'key' => '_thumbnail_id',
            'compare' => 'EXISTS'
        );
    
    $query = new WP_Query( $args );
    
    if( $query->have_posts() ) :
        while( $query->have_posts() ): $query->the_post();
            echo '<h2>' . $query->post->post_title . '</h2>';
        endwhile;
        wp_reset_postdata();
    else :
        echo 'No posts found';
    endif;
    
    die();
    } 
    add_action('wp_ajax_myfilter', 'misha_filter_function'); 
    add_action('wp_ajax_nopriv_myfilter', 'misha_filter_function');
    Code originel (function)

    // for taxonomies / if destinations and activities are set
    if( isset( $_POST['categoryfilter'] ) && isset ($_POST['activitefilter'])  ) {
        $args['tax_query'] = array(
    
        'relation' => 'AND',
    
            array(
                'taxonomy' => 'destination',
                'field' => 'id',
                'terms' => $_POST['categoryfilter']
            ),
            array(
                'taxonomy' => 'activite',
                'field' => 'id',
                'terms' => $_POST['activitefilter']
            ),
        );
    
    
    } else {
    if( isset( $_POST['categoryfilter']) || !empty( $_POST['activitefilter'] ) )// for taxonomies / only destinations are set
        $args['tax_query'] = array(
                'taxonomy' => 'destination',
                'field' => 'id',
                'terms' => $_POST['categoryfilter']
        );
    if( !empty( $_POST['categoryfilter']) || isset( $_POST['activitefilter'] ) )// for taxonomies / only activities are set
        $args['tax_query'] = 
            array(
                'taxonomy' => 'activite',
                'field' => 'id',
                'terms' => $_POST['activitefilter']
        );
    
    }
    Code modifié

    // first of all before filtering define the empty tax_query
    $args['tax_query'] = array();
    
    // or with relation
    $args['tax_query'] = array( 'relation' => 'AND' );
    
    // after that when you begin filtering it, add elements to array with
    // $args['tax_query'][] = 'NEW ELEMENT';
    // example: 
    $args['tax_query'][] = array(
    'taxonomy' => 'activite',
    'field' => 'id',
    'terms' => $_POST['activitefilter']
    );
    Un élément de solution fournit par l'auteur

    #2041727
    yrdna
    Participant
    Chevalier WordPress
    178 contributions

    Bonsoir,

    Pour ce type de recherche multi-taxonomies j’ai utilisé le plugin Ultimate Wp Query Search Filter >> https://www.echodesplugins.li-an.fr/plugins/ultimate-wp-query-search-filter/

    Il y a aussi https://facetwp.com/ qui à l’air bien

    #2044819
    guillome
    Participant
    Initié WordPress
    2 contributions

    Bonjour,

    Merci beaucoup pour votre aide et votre suggestion.

    Je n’avais jamais trouvé celui-ci, j’avais pourtant recherché et déployé pas mal de plugin promettant la recherche multi taxo.

    J’ai essayé l’extension, ça a l’air pas mal… j’espère tout de même trouvé une réponse à ma précédente problématique ayant déjà charté tous les forms en front etc, il ne me reste que la requête à finaliser.

    Mais si jamais je trouve pas de solution, grâce à vous, j’ai une solution de replis 🙂

    Encore merci.

3 sujets de 1 à 3 (sur un total de 3)
  • Vous devez être connecté pour répondre à ce sujet.