array('Content-Type' => 'application/json'), 'body' => wp_json_encode(array( // Clé du contrat d'API de houetor.com/api/connect-site : elle // appartient au service externe et n'est pas un préfixe du plugin. 'hwt_token' => $code, 'site_url' => $site_url, 'site_token' => $site_token, )), 'timeout' => 15, )); if (is_wp_error($response)) { return 'Erreur de connexion au serveur HOUETOR : ' . $response->get_error_message(); } $status_code = wp_remote_retrieve_response_code($response); $body = wp_remote_retrieve_body($response); $data = json_decode($body, true); if ($status_code === 200 && isset($data['success']) && $data['success']) { update_option('houetor_connection_status', 'active'); update_option('houetor_site_token', $site_token); update_option('houetor_site_url', $site_url); update_option('hare_code', $code); return true; } if ($status_code === 409 && isset($data['error']) && $data['error'] === 'SITE_ALREADY_CONNECTED') { $existing_url = isset($data['existing_url']) ? esc_url($data['existing_url']) : ''; $msg = 'Ce site est déjà connecté à un autre compte HOUETOR. Déconnectez-le depuis l\'autre compte avant de le connecter ici.'; if (!empty($existing_url)) { $msg .= ' Site actuel : ' . $existing_url . '.'; } return $msg; } if ($status_code === 409 && isset($data['error']) && $data['error'] === 'DUPLICATE_CONNECTION') { return 'Conflit : ce token de site est déjà enregistré. Contactez le support si le problème persiste.'; } if ($status_code === 409 && isset($data['error']) && $data['error'] === 'ACCOUNT_LIMIT_REACHED') { $existing_url = isset($data['existing_url']) ? esc_url($data['existing_url']) : ''; return sprintf( 'Ce compte est limité à un seul site connecté. Vous êtes déjà connecté au site %s. Déconnectez-vous depuis ce site avant d\'en connecter un autre.', $existing_url ); } $error_msg = isset($data['error']) ? $data['error'] : 'Erreur de connexion (code ' . $status_code . ').'; return $error_msg; } public function handle_connect() { if (!current_user_can('manage_options')) { wp_die('Accès refusé.'); } check_admin_referer('hare_connect_action'); delete_transient(self::pending_code_key()); $code = isset($_POST['houetor_code']) ? sanitize_text_field(wp_unslash($_POST['houetor_code'])) : ''; $result = $this->connect_with_token($code); if ($result === true) { add_settings_error('hare_messages', 'hare_connect_success', '✓ Connecté au compte HOUETOR.', 'success'); } else { add_settings_error('hare_messages', 'hare_connect_error', $result, 'error'); } set_transient('settings_errors', get_settings_errors(), 30); wp_safe_redirect(admin_url('admin.php?page=houetor-connect')); exit; } public function add_admin_menu() { add_menu_page( 'HOUETOR Connect', 'HOUETOR', 'manage_options', 'houetor-connect', array($this, 'render_page'), 'dashicons-admin-plugins', 30 ); add_submenu_page( 'houetor-connect', 'Connexion', 'Connexion', 'manage_options', 'houetor-connect', array($this, 'render_page') ); add_submenu_page( 'houetor-connect', 'Annonces', 'Annonces', 'manage_options', 'houetor-connect-annonces', array($this, 'render_annonces_page') ); add_submenu_page( 'houetor-connect', 'Produits', 'Produits', 'manage_options', 'houetor-connect-produits', array($this, 'render_produits_page') ); add_submenu_page( 'houetor-connect', 'Formations', 'Formations', 'manage_options', 'houetor-connect-formations', array($this, 'render_formations_page') ); add_submenu_page( 'houetor-connect', 'Commandes', 'Commandes', 'manage_options', 'houetor-connect-commandes', array($this, 'render_commandes_page') ); } public function register_settings() { register_setting('hare_settings_group', 'hare_code', array( 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', )); register_setting('hare_settings_group', 'hare_layout', array( 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', )); register_setting('hare_settings_group', 'hare_items_count', array( 'type' => 'integer', 'sanitize_callback' => 'absint', )); register_setting('hare_settings_group', 'hare_injections', array( 'type' => 'array', 'sanitize_callback' => array($this, 'sanitize_injections'), )); register_setting('hare_settings_group', 'hare_token', array( 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', )); register_setting('hare_settings_group', 'houetor_connection_status', array( 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', )); register_setting('hare_settings_group', 'houetor_site_token', array( 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', )); register_setting('hare_settings_group', 'houetor_site_url', array( 'type' => 'string', 'sanitize_callback' => 'esc_url_raw', )); register_setting('hare_settings_group', 'houetor_desync_url', array( 'type' => 'string', 'sanitize_callback' => 'esc_url_raw', )); } public function sanitize_injections($value) { if (!is_array($value)) { return array(); } $allowed_modules = array('annonces', 'produits', 'formations', 'commandes'); $allowed_positions = array('append', 'prepend', 'replace'); $clean = array(); foreach ($value as $injection) { if (!is_array($injection)) { continue; } $module = isset($injection['module']) ? sanitize_key($injection['module']) : ''; $position = isset($injection['position']) ? sanitize_key($injection['position']) : ''; $clean[] = array( 'page_id' => isset($injection['page_id']) ? absint($injection['page_id']) : 0, 'module' => in_array($module, $allowed_modules, true) ? $module : '', 'position' => in_array($position, $allowed_positions, true) ? $position : 'append', ); } return $clean; } public function handle_disconnect() { if (!current_user_can('manage_options')) { wp_die('Accès refusé.'); } check_admin_referer('hare_disconnect_action'); $site_url = get_site_url(); $code = get_option('hare_code', ''); if (!empty($code)) { wp_remote_post('https://houetor.com/api/connect-site', array( 'method' => 'DELETE', 'headers' => array('Content-Type' => 'application/json'), 'body' => wp_json_encode(array( // Clé du contrat d'API externe (houetor.com/api/connect-site). 'hwt_token' => $code, 'site_url' => $site_url, )), 'timeout' => 15, )); } delete_option('houetor_connection_status'); delete_option('houetor_site_token'); delete_option('houetor_site_url'); add_settings_error('hare_messages', 'hare_disconnect_success', 'Déconnecté du compte HOUETOR.', 'success'); wp_safe_redirect(admin_url('admin.php?page=houetor-connect')); exit; } public function handle_reset_desync() { if (!current_user_can('manage_options')) { wp_die('Accès refusé.'); } check_admin_referer('hare_reset_desync_action'); delete_option('houetor_connection_status'); delete_option('houetor_site_token'); delete_option('houetor_site_url'); delete_option('houetor_desync_url'); delete_transient(HARE_Houetor_Connect::TRANSIENT_KEY); add_settings_error('hare_messages', 'hare_reset_desync_success', 'État désynchronisé effacé. Vous pouvez vous reconnecter.', 'success'); wp_safe_redirect(admin_url('admin.php?page=houetor-connect')); exit; } public function enqueue_admin_assets($hook) { if (strpos($hook, 'houetor-connect') === false) { return; } wp_enqueue_style('hare-admin', HARE_PLUGIN_URL . 'assets/admin.css', array(), HARE_VERSION); wp_enqueue_script('hare-admin', HARE_PLUGIN_URL . 'assets/admin.js', array('jquery'), HARE_VERSION, true); $injections = get_option('hare_injections', array()); if (!is_array($injections)) { $injections = array(); } $pages_out = array(); foreach (get_pages(array('number' => 50)) as $page) { $pages_out[] = array( 'ID' => absint($page->ID), 'post_title' => $page->post_title, ); } wp_localize_script('hare-admin', 'hareAdmin', array( 'injectionIndex' => count($injections), 'pages' => $pages_out, )); } public function render_page() { HARE_Houetor_Connect::refresh_remote_status(); $code = get_option('hare_code', ''); $pending_code = get_transient(self::pending_code_key()); $pending_code = is_string($pending_code) ? $pending_code : ''; $layout = get_option('hare_layout', 'grid'); $count = get_option('hare_items_count', 12); $token = get_option('hare_token', ''); $injections = get_option('hare_injections', array()); if (!is_array($injections)) { $injections = array(); } $parser = new HARE_HOUETOR_Parser($code); $profil = $parser->get_profil(); $uuid = $parser->get_uuid(); $modules = $parser->get_modules(); $valid = $parser->is_valid(); $pages = get_pages(array('number' => 50)); $profile_labels = array( 'ONG' => 'ONG', 'BOUTIQUE' => 'Boutique', 'COACH' => 'Coach', 'CM' => 'CM', 'MARKETING' => 'Marketing', 'RESTAURANT'=> 'Restaurant', 'HOTEL' => 'Hôtel', 'ECOLE' => 'École', 'PME' => 'PME', 'AGENCE' => 'Agence', ); ?>
⚠ Désynchronisé
Ce code HOUETOR est maintenant associé à un autre site :
.
Reconnectez-vous ou contactez le support si vous n'êtes pas à l'origine de ce changement.
✅ Connecté au compte HOUETOR
| Site | |
|---|---|
| Token | mask_token($stored_code)); ?> |
| Token d'accès |
Non disponible — connectez votre site via le formulaire ci-dessus pour générer un token. |
|---|---|
| Endpoints |
|
Aucun contenu disponible pour le moment.
Connectez votre site à HOUETOR pour charger les contenus de ce module.