Filter (wpda_construct_where_clause) to add custom search behaviour

WP Data Access version 3 allows you to add your own search logic through a filter named wpda_construct_where_clause. The search logic provided through this filter is used in all tools. To allow developers to add search logic for specific tables or columns only, the filter allows to return a null value to indicate that the plugin should continue with its own default search logic.

Example search on text columns

function my_search_logic( $where, $schema_name, $table_name, $columns, $search ) {
	global $wpdb;
	$where_columns = [];
	foreach ( $columns as $column ) {
		if ( 'string' === WPDA::get_type( $column['data_type'] ) ) {
			$where_columns[] = $wpdb->prepare(
				"`{$column['column_name']}` like '%s'", '%' . esc_attr( $search ) . '%' 
			); // WPCS: unprepared SQL OK.
		}
	}
	if ( 0 === count( $where_columns ) ) {
		return ' (1=2) ';
	}
	return ' (' . implode( ' or ', $where_columns ) . ') ';
}
add_filter('wpda_construct_where_clause','my_search_logic',10,5);

Example search on specific table

function my_search_logic( $where, $schema_name, $table_name, $columns, $search ) {
	if ( 'my_schema' === $schema_name && 'my_table' === $table_name ) {
		// You table specific logic goes here...
		return $my_where_clause;
	} else {
		return null; // Use default plugin search logic for all other tables
	}
}
add_filter('wpda_construct_where_clause','my_search_logic',10,5);

Note

Check if parameter $where already has a value and ADD your own logic if it has. DO NOT OVERWRITE! On parent-child pages you might lose the connection between parent and child tables.

Function declaration

wpda_construct_where_clause( $where, $schema_name, $table_name, $columns, $search )

$columns

Associative array containing the following column info taken from the data dictionary:
$columns[‘column_name’] => information_schema.tables.column_name
$columns[‘data_type’] => information_schema.tables.data_type
$columns[‘extra’] => information_schema.tables.extra
$columns[‘column_type’ => information_schema.tables.column_type
$columns[‘is_nullable’ => information_schema.tables.is_nullable
$columns[‘column_default’] => information_schema.tables.column_default

$search

Search string entered by user

$table_name

Table name for which the search logic is provided

$schema_name

Schema in which the table is stored

Thank you Charles! 🙂

Peter Schulz is a lecturer in information technology at the HAN university of applied sciences. He is an experienced programmer with more than 25 years experience in Oracle databases and tools. Peter is the developer of WordPress plugin WP Data Access.

Leave a Reply

Your email address will not be published. Required fields are marked *

20 − twenty =