'intent:' . self::OPENER ); return $handles; } public static function drawn_at_load( $patterns ) { if ( 'vertical' !== self::$printed ) { return $patterns; } $patterns = (array) $patterns; $patterns[] = '/^fibofilters-/'; return $patterns; } public static function products_request() { if ( ! self::is_products_request() || ! class_exists( '\Rooster\Core\More' ) || ! is_callable( array( '\Rooster\Core\Compat\WooCommerce', 'products_part' ) ) || ! self::applies() ) { return; } $_GET[ \Rooster\Core\More::PART_ARG ] = 'products'; } public static function is_products_request() { if ( isset( $_REQUEST['fibofilters-products'] ) || isset( $_POST['fibofilters-products'] ) ) { return true; } if ( 'POST' !== ( $_SERVER['REQUEST_METHOD'] ?? '' ) ) { return false; } $body = (string) file_get_contents( 'php://input', false, null, 0, 1048576 ); if ( 0 !== strpos( $body, '{' ) || false === strpos( $body, 'fibofilters-products' ) ) { return false; } $data = json_decode( $body, true ); return is_array( $data ) && isset( $data['fibofilters-products'] ); } public static function applied_place() { $place = class_exists( 'AIEO_Recognised_Plugins' ) ? AIEO_Recognised_Plugins::choice( self::ID, self::APPLIED ) : self::APPLIED_COLUMN; $place = (string) apply_filters( 'aieo_fibofilters_applied_place', $place ); return self::APPLIED_ABOVE === $place ? self::APPLIED_ABOVE : self::APPLIED_COLUMN; } public static function has_chosen() { $stored = get_option( 'fibofilters_filters', array() ); $filters = is_string( $stored ) ? json_decode( $stored, true ) : $stored; foreach ( is_array( $filters ) ? $filters : array() as $filter ) { $attrs = is_array( $filter ) && isset( $filter['attributes'] ) && is_array( $filter['attributes'] ) ? $filter['attributes'] : ( is_array( $filter ) ? $filter : array() ); $slug = (string) ( $attrs['url_slug'] ?? '' ); if ( '' !== $slug && isset( $_GET[ $slug ] ) && '' !== trim( (string) wp_unslash( $_GET[ $slug ] ) ) ) { return true; } } return false; } public static function theme_pagination( $mode ) { return self::applies() ? 'pages' : $mode; } public static function available() { if ( ! shortcode_exists( 'fibofilters' ) || ! function_exists( 'rooster_device_class' ) || ! function_exists( 'rooster_icon' ) ) { return false; } $no = isset( $_GET['nofibofilters'] ) ? sanitize_key( wp_unslash( $_GET['nofibofilters'] ) ) : ''; return ! in_array( $no, array( '1', '2' ), true ) && ! in_array( (string) apply_filters( 'fibofilters/nofibofilters', '' ), array( '1', '2' ), true ); } public static function switched_on() { return ! class_exists( 'AIEO_Recognised_Plugins' ) || AIEO_Recognised_Plugins::on( self::ID ); } public static function applies( $block = null ) { if ( ! self::available() ) { return false; } return (bool) apply_filters( 'aieo_fibofilters_shop', self::switched_on(), $block ); } public static function filters( $pre, $parsed ) { if ( null !== $pre || ! is_array( $parsed ) || self::BLOCK !== ( $parsed['blockName'] ?? '' ) ) { return $pre; } if ( false === strpos( (string) ( $parsed['attrs']['className'] ?? '' ), self::FILTERS ) || ! self::applies( $parsed ) ) { return $pre; } $html = self::markup(); if ( '' === $html ) { return $pre; } $device = self::device(); self::$printed = '' === $device ? 'both' : ( 'mobile' === $device ? 'mobile' : 'vertical' ); self::assets(); $block = new WP_Block( $parsed ); return (string) apply_filters( 'render_block_' . self::BLOCK, $html, $parsed, $block ); } public static function markup() { $device = rooster_device_class(); $known = '' !== self::device(); $parts = array(); if ( ! $known || 'mobile' !== $device ) { $vertical = self::shortcode( 'vertical', $known ? 1 : self::WIDE, 99999 ); if ( '' !== $vertical ) { self::$marking = true; $applied = self::APPLIED_COLUMN === self::applied_place() && shortcode_exists( 'fibofilters_applied_filters' ) ? do_shortcode( '[fibofilters_applied_filters]' ) : ''; self::$marking = false; $parts[] = '
' . $vertical . $applied . '
'; } } if ( ! $known || 'mobile' === $device ) { $mobile = self::shortcode( 'mobile', 1, $known ? 99999 : self::WIDE - 1 ); if ( '' !== $mobile ) { $parts[] = self::opener() . $mobile; } } if ( array() === $parts ) { return ''; } $layout = ! $known ? 'both' : ( 'mobile' === $device ? 'mobile' : 'vertical' ); $heading = '

' . esc_html__( 'Filters', 'ai-eshop-optimizer' ) . '

'; return '
' . $heading . implode( '', $parts ) . '
'; } private static function opener() { return ''; } public static function auto_placed( $out, $tag, $attr ) { if ( false !== $out || ! in_array( $tag, array( 'fibofilters', 'fibofilters_applied_filters' ), true ) || ! doing_action( 'woocommerce_before_shop_loop' ) ) { return $out; } if ( 'fibofilters_applied_filters' === $tag ) { return '' !== self::$printed && ( 'mobile' === self::$printed || self::APPLIED_ABOVE !== self::applied_place() ) && self::applies() ? '' : $out; } $layout = is_array( $attr ) && isset( $attr['layout'] ) ? (string) $attr['layout'] : ''; return in_array( $layout, array( 'horizontal', 'mobile' ), true ) && self::applies() ? '' : $out; } public static function applied_row( $out, $tag, $attr ) { if ( 'fibofilters_applied_filters' !== $tag || ! is_string( $out ) || false === strpos( $out, 'class="fibofilters-applied-filters-container' ) ) { return $out; } if ( self::$marking ) { $place = self::APPLIED_COLUMN; } elseif ( 'vertical' === self::$printed && doing_action( 'woocommerce_before_shop_loop' ) ) { $place = self::APPLIED_ABOVE; } else { return $out; } $classes = 'fibofilters-applied-filters-container aieo-fibofilters-applied aieo-fibofilters-applied--' . $place . ( self::has_chosen() ? ' is-reserved' : '' ); return (string) preg_replace( '/class="fibofilters-applied-filters-container/', 'class="' . esc_attr( $classes ), $out, 1 ); } private static function shortcode( $layout, $min, $max ) { $html = do_shortcode( sprintf( '[fibofilters layout="%s" min_screen="%d" max_screen="%d"]', $layout, (int) $min, (int) $max ) ); return false !== strpos( (string) $html, 'fibofilters-' . $layout . '-filters-container' ) ? (string) $html : ''; } public static function loop_selectors( $selectors ) { return self::applies() ? array_values( array_unique( array_merge( self::LOOP, (array) $selectors ) ) ) : $selectors; } public static function pagination_selectors( $selectors ) { return self::applies() ? array_values( array_unique( array_merge( (array) $selectors, self::PAGINATION ) ) ) : $selectors; } public static function fetching_strategy( $strategy ) { return self::applies() ? 'page' : $strategy; } private static function assets() { if ( wp_style_is( self::HANDLE, 'enqueued' ) ) { return; } $root = dirname( __DIR__ ); $css = ( ! defined( 'SCRIPT_DEBUG' ) || ! SCRIPT_DEBUG ) && file_exists( $root . '/assets/css/aieo-fibofilters.min.css' ) ? 'assets/css/aieo-fibofilters.min.css' : 'assets/css/aieo-fibofilters.css'; if ( file_exists( $root . '/' . $css ) ) { wp_enqueue_style( self::HANDLE, plugins_url( $css, __DIR__ ), array(), (string) filemtime( $root . '/' . $css ) ); } $js = ( ! defined( 'SCRIPT_DEBUG' ) || ! SCRIPT_DEBUG ) && file_exists( $root . '/assets/js/aieo-fibofilters.min.js' ) ? 'assets/js/aieo-fibofilters.min.js' : 'assets/js/aieo-fibofilters.js'; if ( file_exists( $root . '/' . $js ) ) { wp_enqueue_script( self::HANDLE, plugins_url( $js, __DIR__ ), array(), (string) filemtime( $root . '/' . $js ), array( 'in_footer' => true, 'strategy' => 'defer' ) ); } } } }