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; }