function wpv_filter_get_order_arg($query, $view_settings)
{
    $orderby = $view_settings['orderby'];
    if (isset($_GET['wpv_column_sort_id']) && $_GET['wpv_column_sort_id'] != 'undefined') {
        $orderby = $_GET['wpv_column_sort_id'];
    }
    $orderby_set = false;
    if (strpos($orderby, 'field-') === 0) {
        // we need to order by meta data.
        $query['meta_key'] = substr($orderby, 6);
        $orderby = 'meta_value';
        $orderby_set = true;
        // Fix for numeric custom field , need to user meta_value_num
        if (_wpv_is_numeric_field($view_settings['orderby'])) {
            $orderby = 'meta_value_num';
        }
    }
    $query['orderby'] = $orderby;
    if (isset($_GET['wpv_order'])) {
        $query['order'] = $_GET['wpv_order'][0];
    }
    // check for column sorting GET parameters.
    if (!$orderby_set && isset($_GET['wpv_column_sort_id']) && $_GET['wpv_column_sort_id'] != 'undefined') {
        $field = $_GET['wpv_column_sort_id'];
        if (strpos($field, 'post-field') === 0) {
            $query['meta_key'] = substr($field, 11);
            $query['orderby'] = 'meta_value';
        } elseif (strpos($field, 'types-field') === 0) {
            $query['meta_key'] = strtolower(substr($field, 12));
            if (function_exists('wpcf_types_get_meta_prefix')) {
                $query['meta_key'] = wpcf_types_get_meta_prefix() . $query['meta_key'];
            }
            if (_wpv_is_numeric_field('field-' . $query['meta_key'])) {
                $query['orderby'] = 'meta_value_num';
            } else {
                $query['orderby'] = 'meta_value';
            }
        } else {
            $query['orderby'] = str_replace('-', '_', $field);
        }
    }
    if (isset($_GET['wpv_column_sort_dir']) && $_GET['wpv_column_sort_dir'] != 'undefined') {
        $query['order'] = strtoupper($_GET['wpv_column_sort_dir']);
    }
    if ($query['orderby'] == 'post_link') {
        $query['orderby'] = 'post_title';
    }
    if ($query['orderby'] == 'post_body') {
        $query['orderby'] = 'post_content';
    }
    if (strpos($query['orderby'], 'post_') === 0) {
        $query['orderby'] = substr($query['orderby'], 5);
    }
    global $orderby_meta;
    $orderby_meta = array();
    // See if the orderby is the same as a custom field filter
    if (isset($query['meta_key']) && isset($query['meta_query'])) {
        foreach ($query['meta_query'] as $index => $meta) {
            if (isset($meta['key']) && $meta['key'] == $query['meta_key']) {
                // Found it.
                // We need to add a post_orderby filter directly to sort by the same field.
                $orderby_meta['order_by'] = $query['orderby'];
                $orderby_meta['meta_key'] = $query['meta_key'];
                $orderby_meta['order'] = $query['order'];
                unset($query['meta_key']);
                add_filter('posts_where', 'wpv_post_where_meta', 10, 2);
                add_filter('posts_orderby', 'wpv_post_order_by_meta', 10, 2);
                break;
            }
        }
    }
    return $query;
}
function wpv_filter_get_order_arg($query, $view_settings)
{
    $orderby = $view_settings['orderby'];
    if (isset($_GET['wpv_column_sort_id']) && esc_attr($_GET['wpv_column_sort_id']) != 'undefined' && esc_attr($_GET['wpv_column_sort_id']) != '') {
        $orderby = esc_attr($_GET['wpv_column_sort_id']);
    }
    $orderby_set = false;
    if (strpos($orderby, 'field-') === 0) {
        // we need to order by meta data.
        $query['meta_key'] = substr($orderby, 6);
        $orderby = 'meta_value';
        $orderby_set = true;
        // Fix for numeric custom field , need to user meta_value_num
        if (_wpv_is_numeric_field($view_settings['orderby'])) {
            $orderby = 'meta_value_num';
        }
    }
    $query['orderby'] = $orderby;
    if (isset($_GET['wpv_order'])) {
        $query['order'] = esc_attr($_GET['wpv_order'][0]);
    }
    // check for column sorting GET parameters.
    if (!$orderby_set && isset($_GET['wpv_column_sort_id']) && esc_attr($_GET['wpv_column_sort_id']) != 'undefined' && esc_attr($_GET['wpv_column_sort_id']) != '') {
        $field = esc_attr($_GET['wpv_column_sort_id']);
        if (strpos($field, 'post-field') === 0) {
            $query['meta_key'] = substr($field, 11);
            $query['orderby'] = 'meta_value';
        } elseif (strpos($field, 'types-field') === 0) {
            $query['meta_key'] = strtolower(substr($field, 12));
            if (function_exists('wpcf_types_get_meta_prefix')) {
                $query['meta_key'] = wpcf_types_get_meta_prefix() . $query['meta_key'];
            }
            if (_wpv_is_numeric_field('field-' . $query['meta_key'])) {
                $query['orderby'] = 'meta_value_num';
            } else {
                $query['orderby'] = 'meta_value';
            }
        } else {
            $query['orderby'] = str_replace('-', '_', $field);
        }
    }
    if (isset($_GET['wpv_column_sort_dir']) && esc_attr($_GET['wpv_column_sort_dir']) != 'undefined' && esc_attr($_GET['wpv_column_sort_dir']) != '') {
        $query['order'] = strtoupper(esc_attr($_GET['wpv_column_sort_dir']));
    }
    if ($query['orderby'] == 'post_link') {
        $query['orderby'] = 'post_title';
    }
    if ($query['orderby'] == 'post_body') {
        $query['orderby'] = 'post_content';
    }
    if (strpos($query['orderby'], 'post_') === 0) {
        $query['orderby'] = substr($query['orderby'], 5);
    }
    global $orderby_meta;
    $orderby_meta = array();
    // See if filtering by custom fields and sorting by custom field too
    if (isset($query['meta_key']) && isset($query['meta_query'])) {
        $thirdsorting = true;
        // flag to know if sorting by one of the filtering custom fields or by another custom field
        // See if the orderby is the same as a custom field filter
        foreach ($query['meta_query'] as $index => $meta) {
            if (isset($meta['key']) && $meta['key'] == $query['meta_key']) {
                // Found it.
                // We need to add a post_orderby filter directly to sort by the same field.
                $thirdsorting = false;
                $orderby_meta['order_by'] = $query['orderby'];
                $orderby_meta['meta_key'] = $query['meta_key'];
                $orderby_meta['order'] = $query['order'];
                unset($query['meta_key']);
                add_filter('posts_where', 'wpv_post_where_meta', 10, 2);
                add_filter('posts_orderby', 'wpv_post_order_by_meta', 10, 2);
                break;
            }
        }
        if ($thirdsorting) {
            // if filtering by custom fields and sorting by another custom field
            $refinedquery = $query;
            unset($refinedquery['orderby']);
            unset($refinedquery['meta_key']);
            $refinedquery['posts_per_page'] = -1;
            // remove the limit in the main query to get all the relevant IDs
            // first query only for filtering
            $filtered_query = new WP_Query($refinedquery);
            $filtered_ids = array();
            while ($filtered_query->have_posts()) {
                $filtered_query->next_post();
                $filtered_ids[] = $filtered_query->post->ID;
            }
            // remove the fields filter from the original query and add the filtered IDs
            unset($query['meta_query']);
            if (isset($query['post__in'])) {
                $query['post__in'] = (array) $query['post__in'];
                $query['post__in'] = array_merge($filtered_ids, $query['post__in']);
            } else {
                $query['post__in'] = $filtered_ids;
            }
        }
    }
    return $query;
}
function wpv_filter_get_order_arg($query, $view_settings)
{
    global $WP_Views;
    $orderby = $view_settings['orderby'];
    if (isset($_GET['wpv_column_sort_id']) && esc_attr($_GET['wpv_column_sort_id']) != 'undefined' && esc_attr($_GET['wpv_column_sort_id']) != '' && esc_attr($_GET['wpv_view_count']) == $WP_Views->get_view_count()) {
        $orderby = esc_attr($_GET['wpv_column_sort_id']);
    }
    $orderby_set = false;
    if (strpos($orderby, 'field-') === 0) {
        // we need to order by meta data.
        $query['meta_key'] = substr($orderby, 6);
        $orderby = 'meta_value';
        $orderby_set = true;
        // Fix for numeric custom field , need to user meta_value_num
        if (_wpv_is_numeric_field($view_settings['orderby']) || _wpv_is_numeric_field('field-wpcf-' . $query['meta_key'])) {
            // This OR will ensure that numeric fields created outside Types but under Types control can sort properly
            $orderby = 'meta_value_num';
        }
    }
    $query['orderby'] = $orderby;
    // This seems legacy code ??
    if (isset($_GET['wpv_order']) && isset($_GET['wpv_order'][0]) && in_array($_GET['wpv_order'][0], array('ASC', 'DESC'))) {
        $query['order'] = esc_attr($_GET['wpv_order'][0]);
    }
    // check for column sorting GET parameters.
    if (!$orderby_set && isset($_GET['wpv_column_sort_id']) && esc_attr($_GET['wpv_column_sort_id']) != 'undefined' && esc_attr($_GET['wpv_column_sort_id']) != '' && esc_attr($_GET['wpv_view_count']) == $WP_Views->get_view_count()) {
        $field = esc_attr($_GET['wpv_column_sort_id']);
        if (strpos($field, 'post-field') === 0) {
            $query['meta_key'] = substr($field, 11);
            $query['orderby'] = 'meta_value';
            if (_wpv_is_numeric_field('field-wpcf-' . $query['meta_key'])) {
                // This will ensure that numeric fields created outside Types but under Types control can sort properly
                $query['orderby'] = 'meta_value_num';
            }
        } elseif (strpos($field, 'types-field') === 0) {
            $query['meta_key'] = strtolower(substr($field, 12));
            if (function_exists('wpcf_types_get_meta_prefix')) {
                $query['meta_key'] = wpcf_types_get_meta_prefix() . $query['meta_key'];
            }
            if (_wpv_is_numeric_field('field-' . $query['meta_key'])) {
                $query['orderby'] = 'meta_value_num';
            } else {
                $query['orderby'] = 'meta_value';
            }
        } else {
            $query['orderby'] = str_replace('-', '_', $field);
        }
    }
    if (isset($_GET['wpv_column_sort_dir']) && esc_attr($_GET['wpv_column_sort_dir']) != 'undefined' && esc_attr($_GET['wpv_column_sort_dir']) != '' && esc_attr($_GET['wpv_view_count']) == $WP_Views->get_view_count() && in_array(strtoupper(esc_attr($_GET['wpv_column_sort_dir'])), array('ASC', 'DESC'))) {
        $query['order'] = strtoupper(esc_attr($_GET['wpv_column_sort_dir']));
    }
    if ($query['orderby'] == 'post_link') {
        $query['orderby'] = 'post_title';
    } else {
        if ($query['orderby'] == 'post_body') {
            $query['orderby'] = 'post_content';
        } else {
            if ($query['orderby'] == 'post_slug') {
                $query['orderby'] = 'name';
            } else {
                if ($query['orderby'] == 'post_id') {
                    $query['orderby'] = 'ID';
                } else {
                    if (strpos($query['orderby'], 'post_') === 0) {
                        $query['orderby'] = substr($query['orderby'], 5);
                    }
                }
            }
        }
    }
    global $orderby_meta;
    $orderby_meta = array();
    // See if filtering by custom fields and sorting by custom field too
    if (isset($query['meta_key']) && isset($query['meta_query'])) {
        // We only need to do something if the relation is OR
        // When the relation is AND it does not matter if we sort by one of the filtering fields, because the filter will add an existence clause anyway
        // When the relation is OR, the natural query will generate an OR clause on the sorting field existence:
        // - if it is one of the filtering fields, it will make its clause useless because just existence will make it pass
        // - if it is not one of the filtering fields it will add an OR clause on this field existence that might pass for results that do not match any of the other requirements
        // See also: https://core.trac.wordpress.org/ticket/25538
        // Since WordPress 4.1 this is indeed not needed, thanks to nested meta_query entries
        if (isset($query['meta_query']['relation']) && $query['meta_query']['relation'] == 'OR') {
            global $wp_version;
            if (version_compare($wp_version, '4.1', '<')) {
                $refinedquery = $query;
                unset($refinedquery['orderby']);
                unset($refinedquery['meta_key']);
                $refinedquery['posts_per_page'] = -1;
                // remove the limit in the main query to get all the relevant IDs
                $refinedquery['fields'] = 'ids';
                // first query only for filtering
                $filtered_query = new WP_Query($refinedquery);
                $filtered_ids = array();
                if (is_array($filtered_query->posts) && !empty($filtered_query->posts)) {
                    $filtered_ids = $filtered_query->posts;
                }
                // remove the fields filter from the original query and add the filtered IDs
                unset($query['meta_query']);
                // we can replace the $query['post__in'] argument because it was applied on the auxiliar query before
                if (count($filtered_ids)) {
                    $query['post__in'] = $filtered_ids;
                } else {
                    $query['post__in'] = array('0');
                }
            }
        }
    }
    return $query;
}