Jump to content
Peter Knight

Limiting search results

Recommended Posts

I have about 50 pages which are just containers for their child pages.

What's the most efficient way to exclude these parent pages from Searches?

I'm using Ryan's code here

Quote

<?php

				// search.php template file
				// See README.txt for more information. 

				// look for a GET variable named 'q' and sanitize it
				$q = $sanitizer->text($input->get->q); 

				// did $q have anything in it?
				if($q) { 

					// Sanitize for placement within a selector string. This is important for any 
					// values that you plan to bundle in a selector string like we are doing here.
					$q = $sanitizer->selectorValue($q); 

					// Search the title and body fields for our query text.
					// Limit the results to 50 pages. 
					$selector = "title|body~=$q, limit=50"; 

					// If user has access to admin pages, lets exclude them from the search results.
					// Note that 2 is the ID of the admin page, so this excludes all results that have
					// that page as one of the parents/ancestors. This isn't necessary if the user 
					// doesn't have access to view admin pages. So it's not technically necessary to
					// have this here, but we thought it might be a good way to introduce has_parent.
					if($user->isLoggedin()) $selector .= ", has_parent!=2"; 

					// Find pages that match the selector
					$matches = $pages->find($selector); 

					// did we find any matches? ...
					if($matches->count) {

						// we found matches
						echo "<strong>$matches->count page(s) match your query:</strong>";

						// output navigation for them
						echo "<ul class='uk-list uk-list-divider'>";

						foreach($matches as $match) {
							echo "<li><a href='$match->url'>$match->title</a>";
							echo "<div class='summary'>$match->summary</div>";
							echo "<div class='search-path'>{$match->path}</div></li>";

						}
						 
						

						echo "</ul>";

					} else {
						// we didn't find any
						echo "<h2>Sorry, no results were found.</h2>";
					}

				} else {
					// no search terms provided
					echo "<h2>Please enter a search term in the search box (upper right corner)</h2>";
				}

	?>

 

 

I guess I have a few options but is number 2 here the best way or is there anything I haven't considered which would be better?

1. Mark as 'Hidden: Exclude from lists and searches"
Isn't an option because it hides from lists which I use.

2. Tell the selector to ignore a particular template(s)
Sounds like a good approach

3. Create my own checkbox called "Search Ignore" and add it into a selector
Could work but it seems like a ton of work to manually edit all the pages I want to ignore

Cheers

 

 

 

 

 

 

 

 

 

Share this post


Link to post
Share on other sites
22 minutes ago, Peter Knight said:

Tell the selector to ignore a particular template(s)
Sounds like a good approach

this seems like the best approach. If these parents have a distinctive feature that can be used to select them (a certain parent, template, field etc), then use $pages->getIDs() method and update your selector to exclude the children with $pages("..., has_parent!=$hidableParents");

Edit: has_parent supports single values, you can build a string for multiple OR groups (has_parent=!35), (has_parent=!72), (...) etc

  • Like 1

Share this post


Link to post
Share on other sites

^ Templates seem the most likely option. I usually have parent pages a different template from children, so you could do "template!=example", or specify the child templates, i.e. "template=child-example".

If the child pages don't have any child pages of their own, you can also exclude them on that basis?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By snobjorn
      I have a website with multiple content types that I want to be accessible through search. I really like the live search on processwire.com, that sorts content types while typing. I tried to find the code to recreate this, with no luck. Does anyone know if this is jquery, specific jquery plugins, json/xml cached files, and what kind of PHP code is used? Any tip that point me in the right direction would be much apperciated.
      The search result listing seems fairly easy to create with sorting through parameters.
    • By Anders
      I want to allow full text search on my site. There is a very nice solution that comes right out of the box:
      $selector = "title|body~=$q, limit=50"; This works, but to make it even better I would want to give higher weight to pages where the search term occurs in the title, than if it just occurs in the body. After all, a page with the title "Wine from France" is probably the best match for the search "france wine". How do I accomplish this in ProcessWire?
      I can see three possible paths, but I am not very fond of any of them:
      Do a direct SQL query, circumventing the API, along these lines. But I would prefer to abstract away the database layout if at all possible. Use something like ElasticSearch, but to be honest that would be to complicated to set up and maintain in the long run. Make multiple lookups, first for matches in the title, then for matches in the body, and merge and sort in PHP. My suspicion is that this would get complicated quite quickly. For instance, how do you deal with a page that has two of the three search terms in the title and the third in the body? Is there a magic option four I should look into? Or are any of the above options better than the others? Any input is welcome!
    • By jds43
      Hello,
      I have a search page loosely based on Skyscrapers where I'm parsing a selector with options 'beds', 'bathrooms', 'size' fields. It is working well until I select 'Any' after I've run a search. This is where no results are returned (/?beds=&bathrooms=&size=&submit=). I want it to reset and show all results.
      I hope this isn't too vague.
       
    • By Peter Troeger
      Hello Community 🙂
      Has anyone ever tried having multiple elements on one page that get their info with $pages->find('selector, limit=n') and tried using pagination on one of these elements without effecting the other?
      I have a slider on a page where I display content with pagination. But when I go to page two, the slider content also goes to page two, which I don't want it to do 🙂
      Any tips are greatly appreciated!
      Thanks!
      -Peter
    • By sww
      Hey there,
      i am trying to add a kind of "intelligent" search.
      Is there any way to ignore punctuation and extra chars.
      e.g.
      When I type "somebody elses" that I still get the result "SOMEBODY ELSE´S CAR, 2005"
      The problem is the extra ´ … if I don't type it I don't get the result.
      So far I am using %=query (which isn't enough, I know)
      So the idea would be something like that:
      $selector = "sanitize(title|text)%=$q, limit=50";
      I know, it's not gonna work like that … just to illustrate.
      Best,
      Stefan
×
×
  • Create New...