__( 'One filter: pick the attribute, the title and how it looks. Add one widget per attribute.', 'addsynapse-search-filter' ), 'classname' => 'wosearch-filter-widget', ) ); } /** * Καταχωρεί το widget στο `widgets_init`. * * 🔴 0.8.1: ΠΡΕΠΕΙ να καλείται ΠΡΙΝ το `init` — το `widgets_init` τρέχει μέσα * στο `init` (προτεραιότητα 1), οπότε από το Addsynapse_Search_Plugin::init() * (init:10) το hook είχε ήδη τρέξει και το widget δεν καταχωρούνταν ΠΟΤΕ * («Invalid widget type», άφαντο από Widgets/Customizer — σιωπηλά). Το * καλεί ο constructor του Addsynapse_Search_Plugin (plugins_loaded)· η * δεύτερη κλήση από το init() είναι no-op. * * @return void */ public static function init() { static $done = false; if ( $done ) { return; } $done = true; add_action( 'widgets_init', static function () { register_widget( 'Addsynapse_Search_Filters_Widget' ); } ); } public function widget( $args, $instance ) { if ( ! shortcode_exists( 'addsynapse_search_filter' ) ) { return; } $attribute = isset( $instance['attribute'] ) ? (string) $instance['attribute'] : ''; if ( '' === $attribute ) { return; } $output = do_shortcode( sprintf( '[addsynapse_search_filter attribute="%s" heading="no" auto_hide="yes" style="%s" limit="%d" counts="%s" search="%s" match="%s" class="%s" category="%s" active_filters="%s" category_display="%s" category_depth="%s"]', esc_attr( $attribute ), esc_attr( isset( $instance['style'] ) ? $instance['style'] : 'checkbox' ), absint( isset( $instance['limit'] ) ? $instance['limit'] : 12 ), empty( $instance['counts'] ) ? 'no' : 'yes', empty( $instance['search'] ) ? 'no' : 'yes', 'all' === ( $instance['match'] ?? 'any' ) ? 'all' : 'any', esc_attr( isset( $instance['class'] ) ? $instance['class'] : '' ), esc_attr( isset( $instance['category'] ) ? $instance['category'] : '' ), empty( $instance['active'] ) ? 'no' : 'yes', esc_attr( isset( $instance['cat_display'] ) ? $instance['cat_display'] : 'list' ), esc_attr( isset( $instance['cat_depth'] ) ? $instance['cat_depth'] : 'all' ) ) ); // Άδεια έξοδος (π.χ. ανενεργή άδεια) -> ΔΕΝ τυπώνουμε καν το κέλυφος // του widget. Ένας άδειος τίτλος σε sidebar μοιάζει με χαλασμένο site. if ( '' === trim( (string) $output ) ) { return; } // Τα before/after_* έρχονται από το θέμα (register_sidebar) — τα // περνάμε κι αυτά από wp_kses_post, ίδια πολιτική με την έξοδο. echo wp_kses_post( $args['before_widget'] ); // Κενός τίτλος = το όνομα της ιδιότητας· ο χειριστής δεν χρειάζεται να // ξαναγράψει «Χρώμα» για να δει «Χρώμα». // Αποκωδικοποίηση μία φορά — το esc_html() κωδικοποιεί (όχι «&»). $title = trim( isset( $instance['title'] ) ? Addsynapse_Search_Indexer::decode_text( (string) $instance['title'] ) : '' ); if ( '' === $title && class_exists( 'Addsynapse_Search_Filters' ) ) { $choices = Addsynapse_Search_Filters::choices(); $title = isset( $choices[ $attribute ] ) ? $choices[ $attribute ] : $attribute; } if ( '' !== $title ) { echo wp_kses_post( $args['before_title'] ) . esc_html( $title ) . wp_kses_post( $args['after_title'] ); } // Έξοδος shortcode: μόνο
id="get_field_id( 'counts' ) ); ?>" name="get_field_name( 'counts' ) ); ?>">
id="get_field_id( 'search' ) ); ?>" name="get_field_name( 'search' ) ); ?>">
id="get_field_id( 'active' ) ); ?>" name="get_field_name( 'active' ) ); ?>">
sanitize_text_field( $new_instance['attribute'] ?? '' ), 'title' => sanitize_text_field( $new_instance['title'] ?? '' ), 'style' => in_array( $style, $styles, true ) ? $style : 'checkbox', 'limit' => max( 1, min( 100, absint( $new_instance['limit'] ?? 12 ) ) ), 'counts' => empty( $new_instance['counts'] ) ? 0 : 1, 'search' => empty( $new_instance['search'] ) ? 0 : 1, 'active' => empty( $new_instance['active'] ) ? 0 : 1, 'match' => 'all' === ( $new_instance['match'] ?? 'any' ) ? 'all' : 'any', 'class' => sanitize_text_field( $new_instance['class'] ?? '' ), 'category' => sanitize_text_field( $new_instance['category'] ?? '' ), 'cat_display' => class_exists( 'Addsynapse_Search_Filters' ) ? Addsynapse_Search_Filters::category_display( $new_instance['cat_display'] ?? 'list' ) : 'list', 'cat_depth' => class_exists( 'Addsynapse_Search_Filters' ) ? Addsynapse_Search_Filters::category_depth( $new_instance['cat_depth'] ?? 'all' ) : 'all', ); } }