'ours', 'attach_selector' => '', 'search_trigger_selector' => '', 'synonyms' => '', 'placeholders' => '', 'oos_behavior' => 'sink', 'show_history' => 1, 'show_popular' => 1, 'send_search_stats' => 0, 'index_description' => 1, 'show_categories' => 1, 'show_brands' => 1, 'show_price' => 1, 'show_image' => 1, 'show_stock' => 1, 'results_count' => 8, 'search_layout' => 'simple', 'search_look' => 'theme', 'search_facets_position' => 'left', 'load_css' => 1, 'voice_search' => 0, 'semantic_search' => 0, ); /* * 🔴 ΜΙΑ ΠΗΓΗ ΑΛΗΘΕΙΑΣ ΓΙΑ ΤΑ DEFAULTS — Addsynapse_Search_Settings::defaults(). * * Η προηγούμενη εκδοχή κρατούσε ΔΕΥΤΕΡΟ αντίγραφο των προεπιλογών μέσα στο * view, που έπρεπε να ενημερώνεται με το χέρι σε κάθε νέα ρύθμιση. Δεν * ενημερώθηκε: τα `filters_ajax`, `filters_max_values` και `filters_target` * έλειπαν, και σε PHP 8+ το `$defaults[$key]` έβγαζε * «Undefined array key» warning — το εντόπισε ο έλεγχος του wordpress.org. * * Τώρα το fallback έρχεται από την ίδια συνάρτηση που ορίζει τις προεπιλογές, * οπότε μια νέα ρύθμιση δεν μπορεί να ξεχαστεί εδώ. */ $addsynapse_search_defaults = class_exists( 'Addsynapse_Search_Settings' ) ? Addsynapse_Search_Settings::defaults() : array(); $addsynapse_search_defaults = array_merge( $defaults, $addsynapse_search_defaults ); $addsynapse_search_setting = function ( $key ) use ( $addsynapse_search_defaults ) { $fallback = array_key_exists( $key, $addsynapse_search_defaults ) ? $addsynapse_search_defaults[ $key ] : ''; if ( class_exists( 'Addsynapse_Search_Settings' ) && method_exists( 'Addsynapse_Search_Settings', 'get' ) ) { try { return Addsynapse_Search_Settings::get( $key, $fallback ); } catch ( \Throwable $e ) { return $fallback; } } return $fallback; }; $search_mode = (string) $addsynapse_search_setting( 'search_mode' ); $attach_selector = (string) $addsynapse_search_setting( 'attach_selector' ); $trigger_selector = (string) $addsynapse_search_setting( 'search_trigger_selector' ); $panel_theme = class_exists( 'Addsynapse_Search_Theme_Search' ) ? Addsynapse_Search_Theme_Search::theme_with_own_panel() : ''; $synonyms = (string) $addsynapse_search_setting( 'synonyms' ); $placeholders = (string) $addsynapse_search_setting( 'placeholders' ); $oos_behavior = (string) $addsynapse_search_setting( 'oos_behavior' ); $show_history = (bool) $addsynapse_search_setting( 'show_history' ); $show_popular = (bool) $addsynapse_search_setting( 'show_popular' ); $send_search_stats = (bool) $addsynapse_search_setting( 'send_search_stats' ); $index_description = (bool) $addsynapse_search_setting( 'index_description' ); $show_categories = (bool) $addsynapse_search_setting( 'show_categories' ); $show_brands = (bool) $addsynapse_search_setting( 'show_brands' ); $show_price = (bool) $addsynapse_search_setting( 'show_price' ); $show_image = (bool) $addsynapse_search_setting( 'show_image' ); $show_stock = (bool) $addsynapse_search_setting( 'show_stock' ); $results_count = (int) $addsynapse_search_setting( 'results_count' ); $search_layout = (string) $addsynapse_search_setting( 'search_layout' ); $search_look = 'addsynapse' === $addsynapse_search_setting( 'search_look' ) ? 'addsynapse' : 'theme'; $facets_position = (string) $addsynapse_search_setting( 'search_facets_position' ); $load_css = (bool) $addsynapse_search_setting( 'load_css' ); $voice_search = (bool) $addsynapse_search_setting( 'voice_search' ); $semantic_search = (bool) $addsynapse_search_setting( 'semantic_search' ); // 0.8.0: Pro/Business (και η δοκιμή Pro). Εκτός πακέτου: κλειδωμένο και ορατά κλειστό. $semantic_available = Addsynapse_Search_Settings::semantic_available(); $semantic_upgrade = class_exists( 'Addsynapse_Search_Coverage' ) ? Addsynapse_Search_Coverage::upgrade_link() : array( 'url' => '', 'trial' => false ); $license = Addsynapse_Search_Admin::get_license_status(); $is_active = Addsynapse_Search_Admin::is_license_active(); $masked_key = (string) Addsynapse_Search_Admin::array_get( $license, array( 'masked_key', 'key_masked' ), '' ); if ( '' === $masked_key ) { $last4 = Addsynapse_Search_Admin::array_get( $license, array( 'key_last4', 'last4' ), '' ); if ( $last4 ) { $masked_key = '••••••' . $last4; } } // Ο server ΔΕΝ επιστρέφει masked_key σήμερα (Addsynapse_Search_License::status() γυρίζει // μόνο active/plan/expires_at/checked_at). Το μασκάρουμε τοπικά από το // αποθηκευμένο κλειδί, ώστε ο πελάτης να αναγνωρίζει ΠΟΙΟ κλειδί είναι // ενεργό χωρίς να το αποκαλύπτουμε ολόκληρο στην οθόνη. if ( '' === $masked_key && class_exists( 'Addsynapse_Search_Settings' ) ) { $stored_key = trim( (string) Addsynapse_Search_Settings::get( 'license_key', '' ) ); if ( strlen( $stored_key ) > 8 ) { $masked_key = substr( $stored_key, 0, 5 ) . str_repeat( "\xE2\x80\xA2", 8 ) . substr( $stored_key, -4 ); } } $license_plan = (string) Addsynapse_Search_Admin::array_get( $license, array( 'plan' ), '' ); $checked_at = (int) Addsynapse_Search_Admin::array_get( $license, array( 'checked_at' ), 0 ); // Έχουμε ήδη ΟΠΟΙΟΔΗΠΟΤΕ κλειδί αποθηκευμένο (ενεργό ή όχι); Αν ΟΧΙ, μόνο το // «Connect to AddSynapse» (η φόρμα κλειδιού κρύβεται πίσω από σύνδεσμο). $has_any_key = '' !== trim( (string) ( class_exists( 'Addsynapse_Search_Settings' ) ? Addsynapse_Search_Settings::get( 'license_key', '' ) : '' ) ); ?>
>

