IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WordPress PHP Discussion :

Simplifier des queries


Sujet :

WordPress PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Points : 25
    Points
    25
    Par défaut Simplifier des queries
    Bonjour,

    J'ai deux queries reunies en une. Tout cela fonctionne correctement. Le probleme est que cela charge tres lentement. Voila mon code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    <?php $geoip = geoip_detect2_get_info_from_current_ip(); $country = $geoip->country->name; get_header(); $cat = getCurrentCatID(); ?>
     
    <?php $my_query2 = new WP_Query( array( 'meta_query' => array( 
    'relation' => 'OR', 
    array( 'relation' => 'AND', 
    array( 'key' => 'allowed_country', 
    'compare' => 'LIKE', 
    'value' => $country, ), 
    array( 'key' => 'restricted_country', 
    'value' => false,
    'type' => 'BOOLEAN', )), 
    array( 'relation' => 'AND',
     array( 'key' => 'restricted_country', 
    'value' => $country, 'compare' => 'NOT LIKE' ), 
    array( 'key' => 'allowed_country',
    'value' => false, 'type' => 'BOOLEAN', )),), 
    'meta_key' => 'ratings_average', 'orderby' => 'post_date', 'posts_per_page' => '-1', 'order' => 'DESC', 'category__in' => array( $cat ),'fields' => 'ids') ); 
     
    $my_query3 = new WP_Query( array( 'meta_query' => array(
    'relation' => 'OR',
     array( 'relation' => 'AND',
     array( 'key' => 'allowed_country',
     'compare' => 'NOT LIKE',
     'value' => $country, ),
     array( 'key' => 'restricted_country',
     'value' => false, 'type' => 'BOOLEAN', )),
     array( 'relation' => 'AND',
     array( 'key' => 'restricted_country',
     'value' => $country,
     'compare' => 'LIKE'),
     array( 'key' => 'allowed_country',
     'value' => false, 'type' => 'BOOLEAN', )),),
     'meta_key' => 'ratings_average',
     'orderby' => 'post_date',
     'order' => 'DESC',
     'posts_per_page' => '-1',
     'category__in' => array( $cat ),
     'fields' => 'ids') );
     
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $ids = array_merge($my_query2->posts, $my_query3->posts);
     
    $my_query = new WP_Query(array('post__in' => $ids,'orderby' => 'post__in', 'paged' => $paged));  ?>
    		<?php if ( have_posts() ) : ?>
    etc...
    En gros cela liste les posts admis dans le pays de l'utilisateur. Ces posts sont classés par note ( ratings_average ). Ensuite il liste les posts qui ne sont pas admis dans le pays de l'utilsateur. Ils sont aussi classé par note.

    Le probleme est que ce code met un certain temps à charger. Je ne peux pas le mettre en cache car le classement des posts est différent en fonction du pays ou se trouve le visiteur.

    D'autre part Wordpress ne me permets pas d'utiliser plus de 2 relation OR par new_query.

    Si vous avez une solution pour mettre tout ca dans une query...

    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 401
    Points : 15 766
    Points
    15 766
    Par défaut
    essayez de faire des conditions imbriquées comme dans le code suivant pour avoir 1 seul appel à WP_Query

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
     
    $meta_query2 = array(
        'relation' => 'OR',
        array(
            'relation' => 'AND',
            array(
                'key' => 'allowed_country',
                'compare' => 'LIKE',
                'value' => $country
            ),
            array(
                'key' => 'restricted_country',
                'value' => false,
                'type' => 'BOOLEAN'
            )
        ),
        array(
            'relation' => 'AND',
            array(
                'key' => 'restricted_country',
                'value' => $country,
                'compare' => 'NOT LIKE'
            ),
            array(
                'key' => 'allowed_country',
                'value' => false,
                'type' => 'BOOLEAN'
            )
        )
    );
     
    $meta_query2 = array(
        'relation' => 'OR',
        array(
            'relation' => 'AND',
            array(
                'key' => 'allowed_country',
                'compare' => 'NOT LIKE',
                'value' => $country
            ),
            array(
                'key' => 'restricted_country',
                'value' => false,
                'type' => 'BOOLEAN'
            )
        ),
        array(
            'relation' => 'AND',
            array(
                'key' => 'restricted_country',
                'value' => $country,
                'compare' => 'LIKE'
            ),
            array(
                'key' => 'allowed_country',
                'value' => false,
                'type' => 'BOOLEAN'
            )
        )
    );
     
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
     
    $my_query = new WP_Query(array(
        'meta_query' => [
            "relation" => "OR",
            $meta_query1,
            $meta_query2,
        ],
        'orderby' => 'ratings_average',
        'paged' => $paged
    ));

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Cela ne marche pas. Il n'accepte pas autant de relations OR.
    Ca charge pendant des heures et la page ne s'affiche jamais.

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 401
    Points : 15 766
    Points
    15 766
    Par défaut
    je viens de remarquer quelque chose dans les conditions.

    Si par exemple le pays est la France, la 1re requête cherche les articles avec (allowed_country = FR) ET (restricted_country = FALSE) et ensuite dans la 2e requête ce sont les articles avec (allowed_country différent de FR) ET (restricted_country = FALSE).
    Donc si on les assemble, il suffit de simplifier en cherchant les articles avec (restricted_country = FALSE), non ? Et la même chose avec (allowed_country = FALSE)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Le probleme c'est qu'il y'a differents cas:

    - Si restricted_country contient des pays, allowed_country est vide et vice versa.
    - Il se peut que restricted_country et allowed_country ne contiennent pas France. ( Donc si restricted_country n'est pas vide et qu'il contient des pays mais pas la France, La France sera accepté, allowed_country est vide ).

    Voulez vous plutot dire en simplifiant la requete en gardant juste (allowed_country = FR) ? Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $my_query2 = new WP_Query( array( 'meta_query' => array( 
    	'relation' => 'OR', 
     
            	array( 'key' => 'allowed_country',
                				'compare' => 'LIKE', 
                                'value' => $country, ),
     
            array(
            	array( 'key' => 'restricted_country', 
       		 	  		'value' => $country, 
                        'compare' => 'NOT LIKE' ), 
                ),),
                        	 'meta_key' => 'ratings_average', 'orderby' => 'meta_value_num', 'posts_per_page' => '-1', 'order' => 'DESC', 'category__in' => array( 1 ),'fields' => 'ids') );
    Si Je simplifie comme cela pour $meta_query2, ca affiche un post dans le $meta_query2 ( qui accepte le pays France ) qui n'a pas France dans allowed_country ni dans restricted_country.

    Je ne peux pas non plus mettre AND à la place de OR car dans le cas ou restricted_country contient des pays ( et donc que allowed_country n'en contient pas ); Si France n'est pas dans restricted_country, il ne sera pas dans allowed_country ( qui sera vide ).

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 401
    Points : 15 766
    Points
    15 766
    Par défaut
    Je crois que j'ai un peu mieux compris le contenu des champs.

    Une mise en cache quand même faisable en stockant pour chaque pays, les identifiants des articles concernés par ce pays.
    Ensuite à chaque affichage, vous ferez le tri en fonction des votes.

    Pour la mise en place de ce cache, à chaque modification des pays d'un article, je stockerai les pays à recalculer. Et ensuite une tâche cron lira régulièrement cette liste de pays à recalculer et mettre à jour le cache en arrière plan.

    Est ce que tous les visiteurs peuvent voter ? Ou alors il n'y a pas beaucoup de votes et dans ce cas le tri par vote peut aussi être mis en cache.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Points : 25
    Points
    25
    Par défaut
    Tout les visiteurs peuvent voter. J'ai pensé à faire un cache par pays mais je pensais d'abord qu'il serait possible de simplifier cette query.

    Vous me conseillez quoi pour faire du cache par pays?

Discussions similaires

  1. Message d'erreur lors de l'initialisation des queries
    Par Pierre FORAZ dans le forum XMLRAD
    Réponses: 2
    Dernier message: 21/09/2007, 15h26
  2. Utilisation des queries
    Par mchicoix dans le forum XMLRAD
    Réponses: 2
    Dernier message: 04/08/2006, 09h21
  3. Automatiser des queries journalieres avec envoie email.
    Par tsconetti dans le forum Access
    Réponses: 1
    Dernier message: 08/07/2006, 18h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo