$term) { if (in_array($term->slug, array('exclude-from-search', 'exclude-from-catalog'))) { unset($terms[$index]); } } } } if ($e_name === 'product_cat') { if (is_array($terms)) { foreach ($terms as $index => $term) { if (in_array($term->slug, array('uncategorized'))) { unset($terms[$index]); } } } } return $terms; } } if (!function_exists('flrt_remove_author_query_post_types')) { function flrt_remove_author_query_post_types($post_types) { if (isset($post_types['attachment'])) { unset($post_types['attachment']); } return $post_types; } } if (!function_exists('flrt_exclude_post_types')) { function flrt_exclude_post_types($post_types) { $post_types = array( FLRT_FILTERS_POST_TYPE, FLRT_FILTERS_SET_POST_TYPE, 'attachment', 'elementor_library', 'e-landing-page', 'jet-smart-filters', 'ct_template' ); return $post_types; } } if (!function_exists('flrt_after_filter_input')) { function flrt_after_filter_input($attributes) { if (isset($attributes['class']) && $attributes['class'] === 'wpc-field-slug' && $attributes['value'] === '') { echo '

' . esc_html__('a-z, 0-9, "_" and "-" symbols supported only', 'filter-everything') . '

'; } } } if (!function_exists('wpc_term_brand_logo')) { function wpc_term_brand_logo($html, $link_attributes, $term, $filter) { if (!in_array($filter['e_name'], flrt_brand_filter_entities())) { return $html; } if (!isset($term->slug)) { return $html; } $src = flrt_get_term_brand_image($term->term_id, $filter); $link_attributes .= ' title="' . esc_attr( $term->name ) . '"'; if ($src) { $img = '' . esc_attr( $term->name ) . ''; $html = '' . $img . '' . esc_html( $term->name ) . ''; } return $html; } } if( !function_exists( 'flrt_remove_default_category_location' ) ) { function flrt_remove_default_category_location( $terms, $taxonomy ){ // Bail on anything that is not a terms array (e.g. WP_Error when the // taxonomy is unavailable) so we never index into a non-array. if ( is_wp_error( $terms ) || ! is_array( $terms ) ) { return $terms; } $default_category = 0; if ( $taxonomy === 'product_cat' ) { $default_category = get_option( 'default_product_cat' ); } elseif( $taxonomy === 'category' ) { $default_category = get_option('default_category'); } // Remove default category from the list if ( $default_category > 0 ) { unset( $terms[ $default_category ] ); } return $terms; } } /** * Fix for the LiveCanvas page builder */ if( defined( 'LC_MU_PLUGIN_NAME' ) && LC_MU_PLUGIN_NAME === 'livecanvas-must-use-plugin.php' ) { add_filter('wpc_pre_save_set_fields', 'flrt_safe_save_set_fields'); function flrt_safe_save_set_fields($setFields) { if (isset($setFields['wp_filter_query_vars'])) { $query_vars = $setFields['wp_filter_query_vars']; $new_query_vars = []; $search_values = [ '…' ]; $replace_values = [ '…' ]; foreach ($query_vars as $hash => $vars_serialized_str) { $new_query_vars[$hash] = str_replace($search_values, $replace_values, $vars_serialized_str); } $setFields['wp_filter_query_vars'] = $new_query_vars; } return $setFields; } } function flrt_round_numeric_values( $value, $entity_name, $limit ) { if( $limit === 'min' ) { $value = floor( $value ); } elseif ( $limit === 'max' ){ $value = ceil( $value ); } return $value; } } function flrt_chips( $showReset = false, $setIds = [] ) { $templateManager = \FilterEverything\Filter\Container::instance()->getTemplateManager(); $wpManager = \FilterEverything\Filter\Container::instance()->getWpManager(); $filterSet = Container::instance()->getFilterSetService(); if( empty( $setIds ) || ! $setIds || ! is_array( $setIds ) ){ $relatedSetIds = $wpManager->getQueryVar('wpc_page_related_set_ids'); if( is_array( $relatedSetIds ) ) { foreach ( $relatedSetIds as $set ){ $setIds[] = $set['ID']; } } } $chipsObj = new \FilterEverything\Filter\Chips( $showReset, $setIds ); $chips = $chipsObj->getChips(); $templateManager->includeFrontView( 'chips', array( 'chips' => $chips, 'setid' => reset($setIds) ) ); } function flrt_show_selected_terms( $showReset = true, $setIds = [], $class = [] ) { $default_class = array('wpc-custom-selected-terms'); if(! empty( $class ) && is_array($class) ){ $default_class = array_merge( $default_class, $class ); } if( isset( $_POST['action'] ) && $_POST['action'] === 'elementor_ajax' ){ echo ''.esc_html__( 'Filter Everything — Chips', 'filter-everything' ).''; return; } if( isset( $_GET['action'] ) && $_GET['action'] === 'elementor' ){ echo ''.esc_html__( 'Filter Everything — Chips', 'filter-everything' ).''; return; } echo '
'."\r\n"; flrt_chips( $showReset, $setIds ); echo '
'."\r\n"; } add_filter( 'wpc_dropdown_option_attr', 'flrt_parse_dropdown_value' ); function flrt_parse_dropdown_value( $attr ){ if( ! is_array( $attr ) ){ $new_attr = array(); $new_attr['label'] = $attr; return $new_attr; } return $attr; } add_filter( 'wpc_unnecessary_get_parameters', 'flrt_unnecessary_get_parameters' ); function flrt_unnecessary_get_parameters( $params ){ $unnecessary_params = array( 'product-page' => true, '_pjax' => true, 'cst' => true, ); $get = \FilterEverything\Filter\Container::instance()->getTheGet(); if( ! empty( $get ) && is_array( $get ) ) { foreach ( $get as $param_name => $param_value ) { if( preg_match( '%query\-[0-9]+\-page%', $param_name ) ) { $unnecessary_params[$param_name] = true; } if( preg_match( '%e\-page\-[a-zA-Z0-9]+%im', $param_name ) ) { $unnecessary_params[$param_name] = true; } } } return array_merge( $params, $unnecessary_params ); } add_filter('wpc_posts_containers', 'flrt_convert_posts_container_to_array'); function flrt_convert_posts_container_to_array( $container ){ if( ! is_array( $container ) ){ return [ 'default' => trim($container) ]; } return $container; } add_filter( 'wpc_seo_title', 'do_shortcode' ); add_filter( 'wpc_seo_description', 'do_shortcode' ); add_filter( 'wpc_seo_h1', 'do_shortcode' ); /** * @return int * @since 1.7.1 */ function flrt_more_less_count() { return apply_filters( 'wpc_more_less_count', 5 ); } /** * @return mixed|void * @since 1.7.1 */ function flrt_more_less_opened() { return apply_filters( 'wpc_more_less_opened', [] ); } /** * @return mixed|void * @since 1.7.1 */ function flrt_folding_opened() { return apply_filters( 'wpc_folding_opened', [] ); } /** * @return mixed|void * @since 1.7.1 */ function flrt_hierarchy_opened() { return apply_filters( 'wpc_hierarchy_opened', [] ); } /** * @param $filter * @return mixed|void * @since 1.7.1 */ function flrt_dropdown_default_option( $filter ) { $label = sprintf( __( '- Select %s -', 'filter-everything' ), $filter['label'] ); if( isset( $filter['dropdown_label'] ) && $filter['dropdown_label'] ){ $label = $filter['dropdown_label']; } return apply_filters( 'wpc_dropdown_default_option', $label, $filter ); } function flrt_brand_filter_entities(){ return apply_filters( 'wpc_brand_filter_entities', ['product_brand', 'pa_brand', 'pwb-brand', 'yith_product_brand'] ); } add_filter( 'wpc_filter_classes', 'wpc_frontend_filter_classes', 10, 2 ); function wpc_frontend_filter_classes( $classes, $filter ){ if( in_array( $filter['e_name'], flrt_brand_filter_entities() ) ) { $classes[] = 'wpc-filter-has-brands'; } return $classes; } add_filter( 'wpc_filter_classes', 'flrt_frontend_filter_classes', 10, 2 ); function flrt_frontend_filter_classes( $classes, $filter ){ if ( $filter['show_term_names'] === 'yes' ) { $classes[] = 'wpc-filter-visible-term-names'; } else { $classes[] = 'wpc-filter-hidden-term-names'; } return $classes; } // Bricks Builder fix for Any Category Filter Set add_action( 'wpc_all_set_wp_queried_posts', 'flrt_bricks_builder_category_compat', 10, 2 ); function flrt_bricks_builder_category_compat( $set_wp_query, $setId ){ //to check if there is Bricks Builder if ( defined( 'BRICKS_VERSION' ) && BRICKS_VERSION ) { $filterSet = \FilterEverything\Filter\Container::instance()->getFilterSetService(); $the_set = $filterSet->getSet( $setId ); if ( isset( $the_set['wp_page_type']['value'] ) && isset( $the_set['post_name']['value'] ) ){ if ( strpos( $the_set['wp_page_type']['value'], 'taxonomy_' ) !== false ) { if ( strpos( $the_set['post_name']['value'], '-1' ) !== false ) { $queried_object = get_queried_object(); if ( property_exists( $queried_object, 'taxonomy' ) ){ $set_wp_query->set( $queried_object->taxonomy, $queried_object->slug ); } } } } } return $set_wp_query; } add_filter( 'wpc_chips_term_name', 'flrt_chips_labels', 10, 3 ); function flrt_chips_labels( $term_name, $term, $filter ) { if ( in_array( $filter['entity'], ['post_meta_num', 'tax_numeric', 'post_date', 'post_meta_date'] ) ) { // 'min_num_label' // 'max_num_label' if( $filter['min_num_label'] !== '' ){ if( ! is_null( $term ) && property_exists( $term, 'slug' ) && in_array( $term->slug, ['min', 'from'] ) ){ $value = flrt_chips_label_value( $filter, $term->slug ); if( strpos( $filter['min_num_label'], '{value}' ) !== false ){ $term_name = str_replace( '{value}', $value, $filter['min_num_label'] ); }else { $term_name = $filter['min_num_label'] .' '.$value; } } } if( $filter['max_num_label'] !== '' ){ if( ! is_null( $term ) && property_exists( $term, 'slug' ) && in_array( $term->slug, ['max', 'to'] ) ){ $value = flrt_chips_label_value( $filter, $term->slug ); if( strpos( $filter['max_num_label'], '{value}' ) !== false ){ $term_name = str_replace( '{value}', $value, $filter['max_num_label'] ); }else { $term_name = $filter['max_num_label'] .' '.$value; } } } } return $term_name; } /** * Queried value for a {value} chip label. Date values must respect the * filter's Date Format option, like the default term names built in * PostDateEntity::createTermName() do (raw URL values otherwise leak * into the chips). */ function flrt_chips_label_value( $filter, $edge ) { $value = isset( $filter['values'][ $edge ] ) ? $filter['values'][ $edge ] : ''; if ( in_array( $filter['entity'], [ 'post_date', 'post_meta_date' ] ) && ! empty( $filter['date_format'] ) ) { $format = $filter['date_format']; $date_type = flrt_detect_date_type( $value ); // In case if we have several date filters on the same page if ( in_array( $date_type, [ 'date', 'time' ] ) ) { $maybe_split_format = flrt_split_date_time( $format ); if ( isset( $maybe_split_format[ $date_type ] ) ) { $format = $maybe_split_format[ $date_type ]; } } $formatted = flrt_apply_date_format( $value, $format ); if ( $formatted ) { $value = $formatted; } } return $value; } add_filter( 'query_loop_block_query_vars', 'flrt_query_loop_block_query_vars', 10, 2 ); function flrt_query_loop_block_query_vars( $query, $block ){ global $xd; $xd++; if( ! is_null( $block ) && property_exists( $block, 'parsed_block' ) ){ if( isset( $block->parsed_block['blockName'] ) ) { if( in_array( $block->parsed_block['blockName'], [ 'core/query-pagination-previous', 'core/query-pagination-next', 'core/query-pagination-numbers', ] ) ){ $query['flrt_pagination'] = true; } } } return $query; } add_filter( 'wpc_settings_field_checkbox', 'flrt_collapse_widget_checkbox_handler', 10, 2 ); function flrt_collapse_widget_checkbox_handler( $checkbox, $args ) { $checkbox = '
'; $checkbox .= ''; $checkbox .= '%s'; $checkbox .= '
'; return $checkbox; } add_filter( 'wpc_input_type_checkbox', 'flrt_input_checkbox_switcher', 10, 2 ); function flrt_input_checkbox_switcher( $html, $attributes ) { $html_wrap = '
'; $html_wrap .= ''; $html_wrap .= '
'; return $html_wrap; } add_filter('wpc_get_broken_builders', function ($array) { return [3669169978, 339203640]; }, 10, 1); if(!defined('FLRT_FILTERS_PRO')) { add_filter('flrt_before_render_admin_select_option', 'flrt_add_data_to_option_before_render', 10, 4); function flrt_add_data_to_option_before_render($option_value, $attr, $label, $disabled) { $attributes = ' data-link="' . flrt_reneder_preview_link($option_value, $attr) . '"'; if(is_array($disabled) && in_array($option_value, $disabled)){ $class = $option_value . '-disabled'; $attributes .= ' class="' . $class . '"'; } return $attributes; } function flrt_reneder_preview_link($option_value, $attr) { $link = ''; if ($attr['id'] == 'wpc_set_fields-post_type') { if ($option_value == 'page') { $option_value = 'post'; } $archive_link = get_post_type_archive_link($option_value); if ($archive_link) { $link = $archive_link; } if (!$archive_link) { $taxonomies = get_object_taxonomies($option_value); if (!empty($taxonomies)) { $first_taxonomy = $taxonomies[0]; $taxonomy = get_taxonomy($first_taxonomy); if (!empty($taxonomy) && !is_wp_error($taxonomy)) { $terms = get_terms([ 'taxonomy' => $taxonomy->name, 'number' => 1, 'hide_empty' => false, ]); if (!empty($terms) && !is_wp_error($terms)) { $term_link = get_term_link($terms[0]); $link = esc_url($term_link); } } } } } return $link; } } add_filter('wpc_is_check_errors_pro', function ($filter_sets, $query) { $detector_class = 'FilterEverything\\Filter\\WP_Query_Source_Detector'; $is_allowed_method = 'is_allowed'; $source_var = 'flrt_detected_source'; if (defined('FLRT_FILTERS_PRO')) { if (defined('FLRT_PRO_BUILDER_KEY')) { $builder_key = apply_filters('wpc_builder_key_pro', $query->get($source_var), constant('FLRT_PRO_BUILDER_KEY')); if ($detector_class::$is_allowed_method($builder_key)) { return apply_filters('wpc_is_filtered_query_pro', [], $query); } } } if (!defined('FLRT_FILTERS_PRO')) { $builder_key = apply_filters('wpc_builder_key', $query->get($source_var), $detector_class::$builder_key); if ($detector_class::$is_allowed_method($builder_key)) { return apply_filters('wpc_is_filtered_query_free', [], $query); } } return []; }, 10, 2); add_filter('wpc_set_min_max', function($min_and_max, $filter_name) { global $wp_query; if (empty($wp_query->posts)) { $min_and_max = ['min' => 0, 'max' => 0]; return $min_and_max; } return $min_and_max; }, 10, 2); if(!function_exists('wpc_default_custom_meta_keys_filter')){ function wpc_default_custom_meta_keys_filter(){ $normalize_keys = function($data) use (&$normalize_keys) { $result = []; foreach ($data as $k => $v) { if (is_array($v)) { $v = $normalize_keys($v); } if (is_int($k)) { $result[(string)$v] = ""; } else { $result[$k] = $v; } } return $result; }; $product_post_meta = array( '_price' => esc_html__('filter by Product price', 'filter-everything'), '_stock_status' => esc_html__('filter by Product stock status', 'filter-everything'), '_sale_price' => esc_html__('filter by Product sale price', 'filter-everything'), '_stock' => esc_html__('filter by Product stock quantity', 'filter-everything'), 'total_sales' => esc_html__('filter by Product total sales', 'filter-everything'), '_backorders' => esc_html__('filter by Product backorders status', 'filter-everything'), '_sold_individually' => esc_html__('filter by Product sold individually status', 'filter-everything'), '_downloadable' => esc_html__('filter by Product downloadable status', 'filter-everything'), '_virtual' => esc_html__('filter by Product virtual status', 'filter-everything'), '_length' => esc_html__('filter by Product length', 'filter-everything'), '_width' => esc_html__('filter by Product width', 'filter-everything'), '_height' => esc_html__('filter by Product height', 'filter-everything'), '_weight' => esc_html__('filter by Product weight', 'filter-everything'), '_wc_average_rating' => esc_html__('filter by Product average rating', 'filter-everything'), '_thumbnail_id' => esc_html__('filter by Featured image', 'filter-everything') ); $product_post_meta_num = array( '_price' => esc_html__('filter by Product price', 'filter-everything'), '_stock' => esc_html__('filter by Product stock quantity', 'filter-everything'), 'total_sales' => esc_html__('filter by Product total sales', 'filter-everything'), '_sale_price' => esc_html__('filter by Product sale price', 'filter-everything'), '_stock_status' => esc_html__('filter by Product stock status', 'filter-everything'), '_length' => esc_html__('filter by Product length', 'filter-everything'), '_width' => esc_html__('filter by Product width', 'filter-everything'), '_height' => esc_html__('filter by Product height', 'filter-everything'), '_weight' => esc_html__('filter by Product weight', 'filter-everything'), '_wc_average_rating' => esc_html__('filter by Product average rating', 'filter-everything'), '_backorders' => esc_html__('filter by Product backorders status', 'filter-everything'), '_sold_individually' => esc_html__('filter by Product sold individually status', 'filter-everything'), '_downloadable' => esc_html__('filter by Product downloadable status', 'filter-everything'), '_virtual' => esc_html__('filter by Product virtual status', 'filter-everything'), '_thumbnail_id' => esc_html__('filter by Featured image', 'filter-everything'), ); $product_post_meta_exists = array( '_sale_price' => esc_html__('filter by Product on sale status', 'filter-everything'), '_price' => esc_html__('filter by Product price', 'filter-everything'), '_stock' => esc_html__('filter by Product stock quantity', 'filter-everything'), 'total_sales' => esc_html__('filter by Product total sales', 'filter-everything'), '_stock_status' => esc_html__('filter by Product stock status', 'filter-everything'), '_length' => esc_html__('filter by Product length', 'filter-everything'), '_width' => esc_html__('filter by Product width', 'filter-everything'), '_height' => esc_html__('filter by Product height', 'filter-everything'), '_weight' => esc_html__('filter by Product weight', 'filter-everything'), '_wc_average_rating' => esc_html__('filter by Product average rating', 'filter-everything'), '_backorders' => esc_html__('filter by Product backorders status', 'filter-everything'), '_sold_individually' => esc_html__('filter by Product sold individually status', 'filter-everything'), '_downloadable' => esc_html__('filter by Product downloadable status', 'filter-everything'), '_virtual' => esc_html__('filter by Product virtual status', 'filter-everything'), '_thumbnail_id' => esc_html__('filter by Featured image', 'filter-everything'), ); $all_post_types_post_meta_exists = array('_thumbnail_id' => esc_html__('filter by Featured image', 'filter-everything')); $input = array( 'product' => array( 'post_meta' => $normalize_keys($product_post_meta), 'post_meta_num' => $normalize_keys($product_post_meta_num), 'post_meta_exists' => $normalize_keys($product_post_meta_exists) ), 'all_post_types' => array( 'post_meta_exists' => $normalize_keys($all_post_types_post_meta_exists) ), ); return $normalize_keys($input); } } add_action('wp_ajax_wpc_search_meta_keys', function () { check_ajax_referer('wpc-f-set-nonce', '_flrt_nonce'); if ( ! current_user_can('edit_posts') ) { wp_send_json_error(['message' => __('Forbidden', 'textdomain')], 403); } global $wpdb; $q = isset($_GET['q']) ? sanitize_text_field(wp_unslash($_GET['q'])) : ''; $post_type = isset($_GET['post_type']) ? sanitize_key($_GET['post_type']) : 'post'; $post_meta_type = isset($_GET['post_meta_type']) ? sanitize_key($_GET['post_meta_type']) : ''; $include_custom_meta_keys = []; if (!empty($post_type) && !empty($post_meta_type) && !empty(wpc_default_custom_meta_keys_filter()[$post_type][$post_meta_type])) { foreach (wpc_default_custom_meta_keys_filter()[$post_type][$post_meta_type] as $key => $value) { $include_custom_meta_keys[$key] = $value; } } if (!empty($post_meta_type) && !empty(wpc_default_custom_meta_keys_filter()['all_post_types'][$post_meta_type])) { foreach (wpc_default_custom_meta_keys_filter()['all_post_types'][$post_meta_type] as $key => $value) { $include_custom_meta_keys[$key] = $value; } } $default_custom_meta_keys = $include_custom_meta_keys; $include_custom_meta_keys = array_values(array_unique(array_filter($include_custom_meta_keys))); if(strlen($q) > 0){ $include_custom_meta_keys = array_values(array_filter( $include_custom_meta_keys, static fn(string $key) => strncmp($key, $q, strlen($q)) === 0 )); } $default_items = array_map(static function ($k) use ($include_custom_meta_keys) { return [ 'id' => $k, 'text' => $include_custom_meta_keys[$k], ]; }, array_keys($include_custom_meta_keys) ?: []); if (strlen($q) < 1) { wp_send_json(['items' => $default_items]); } $like = '%' . $wpdb->esc_like($q) . '%'; $limit = 15; $sql = $wpdb->prepare( "SELECT DISTINCT pm.meta_key FROM {$wpdb->postmeta} pm INNER JOIN {$wpdb->posts} p ON p.ID = pm.post_id WHERE p.post_type = %s AND pm.meta_key LIKE %s ORDER BY pm.meta_key ASC LIMIT %d", $post_type, $like, $limit ); $keys = $wpdb->get_col($sql); $exact_match_index = array_search($q, $keys); if ($exact_match_index !== false) { unset($keys[$exact_match_index]); array_unshift($keys, $q); } $items = array_map(static function ($k) use ($default_custom_meta_keys) { $text = !empty($default_custom_meta_keys[$k]) ? $default_custom_meta_keys[$k] : ''; return [ 'id' => $k, 'text' => $text, ]; }, $keys ?: []); if (strlen($q) > 1 && count($items) < 1) { $items[] = [ 'id' => $q, 'text' => '', ]; } wp_send_json(['items' => array_merge($default_items, $items)]); }); add_action( 'admin_post_wpc_seo_settings', function() { check_admin_referer( 'wpc_seo_settings' ); $filter_permalinks = $_POST['wpc_filter_permalinks'] ?? []; $seo_rules_settings = $_POST['wpc_seo_rules_settings'] ?? []; $wpc_indexing_deep_settings = $_POST['wpc_indexing_deep_settings'] ?? []; $filter_permalinks = array_map( 'sanitize_text_field', $filter_permalinks ); $seo_rules_settings = array_map( 'sanitize_text_field', $seo_rules_settings ); $wpc_indexing_deep_settings = array_map( 'sanitize_text_field', $wpc_indexing_deep_settings ); update_option( 'wpc_filter_permalinks', $filter_permalinks ); update_option( 'wpc_seo_rules_settings', $seo_rules_settings ); update_option( 'wpc_indexing_deep_settings', $wpc_indexing_deep_settings ); $redirect_url = add_query_arg( 'settings-updated', 'true', wp_get_referer() ); wp_safe_redirect( $redirect_url ); exit; }); if (!defined( 'FLRT_FILTERS_PRO' ) ){ add_action( 'admin_footer', function () { if ( ! is_admin() ) { return; } $screen = get_current_screen(); if ( ! $screen ) { return; } if ( $screen->post_type === 'filter-set' ) { flrt_include_admin_view('pro-modal', []); } }); } /** * PRO-only fields have no inputs in the free admin UI, so saving in the free * version would silently wipe their values from the DB. Instead, carry the * previously saved values over — they must survive free-mode saves and start * working again after switching back to PRO. In the free version their * runtime effect is disabled at read time (see the hooks below), not in the DB. */ add_filter('wpc_pre_save_filter', function($filter) { if( !defined('FLRT_FILTERS_PRO')) { $proFields = array('show_range_list', 'range_list_input', 'used_for_variations'); // Values for these fields can not come from the free UI — drop any posted ones foreach ($proFields as $proField) { unset($filter[$proField]); } if (!empty($filter['ID']) && is_numeric($filter['ID'])) { $savedPost = get_post((int) $filter['ID']); if ($savedPost && $savedPost->post_type === FLRT_FILTERS_POST_TYPE) { $savedFields = (array) maybe_unserialize($savedPost->post_content); foreach ($proFields as $proField) { if (isset($savedFields[$proField])) { $filter[$proField] = $savedFields[$proField]; } } } } } return $filter; }); add_filter('wpc_pre_save_set_fields', function($setFields) { if( !defined('FLRT_FILTERS_PRO')) { $proFields = array('hide_empty_filter', 'custom_posts_container', 'apply_button_page_type', 'apply_button_post_name'); foreach ($proFields as $proField) { unset($setFields[$proField]); } if (!empty($setFields['ID']) && is_numeric($setFields['ID'])) { $savedPost = get_post((int) $setFields['ID']); if ($savedPost && $savedPost->post_type === FLRT_FILTERS_SET_POST_TYPE) { $savedFields = (array) maybe_unserialize($savedPost->post_content); foreach ($proFields as $proField) { if (isset($savedFields[$proField])) { $setFields[$proField] = $savedFields[$proField]; } } } } } return $setFields; }); /** * PRO-only plugin settings have no inputs in the free Settings UI (they render * as "Unlock with PRO"), so saving the settings form in the free version would * silently drop their values from the option. Carry the previously saved * values over — they must survive free-mode saves and start working again * after switching back to PRO. Their runtime effect is disabled at read time * (flrt_instant_recount). Since 1.9.6 «Disable filter links for crawlers» is a * regular option in both builds and no longer belongs here. */ add_filter('pre_update_option_wpc_filter_settings', function($value, $old_value) { if( !defined('FLRT_FILTERS_PRO')) { $proOptions = array('apply_button_instant_recount'); foreach ($proOptions as $proOption) { // Values for these keys can not come from the free UI — drop any posted ones if (is_array($value)) { unset($value[$proOption]); } if (is_array($old_value) && isset($old_value[$proOption])) { if (!is_array($value)) { $value = array(); } $value[$proOption] = $old_value[$proOption]; } } } return $value; }, 10, 2); /** * Runtime gate for the free version: the PRO-only values preserved in the DB * must not activate PRO features while the plugin runs as free. */ add_filter('wpc_after_get_filter', function($filter) { if( !defined('FLRT_FILTERS_PRO')) { $filter['show_range_list'] = ''; $filter['range_list_input'] = ''; // '' matches getEmptyFilter() and disables the JS range-list branch $filter['used_for_variations'] = ''; } return $filter; }); add_filter('wpc_filter_before_make_default_set_values', function($parsed) { if( !defined('FLRT_FILTERS_PRO')) { foreach (array('hide_empty_filter', 'custom_posts_container', 'apply_button_page_type', 'apply_button_post_name') as $proField) { unset($parsed[$proField]); } } return $parsed; }); if (!function_exists('wpc_replace_links_with_spans')) { function wpc_replace_links_with_spans($term_name, $attributes = '', $term = false, $filter = false) { // Available in both builds since 1.9.6: in free every filter link becomes // a (filter pages are noindex there by design); PRO keeps a real // for the targets its SEO Rules index (smart spans) if( flrt_get_option('disable_filter_links_for_bots') === 'on' ) { // Keep a real when the target page is indexable (within the // Indexing Depth) — hiding pages the SEO layer indexes would // starve them of internal links; only the noise stays hidden (PRO; // the helper does not exist in free, so nothing is exempt there) if ( $term && $filter && function_exists('flrt_indexable_link_target') && flrt_indexable_link_target( $term, $filter ) ) { return $term_name; } $term_name = str_replace('', '', $term_name); } return $term_name; } } //add_filter( 'stackable/posts/post_query', 'flrt_stackable_block_query_vars', 10, 3 ); //function flrt_stackable_block_query_vars( $post_query, $context, $query_string ){ // if( is_user_logged_in() ) { // var_dump( $context ); // var_dump( $query_string ); // } // // return $post_query; //}