● ● ● ●

__( 'Active', 'addsynapse-search-filter' ), 'trial' => __( 'Trial', 'addsynapse-search-filter' ), 'grace' => __( 'Payment due — grace period', 'addsynapse-search-filter' ), 'past_due' => __( 'Payment past due', 'addsynapse-search-filter' ), 'cancelled' => __( 'Cancelled', 'addsynapse-search-filter' ), ); echo esc_html( isset( $hub_billing_labels[ $hub_billing['state'] ] ) ? $hub_billing_labels[ $hub_billing['state'] ] : ucfirst( (string) $hub_billing['state'] ) ); if ( ! empty( $hub_billing['interval'] ) ) { echo ' · ' . esc_html( 'yearly' === $hub_billing['interval'] ? __( 'yearly', 'addsynapse-search-filter' ) : __( 'monthly', 'addsynapse-search-filter' ) ); } $hub_period_end = ! empty( $hub_billing['current_period_end'] ) ? strtotime( (string) $hub_billing['current_period_end'] ) : false; if ( $hub_period_end ) { echo '
' . esc_html( sprintf( /* translators: %s: date */ ! empty( $hub_billing['cancel_at_period_end'] ) ? __( 'Ends on %s (then the Free plan applies)', 'addsynapse-search-filter' ) : __( 'Renews on %s', 'addsynapse-search-filter' ), date_i18n( get_option( 'date_format' ), $hub_period_end ) ) ) . ''; } if ( in_array( $hub_billing['state'], array( 'grace', 'past_due' ), true ) ) { echo '
' . esc_html__( 'Please update your payment method on AddSynapse. Search is never switched off because of a payment problem — if it is not resolved, Free plan limits apply.', 'addsynapse-search-filter' ) . ''; } ?>
'; if ( 'reconnect' === $hub_status['error'] ) { esc_html_e( 'AddSynapse no longer accepts this connection. Disconnect and connect again.', 'addsynapse-search-filter' ); } else { esc_html_e( 'The last check did not succeed; the last known status is shown and search keeps working.', 'addsynapse-search-filter' ); } echo ''; } ?>
()

Terms of service and Privacy policy.', 'addsynapse-search-filter' ), esc_url( 'https://addsynapse.com/terms' ), esc_url( 'https://addsynapse.com/privacy' ) ), array( 'a' => array( 'href' => array(), 'target' => array(), 'rel' => array(), ), ) ); ?>

>
>

>

>
>

>

' . esc_html__( 'AddSynapse Search — Product filter', 'addsynapse-search-filter' ) . '', '[addsynapse_search_filters]', '[addsynapse_search_products]' ); ?>

>

Addsynapse_Search_Admin::MENU_SLUG, 'tab' => 'synonyms' ), admin_url( 'admin.php' ) ) ) . '">' . esc_html__( 'Synonyms', 'addsynapse-search-filter' ) . '' ); ?>

>

> >