Note: You are viewing the documentation for Version 4View Version 3 Docs

Comparing Index and Source Mods

\SearchWP\Mods are purpose built interactions with SearchWP search queries.

There are to primary types of Mods:

Index-based
Apply modification to the index as a whole
Source-based
Limit the modification to a single Source

The primary way of specifying which type of Mod you’re implementing is to pass in a Source (or Source name) when instantiating a Mod.

Note: this is a comparison of the two instantiations, note that these Mods don’t actually do anything yet.

<?php
// @link https://searchwp.com/documentation/knowledge-base/comparing-index-source-mods/
// Instantiate an index Mod that applies to the entire index.
$mod = new \SearchWP\Mod();
// Instantiate a Source Mod that applies only to Posts.
$source = \SearchWP\Utils::get_post_type_source_name( 'post' );
$mod = new \SearchWP\Mod( $source );

The first Mod has been instantiated in a way that will apply to the Index as a whole when they query runs. By comparison, the second Mod will apply only to a single Source.

Using an Index-based Mod

An Index-based Mod has only the SearchWP Index as its context. Index-based Mods should be limited to those that only need that immediate context to perform their job.

While it is certainly possible to perform additional JOINs using an Index-based Mod, doing so may result in increased query times that may not be so prevalent with a Source-based Mod.

For example: an applicable Index-based Mod would be one that adds ‘bonus’ weight to a particular Source that is returned as a result.

All hooks should be added to your custom SearchWP Customizations Plugin.

<?php
// Add relevance weight to a single SearchWP Source (Posts).
add_filter( 'searchwp\query\mods', function( $mods ) {
global $wpdb;
$mod = new \SearchWP\Mod();
$source = \SearchWP\Utils::get_post_type_source_name( 'post' );
$mod->weight( $wpdb->prepare( "IF(s.source = %s, 9999999, 0)", $source ) );
$mods[] = $mod;
return $mods;
} );

With this Mod a ‘bonus’ relevance weight of 9999999 will be afforded to all Posts. A use case for a hook like this may be that you want Posts to be (nearly) guaranteed to show up above all other Sources without explicitly forcing Sources to be grouped together.

Using an Source-based Mod

Source-based Mods facilitate query modifications that apply only to a single Source. In this case there already exists a JOIN with the database table that defines the Source, which opens new possibilities for modification.

For example: a Source-based Mod can be used to exclude certain Posts from search results if some sort of condition has been met:

All hooks should be added to your custom SearchWP Customizations Plugin.

<?php
add_filter( 'searchwp\query\mods', function( $mods ) {
if ( ! isset( $_GET['my_mod_trigger'] ) ) {
return $mods;
}
// Exclude Posts 97 and 188 from search results.
$source = \SearchWP\Utils::get_post_type_source_name( 'post' );
$mod = new \SearchWP\Mod( $source );
$mod->set_where( [ [
'column' => 'ID',
'value' => ['97', '188'],
'compare' => 'NOT IN',
'type' => 'NUMERIC'
] ] );
$mods[] = $mod;
return $mods;
}, 30, 2 );

Using this Mod Post 97 and 188 are excluded from search results only when $_GET['my_mod_trigger'] has been defined.

Another example: a Source-based Mod can be used to exclude Pages with the word coffee in their Title:

All hooks should be added to your custom SearchWP Customizations Plugin.

<?php
add_filter( 'searchwp\query\mods', function( $mods ) {
// Exclude Pages with 'coffee' in the Title.
$source = \SearchWP\Utils::get_post_type_source_name( 'page' );
$mod = new \SearchWP\Mod( $source );
$mod->set_where( [ [
'column' => 'post_title',
'value' => 'coffee',
'compare' => 'LIKE',
] ] );
$mods[] = $mod;
return $mods;
}, 30, 2 );

Source-based Mods are powerful, programmatic ways to modify the way SearchWP performs its searches.

Fix keyword search on your site. No coding required!

Now you can utilize all of the content that's gone unrecognized by native WordPress keyword search instantly with SearchWP

Get SearchWP