une requête qui ne fait pas ce qu'on aimerait d'elle

Eléphanteau du PHP | 33 Messages

27 févr. 2009, 16:11

Bonjour,

J'espère pouvoir trouver une solution à ce problème qui m'empoisonne pas mal l'existence ces jours derniers. Je suis pas vraiment ce qu'on peut appeler un codeur, même si j'ai un DUT SRC, ca fait bien longtemps que j'ai arrété de faire du dev web pur et dur. Je me débrouille avec ce que je sais faire, mais parfois il m'arrive (comme là), de n'avoir aucune idée sur ce que je devrais faire pour obtenir ce que je veux. En vrai, j'ai pas du créer une requête SQL depuis facilement 4 ans.

Donc voilà, sous wordpress, on a une fonction qui s'appelle previous_post_link (pareil avec next), qui en théorie permet d'exclure un certain nombre de catégories, qui fait que la navigation ne s'opère qu'au sein d'une seule catégorie, ce qui est par ailleurs exactement ce dont j'ai besoin.

Or voilà, il semblerait que ca ne marche pas. Disons que si j'ai deux catégories, chien et chat, et que je veux naviguer uniquement dans chat, ben le filtre "vire-moi-les-chiens" ne fonctionne pas. Car le post suivant ou précédent apparait quand meme comme être un chien. Enfoiré!


J'ai cherché sur les forums wordpress, aucune réponse consistante n'a pu venir me sauver, donc j'ai décidé d'y aller à bras-le-corps, et d'aller moi-même farfouiller dans les requêtes sql.

Donc voici la requête effectuée par wp pour savoir quel est le post suivant à afficher (pour en créer un lien, enfin je laisse wordpress faire son travail, le problème étant surtout qu'il me retourne des posts de mauvaise catégorie):

Code : Tout sélectionner

SELECT p.* FROM `wpmod_posts` AS p INNER JOIN wpmod_term_relationships AS tr ON p.ID = tr.object_id INNER JOIN wpmod_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE p.post_date < '2009-02-24 15:44:17' AND p.post_type = 'post' AND p.post_status = 'publish' AND tt.taxonomy = 'category' AND tt.term_id NOT IN (5) ORDER BY p.post_date DESC LIMIT 1
où NOT IN (5) est censé opérer le filtre.

Maintenant je l'ai retournée dans tous les sens, en remplacant par !=, en mettant IN, ou = en changeant la catégorie (5 ou 6), en l'enlevant, et à chaque fois il me retourne le même post.

Donc, mes capacités d'analyse m'ont permis d'en conclure que cette condition ne sert absolument à rien dans la requête. Maintenant j'aimerais savoir s'il y a un moyen d'arriver à faire marcher ce filtre, dont j'ai désespérément besoin, pour lequel j'ai essayé plusieurs méthodes et sur lequel je viens de passer plusieurs heures (au moins depuis hier apm), et si oui, est ce que vous pourriez m'aider à l'atteindre?

Merci beaucoup

pour la structure de la db, on une dizaine de table, mais les trois utilisées ici sont correctes il me semble:

Post, contient tous les posts, relationship est la relation entre les post et les catégories:

Code : Tout sélectionner

CREATE TABLE `wpmod_term_relationships` ( `object_id` bigint(20) NOT NULL default '0', `term_taxonomy_id` bigint(20) NOT NULL default '0', `term_order` int(11) NOT NULL default '0', PRIMARY KEY (`object_id`,`term_taxonomy_id`), KEY `term_taxonomy_id` (`term_taxonomy_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Image


et term_taxonomy ressemble à cela:

Code : Tout sélectionner

CREATE TABLE `wpmod_term_taxonomy` ( `term_taxonomy_id` bigint(20) NOT NULL auto_increment, `term_id` bigint(20) NOT NULL default '0', `taxonomy` varchar(32) NOT NULL default '', `description` longtext NOT NULL, `parent` bigint(20) NOT NULL default '0', `count` bigint(20) NOT NULL default '0', PRIMARY KEY (`term_taxonomy_id`), UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9
Image

Merci pour votre aide![/code]

Eléphant du PHP | 60 Messages

28 avr. 2009, 12:07

As-tu trouvé la solution à ton problème ?

Sinon il serait bon de transmettre la structure de la table `wpmod_posts`. Comme ça à vue de nez
je penses qu'on peut s'orienter vers un problème de compréhension du format de date et/ou de jointures.

Mais comme dit, c'est mieux de vérifier avec les tables.
"La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information"
Albert Einstein.

ViPHP
AB
ViPHP | 5818 Messages

28 avr. 2009, 18:10

Et avec NOT IN ('5') plutôt que NOT IN (5) ?