1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175:
<?php
namespace WPGMZA;
require_once(plugin_dir_path(__FILE__) . 'class.custom-fields.php');
require_once(plugin_dir_path(__FILE__) . 'class.custom-marker-fields.php');
class CustomFieldFilter
{
private $field_id;
private $map_id;
private $values;
private $field_data;
private static $cached_widget_types_by_filter_id;
public function __construct($field_id, $map_id)
{
global $wpdb;
global $WPGMZA_TABLE_NAME_MAPS_HAS_CUSTOM_FIELDS_FILTERS;
global $WPGMZA_TABLE_NAME_MARKERS_HAS_CUSTOM_FIELDS;
global $WPGMZA_TABLE_NAME_CUSTOM_FIELDS;
if(!is_numeric($field_id))
throw new \Exception('Invalid field ID');
$this->field_id = $field_id;
$this->map_id = $map_id;
$results = $wpdb->get_results("SELECT * FROM $WPGMZA_TABLE_NAME_CUSTOM_FIELDS WHERE id = " . (int)$field_id);
if(!empty($results))
$this->field_data = $results[0];
$qstr = "SELECT value
FROM $WPGMZA_TABLE_NAME_MARKERS_HAS_CUSTOM_FIELDS
WHERE object_id IN (
SELECT id FROM {$wpdb->prefix}wpgmza WHERE map_id = %d
) AND field_id = %d
GROUP BY value";
$stmt = $wpdb->prepare($qstr, array($map_id, $field_id));
$this->values = $wpdb->get_col($stmt);
}
public static function setEnabledFilters($map_id, $field_ids)
{
global $wpdb;
global $WPGMZA_TABLE_NAME_MAPS_HAS_CUSTOM_FIELDS_FILTERS;
$qstr = "DELETE FROM $WPGMZA_TABLE_NAME_MAPS_HAS_CUSTOM_FIELDS_FILTERS WHERE map_id=%d";
$params = array($map_id);
if(!empty($field_ids))
{
$field_ids = array_map('intval', $field_ids);
$imploded = implode(',', $field_ids);
$qstr .= " AND field_id NOT IN ($imploded)";
}
$stmt = $wpdb->prepare($qstr, $params);
$wpdb->query($stmt);
$qstr = "INSERT INTO $WPGMZA_TABLE_NAME_MAPS_HAS_CUSTOM_FIELDS_FILTERS
(map_id, field_id)
VALUES
(%d, %d)
ON DUPLICATE KEY UPDATE field_id=%d";
foreach($field_ids as $field_id)
{
$stmt = $wpdb->prepare($qstr, array(
$map_id,
$field_id,
$field_id
));
$wpdb->query($stmt);
}
}
public static function getWidgetType($field_id)
{
global $wpdb;
global $WPGMZA_TABLE_NAME_CUSTOM_FIELDS;
if(CustomFieldFilter::$cached_widget_types_by_filter_id)
return CustomFieldFilter::$cached_widget_types_by_filter_id[$field_id];
CustomFieldFilter::$cached_widget_types_by_filter_id = array();
$results = $wpdb->get_results("SELECT id, widget_type FROM $WPGMZA_TABLE_NAME_CUSTOM_FIELDS");
foreach($results as $obj)
CustomFieldFilter::$cached_widget_types_by_filter_id[$obj->id] = $obj->widget_type;
return CustomFieldFilter::$cached_widget_types_by_filter_id[$field_id];
}
public function getMapID()
{
return $this->map_id;
}
public function getFieldID()
{
return $this->field_id;
}
public function getFieldValues()
{
return $this->values;
}
public function getFieldData()
{
return $this->field_data;
}
public function getFilteringSQL($value)
{
global $wpdb;
global $WPGMZA_TABLE_NAME_MARKERS_HAS_CUSTOM_FIELDS;
$qstr = "SELECT object_id AS id FROM $WPGMZA_TABLE_NAME_MARKERS_HAS_CUSTOM_FIELDS
WHERE field_id = %d";
$params = array(
$this->field_id
);
if(is_array($value))
{
$parts = array();
foreach($value as $el)
{
$parts[] = 'value LIKE %s';
$params[] = $el;
}
$qstr .= ' AND (' . implode(' OR ', $parts) . ')';
}
else
{
$qstr .= ' AND value LIKE %s';
$params[] = '%' . $value . '%';
}
$qstr .= " AND object_id IN (
SELECT id FROM {$wpdb->prefix}wpgmza WHERE map_id=%d
)";
$params[] = $this->map_id;
$stmt = $wpdb->prepare($qstr, $params);
return $stmt;
}
}
add_filter('wpgmza_get_custom_field_filter', 'WPGMZA\\get_custom_field_filter', 100, 2);
function get_custom_field_filter($field_id, $map_id)
{
if($field_id instanceof CustomFieldFilter)
return $field_id;
return new CustomFieldFilter($field_id, $map_id);
}