Skip to content

Instantly share code, notes, and snippets.

@vfontjr
Last active June 26, 2022 12:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vfontjr/85136cf1fe0fa4a1febdf401d4c20e4a to your computer and use it in GitHub Desktop.
Save vfontjr/85136cf1fe0fa4a1febdf401d4c20e4a to your computer and use it in GitHub Desktop.
<?php
/* directory search form custom where filter */
add_filter('frm_view_order', 'masterminds_directory_search_filter', 10, 2);
/**
* masterminds_directory_search_filter() callback for frm_view_order filter
*
* this function is where you create custom SQL for any view
*
* @param array $query contains the SQL query created by Formidable
* @param array $args contains the view
*
* @return $query with the rewritten custom query
*/
function masterminds_directory_search_filter( $query, $args ) {
/* developers directory search view */
if ( isset( $args['display']->post_name ) && $args['display']->post_name == "developers-directory-search-results" ) {
/* initialize variables for the sql */
global $wpdb;
$wpdb_prefix = $wpdb->prefix;
$frm_items_table = $wpdb_prefix . 'frm_items';
$frm_item_metas_table = $wpdb_prefix . 'frm_item_metas';
/* get the number of parameters passed */
$parameters = count($_GET);
$wautop = ( isset( $_GET[ 'wautop' ] ) ) ? 1 : 0;
$query_string_parameters = $parameters-$wautop;
$query_string_parameters_hold = $query_string_parameters;
/* get the directory field ids */
$devdir_directory_listing = FrmField::get_id_by_key( "devdir_directory_listing" );
$devdir_registration_type = FrmField::get_id_by_key( "devdir_registration_type" );
$devdir_first_name = FrmField::get_id_by_key( "devdir_first_name" );
$devdir_display_name = FrmField::get_id_by_key( "devdir_display_name" );
$devdir_price_range = FrmField::get_id_by_key( "devdir_price_range" );
$devdir_country = FrmField::get_id_by_key( "devdir_country" );
$form_id = $query['where']['it.form_id'];
/* Start the SQL statement */
$sql = "SELECT it.id FROM `{$frm_items_table}` it LEFT JOIN `{$frm_item_metas_table}` t2 ON t2.item_id=it.id AND t2.field_id={$devdir_directory_listing} LEFT JOIN `{$frm_item_metas_table}` t4 ON t4.item_id=it.id AND t4.field_id={$devdir_display_name} LEFT JOIN `{$frm_item_metas_table}` fn ON fn.item_id=it.id AND fn.field_id={$devdir_first_name}";
$where = "WHERE it.is_draft = 0 AND it.form_id = {$form_id} AND t2.meta_value = 'Yes'";
$order = "ORDER BY (CASE WHEN t4.meta_value IS NULL THEN fn.meta_value ELSE t4.meta_value END) ASC";
$query['select'] = $sql . " " . $where;
/* empty $query['where'] to prevent conflicts with the view */
$query['where'] = '';
$query['order'] = $order;
if ( ( isset( $_GET[ 'resource_type' ] ) ||
isset( $_GET[ 'display_name' ] ) ||
isset( $_GET[ 'country' ] ) ||
isset( $_GET[ 'price_range' ] ) ) ) {
$where .= " AND ";
$where .= ( $query_string_parameters_hold > 1 ) ? "( " : "";
/* get the field ids for search fields */
if ( isset( $_GET[ 'resource_type' ] ) ) {
$sql .= " LEFT JOIN `{$frm_item_metas_table}` t3 ON t3.item_id=it.id AND t3.field_id={$devdir_registration_type}";
$where .= "t3.meta_value = '" . $_GET[ 'resource_type' ] . "'";
if ( $query_string_parameters > 1 ) {
$where .= " OR ";
--$query_string_parameters;
}
}
if ( isset( $_GET[ 'display_name' ] ) ) {
/* the display name LEFT JOIN is included in the main SQL for the ORDER BY clause */
// $sql .= " LEFT JOIN `{$frm_item_metas_table}` t4 ON t4.item_id=t1.id AND t4.field_id={$devdir_display_name}";
$where .= "t4.meta_value = '" . $_GET[ 'display_name' ] . "'";
if ( $query_string_parameters > 1 ) {
$where .= " OR ";
--$query_string_parameters;
}
}
if ( isset( $_GET[ 'price_range' ] ) ) {
$sql .= " LEFT JOIN `{$frm_item_metas_table}` t5 ON t5.item_id=it.id AND t5.field_id={$devdir_price_range}";
if( $query_string_parameters_hold == 1 ) {
$where .= "t5.meta_value = '" . $_GET[ 'price_range' ] . "'";
} else {
$where .= "t5.meta_value <= '" . $_GET[ 'price_range' ] . "'";
}
if ( $query_string_parameters > 1 ) {
$where .= " OR ";
--$query_string_parameters;
}
}
if ( isset( $_GET[ 'country' ] ) ) {
$sql .= " LEFT JOIN `{$frm_item_metas_table}` t6 ON t6.item_id=it.id AND t6.field_id={$devdir_country}";
$where .= "t6.meta_value = '" . $_GET[ 'country' ] . "'";
}
$where .= ( $query_string_parameters_hold > 1 ) ? " )" : "";
$query['select'] = $sql . " " . $where;
}
}
return $query;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment