Пример #1
0
/**
 * 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;
}
Пример #2
0
/**
 * 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;
}
Пример #3
0
/**
 * 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;
}