Riporto integralmente un post pubblicato sul sito Internet https://www.levysoft.it in merito ad un bug presente nel plugin Ultimate Tag Warrior per WordPress 2.x perché quel bug ha reso inutilizzabile – fino a pochi minuti fa – le funzioni di ricerca anche su questo blog. La fonte originale si trova a questo indirizzo.
Ieri ho scoperto una malfunzione della funzionalità di Search di WordPress 2.x se abbinato con il plugin Ultimate Tag Warrior: sembra infatti che la ricerca mostra nei risultati solo quei post che hanno associato almeno un tag.
Da qualche giorno, dovendo cercare riferimenti a vecchi articoli, notavo che il form di ricerca presente sul mio sito non funzionava correttamente: per esempio cercando le parole tipo “Dosbox” non trovavo alcun riferimento mentre se cercavo “Gmail” trovavo solo 5 post e l’ultimo risaliva al 2006 (cosa molto strana dato che ho scritto molti altri articoli antecendenti il 2006).
Se però, la stessa ricerca la effettuavo su Google (con una stringa tipo “Dosbox levysoft”) ottenevo subito il link all’articolo desiderato. Va bene che Google è il migliore motore di ricerca in circolazione, ma una funzione di ricerca su WordPress non è molto difficile se si dispone di un bel database indicizzato.
All’inizio pensavo che il problema risiedesse nel template che avevo installato, ma un’occhiata al codice ha subito smentito l’ipotesi, dato che la chiamata alla funzione di ricerca corrispondeva a quella presente nel tema di default di WordPress. Una ulteriore conferma al fatto che fosse un problema generale era che il problema si verificava anche quando, collegandomi con Admin, eseguivo la stessa query dall’area di “Gestione Articoli”.
Dopo qualche tentativo (per fare qualche verifica ho chiamato a consulto anche Davide) ho intuito che la funzione di ricerca eseguiva la query solo per i post più recenti, escludendo quelli più vecchi. Cercando parole presenti in articoli del 2004 o del 2005 la ricerca dava esito negativo.
A questo punto ho iniziato a dare un’occhiata al codice php di WordPress alla ricerca di qualche anomalia nell’esecuzione della query: da un LIMIT male impostato ad una condizione WHERE poco precisa (sospettavo un limite temporale della condizione di ricerca). Ho aperto, quindi, il file wp-includes/query.php e cercando le parole chiave “search” e “where” ho trovato i punti in cui si creava la sintassi della query. Ma tutto sembrava corretto.
Ho così deciso di chiedere informazioni sul forum di supporto di WordPress.org, ma prima ho deciso di fare una ricerca per vedere se il problema si era già ripresentato: con la semplice chiava “search old post” ho trovato la soluzione ai miei problemi. Qui, infatti, qualcuno ha lo stesso mio problema evidenziando il fatto che aggiornando WordPress dalla release 2.0.6 alla 2.1 la ricerca su vecchi post non funzionava affatto.
Alla fine ecco la soluzione: il problema, segnalato anche sul forum del plugin in questione , risiedeva nell’attivazione del plugin “Ultimate tag warrior” (io ho anche l’ultima release 3.14159265) con WordPress 2.07 o 2.1: sembra infatti che la ricerca mostra nei risultati solo quei post che hanno i tag. Nel mio caso, siccome, i post più vecchi non hanno i tag, venivano automaticamente esclusi dalla ricerca.
Per sicurezza ho fatto anche una prova: ho preso una parola presente solo in un vecchio post senza tag e ho fatto la ricerca: nessun risultato! Ho poi aggiunto i tag a quell’articolo e dopodicché la ricerca ha dato esito positivo! Certo che era difficile immaginare una correlazione tra un bug del plugin dei tag con la ricerca di WordPress, anche se in effetti la ricerca per tag è strettamente correlata alla normale ricerca.
Attualmente, però, nonostante il problema sia noto, non è stato rilasciata alcuna nuova release che risolva il problema, ma se non si vogliono disattivare i tag (disattivando definitivamente il plugin Ultimate Tag Warrior) sul proprio sito o non si vuole inserire a mano/automaticamente i tag su tutti gli articoli (infatti se i tag sono presenti su tutti i post la ricerca viene effettuata correttamente) ma comunque non si vuole convivere con questo problema (inserendo magari il funzionale modulo di ricerca di Google), è disponibile un work around per chi è capace a mettere mano al codice php.
E’ sufficiente aprire il file ultimate-tag-warrior-actions.php e commentare le seguenti due righe:
//add_filter('posts_join', array('UltimateTagWarriorActions','ultimate_search_join'));
//add_filter('posts_where', array('UltimateTagWarriorActions','ultimate_search_where'));
Questa soluzione non è definitiva perché, per risolvere il problema si deve disattivare la ricerca dei tag: pare infatti che il problema risieda in una JOIN della query. Ora sta a voi decidere se, in attesa di una patch ufficiale, è più utile privarsi della ricerca nei tag oppure avere una ricerca generica di WordPress limitata ai soli post con i tag (certo che se poi avete tutti gli articoli con i tag assegnati, il problema per voi non sussiste!).
UPDATE: Grazie a Javano, abbiamo finalmente la soluzione al problema: e lo ha risolto in un modo semplicissimo. Basta andare nel file ‘ultimate-tag-warrior-actions.php‘ del plugin e nel metodo ‘ultimate_search_join‘ modificare il secondo join da una INNER JOIN in una LEFT JOIN, la ricerca continuerà a funzionare anche per i post ai quali non è associato alcun TAG.
Codice del plugin:
$join .= " LEFT JOIN $tablepost2tag p2t on $wpdb->posts.ID = p2t.post_id INNER JOIN $tabletags on p2t.tag_id = $tabletags.tag_id ";
Codice rimodificato:
$join .= " LEFT JOIN $tablepost2tag p2t on $wpdb->posts.ID = p2t.post_id LEFT JOIN $tabletags on p2t.tag_id = $tabletags.tag_id ";