Ja torno a penjar Lletres de Cançons
per Xavi el 26 de octubre de 2006, sota Informàtica i Tecnologia amb 1.418 lectures
Des que vaig recuperar totes les lletres de cançons encara no n’havia penjat cap de nova. La raó és senzilla: No volia que a la pantalla inicial m’aparegués cap lletra, ja que no tenen el format normal que li dóno als articles. Com que el format que tenen és tota la lletra a pinyón, en la pàgina inicial sortiria tota ella i ocuparia un espai important. De fet, volia recuperar el llistat d’últimes lletres que tenia a l’antiga site, però al estar la nova amb WordPress i encara no tinc el rodatge suficient, m’ha costat una mica. En aquest article explico què he fet per solucionar-ho.
Primer de tot he intentat que dins del bucle principal s’identifiqués la categoria del post que en aquella iteració es presentava. Per tal de fer això, he afegit just abans del “while” la següent línia:
[php]
[/php]
i la línia de final de bucle li he afegit la clau del tancament del if de la següent manera
[php]
[/php]
Però llavors m’he adonat d’una falla de concepte. El nombre d’iterancions del bucle es defineix en les Opcions de la Administració, i allí tenia definit que volia 3 elements. Si em dedico a eliminar els elements mostrats de la categoria 11 (la de les lletres), s’aniran restant els elements mostrats, fins al punt de que si poso 3 lletres seguides a la pantalla inicial no apareixerà cap element. Que maco no? Pos quina merda…
Però rebuscant una mica més, he trobat aquest post al suport de Wordpress. Aquí expliquen com excloure múltiples categories, però m’he quedat amb la pista bàsica: com excloure’n una directament sense haver de tocar el codi de les funcions. Molt interessant!
Així que al final, un cop borrat el que havia fet, només he hagut d’afegir un parell de línies abans de la declaració “While” del principi del bucle:
[php]
[/php]
Cosa que agafa la query normal i la guarda en una variable temporal, i després s’executa una altra query estandar amb el modificador de la categoria que es vol excloure (definida amb un signe “menys”). Llavors, només queda restablir la query inicial després del bucle (al tancar el “While”):
[php]
[/php]
I ja tinc exclosa la categoria de les Lletres de Cançons de la presentació.
Però ara volia tenir el llistat de les últimes 5 Lletres, abaix de tot. Com ho faig? Doncs usant el plugin de Llistats de Categories que ja tinc funcionant per a les categories, però aplicant unes modificacions. M’explicaré:
Primer de tot val a dir que la cosa és tant senzilla com cridar la funció del plugin:
[php]
[/php]
Però quin és el problema? Que no hi ha límit de registres. S’haurà de modificar la funció. La funció original és la següent:
[php]
function wp_cat_posts( $catID ) {
global $wpdb;
$get_posts_in_cat = “SELECT $wpdb->posts.ID, $wpdb->posts.post_title, “;
$get_posts_in_cat .= “$wpdb->post2cat.post_id, $wpdb->post2cat.category_id “;
$get_posts_in_cat .= “FROM $wpdb->posts, $wpdb->post2cat “;
$get_posts_in_cat .= “WHERE $wpdb->posts.ID = $wpdb->post2cat.post_ID “;
$get_posts_in_cat .= “AND $wpdb->post2cat.category_id = ‘$catID’ “;
$get_posts_in_cat .= “AND $wpdb->posts.post_status = ‘publish’ “;
$get_posts_in_cat .= “ORDER BY $wpdb->posts.post_title “;
$get_posts_in_cat_result = mysql_query($get_posts_in_cat);
echo ‘
- ‘;
- ‘ . $post_title . ‘
while ($posts_in_cat_row = mysql_fetch_assoc($get_posts_in_cat_result)) {
$post_title = $posts_in_cat_row['post_title'];
$postID = $posts_in_cat_row['ID'];echo ‘
‘;
}
echo ‘
‘;
}
[/php]
Amb una mica de coneixements de SQL et dónes compte que la query és molt senzilla, i que només cal afegir-hi un Limit. Però cal tenir en compte que no podem afegir-ho directament i sense més… Primer, perqué les funcions que ara mateix s’estan cridant deixarien de funcionar com fins ara i muntariem un “pollo de mucho cuidao”. Així que el que farem és, primer de tot, afegir un paràmetre per defecte a la declaració de la funció que ens permeti definir un límit de registres i que si no es crida no alteri el funcionament “normal”:
[php]
function wp_cat_posts( $catID , $limit=null) {
[/php]
Després afegim una línia dient que si el paràmetre “limit” no es null afegeixi un límit a la quey amb el valor introduït:
[php]
if(!is_null($limit)) $get_posts_in_cat .= “LIMIT “.$limit;
[/php]
Però si ens fixem bé, la ordenació que fa per defecte és sobre el títol. Això què farà? Doncs que si ho deixem així mostrarà el número d’elements que hem definit, però no seran els últims. Ho podríem modificar per que funcionés per dates, però si tenim en compte que un post recent té una ID major que un post antic (a mesura que anem introduint posts la ID augmenta), podem usar un camp que ja tenim, el ID, ordenant-lo descendentment. Per això, modificarem la línia que es refereix a la ordenació afegint que si el paràmetre “límit” no es null faci una ordenació diferent, però si ho és, que mantingui la ordenació original:
[php]
if(is_null($limit)) $get_posts_in_cat .= “ORDER BY $wpdb->posts.post_title “;
else $get_posts_in_cat .= “ORDER BY $wpdb->posts.ID DESC “;
[/php].
Total, que acabem tenint una funció modificada de la següent manera:
[php]
function wp_cat_posts( $catID , $limit=null) {
global $wpdb;
$get_posts_in_cat = “SELECT $wpdb->posts.ID, $wpdb->posts.post_title, “;
$get_posts_in_cat .= “$wpdb->post2cat.post_id, $wpdb->post2cat.category_id “;
$get_posts_in_cat .= “FROM $wpdb->posts, $wpdb->post2cat “;
$get_posts_in_cat .= “WHERE $wpdb->posts.ID = $wpdb->post2cat.post_ID “;
$get_posts_in_cat .= “AND $wpdb->post2cat.category_id = ‘$catID’ “;
$get_posts_in_cat .= “AND $wpdb->posts.post_status = ‘publish’ “;
if(is_null($limit)) $get_posts_in_cat .= “ORDER BY $wpdb->posts.post_title “;
else $get_posts_in_cat .= “ORDER BY $wpdb->posts.ID DESC “;
if(!is_null($limit)) $get_posts_in_cat .= “LIMIT “.$limit;
$get_posts_in_cat_result = mysql_query($get_posts_in_cat);
echo ‘
- ‘;
- ‘ . $post_title . ‘
while ($posts_in_cat_row = mysql_fetch_assoc($get_posts_in_cat_result)) {
$post_title = $posts_in_cat_row['post_title'];
$postID = $posts_in_cat_row['ID'];echo ‘
‘;
}
echo ‘
‘;
}
[/php]
I ara, només ens queda afegir a on volguem de l’index la crida a la funció:
[php]
[/php]
I ja tenim tot el que volíem. Ara, al penjar una lletra no apareixerà com a un post nou, però si que apareixerà com a lletra nova, mostrant-se en el llistat d’Últimes Lletres. Genial, no?
