/** * Filter to handle Views queries with checkboxes. * * @todo DOCUMENT THIS! * * @param type $query * @param type $view_settings * @return string */ function wpcf_views_query($query, $view_settings) { $meta_filter_required = false; $opt = get_option('wpcf-fields'); if (isset($query['meta_query'])) { foreach ($query['meta_query'] as $index => $meta) { if (is_array($meta) && isset($meta['key'])) { $field_name = $meta['key']; if (_wpcf_is_checkboxes_field($field_name)) { // We'll use SQL regexp to find the checked items. // Note that we are creating something here that // then gets modified to a proper SQL REGEXP in // the get_meta_sql filter. $field_name = substr($field_name, 5); $meta_filter_required = true; $meta['compare'] = '='; $values = explode(',', $meta['value']); $meta['value'] = ' REGEXP('; $options = $opt[$field_name]['data']['options']; $count = 0; foreach ($values as $value) { foreach ($options as $key => $option) { if ($option['title'] == $value) { if ($count > 0) { $meta['value'] .= '|'; } $meta['value'] .= $key; break; } } $count++; } $meta['value'] .= ')'; $query['meta_query'][$index] = $meta; } } } } if ($meta_filter_required) { add_filter('get_meta_sql', 'wpcf_views_get_meta_sql', 10, 6); } return $query; }
/** * Filter to handle Views queries with checkboxes. * * @todo DOCUMENT THIS! * * @param type $query * @param type $view_settings * @return string */ function wpcf_views_query($query, $view_settings, $meta_key = 'wpcf-fields') { if (!in_array($meta_key, array('wpcf-fields', 'wpcf-usermeta', 'wpcf-termmeta'))) { return $query; } $meta_filter_required = false; $opt = get_option($meta_key); if (isset($query['meta_query'])) { foreach ($query['meta_query'] as $index => $meta) { if (is_array($meta) && isset($meta['key'])) { $field_name = $meta['key']; if (_wpcf_is_checkboxes_field($field_name, $meta_key)) { $orginal = $query['meta_query'][$index]; unset($query['meta_query'][$index]); // We'll use SQL regexp to find the checked items. // Note that we are creating something here that // then gets modified to a proper SQL REGEXP in // the get_meta_sql filter. $field_name = substr($field_name, 5); $meta_filter_required = true; /* According to http://codex.wordpress.org/Class_Reference/WP_Meta_Query#Accepted_Arguments, * $meta['value'] can be an array or a string. In case of a string we additionally allow * multiple comma-separated values. */ if (is_array($meta['value'])) { $values = $meta['value']; // Add comma-separated combinations of meta values, since a legit value containing a comma might have been removed $values = _wpcf_views_query_recursive_add_comma_meta_values($values); } elseif (is_string($meta['value'])) { $values = explode(',', $meta['value']); if (count($values) > 1) { // Add comma-separated combinations of meta values, since a legit value containing a comma might have been removed $values = _wpcf_views_query_recursive_add_comma_meta_values($values); // Also add the original one, as it might be a legitimate value containing several commas instead of a comma-separated list $values[] = $meta['value']; } } else { // This can happen if $meta['value'] is a number, for example. $values = array($meta['value']); } $options = $opt[$field_name]['data']['options']; global $wp_version; if (version_compare($wp_version, '4.1', '<')) { // We can not use nested meta_query entries foreach ($values as $value) { foreach ($options as $key => $option) { if ($option['title'] == $value || isset($option['set_value']) && $option['set_value'] == $value) { $query['meta_query'][] = array('key' => $meta['key'], 'compare' => in_array($orginal['compare'], array('!=', 'NOT LIKE', 'NOT IN')) ? 'NOT LIKE' : 'LIKE', 'value' => $key, 'type' => 'CHAR'); break; } } } } else { // We can use nested meta_query entries if (count($values) < 2) { // Only one value to filter by, so no need to add nested meta_query entries foreach ($values as $value) { foreach ($options as $key => $option) { if ($option['title'] == $value || isset($option['set_value']) && $option['set_value'] == $value) { $query['meta_query'][] = array('key' => $meta['key'], 'compare' => in_array($orginal['compare'], array('!=', 'NOT LIKE', 'NOT IN')) ? 'NOT LIKE' : 'LIKE', 'value' => $key, 'type' => 'CHAR'); break; } } } } else { // We will translate each value into a meta_query clause and add them all as a nested meta_query entry $inner_relation = in_array($orginal['compare'], array('!=', 'NOT LIKE', 'NOT IN')) ? 'AND' : 'OR'; $inner_compare = in_array($orginal['compare'], array('!=', 'NOT LIKE', 'NOT IN')) ? 'NOT LIKE' : 'LIKE'; $inner_meta_query = array('relation' => $inner_relation); foreach ($values as $value) { foreach ($options as $key => $option) { if ($option['title'] == $value || isset($option['set_value']) && $option['set_value'] == $value) { $inner_meta_query[] = array('key' => $meta['key'], 'compare' => $inner_compare, 'value' => $key, 'type' => 'CHAR'); break; } } } $query['meta_query'][] = $inner_meta_query; } } } } } } if ($meta_filter_required) { add_filter('get_meta_sql', 'wpcf_views_get_meta_sql', 10, 6); } return $query; }
/** * Filter to handle Views queries with checkboxes. * * @todo DOCUMENT THIS! * * @param type $query * @param type $view_settings * @return string */ function wpcf_views_query($query, $view_settings) { $meta_filter_required = false; $opt = get_option('wpcf-fields'); if (isset($query['meta_query'])) { foreach ($query['meta_query'] as $index => $meta) { if (is_array($meta) && isset($meta['key'])) { $field_name = $meta['key']; if (_wpcf_is_checkboxes_field($field_name)) { $orginal = $query['meta_query'][$index]; unset($query['meta_query'][$index]); // We'll use SQL regexp to find the checked items. // Note that we are creating something here that // then gets modified to a proper SQL REGEXP in // the get_meta_sql filter. $field_name = substr($field_name, 5); $meta_filter_required = true; /* According to http://codex.wordpress.org/Class_Reference/WP_Meta_Query#Accepted_Arguments, * $meta['value'] can be an array or a string. In case of a string we additionally allow * multiple comma-separated values. */ if (is_array($meta['value'])) { $values = $meta['value']; } elseif (is_string($meta['value'])) { $values = explode(',', $meta['value']); } else { // This can happen if $meta['value'] is a number, for example. $values = array($meta['value']); } $options = $opt[$field_name]['data']['options']; foreach ($values as $value) { foreach ($options as $key => $option) { if ($option['title'] == $value) { $query['meta_query'][] = array('key' => $meta['key'], 'compare' => 'NOT IN' == $orginal['compare'] ? 'NOT LIKE' : 'LIKE', 'value' => $key, 'type' => 'CHAR'); break; } } } } } } } if ($meta_filter_required) { add_filter('get_meta_sql', 'wpcf_views_get_meta_sql', 10, 6); } return $query; }