debug( $line, array( 'source' => 'addsynapse-search' ) ); } if ( defined( 'ADDSYNAPSE_SEARCH_DEBUG' ) && ADDSYNAPSE_SEARCH_DEBUG ) { // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- μόνο με ρητό ADDSYNAPSE_SEARCH_DEBUG. error_log( $line ); } } // -------------------------------------------------------------------- // Μεταφράσεις. // -------------------------------------------------------------------- /** * Εφεδρική φόρτωση των μεταφράσεων που συνοδεύουν το πακέτο (`languages/`). * * Σειρά προτεραιότητας (η πρώτη που υπάρχει κερδίζει): * 1. Language pack του translate.wordpress.org (WP_LANG_DIR/plugins/) — * το φορτώνει ο πυρήνας just-in-time· εδώ δεν κάνουμε τίποτα. * 2. Νεότερος πυρήνας δηλώνει μόνος του το `Domain Path` κάθε ενεργού plugin * (wp-settings.php → set_custom_path()), άρα το registry βρίσκει ήδη το * δικό μας .mo και το JIT το φορτώνει· πάλι δεν κάνουμε τίποτα. * 3. Αλλιώς (παλαιότερο WP χωρίς language pack): load_textdomain() στο δικό * μας .mo — ΟΧΙ load_plugin_textdomain(), που το Plugin Check το σημαδεύει * ως περιττό για plugins του wordpress.org. * * Στο `init` (όχι νωρίτερα): από WP 6.7 μετάφραση πριν το init βγάζει * `_load_textdomain_just_in_time` notice. Προτεραιότητα 0, ώστε να * προηγείται κάθε δικού μας string. * * @return void */ function addsynapse_search_load_bundled_translations() { $domain = 'addsynapse-search-filter'; if ( is_textdomain_loaded( $domain ) ) { return; } $locale = determine_locale(); if ( isset( $GLOBALS['wp_textdomain_registry'] ) && $GLOBALS['wp_textdomain_registry'] instanceof WP_Textdomain_Registry && false !== $GLOBALS['wp_textdomain_registry']->get( $domain, $locale ) ) { return; // Περιπτώσεις 1 και 2: το αναλαμβάνει ο πυρήνας. } $mofile = ADDSYNAPSE_SEARCH_PLUGIN_DIR . 'languages/' . $domain . '-' . $locale . '.mo'; if ( is_readable( $mofile ) ) { load_textdomain( $domain, $mofile, $locale ); } } add_action( 'init', 'addsynapse_search_load_bundled_translations', 0 ); // -------------------------------------------------------------------- // Έλεγχος προαπαιτούμενων (WooCommerce, mbstring). // // 🔴 0.8.1 (review wordpress.org 05/10): ΚΑΝΕΝΑ σκληρό μπλοκάρισμα της // ενεργοποίησης. Πριν υπήρχαν ΔΥΟ: το header `Requires Plugins: woocommerce` // (ο πυρήνας ταιριάζει ΜΟΝΟ με όνομα φακέλου, ΜΟΝΟ κανονικά plugins — όχι // mu-plugins — και ελέγχει τη στιγμή της ενεργοποίησης) και ένα wp_die() στο // activation hook. Σε μαζική ενεργοποίηση («Activate» σε πολλά, `wp plugin // activate --all`, blueprint) το `addsynapse-…` ενεργοποιείται ΠΡΙΝ το // `woocommerce` (αλφαβητικά) → «requires WooCommerce» ενώ στο τέλος του ίδιου // αιτήματος το WooCommerce ήταν ενεργό. Τώρα: η ενεργοποίηση πετυχαίνει πάντα, // ο έλεγχος γίνεται σε ΚΑΘΕ φόρτωση (plugins_loaded, όταν έχουν φορτωθεί όλα // τα plugins — και mu/network), και αν κάτι λείπει το plugin μένει αδρανές με // admin notice που εξηγεί τι λείπει. // -------------------------------------------------------------------- /** Ελάχιστη έκδοση WooCommerce (ίδια με το header «WC requires at least»). */ define( 'ADDSYNAPSE_SEARCH_MIN_WC_VERSION', '8.0' ); /** * Αν το WooCommerce είναι ενεργό αυτή τη στιγμή. * * Αξιόπιστο ΜΟΝΟ από το plugins_loaded και μετά (όλα τα plugins έχουν φορτωθεί). * Πριν από αυτό ένα «false» σημαίνει απλώς «δεν έχει φορτωθεί ΑΚΟΜΑ» — π.χ. το * `addsynapse-…` φορτώνεται αλφαβητικά ΠΡΙΝ το `woocommerce`. * * @return bool */ function addsynapse_search_is_woocommerce_active() { return class_exists( 'WooCommerce', false ) || function_exists( 'WC' ); } /** * Τα προαπαιτούμενα που λείπουν, ως κωδικοί (mbstring|woocommerce|woocommerce_version). * * Κενός πίνακας = όλα εντάξει. 🔴 ΚΩΔΙΚΟΙ, όχι κείμενα: καλείται στο * plugins_loaded, και μια __() πριν το `init` βγάζει `_load_textdomain_just_in_time` * notice (WP 6.7+). Τα μηνύματα χτίζονται μόνο στο admin notice. * * 🔴 0.8.2 (review wordpress.org 08/10): ΚΑΝΕΝΑ cache. Το 0.8.1 κρατούσε το * αποτέλεσμα σε `static` και το πρώτο που το ρωτούσε ήταν το * Addsynapse_Search_Admin::init() (plugins_loaded:10, καταχωρημένο ήδη από το * include του αρχείου) — αν το WooCommerce δεν είχε φορτωθεί ακόμα εκείνη τη * στιγμή, το bootstrap (plugins_loaded:20) ξαναχρησιμοποιούσε το «λείπει» και το * plugin έμενε αδρανές. Ο έλεγχος είναι φθηνός (class_exists/function_exists): * υπολογίζεται ΚΑΘΕ φορά, και καλείται μόνο από plugins_loaded και μετά. * * @return string[] */ function addsynapse_search_requirement_errors() { $errors = array(); // mbstring: ο ελληνικός stemmer/μεταγραφή (mb_strtolower, mb_str_split) — // ο πυρήνας δίνει polyfill μόνο για mb_substr/mb_strlen. if ( ! function_exists( 'mb_strtolower' ) || ! function_exists( 'mb_str_split' ) ) { $errors[] = 'mbstring'; } if ( ! addsynapse_search_is_woocommerce_active() ) { $errors[] = 'woocommerce'; } elseif ( defined( 'WC_VERSION' ) && version_compare( WC_VERSION, ADDSYNAPSE_SEARCH_MIN_WC_VERSION, '<' ) ) { $errors[] = 'woocommerce_version'; } return $errors; } /** * Αν ικανοποιούνται όλα τα προαπαιτούμενα (βλ. addsynapse_search_requirement_errors()). * * @return bool */ function addsynapse_search_requirements_met() { return array() === addsynapse_search_requirement_errors(); } /** * Το μήνυμα για τον διαχειριστή ενός κωδικού προαπαιτούμενου. * * @param string $code Κωδικός από addsynapse_search_requirement_errors(). * @return string */ function addsynapse_search_requirement_message( $code ) { switch ( $code ) { case 'mbstring': return __( 'AddSynapse – Live Product Search & Filters for WooCommerce needs the PHP "mbstring" extension, which is not enabled on this server. Please ask your hosting provider to enable it; until then this plugin stays inactive.', 'addsynapse-search-filter' ); case 'woocommerce_version': return sprintf( /* translators: 1: required WooCommerce version, 2: installed WooCommerce version */ __( 'AddSynapse – Live Product Search & Filters for WooCommerce needs WooCommerce %1$s or newer (installed: %2$s). Please update WooCommerce; until then this plugin stays inactive.', 'addsynapse-search-filter' ), ADDSYNAPSE_SEARCH_MIN_WC_VERSION, defined( 'WC_VERSION' ) ? WC_VERSION : '?' ); default: return __( 'AddSynapse – Live Product Search & Filters for WooCommerce needs WooCommerce. Please install and activate WooCommerce; until then this plugin stays inactive and changes nothing on your site.', 'addsynapse-search-filter' ); } } /** * Admin notice όταν λείπει κάποιο προαπαιτούμενο. * * @return void */ function addsynapse_search_requirements_notice() { if ( ! current_user_can( 'activate_plugins' ) ) { return; } foreach ( addsynapse_search_requirement_errors() as $addsynapse_search_code ) { printf( '
%s