Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

General Questions /

General questions about getting started with SilverStripe that don't fit in any of the categories above.

Moderators: martimiz, Sean, biapar, Willr, Ingo, swaiba

MetaDescription in search results


Go to End
Reply


10 Posts   2791 Views

Avatar
DeklinKelly

Community Member, 197 Posts

29 July 2010 at 7:42am

I want to show the Meta Description in search results. I am using the standard search form on Silverstripe 2.4.

This code does NOT display the $MetaDescription and I think the problem is that the built-in search functionality does NOT return MetaDescription along with other SiteTree objects.

How can I get the $MetaDescription in these results?

Here is my template code:

<h1>Search Results</h1>
<div class="typography">
	<% if Results %>
	    <ul id="SearchResults">
	      <% control Results %>
	        <li>
	            <% if MenuTitle %>
	              <h3><a class="searchResultHeader" href="$Link">$MenuTitle</a></h3>
	            <% else %>
	              <h3><a class="searchResultHeader" href="$Link">$Title</a></h3>
	            <% end_if %>
			  <% if MetaDescription %>
				<p>$MetaDescription</p>
			  <% end_if %>
	          <a class="readMoreLink" href="$Link" title="{$Title}">Click Here</a>
	        </li>
	      <% end_control %>
	    </ul>
	  <% else %>
	    <p>Sorry, your search query did not return any results.</p>
	  <% end_if %>

	  <% if Results.MoreThanOnePage %>
	    <div id="PageNumbers">
	      <% if Results.NotLastPage %>
	        <a class="next" href="$Results.NextLink" title="View the next page">Next</a>
	      <% end_if %>
	      <% if Results.NotFirstPage %>
	        <a class="prev" href="$Results.PrevLink" title="View the previous page">Prev</a>
	      <% end_if %>
	      <span>
	        <% control Results.SummaryPagination(10) %>
	          <% if CurrentBool %>
	            $PageNum
	          <% else %>
	            <a href="$Link" title="View page number $PageNum">$PageNum</a>
	          <% end_if %>
	        <% end_control %>
	      </span>
      
	    </div>
	 <% end_if %>
</div>

Thanks!

Avatar
ryanwachtl

Community Member, 46 Posts

30 July 2010 at 1:44am

Edited: 30/07/2010 1:44am

Hi DeklinKelly,

This Topic should help you out: http://www.silverstripe.org/template-questions/show/276854

- Ryan

Avatar
DeklinKelly

Community Member, 197 Posts

30 July 2010 at 4:06am

Thanks. But how do I use this code?

What function or class should I put in mysite/Page.php to make this work?

<?php
class CustomSearch extends SearchForm
{
	
	protected $classesToSearch = array("SiteTree");
	
