function wpv_filter_post_category($query, $view_settings)
{
    global $WP_Views;
    if (!isset($view_settings['taxonomy_relationship'])) {
        $view_settings['taxonomy_relationship'] = 'OR';
    }
    $taxonomies = get_taxonomies('', 'objects');
    foreach ($taxonomies as $category_slug => $category) {
        $relationship_name = $category->name == 'category' ? 'tax_category_relationship' : 'tax_' . $category->name . '_relationship';
        if (isset($view_settings[$relationship_name])) {
            $save_name = $category->name == 'category' ? 'post_category' : 'tax_input_' . $category->name;
            $attribute_operator = isset($view_settings['taxonomy-' . $category->name . '-attribute-operator']) ? $view_settings['taxonomy-' . $category->name . '-attribute-operator'] : 'IN';
            if ($view_settings['tax_' . $category->name . '_relationship'] == "FROM PAGE") {
                // we need to get the terms from the current page.
                $current_page = $WP_Views->get_current_page();
                if ($current_page) {
                    //	$terms = wp_get_post_terms($current_page->ID, $category->name, array("fields" => "ids"));
                    //	we can save a SQL query if we use get_the_terms and wp_list_pluck instead of wp_get_post_terms
                    $terms = array();
                    $term_obj = get_the_terms($current_page->ID, $category->name);
                    if ($term_obj && !is_wp_error($term_obj)) {
                        $terms = array_values(wp_list_pluck($term_obj, 'term_id'));
                    }
                    if (count($terms)) {
                        $query['tax_query'][] = array('taxonomy' => $category->name, 'field' => 'id', 'terms' => _wpv_get_translated_terms($terms, $category->name), 'operator' => "IN");
                    } else {
                        // if the current page has no term in the given taxonomy, return nothing
                        $query['tax_query'][] = array('taxonomy' => $category->name, 'field' => 'id', 'terms' => 0, 'operator' => "IN");
                    }
                }
            } else {
                if ($view_settings['tax_' . $category->name . '_relationship'] == "FROM ATTRIBUTE") {
                    $attribute = $view_settings['taxonomy-' . $category->name . '-attribute-url'];
                    if (isset($view_settings['taxonomy-' . $category->name . '-attribute-url-format'])) {
                        $attribute_format = $view_settings['taxonomy-' . $category->name . '-attribute-url-format'][0];
                    } else {
                        $attribute_format = 'name';
                    }
                    $view_attrs = $WP_Views->get_view_shortcodes_attributes();
                    if (isset($view_attrs[$attribute])) {
                        // support csv terms
                        $terms = explode(',', $view_attrs[$attribute]);
                        $term_ids = array();
                        foreach ($terms as $t) {
                            $term = get_term_by($attribute_format, trim($t), $category->name);
                            if ($term) {
                                array_push($term_ids, $term->term_id);
                            }
                        }
                        if (count($term_ids) > 0) {
                            $query['tax_query'][] = array('taxonomy' => $category->name, 'field' => 'id', 'terms' => _wpv_get_translated_terms($term_ids, $category->name), 'operator' => $attribute_operator);
                        } else {
                            if (count($terms) > 1) {
                                // if the shortcode attribute exists and is not empty, and no term matches the value, return nothing
                                $query['tax_query'][] = array('taxonomy' => $category->name, 'field' => 'id', 'terms' => 0, 'operator' => "IN");
                            }
                        }
                    }
                } else {
                    if ($view_settings['tax_' . $category->name . '_relationship'] == "FROM URL") {
                        $url_parameter = $view_settings['taxonomy-' . $category->name . '-attribute-url'];
                        if (isset($view_settings['taxonomy-' . $category->name . '-attribute-url-format'])) {
                            $url_format = $view_settings['taxonomy-' . $category->name . '-attribute-url-format'][0];
                        } else {
                            $url_format = 'name';
                        }
                        if (isset($_GET[$url_parameter])) {
                            if (is_array($_GET[$url_parameter])) {
                                $terms = $_GET[$url_parameter];
                            } else {
                                // support csv terms
                                $terms = explode(',', $_GET[$url_parameter]);
                            }
                            $term_ids = array();
                            foreach ($terms as $t) {
                                $term = get_term_by($url_format, trim($t), $category->name);
                                if ($term) {
                                    array_push($term_ids, $term->term_id);
                                }
                            }
                            if (count($term_ids) > 0) {
                                $query['tax_query'][] = array('taxonomy' => $category->name, 'field' => 'id', 'terms' => _wpv_get_translated_terms($term_ids, $category->name), 'operator' => $attribute_operator);
                            } else {
                                if (!empty($_GET[$url_parameter])) {
                                    // if the URL parameter exists and is not empty, and no term matches the value, return nothing
                                    $query['tax_query'][] = array('taxonomy' => $category->name, 'field' => 'id', 'terms' => 0, 'operator' => "IN");
                                }
                            }
                        }
                    } else {
                        if ($view_settings['tax_' . $category->name . '_relationship'] == "FROM PARENT VIEW") {
                            $parent_term_id = $WP_Views->get_parent_view_taxonomy();
                            if ($parent_term_id) {
                                $query['tax_query'][] = array('taxonomy' => $category->name, 'field' => 'id', 'terms' => _wpv_get_translated_terms(array($parent_term_id), $category->name), 'operator' => "IN");
                            } else {
                                // if the parent View does not set any term, return nothing
                                $query['tax_query'][] = array('taxonomy' => $category->name, 'field' => 'id', 'terms' => 0, 'operator' => "IN");
                            }
                        } else {
                            if (isset($view_settings[$save_name])) {
                                // when relationship is IN, NOT IN or AND
                                $term_ids = $view_settings[$save_name];
                                $query['tax_query'][] = array('taxonomy' => $category->name, 'field' => 'id', 'terms' => _wpv_get_translated_terms($term_ids, $category->name), 'operator' => $view_settings['tax_' . $category->name . '_relationship']);
                            }
                        }
                    }
                }
            }
            if (isset($query['tax_query'])) {
                $query['tax_query']['relation'] = $view_settings['taxonomy_relationship'];
            }
        }
    }
    return $query;
}
function wpv_filter_post_category($query, $view_settings)
{
    global $WP_Views;
    if (!isset($view_settings['taxonomy_relationship'])) {
        $view_settings['taxonomy_relationship'] = 'OR';
    }
    $taxonomies = get_taxonomies('', 'objects');
    foreach ($taxonomies as $category_slug => $category) {
        $relationship_name = $category->name == 'category' ? 'tax_category_relationship' : 'tax_' . $category->name . '_relationship';
        if (isset($view_settings[$relationship_name])) {
            $save_name = $category->name == 'category' ? 'post_category' : 'tax_input_' . $category->name;
            if (!isset($query['tax_query'])) {
                $query['tax_query'] = array('relation' => $view_settings['taxonomy_relationship']);
            }
            if ($view_settings['tax_' . $category->name . '_relationship'] == "FROM PAGE") {
                // we need to get the terms from the current page.
                $current_page = $WP_Views->get_current_page();
                if ($current_page) {
                    $terms = wp_get_post_terms($current_page->ID, $category->name, array("fields" => "ids"));
                    if (count($terms)) {
                        $query['tax_query'][] = array('taxonomy' => $category->name, 'field' => 'id', 'terms' => _wpv_get_translated_terms($terms, $category->name), 'operator' => "IN");
                    }
                }
            } else {
                if ($view_settings['tax_' . $category->name . '_relationship'] == "FROM ATTRIBUTE") {
                    $attribute = $view_settings['taxonomy-' . $category->name . '-attribute-url'];
                    if (isset($view_settings['taxonomy-' . $category->name . '-attribute-url-format'])) {
                        $attribute_format = $view_settings['taxonomy-' . $category->name . '-attribute-url-format'][0];
                    } else {
                        $attribute_format = 'name';
                    }
                    $view_attrs = $WP_Views->get_view_shortcodes_attributes();
                    if (isset($view_attrs[$attribute])) {
                        // support csv terms
                        $terms = explode(',', $view_attrs[$attribute]);
                        $term_ids = array();
                        foreach ($terms as $t) {
                            $term = get_term_by($attribute_format, trim($t), $category->name);
                            if ($term) {
                                array_push($term_ids, $term->term_id);
                            }
                        }
                        if (count($term_ids) > 0) {
                            $query['tax_query'][] = array('taxonomy' => $category->name, 'field' => 'id', 'terms' => _wpv_get_translated_terms($term_ids, $category->name), 'operator' => "IN");
                        }
                    }
                } else {
                    if ($view_settings['tax_' . $category->name . '_relationship'] == "FROM URL") {
                        $url_parameter = $view_settings['taxonomy-' . $category->name . '-attribute-url'];
                        if (isset($view_settings['taxonomy-' . $category->name . '-attribute-url-format'])) {
                            $url_format = $view_settings['taxonomy-' . $category->name . '-attribute-url-format'][0];
                        } else {
                            $url_format = 'name';
                        }
                        if (isset($_GET[$url_parameter])) {
                            if (is_array($_GET[$url_parameter])) {
                                $terms = $_GET[$url_parameter];
                            } else {
                                // support csv terms
                                $terms = explode(',', $_GET[$url_parameter]);
                            }
                            $term_ids = array();
                            foreach ($terms as $t) {
                                $term = get_term_by($url_format, trim($t), $category->name);
                                if ($term) {
                                    array_push($term_ids, $term->term_id);
                                }
                            }
                            if (count($term_ids) > 0) {
                                $query['tax_query'][] = array('taxonomy' => $category->name, 'field' => 'id', 'terms' => _wpv_get_translated_terms($term_ids, $category->name), 'operator' => "IN");
                            }
                        }
                    } else {
                        if ($view_settings['tax_' . $category->name . '_relationship'] == "FROM PARENT VIEW") {
                            $parent_term_id = $WP_Views->get_parent_view_taxonomy();
                            if ($parent_term_id) {
                                $query['tax_query'][] = array('taxonomy' => $category->name, 'field' => 'id', 'terms' => _wpv_get_translated_terms(array($parent_term_id), $category->name), 'operator' => "IN");
                            }
                        } else {
                            if (isset($view_settings[$save_name])) {
                                $term_ids = $view_settings[$save_name];
                                $query['tax_query'][] = array('taxonomy' => $category->name, 'field' => 'id', 'terms' => _wpv_get_translated_terms($term_ids, $category->name), 'operator' => $view_settings['tax_' . $category->name . '_relationship']);
                            }
                        }
                    }
                }
            }
        }
    }
    return $query;
}