[Résolu] Requête php wordpress filtre catégorie (Créer un compte)

  • WordPress :5.2
  • Statut : résolu
  • Ce sujet contient 12 réponses, 5 participants et a été mis à jour pour la dernière fois par Oceane_974, le il y a 4 mois.
13 sujets de 1 à 13 (sur un total de 13)
  • Auteur
    Messages
  • #2293705
    Oceane_974
    Participant
    Initié WordPress
    8 contributions

    Bonjour, j’aurais besoin d’aide pour une requête php. Je travaille en ce moment dans la création d’un site pour une entreprise. Je débute sur wordpress. Et c’est la première que je fait appelle à un forum pour de l’aide
    En résumer, j’ai fait une requête php pour récupérer tous les articles du même catégorie. Mon but est de crée une page dans laquelle je dois avoir un filtre qui permet à utilisateur de filtre, c’est recherche par catégorie comme par exemple https://app.labox.tf1pub.fr/documents/commercialtermsCGV

    Ex : la requête va sélection tous les articles en rapport à la catégorie média.

    Malgré mes recherches est test, je n’ai pas pu trouver la solution. Pouvez-vous s’il vous plaît m’aider

    //SELECT * FROM wp_asbposts p JOIN wp_asbterm_relationships r ON r.object_id = p.ID JOIN wp_asbterm_taxonomy t ON r.term_taxonomy_id = t.term_taxonomy_id JOIN wp_asbterms terms ON terms.term_id = t.term_id WHERE t.taxonomy ='category' AND parent='12' AND p.post_type = 'post' ORDER BY `post_date` DESC

    • Ce sujet a été modifié le il y a 4 mois et 1 semaine par PhiLyon.
    • Ce sujet a été modifié le il y a 4 mois et 1 semaine par Oceane_974.
    • Ce sujet a été modifié le il y a 4 mois et 1 semaine par Oceane_974.
    Fichiers joints :
    Vous devez être connecté pour voir les fichiers joints.
    #2293706
    PhiLyon
    Modérateur
    Maître WordPress
    25679 contributions

    Bonjour.

    Efface le contenu de ton message et recommences ton copier/coller en faisant Ctrl+Maj+V

    🙂

    #2293712
    Oceane_974
    Participant
    Initié WordPress
    8 contributions

    Bonjour j’ai modif merci de l’info 🙂

    #2293749
    Inglebard
    Participant
    Chevalier WordPress
    111 contributions

    Bonjour,

    Essai de regarder du coté de “get_posts()” et “WP_Query” pour faire la requête.

     

    Après tu peux créer un formulaire standard et utiliser “get_query_var()”. Tu peux inclure tous ça dans un shortcode/plugin.

    #2293811
    virtazp
    Participant
    Padawan WordPress
    79 contributions

    Salut 🙂
    C’est pas évident pour quelqu’un qui débute avec WP mais voilà comment il faut que tu t’y prennes :

    (Vu ta requête, je me dis que tu as un peu de connaissance en code)

    1. Avec WordPress (WP) pas besoin de requête SQL. Tu créés ton template. Le modèle pour appellé des articles ou des posts en général c’est ça :
      $loop = new WP_Query(array('post_type' => 'post', 'posts_per_page' => 6));
      if ($loop->have_posts()) :
          while ($loop->have_posts()) : $loop->the_post();
              // Affiche ce tu as saisies dans ton article
              get_the_content();
          endwhile;
      endif;
      wp_reset_query();

    2. Si tu veux filtrer, c’est un peu plus complexe car tu dois activer l’AJAX de WP et te servir de Javascript
      1. function.php de ton thème actif:
        // Activation ajax natif wordpress
        add_action('wp_head', 'myplugin_ajaxurl');
        function myplugin_ajaxurl()
        {
          echo '<script type="text/javascript">
                   var ajaxurl = "' . admin_url('admin-ajax.php') . '";
                 </script>';
        }

        Cela va permettre d’avoir une variable “ajaxurl” défini avec la bonne adresse à utiliser pour la requête ajax post à venir.

      2. Code à insérer dans script.js du thème actif
        jQuery.post(
            ajaxurl, {
                'action': 'nom_de_laction',
                'parametre': "parametre_a_faire_passer"
            },
            function(response) {
                // Ca sera le retour (callback) de ta requête contenant les articles filtrés
                document.getElementById('id').innerHTML = response;
            }
        );

        Tu peux voir dans ce code “ajaxurl”, on récupère ce qu’on a défini dans function.php, ici. “action” te servira pour la dernière méthode qu’il nous reste à créer, et “parametre” sera le paramètre à faire passer comme les filtres (Tu récupèrera certainement la valeur d’un select)

      3. Function.php de nouveau :
        // Ajout de l'action issu de ton javascript 
        add_action('wp_ajax_nom_de_ton_action', 'nom_de_ton_action');
        // Ajout de l'action issu de ton javascript nopriv (non connecté)
        add_action('wp_ajax_nopriv_nom_de_ton_action', 'nom_de_ton_action');
        
        function nom_de_ton_action()
        {
          $args = array(
            'post_status' => "publish",
            'post_type' => "post",
            // $_POST['parametre] est le paramètre que tu as envoyé depuis ton javascript, c'est lui le filtre
            'category_name' => $_POST['parametre']
          );
        
          $ajax_query = new WP_Query($args);
        
          if ($ajax_query->have_posts()) {
            while ($ajax_query->have_posts()) : $ajax_query->the_post();
              get_the_content();
            endwhile;
          }
          wp_reset_query();
          die();
        }

    Et voilà. Tu défini d’abord l’url pour les requêtes (1) ensuite fais une requêtes ajax post en envoyant comme paramètre le nom des catégories par exemple (2) et tu traites cette requêtes dans function.php (3). Ensuite c’est le callback de ta requêtes post en javascript qui affiche le résultat.

    J’espère ne pas t’avoir trop embrouillé ^^

    • Cette réponse a été modifiée le il y a 4 mois et 1 semaine par virtazp.
    #2293825
    Oceane_974
    Participant
    Initié WordPress
    8 contributions

    Tout d’abord, je tiens à vous remercier de votre précieuse aide^^. Je débute sur wordpress, mais je suis développeuse web en contrat pro 🙂

    J’ai remarquer dans ma demande que je n’ai pas précisé mon vrai problème x), la requête que j’ai fait précédemment était pour sélection 1 catégorie, ma problématique était de faire une requête pour sélect 2 catégories en même temps.

    Cependant grâce à @Inglebardj’ai pus trouvé une méthode plus simple avec  “get_posts()” et “WP_Query

     

    
    <?php
    
    /*
    Template Name: OffresCGV
    */
    
    
    //$the_query = new WP_Query( array( 'cat' => 12 ) );
    
    //Filtre 2 catégories
    $the_query = new WP_Query( array( 'cat' => array( 12, 13 ) ) );
    if ( $the_query->have_posts() ) {
    
      
    
        while ( $the_query->have_posts() ) {
    
            $the_query->the_post();
            echo '<h4 class="card-title text-center">'.get_the_title().'</h4><br>' ;
    
    
    
            echo '<div class="col-md-4">' ;
             echo '<div class="card">' ;
    
    			   echo '<h4 class="card-title text-center">'.get_the_title().'</h4>' ;
    			//  echo '<a href= "'.get_the_guid().'" >';
    			 echo '<div class="card-picture text-center">'.the_post_thumbnail().'</div>';
    
       
           echo'</div>';
           echo'</div>';
    
    
    
          }
    
       
    
      } 
    else {
    
    }
    wp_reset_postdata();

    • Cette réponse a été modifiée le il y a 4 mois et 1 semaine par Oceane_974.
    #2293830
    Oceane_974
    Participant
    Initié WordPress
    8 contributions

    Pour le moment, je ne suis pas encore à l’étape du AJAX, mais je prend note de se que tu ma dit @virtazp^^

    J’ai pu obtenir le résultat suivante(cf.screenshot) mais je constate une 2eme prob ma requête me permet d’afficher tout les articles des 2 catégorie parents et enfants se qui fait un totale de 11 articles mais le résultats n’est pas 10 articles. Ce n’est pas un prob lier à mon back-office wordpress, car j’obtient un total de 11 articles.

    Ma question est la suivante :Il y a t-il via à ma requête précédente une limite du nombre de résultat d’ou pourquoi il affiche 10 au lieux de 11 articles.

     

    • Cette réponse a été modifiée le il y a 4 mois et 1 semaine par Oceane_974.
    • Cette réponse a été modifiée le il y a 4 mois et 1 semaine par Oceane_974.
    • Cette réponse a été modifiée le il y a 4 mois et 1 semaine par Oceane_974.
    Fichiers joints :
    Vous devez être connecté pour voir les fichiers joints.
    #2293840
    Inglebard
    Participant
    Chevalier WordPress
    111 contributions

    Oui il y a une limite.

    Tu doit mettre en place la pagination (regarde le fichier archive.php ou single.php des thèmes wordpress par défaut) ou régler le nombre max de post à afficher dans “Réglages” => “Lecture”

    #2293850
    ferman
    Participant
    Maître WordPress
    2504 contributions

    Bonjour,

    Votre requête SQL st un peu compliquée mais elle fonctionne bien.  Avec elle vous sortez tous les articles des catégories enfant de la catégorie “12” (pas la catégorie 12). C’est bien ce que vous observez?

    Cela vous donne beaucoup de renseignements (voir pièce jointe: votre requête avec ma base de données: cat-1b est une catégorie enfant, j’ai omis les autres, de la catégorie 5,)  mais pas très utiles à mon avis.

    Ensuite cela dépend de ce que vous voulez faire. Montrer quelque chose qui a l’aspect l’aspect d’une page blog (titre de l’article , extrait, image, auteur…), avoir simplement une liste de titres avec des liens vers les articles, autre chose?

    Dans tous les cas, le principe est de partir d’un formulaire (c’est ce que vous avez déjà fait je crois) et suivant la case cochée vous déclenchez une fonction avec des paramètres légèrement différents (la variable catégorie).

    La fonction elle-même peut être une requête SQL “convertie” en php (wpdb) ou une fonction WordPress (plusieurs possibilités). Tout dépend réellement de votre projet. Vous devriez préciser.

    EDIT: Je n’avais pas vu les dernières réponses et le temps que je rédige la mienne (de réponse), les choses ont bien avancé. Donc ma contribution n’est plus vraiment utile. Bon courage.

     

    • Cette réponse a été modifiée le il y a 4 mois et 1 semaine par ferman.
    Fichiers joints :
    Vous devez être connecté pour voir les fichiers joints.
    #2293857
    Oceane_974
    Participant
    Initié WordPress
    8 contributions

    Effectivement @Inglebard, c’est une solution, mais je préfère forcer la valeur comme si dessous

    Pour éviter d’avoir trop de résultats sur la page par default dans le wordpress je laisse 10 et ma valeur max 20. Merci encore pour toute vos réponse je reviendrais vers vous si j’ai d’autre point de blocage 🙂

    Toutes les contributions sont bonnes à prendre 🙂

     $the_query = new WP_Query(array('cat' => '12, 13', 'posts_per_page' => 20));

    • Cette réponse a été modifiée le il y a 4 mois et 1 semaine par Oceane_974.
    • Cette réponse a été modifiée le il y a 4 mois et 1 semaine par Oceane_974.
    • Cette réponse a été modifiée le il y a 4 mois et 1 semaine par Oceane_974.
    #2294552
    Oceane_974
    Participant
    Initié WordPress
    8 contributions

     

    <span id=”p2″>Bonjour, je reviens vers vous pour vous dire que j’ai réussi à créer mon filtre comme ceci :</span>

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <link rel="stylesheet" href="https://bootswatch.com/4/lux/bootstrap.min.css">
      
    </head>
    
    <body>
    
        <?php
    
     setlocale(LC_TIME, 'fr'); 
    
      get_header();
      if ( have_posts() ) : while ( have_posts() ) : the_post();
    ?>
    
        <div class="container">
            <div class="row">
    
    
    
                <form method="GET" class="form-group">
                    <select name="medias">
                        <option value="<?php  echo '12' ?>">Medias</option>
                        <option value="<?php  echo '5' ?>">TV</option>
                        <option value="<?php  echo '4' ?>">DIGITAL</option>
                        <option value="<?php  echo '11' ?>">OPS</option>
                    </select>
    
                    <select name="type_documents">
                        <option value="<?php  echo '13' ?>">Type documents</option>
                        <option value="<?php  echo '15' ?>">Audience/Etudes</option>
                        <option value="<?php  echo '16' ?>">Condition commerciales</option>
                        <option value="<?php  echo '17' ?>">Fiches techniques</option>
                        <option value="<?php  echo '14' ?>">Offres commerciales</option>
    
                    </select>
                    <button type="submit" type="button" class="btn btn-warning">OK</button>
    
                </form>
              </div>
            <?php
    
    /*
    Template Name: OffresCGV
    */
    
    
    
     $media = $_GET['medias'];
     $type_document = $_GET['type_document'];
    
    
    
    
    $array_filter=array();
    
    //Si valeur medie ou type doc est vide =>test
    
    if (!empty($media) || (!empty($type_document))) {
    
     //Si media plein et type doc plein-> filtre 2 catégorie
      if(!empty($media) and !empty($type_document)) { 
    
        $array_filter=array( 'category__and' => array( $media, $type_document ) ) ;  
      }
      
    //Si meida vide et type doc plein ->filtre catégorie type doc  
      if (empty($media) and !empty($type_document)){
    
        $array_filter=array( 'cat' => array( $type_document ));
      }
    
    // Si media plein et type doc  vide -> filtre catégorie media
      if (!empty($media) and empty($type_document)) {
    
        $array_filter=array( 'cat' => array( $media ));
    }
    
    
    }
    
    
    else{
      //Sinon si 2valeur vide =selectionne tout les catégorie par default
    
      $array_filter=array( 'cat' => array( '12, 13', 'posts_per_page' => 20 ));
    
    }
    
    //var_dump($array_filter);
    echo '<hr />';
    
    $my_query = new WP_Query($array_filter);
    //var_dump($my_query);
    
    //affiche les resultats
      // The Loop
    if ( $my_query->have_posts() ) {
    
          echo'<div class="row">';
      while ( $my_query->have_posts() ) {
    
          $my_query->the_post();
    
    
    
    
           echo '<div class="col-md-4">' ;
           
            echo '<div class="card">' ;
    
    
       echo '<h4 class="card-title text-center"><a href="'.get_the_guid().'" title="'.get_the_title().'">'.wp_trim_words($post->post_title, 15).'</a></h4>' ;
       echo '<div class="card-picture text-center">'.the_post_thumbnail().'</div>';
    
    
         echo'</div>';
         echo'</div>';
        
    
    
        }
     echo'</div>';
     
    
    } 
    else {
    
      // no posts found
    }
    ?>
    
        </div>
    
    
    
    
    
        <?php
      endwhile;
      endif;
    
      get_footer();
    
    ?>
    </body>

    • Cette réponse a été modifiée le il y a 4 mois par Oceane_974.
    #2294554
    Oceane_974
    Participant
    Initié WordPress
    8 contributions

    C’est une méthode longue mais qui fonctionne (cf.sreenshot) . Encore merci de votre aide 🙂

    Fichiers joints :
    Vous devez être connecté pour voir les fichiers joints.
    #2294556
    Oceane_974
    Participant
    Initié WordPress
    8 contributions

    Pour aller plus loin,j’aurais aimé ajouter l’ajax, mais j’ai une question avec le code précédent, puis-je utiliser ta méthode pour l’ajax et comment ?@virtazp

    De plus est-il possible de filtrer 1 catégorie dans la barre de navigation. Je m’explique au lieux d’arriver et de cliquer sur la page “OffreCGV” on a la possibilité de filtré avant arriver sur la page et d’avoir le résultat du filtre en arrivant sur le page avec l’aide d’un sous menus

    • Cette réponse a été modifiée le il y a 4 mois par Oceane_974.
    Fichiers joints :
    Vous devez être connecté pour voir les fichiers joints.
13 sujets de 1 à 13 (sur un total de 13)
  • Vous devez être connecté pour répondre à ce sujet.