> > > Ecrire à l'auteur < < <          

WordPress chez Free.fr : bug de tri des articles

Je me suis rendu compte que depuis quelques jours, l’hébergeur Free.fr avait introduit un bug sur WordPress en changeant la version de MySQL. En effet, avec MySQL 5.0.51a et WordPress 2.0.5 (version fournit par Free.fr), les articles du blog ne sont pas triés correctement par date de publication. Voici le correctif.

Le bug est détaillé ici : http://wordpress.org/support/topic/154622 “Les posts apparaissent dans le désordre”. En fait, les articles ne sont plus triés par date de publication, mais par identifiant interne du plus petit au plus grand. Cela correspond, grosso-modo à un tri par date de publication inverse (du plus ancien au plus récent), ce qui est totalement contraire au fonctionnement normal du blog.

Ce bug a été introduit lors du changement de version de MySQL. C’est un bug spécifique à MySQL.

Pour le corriger, il vous faut modifier le fichier de WordPress nommé “classes.php“. Aux alentours de la ligne 663, vous trouverez :

$request = " SELECT $distinct * FROM $wpdb->posts $join WHERE 1=1" . $where . " GROUP BY " . $groupby . " ORDER BY " . $orderby . " $limits";

Remplacez cette ligne par ceci :

if ($join == '' && $groupby == " $wpdb->posts.ID ")
$request = " SELECT $distinct * FROM $wpdb->posts WHERE 1=1" . $where . " ORDER BY " . $orderby . " $limits";
else
$request = " SELECT $distinct * FROM $wpdb->posts $join WHERE 1=1" . $where . " GROUP BY " . $groupby . " ORDER BY " . $orderby . " $limits";

Un peu en dessous, vous trouverez

$this->posts = $wpdb->get_results($this->request);

Ajouter ces deux lignes en dessous de la ligne précédente :

$request = " SELECT $distinct * FROM $wpdb->posts $join WHERE 1=1" . $where . " GROUP BY " . $groupby . " ORDER BY " . $orderby . " $limits";
$this->request = apply_filters('posts_request', $request);

Pour résumer :

Avant

$request = " SELECT $distinct * FROM $wpdb->posts $join WHERE 1=1" . $where . " GROUP BY " . $groupby . " ORDER BY " . $orderby . " $limits";

$this->request = apply_filters('posts_request', $request);

$this->posts = $wpdb->get_results($this->request);

Après

if ($join == '' && $groupby == " $wpdb->posts.ID ")
$request = " SELECT $distinct * FROM $wpdb->posts $join WHERE 1=1" . $where . " ORDER BY " . $orderby . " $limits";
else
$request = " SELECT $distinct * FROM $wpdb->posts $join WHERE 1=1" . $where . " GROUP BY " . $groupby . " ORDER BY " . $orderby . " $limits";

$this->request = apply_filters('posts_request', $request);

$this->posts = $wpdb->get_results($this->request);
$request = " SELECT $distinct * FROM $wpdb->posts $join WHERE 1=1" . $where . " GROUP BY " . $groupby . " ORDER BY " . $orderby . " $limits";
$this->request = apply_filters('posts_request', $request);

Et l’anomalie devrait disparaître.

Laisser un commentaire

CAPTCHA

Hey you spammer : each comments are manually validated. I do not need viagra or rolex.