Lister les articles qui appartiennent à 2 catégories (Créer un compte)

  • Statut : non résolu
13 sujets de 1 à 13 (sur un total de 13)
  • Auteur
    Messages
  • #452151
    YoannEMF
    Membre
    Padawan WordPress
    74 contributions

    Bonjour,

    Voila comment s’organise mes articles
    1er article qui appartient à la catégorie 1
    2ème articles qui appartient à la catégorie 2
    3ème article qui appartient aux catégorie 1 et catégorie 2

    Pour lister les 2 premiers articles cela est simple, Mais je ne sais pas comment lister le 3ème.

    Il faudrait utiliser un opérateur logique mais je ne sais pas si cela est possible avec la fonction query_posts(« category_name= ??? »);

    #600604
    YoannEMF
    Membre
    Padawan WordPress
    74 contributions

    Personne a une idée sur la manipulation a faire pour afficher seulement des articles apartenant a la catégorie 1 et la catégorie 2?

    #600605
    AmO
    Participant
    Maître WordPress
    4447 contributions

    A mon avis ca n’est pas possible, tu devras être obliger de faire une requête SQL personnalisée…

    #600606
    YoannEMF
    Membre
    Padawan WordPress
    74 contributions

    Ok et quelle genre de requète? si tu sais pas c’est pas grave je chercherai tout seul.

    #600607
    dlo
    Participant
    Maître WordPress
    1849 contributions

    Pour afficher les articles appartenant aux deux catégories en même temps, il faut rajouter le code suivant dans la boucle de lecture.




    <a href=" »></a> <br />

    Cordialement

    #600608
    AmO
    Participant
    Maître WordPress
    4447 contributions

    Si je peux me permettre l’inconvénient de ta technique dlo

    Imaginons que tu as configuré WP pour afficher 10 articles, si il n’y a que le 9ème qui appartient aux 2 catégories, ta page affichera 1 seul article.

    Alors que le 11ème article peut très bien appartenir aux 2 catégories, et il devrait être afficher 🙂

    Tu vois le problème 🙂

    #600609
    YoannEMF
    Membre
    Padawan WordPress
    74 contributions

    En effet AmO a raison mais dans mon cas cela n’est pas trop génant puisque je fais une requète à part :





    Donc pour le moment j’affiche tous les articles de la catégorie 54, par la suite je voudrais afficher que ceux qui appartiennent à la catégorie 54 mais aussi 55. Je rajoute une ligne pour donner ça :



    <?php if ( in_category(55)) :



    #600610
    dlo
    Participant
    Maître WordPress
    1849 contributions
    AmO wrote:
    Si je peux me permettre l’inconvénient de ta technique dlo

    Bien sûr que tu peux te permettre, AmO ! 🙂 Surtout que ta remarque est tout à fait pertinente et que je n’avais pas vu cet aspect des choses. Mauvais que je suis ! :fouet:

    Bon, piqué au vif, j’ai cherché LA solution ultime… et je propose ceci :

    Ajouter deux paramètres à ceux disponibles dans un query_posts() pour permettre la sélection d’articles appartenant à deux catégories (ou plus) et, cerise sur le gateau, on peut l’utiliser aussi pour avoir les articles appartenant à une seule catégorie dans une liste donnée.
    De plus, la requête ne va pas chercher les articles appartenant à une catégorie fille des catégories choisies comme dans la requête d’origine.

    Paramètres :
    xcat: liste des catégories séparée par une virgule
    xop: Opérateur logique à appliquer à la liste xcat
    Valeurs possibles:
    AND : l’article doit appartenir à toutes les catégories listées.
    OR : l’article doit appartenir à une des catégories listées.
    XOR : l’article doit appartenir à une et une seule des catégories listée.

    Cela s’utilise donc comme ceci :

    // JE NE VEUX QUE LES ARTICLES APPARTENANT A LA FOIS A LA CATEGORIE 1 ET 5




    <p></p>

    Et tout cela en créant un fichier functions.php pour son thème avec les instructions suivantes:

     0 )
    $newwhere =  » AND $wpdb->post2cat.category_id IN ($in_cats) »;
    }
    }
    return $where.$newwhere;
    }

    function extendedCatJoin($join) {
    global $wpdb;
    $catop = strtoupper(get_query_var(‘xop’));
    $cats = get_query_var(‘xcat’);
    $newjoin =  »;
    if (($catop !=  ») && ($cats !=  ») && ($join ==  »))
    $newjoin =  » LEFT JOIN $wpdb->post2cat ON ($wpdb->posts.ID = $wpdb->post2cat.post_id) « ;

    return $join.$newjoin;
    }

    function extendedCatGroupBy($groupby) {
    global $wpdb;
    $catop = strtoupper(get_query_var(‘xop’));
    $cats = get_query_var(‘xcat’);
    $having =  »;
    if (($catop !=  ») && ($cats !=  »)) {
    if ((!empty($cats)) && ($cats != ‘0’)) {
    $cats =  ».urldecode($cats). »;
    $cats = addslashes_gpc($cats);
    $cat_array = preg_split(‘/[,s]+/’, $cats);
    $cat_number = count($cat_array);
    if ($catop == « AND »)
    $having =  » HAVING postnbr = $cat_number « ;
    if ($catop == « OR »)
    $having =  » HAVING postnbr posts}.ID »;
    }
    }
    return $groupby.$having;
    }

    function extendedCatFields($fields) {
    global $wpdb;
    $catop = strtoupper(get_query_var(‘xop’));
    $cats = get_query_var(‘xcat’);
    $countrows =  »;
    if (($catop !=  ») && ($cats !=  »)) {
    $countrows = « , COUNT(*) as postnbr « ;
    }
    return $fields.$countrows;
    }


    add_filter(‘posts_where’,’extendedCatSelection’);
    add_filter(‘posts_join’, ‘extendedCatJoin’);
    add_filter(‘posts_groupby’, ‘extendedCatGroupBy’);
    add_filter(‘posts_fields’, ‘extendedCatFields’);

    ?>

    On pourrait bien sûr en faire facilement un plugin… mais ceci est une autre histoire.

    Qu’en pensez-vous ?

    Cordialement

    #600611
    YoannEMF
    Membre
    Padawan WordPress
    74 contributions

    Merci dlo pour ton programme tu devrais le proposer aux développeurs de WordPress car sa serait util de pouvoir faire des opérations logiques entre les catégories.

    Mais malheureusement dans mon cas cela ne me convient pas :
    – Premièrement parceque sa annule la requète principale (car je l’utilise dans une requète annexe).
    – Deruxièment parceque la partie que tu mets dans « fonction.php » génére des erreurs sur les accents.

    #600612
    dlo
    Participant
    Maître WordPress
    1849 contributions

    Merci pour le retour, YoannEMF. 🍺

    Concernant les deux points que tu mentionnes:

    1) Il est tout à fait valide de mettre plusieurs boucles dans un template. Il est donc possible de garder la boucle principale et de rajouter ensuite un appel à query_posts avec les nouveaux paramètres puis une autre boucle de lecture. C’est déjà ce que tu fais en utilisant get_posts() et une boucle foreach…

    2) Peux-tu détailler ce que tu entends par « générer des erreurs sur les accents » ? Je n’ai pas pu reproduire le cas et je ne suis pas sûr d’avoir compris. Un exemple serait parfait. Je t’en remercie d’avance.

    Cordialement

    #600613
    YoannEMF
    Membre
    Padawan WordPress
    74 contributions

    Pour le problème au niveau des accents, WordPress remplace, sur les pages qu’il affiche, les lettre accentuées par une suite de caractères bizarres.
    Dans mon cas j’ai utilisé la première solution que tu proposais.
    Ceci dit, je pense sincèrement que le programme que tu as proposé (je répéte) est une très bonne base non pas pour faire un plugin mais pour être intégré directement au coeur de WP. Cela repousserait ses limites en rendant possible la modularité dans la requète des article tel que ton programme est capable de le faire. Alors si tu veux un conseil : ne le perd pas.
    Et merci.

    #600614
    AmO
    Participant
    Maître WordPress
    4447 contributions

    dlo, beau travail…

    #600615
    dlo
    Participant
    Maître WordPress
    1849 contributions
    YoannEMF wrote:
    Ceci dit, je pense sincèrement que le programme que tu as proposé (je répéte) est une très bonne base non pas pour faire un plugin mais pour être intégré directement au coeur de WP.
    AmO wrote:
    dlo, beau travail…

    Que de compliments en aussi peu de temps ! Ma modestie naturelle ne va pas y résister. 😇

    En tout cas, merci de votre intérêt. :happy:

    Cordialement

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