Cerques amb WordPress

Quan realitzem un cerca en un web què és realment el que cerquem? O més ben dit, on hem de cercar el què cerquem? Potser sona un xic estrany, però el plantejament és senzill, quan fem una cerca en un web cerquem sobre el contingut dels documents que allotja (text sense tags) o sobre el contingut, la forma i semàntica dels mateixos (text amb tags)?

En el cas de WordPress la decissió de l’equip de desenvolupament fa que les cerques es realitzin sobre el codi ·HTML· dels articles, és a dir sobre el seu contingut, forma i semàntica. La qual cosa comporta que si cerquem href en una bitàcola feta amb WordPress pràcticament rebrem com a resposta tots els escrits o si més no tots els que contenen enllaços, ja que contenen <a href=”….”>. Suposo que depenent del contingut del web, aquesta decissió potser més o menys encertada, però no és el cas que motiva aquest article:

Quan l’Arnau va inagurar la seva Referència de CSS i XHTML en català, vàrem detectar que quan algú cercava una etiqueta ·CSS· o ·XHTML· amb el cercador de WordPress el resultat reflexava una cerca al codi de les definicions de les etiquetes, de manera que no retornava exclusivament l’etiqueta cercada. (Un exemple clar és quan es cercava l’etiqueta <strong> que retornava tots els posts i, teòricament només havia de retornar l’entrada per aquesta tag). Així doncs vàrem començar a cercar la manera més senzilla i menys agressiva de modificar el WordPress 1.5 per a fer cerques sobre el contingut dels articles i no sobre el seu codi. La solució és senzilla:

Només cal crear un arxiu dins del nostre Theme que contingui la manera com ha d’actuar WordPress en cas que s’hagi realitzat una cerca. Normalment contindrà quelcom similar a l’arxiu Search Template que porta el Theme per defecte:

<?php get_header(); ?>
  <div id="content" class="narrowcolumn">
	<?php if (have_posts()) : ?>
		<h2 class="pagetitle">Search Results</h2>
		<div class="navigation">
			<div class="alignleft"><?php posts_nav_link('','','« Previous Entries') ?></div>
			<div class="alignright"><?php posts_nav_link('','Next Entries »','') ?></div>
		</div>
		<?php while (have_posts()) : the_post(); ?>
			<div class="post">
				<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h3>
				<small><?php the_time('l, F jS, Y') ?></small>
				<div class="entry">
					<?php the_excerpt() ?>
				</div>
				<p class="postmetadata">Posted in <?php the_category(', ') ?> <strong>|</strong> <?php edit_post_link('Edit','','<strong>|</strong>'); ?>  <?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></p>
				<!--
				<?php trackback_rdf(); ?>
				-->
			</div>
		<?php endwhile; ?>
		<div class="navigation">
			<div class="alignleft"><?php posts_nav_link('','','« Previous Entries') ?></div>
			<div class="alignright"><?php posts_nav_link('','Next Entries »','') ?></div>
		</div>
	<?php else : ?>
		<h2 class="center">Not Found</h2>
		<?php include (TEMPLATEPATH . '/searchform.php'); ?>
	<?php endif; ?>
	</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Smart Template original

I afegir-hi unes modificacions per a que controli si realment és el contingut o el codi el que conté el mot o expressió cercada.

<?php get_header(); ?>
  <div id="content" class="narrowcolumn">

	<?php $algun_post=0; ?>
	<?php if (have_posts()) : ?>
		<?php while (have_posts()) : the_post(); ?>
			<?php if (strpos(strip_tags(get_the_content()), $_GET['s'])) :?>
				<?php if($algun_post==0) :?>
					<h2 class="pagetitle">Search Results</h2>
					<div class="navigation">
					<div class="alignleft"><?php posts_nav_link('','','« Previous Entries') ?></div>
					<div class="alignright"><?php posts_nav_link('','Next Entries »','') ?></div>
					</div>
				<?php $algun_post=1; ?>
				<?php endif; ?>

				<div class="post">
					<h3 id="post-<?php the_ID(); ?>"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h3>
					<small><?php the_time('l, F jS, Y') ?></small>
					<div class="entry">
						<?php the_excerpt() ?>
					</div>
					<p class="postmetadata">Posted in <?php the_category(', ') ?> <strong>|</strong> <?php edit_post_link('Edit','','<strong>|</strong>'); ?>  <?php comments_popup_link('No Comments »', '1 Comment »', '% Comments »'); ?></p>
					<!--
					<?php trackback_rdf(); ?>
					-->
				</div>
				<?php endif; ?>
		<?php endwhile; ?>
		<?php if($algun_post!=0) :?>
			<div class="navigation">
				<div class="alignleft"><?php posts_nav_link('','','« Previous Entries') ?></div>
				<div class="alignright"><?php posts_nav_link('','Next Entries »','') ?></div>
			</div>
		<?php else : ?>
			<h2 class="center">Not Found</h2>
			<?php include (TEMPLATEPATH . '/searchform.php'); ?>
		<?php endif; ?>
	<?php else : ?>
		<h2 class="center">Not Found</h2>
		<?php include (TEMPLATEPATH . '/searchform.php'); ?>
	<?php endif; ?>
	</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Smart Template modificat

De moment us proposo aquesta solució, però estic acabant de desenvolupar un hack més potent que permetrà fer cerques sobre el codi o sobre el contingut mitjançant un selector i evitarà els problemes que té aquest mètode.