	public function searchEngine($keywords, $pageLength = null, $sortBy = "Relevance DESC", $extraFilter = "", $booleanSearch = false, $alternativeFileFilter = "", $invertedMatch = false) {
		if(!$pageLength) $pageLength = $this->pageLength;
	 	$keywords = addslashes($keywords);
	
		$extraFilters = array('SiteTree' => '');
	 	
	 	if($booleanSearch) $boolean = "IN BOOLEAN MODE";
	 	if($extraFilter) {
	 		$extraFilters['SiteTree'] = " AND $extraFilter";
	 	}
	 	
	 	if($this->showInSearchTurnOn)	$extraFilters['SiteTree'] .= " AND showInSearch <> 0";

		$start = isset($_GET['start']) ? (int)$_GET['start'] : 0;
		$limit = $start . ", " . (int) $pageLength;
		
		$notMatch = $invertedMatch ? "NOT " : "";
		if($keywords) {
			$match['SiteTree'] = "MATCH (Title, MenuTitle, Content, MetaTitle, MetaDescription, MetaKeywords) AGAINST ('$keywords' $boolean)";
		
			// We make the relevance search by converting a boolean mode search into a normal one
			$relevanceKeywords = str_replace(array('*','+','-'),'',$keywords);
			$relevance['SiteTree'] = "MATCH (Title) AGAINST ('$relevanceKeywords') + MATCH (Title, MenuTitle, Content, MetaTitle, MetaDescription, MetaKeywords) AGAINST ('$relevanceKeywords')";
		} else {
			$relevance['SiteTree'] = 1;
			$match['SiteTree'] = "1 = 1";
		}

		// Generate initial queries and base table names
		$baseClasses = array('SiteTree' => '');
		foreach($this->classesToSearch as $class) {
			$queries[$class] = singleton($class)->extendedSQL($notMatch . $match[$class] . $extraFilters[$class], "");
			$baseClasses[$class] = reset($queries[$class]->from);
		}
		
		// Make column selection lists
		$select = array(
			'SiteTree' => array("ClassName","$baseClasses[SiteTree].ID","ParentID","MetaDescription","Title","URLSegment","Content","LastEdited","Created","_utf8'' AS Filename", "_utf8'' AS Name", "$relevance[SiteTree] AS Relevance", "CanViewType"),
		);
		
		// Process queries
		foreach($this->classesToSearch as $class) {
			// There's no need to do all that joining
			$queries[$class]->from = array(str_replace('`','',$baseClasses[$class]) => $baseClasses[$class]);
			$queries[$class]->select = $select[$class];
			$queries[$class]->orderby = null;
		}

		// Combine queries
		$querySQLs = array();
		$totalCount = 0;
		foreach($queries as $query) {
			$querySQLs[] = $query->sql();
			$totalCount += $query->unlimitedRowCount();
		}
		$fullQuery = implode(" UNION ", $querySQLs) . " ORDER BY $sortBy LIMIT $limit";

		// Get records
		$records = DB::query($fullQuery);

		foreach($records as $record)
			$objects[] = new $record['ClassName']($record);

		if(isset($objects)) $doSet = new DataObjectSet($objects);
		else $doSet = new DataObjectSet();
		
		$doSet->setPageLimits($start, $pageLength, $totalCount);

		return $doSet;
	}
}

?>

Avatar
ryanwachtl

Community Member, 46 Posts

30 July 2010 at 4:13am

Avatar
DeklinKelly

Community Member, 197 Posts

30 July 2010 at 4:46am

Thanks, the directions say to replace a line, but I don't have that line to replace.

Avatar
ryanwachtl

Community Member, 46 Posts

30 July 2010 at 4:54am

What version of SS are you using? What does your current Page.php look like?

Avatar
DeklinKelly

Community Member, 197 Posts

30 July 2010 at 5:13am

I use SilverStripe version 2.4.

Here is my Page.php

<?php
class Page extends SiteTree {

	public static $db = array(
	);

	public static $has_one = array(
	);

}
class Page_Controller extends ContentController {

	public static $allowed_actions = array (
	);

	public function init() {
		parent::init();

	}
}

Avatar
ryanwachtl

Community Member, 46 Posts

30 July 2010 at 6:07am

Sorry for the confusion looks like that Topic doesn't cover 2.4

Here is a quick and dirty way to get your MetaDescription in your template. It will return the Meta Description for a Page if it exists or is not empty, if not it will return false and your template will fall back to the default display.

in Page.php

...
public static $has_one = array( 
   );

function getSearchMetaDescription() { 
	       
        if ( $data = DataObject::get_by_id("Page", $this->ID) ) {
            if ( $data->MetaDescription != "" ) { return $data->MetaDescription; }
            else { return false; }          
        }
        else { return false; }
              
    }
...

then update template Page_results.ss:

replace:

$Content.LimitWordCountXML

with:

<% if SearchMetaDescription %>
<p>$SearchMetaDescription</p>
<% else %>
<p>$Content.LimitWordCountXML</p>
<% end_if %>

Go to Top