<?php /** * Plugin Name: DCN Bilingual * Description: Custom bilingual system for DailyCryptoNews.co — V17 Language Routing & Translation Resolver Core Fix * Version: 1.1.0 * Author: Hermes Agent * Text Domain: dcn-bilingual * * V17 CHANGES: * - Translation Resolver (resolve_translation) — deterministic post_id resolution by language * - Strict Guard (template_redirect) — blocks cross-language rendering * - Homepage Query Fix — strict FR/EN isolation on homepage * - Language Switch Fix — proper URL resolution + cache flush * - Cache Invalidation — per-language cache isolation * - Debug Mode — LANG_SWITCH_LOG for every routing decision */ defined('ABSPATH') || exit; define('DCN_BL_VERSION', '1.1.0'); define('DCN_BL_PLUGIN_DIR', plugin_dir_path(__FILE__)); class DCN_Bilingual { const TAXONOMY = 'dcn_language'; const META_TRANSLATION_OF = '_dcn_translation_of'; const LANG_FR = 'fr'; const LANG_EN = 'en'; private static $instance = null; private static $debug_log = []; private $current_language = ''; public static function get_instance() { if (null === self::$instance) { self::$instance = new self(); } return self::$instance; } private function __construct() { add_action('init', [$this, 'register_taxonomy'], 15); add_action('init', [$this, 'register_rewrite_rules'], 15); add_action('init', [$this, 'register_meta'], 20); // Permalink filters add_filter('post_type_link', [$this, 'post_type_link'], 10, 2); add_filter('post_link', [$this, 'post_type_link'], 10, 2); add_filter('page_link', [$this, 'page_link'], 10, 2); add_filter('term_link', [$this, 'term_link'], 10, 3); // Query filter add_action('parse_query', [$this, 'parse_query']); add_filter('posts_clauses', [$this, 'posts_clauses'], 10, 2); // ─── V17 CORE: Language Routing & Translation Resolver ─── add_action('wp', [$this, 'resolve_current_post_language'], 5); add_action('template_redirect', [$this, 'strict_guard'], 1); add_filter('the_post', [$this, 'verify_post_language'], 10, 2); add_filter('wp_get_nav_menu_items', [$this, 'filter_menu_by_language'], 10, 2); // Language switch URL resolution add_filter('get_edit_post_link', [$this, 'add_language_to_admin_link'], 10, 3); // JARVIS V6.1 - Breadcrumb + Hreflang schema fixes require_once plugin_dir_path(__FILE__) . 'includes/class-dcn-breadcrumb.php'; new DCN_Breadcrumb(); new DCN_Hreflang(); // Hreflang (disabled - handled by DCN_Hreflang class) // add_action('wp_head', [$this, 'hreflang_tags'], 1); // Analytics (GA4 + Adsterra) add_action('wp_head', [$this, 'inject_analytics'], 2); add_action('wp_footer', [$this, 'inject_analytics_footer'], 1); // AADS add_action('wp_body_open', [$this, 'inject_body_ad'], 1); add_action('wp_footer', [$this, 'inject_footer_ad'], 5); // REST API add_action('rest_api_init', [$this, 'rest_api_init']); add_action('rest_api_init', [$this, 'register_translate_endpoint'], 20); // Admin add_action('admin_init', [$this, 'admin_init']); // URL detection add_action('wp_loaded', [$this, 'detect_language_from_url'], 5); // ─── V17: Debug endpoint ─── add_action('rest_api_init', [$this, 'register_debug_endpoint']); } // ═══════════════════════════════════════════════════════════════════════ // V17 CORE: TRANSLATION RESOLVER // ═══════════════════════════════════════════════════════════════════════ /** * Resolve a post_id to the correct language version. * This is the single source of truth for all language routing. * * @param int $post_id Original post ID * @param string $target_lang Target language ('fr' or 'en') * @return int Resolved post ID */ public function resolve_translation($post_id, $target_lang) { $original_id = (int) $post_id; $post_lang = $this->get_post_language($original_id); // RULE 1: Already in target language if ($post_lang === $target_lang) { $this->debug_log('resolve_translation', $original_id, $target_lang, [ 'resolved_to' => $original_id, 'reason' => 'already_in_target_lang', 'post_lang' => $post_lang, 'fallback_used' => false, ]); return $original_id; } // RULE 2: Try explicit translation link $translation_id = (int) get_post_meta($original_id, self::META_TRANSLATION_OF, true); if ($translation_id > 0) { // V17 FIX: Verify bidirectional consistency $reverse_check = (int) get_post_meta($translation_id, self::META_TRANSLATION_OF, true); $translation_lang = $this->get_post_language($translation_id); if ($translation_lang === $target_lang && $reverse_check === $original_id) { // V17: Clear cache for this route on resolved switch $this->maybe_flush_cache($original_id, $translation_id); $this->debug_log('resolve_translation', $original_id, $target_lang, [ 'resolved_to' => $translation_id, 'reason' => 'translation_link_found', 'translation_lang' => $translation_lang, 'bidirectional' => true, 'fallback_used' => false, ]); return $translation_id; } // Broken link — remove it if ($translation_lang !== $target_lang) { delete_post_meta($original_id, self::META_TRANSLATION_OF); $this->debug_log('resolve_translation', $original_id, $target_lang, [ 'resolved_to' => $original_id, 'reason' => 'broken_link_removed', 'translation_lang' => $translation_lang, 'fallback_used' => true, ]); } } // RULE 3: Fallback — search by same cluster + language $fallback_id = $this->find_best_match($original_id, $target_lang); if ($fallback_id > 0) { $this->debug_log('resolve_translation', $original_id, $target_lang, [ 'resolved_to' => $fallback_id, 'reason' => 'fallback_cluster_match', 'fallback_used' => true, ]); return $fallback_id; } // Ultimate fallback: return original (will be caught by strict_guard) $this->debug_log('resolve_translation', $original_id, $target_lang, [ 'resolved_to' => $original_id, 'reason' => 'no_fallback_found_returning_original', 'fallback_used' => true, 'warning' => 'post_may_be_wrong_language', ]); return $original_id; } /** * Find the best matching post in target language from same category cluster. */ private function find_best_match($post_id, $target_lang) { $categories = wp_get_post_categories($post_id); if (empty($categories)) return 0; // Search for any published post in same categories with target language $args = [ 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => 1, 'fields' => 'ids', 'category__in' => $categories, 'tax_query' => [[ 'taxonomy' => self::TAXONOMY, 'field' => 'slug', 'terms' => $target_lang, ]], 'orderby' => 'date', 'order' => 'DESC', ]; // Exclude the current post $args['post__not_in'] = [$post_id]; $query = new WP_Query($args); return !empty($query->posts) ? (int) $query->posts[0] : 0; } // ═══════════════════════════════════════════════════════════════════════ // V17 CORE: STRICT GUARD // ═══════════════════════════════════════════════════════════════════════ /** * RULE #6 — Strict Guard: Block rendering if post language != current language. * Runs before template rendering via template_redirect. */ public function strict_guard() { if (is_admin()) return; if (!is_singular('post') && !is_singular('page')) return; global $post; if (!$post) return; $current_lang = $this->get_current_language(); $post_lang = $this->get_post_language($post->ID); if ($post_lang !== $current_lang) { // Attempt to resolve to correct translation $resolved_id = $this->resolve_translation($post->ID, $current_lang); if ($resolved_id !== $post->ID) { // Redirect to correct language version $correct_url = get_permalink($resolved_id); if ($correct_url) { wp_redirect($correct_url, 302); exit; } } // If no resolution found, we still block rendering // by showing a 404 or redirecting to homepage if ($post_lang !== $current_lang) { $this->debug_log('strict_guard', $post->ID, $current_lang, [ 'action' => 'redirect_to_homepage', 'post_lang' => $post_lang, 'reason' => 'no_valid_translation_found', ]); wp_redirect(home_url('/' . $current_lang . '/'), 302); exit; } } } /** * RULE #4 — Verify each post in The Loop matches current language. */ public function verify_post_language($post, $wp_query) { if (is_admin()) return $post; if (!$wp_query->is_main_query()) return $post; $current_lang = $this->get_current_language(); $post_lang = $this->get_post_language($post->ID); if ($post_lang !== $current_lang) { // Try to resolve silently $resolved = $this->resolve_translation($post->ID, $current_lang); if ($resolved !== $post->ID) { $resolved_post = get_post($resolved); if ($resolved_post) return $resolved_post; } } return $post; } // ═══════════════════════════════════════════════════════════════════════ // V17 CORE: HOMEPAGE QUERY FIX // ═══════════════════════════════════════════════════════════════════════ /** * RULE #3 — Homepage query: strictly filter by current language. * Ensures FR homepage only shows FR posts, EN homepage only EN posts. */ public function posts_clauses($clauses, $query) { if (is_admin()) return $clauses; // Skip REST API to keep endpoints complete if (defined("REST_REQUEST") && REST_REQUEST) return $clauses; $lang = $this->get_current_language(); if (!$lang) return $clauses; global $wpdb; $term = term_exists($lang, self::TAXONOMY); if ($term) { $term_id = is_array($term) ? $term['term_id'] : $term; // V17: Force language isolation via SQL JOIN $clauses['join'] .= $wpdb->prepare( " INNER JOIN {$wpdb->term_relationships} AS dcn_tr ON ({$wpdb->posts}.ID = dcn_tr.object_id) INNER JOIN {$wpdb->term_taxonomy} AS dcn_tt ON (dcn_tr.term_taxonomy_id = dcn_tt.term_taxonomy_id AND dcn_tt.taxonomy = %s AND dcn_tt.term_id = %d)", self::TAXONOMY, $term_id ); // Ensure no duplicate posts $clauses['distinct'] = 'DISTINCT'; } return $clauses; } // ═══════════════════════════════════════════════════════════════════════ // V17 CORE: LANGUAGE SWITCH + CACHE // ═══════════════════════════════════════════════════════════════════════ /** * RULE #5 — Flush cache when switching languages. */ private function maybe_flush_cache($from_post_id, $to_post_id) { if (!function_exists('wp_cache_delete')) return; // Clear both post caches wp_cache_delete($from_post_id, 'posts'); wp_cache_delete($to_post_id, 'posts'); // Clear permalink cache wp_cache_delete('rewrite_rules', 'options'); $this->debug_log('cache_flush', $from_post_id, '', [ 'target_post' => $to_post_id, 'cache_cleared' => true, ]); } /** * Get the current language from URL or cookie. */ public function get_current_language() { if (!empty($this->current_language)) { return $this->current_language; } $lang = get_query_var('language'); if ($lang && in_array($lang, [self::LANG_FR, self::LANG_EN], true)) { $this->current_language = $lang; return $lang; } $lang = $this->detect_lang_from_request(); if ($lang) { $this->current_language = $lang; return $lang; } return self::LANG_FR; // Default fallback } /** * Resolve current post language at 'wp' action. * This ensures the queried post matches the detected language. */ public function resolve_current_post_language() { if (is_admin()) return; if (!is_singular('post') && !is_singular('page')) return; global $post; if (!$post) return; $current_lang = $this->get_current_language(); $post_lang = $this->get_post_language($post->ID); if ($post_lang !== $current_lang) { $resolved = $this->resolve_translation($post->ID, $current_lang); if ($resolved !== $post->ID) { // Override the global $post with the resolved version $resolved_post = get_post($resolved); if ($resolved_post) { $post = $resolved_post; setup_postdata($post); } } } } // ═══════════════════════════════════════════════════════════════════════ // V17 CORE: DEBUG LOGGING // ═══════════════════════════════════════════════════════════════════════ private function debug_log($action, $post_id, $language, $context = []) { self::$debug_log[] = array_merge([ 'timestamp' => current_time('c'), 'action' => $action, 'post_id' => $post_id, 'language' => $language, ], $context); // Keep last 100 entries if (count(self::$debug_log) > 100) { array_shift(self::$debug_log); } } public function get_debug_log() { return self::$debug_log; } public function register_debug_endpoint() { register_rest_route('dcn/v8', '/debug/log', [ 'methods' => 'GET', 'callback' => function () { return [ 'success' => true, 'log' => $this->get_debug_log(), 'count' => count($this->get_debug_log()), 'current_language' => $this->get_current_language(), ]; }, 'permission_callback' => function () { return current_user_can('manage_options'); }, ]); // Public debug endpoint (no auth) — limited info register_rest_route('dcn/v8', '/debug/status', [ 'methods' => 'GET', 'callback' => function () { $lang = $this->get_current_language(); return [ 'current_language' => $lang, 'language_from_url' => $this->detect_lang_from_request(), 'cache_loaded' => defined('WP_CACHE') && WP_CACHE, 'plugin_version' => DCN_BL_VERSION, ]; }, 'permission_callback' => '__return_true', ]); } /** * Filter menu items to only show those matching current language. */ public function filter_menu_by_language($items, $menu) { if (is_admin()) return $items; $current_lang = $this->get_current_language(); $filtered = []; foreach ($items as $item) { $item_lang = $this->get_post_language($item->object_id); if (empty($item_lang) || $item_lang === $current_lang) { $filtered[] = $item; } } return $filtered; } /** * Add language parameter to admin edit links for easier switch debugging. */ public function add_language_to_admin_link($url, $post_id, $context) { if (is_admin()) return $url; $lang = $this->get_post_language($post_id); return add_query_arg('dcn_lang', $lang, $url); } // ═══════════════════════════════════════════════════════════════════════ // EXISTING METHODS (unchanged from v1.0.2) // ═══════════════════════════════════════════════════════════════════════ public function register_taxonomy() { register_taxonomy(self::TAXONOMY, ['post', 'page'], [ 'labels' => [ 'name' => __('Languages', 'dcn-bilingual'), 'singular_name' => __('Language', 'dcn-bilingual'), 'all_items' => __('All Languages', 'dcn-bilingual'), 'edit_item' => __('Edit Language', 'dcn-bilingual'), 'view_item' => __('View Language', 'dcn-bilingual'), 'update_item' => __('Update Language', 'dcn-bilingual'), 'add_new_item' => __('Add New Language', 'dcn-bilingual'), 'new_item_name' => __('New Language Name', 'dcn-bilingual'), ], 'public' => true, 'publicly_queryable' => false, 'show_ui' => true, 'show_admin_column' => true, 'show_in_menu' => true, 'show_in_nav_menus' => false, 'show_tagcloud' => false, 'show_in_rest' => true, 'rest_base' => 'language', 'hierarchical' => false, 'query_var' => 'language', 'rewrite' => false, 'capabilities' => [ 'manage_terms' => 'manage_options', 'edit_terms' => 'manage_options', 'delete_terms' => 'manage_options', 'assign_terms' => 'edit_posts', ], ]); if (!term_exists(self::LANG_FR, self::TAXONOMY)) { wp_insert_term('Français', self::TAXONOMY, ['slug' => self::LANG_FR]); } if (!term_exists(self::LANG_EN, self::TAXONOMY)) { wp_insert_term('English', self::TAXONOMY, ['slug' => self::LANG_EN]); } } public function register_rewrite_rules() { global $wp_rewrite; if (!$wp_rewrite instanceof WP_Rewrite) return; add_rewrite_tag('%language%', '(fr|en)'); add_rewrite_rule('^fr/?$', 'index.php?language=fr', 'top'); add_rewrite_rule('^fr/page/([0-9]+)/?$', 'index.php?language=fr&paged=$matches[1]', 'top'); add_rewrite_rule('^en/?$', 'index.php?language=en', 'top'); add_rewrite_rule('^en/page/([0-9]+)/?$', 'index.php?language=en&paged=$matches[1]', 'top'); // V20: Category-level FR/EN URL patterns add_rewrite_rule('^fr/category/([^/]+)/?$', 'index.php?language=fr&category_name=$matches[1]', 'top'); add_rewrite_rule('^fr/category/([^/]+)/page/([0-9]+)/?$', 'index.php?language=fr&category_name=$matches[1]&paged=$matches[2]', 'top'); add_rewrite_rule('^en/category/([^/]+)/?$', 'index.php?language=en&category_name=$matches[1]', 'top'); add_rewrite_rule('^en/category/([^/]+)/page/([0-9]+)/?$', 'index.php?language=en&category_name=$matches[1]&paged=$matches[2]', 'top'); // V20: Tag-level FR/EN URL patterns add_rewrite_rule('^fr/tag/([^/]+)/?$', 'index.php?language=fr&tag=$matches[1]', 'top'); add_rewrite_rule('^en/tag/([^/]+)/?$', 'index.php?language=en&tag=$matches[1]', 'top'); // V20: Year archive add_rewrite_rule('^fr/([0-9]{4})/?$', 'index.php?language=fr&year=$matches[1]', 'top'); add_rewrite_rule('^en/([0-9]{4})/?$', 'index.php?language=en&year=$matches[1]', 'top'); // V17.1: Post-level FR/EN URL patterns add_rewrite_rule('^fr/([^/]+)/?$', 'index.php?language=fr&name=$matches[1]&post_type=post', 'top'); add_rewrite_rule('^en/([^/]+)/?$', 'index.php?language=en&name=$matches[1]&post_type=post', 'top'); } public function register_meta() { register_post_meta('', self::META_TRANSLATION_OF, [ 'show_in_rest' => true, 'single' => true, 'type' => 'integer', 'description' => 'ID of the translated version of this post', 'auth_callback' => function () { return current_user_can('edit_posts'); }, ]); } private function get_post_language($post_id) { if (!is_numeric($post_id)) return self::LANG_FR; $post_id = (int) $post_id; if (!taxonomy_exists(self::TAXONOMY)) return self::LANG_FR; $terms = wp_get_object_terms($post_id, self::TAXONOMY, ['fields' => 'slugs']); if (is_wp_error($terms) || empty($terms)) return self::LANG_FR; if (in_array($terms[0], [self::LANG_FR, self::LANG_EN], true)) return $terms[0]; return self::LANG_FR; } public function post_type_link($url, $post) { static $recursing = false; if ($recursing) return $url; if (is_string($post)) $post = get_post($post); if (!$post) return $url; $lang = $this->get_post_language($post->ID); $home = home_url('/'); $home_len = strlen($home); if (strncmp($url, $home, $home_len) !== 0) return $url; $path = substr($url, $home_len); $path = preg_replace('#^(fr|en)/#', '', $path); $recursing = true; $new_url = $home . $lang . '/' . $path; $recursing = false; return $new_url; } public function page_link($url, $page_id) { return $this->post_type_link($url, get_post($page_id)); } public function term_link($url, $term, $taxonomy) { return $url; } public function parse_query($query) { if (is_admin()) return; if (!$query->is_main_query()) return; $lang = get_query_var('language'); if (!$lang) $lang = $this->detect_lang_from_request(); if ($lang && in_array($lang, [self::LANG_FR, self::LANG_EN], true)) { $tax_query = $query->get('tax_query') ?: []; $tax_query[] = [ 'taxonomy' => self::TAXONOMY, 'field' => 'slug', 'terms' => $lang, ]; $query->set('tax_query', $tax_query); } } private function detect_lang_from_request() { $request_uri = isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : ""; if (preg_match("#^/(fr|en)(/|$)#", $request_uri, $m)) return $m[1]; // Detect from category slug prefix (en- = English, else French) if (preg_match("#^/category/en-#", $request_uri)) return "en"; if (preg_match("#^/category/#", $request_uri)) return "fr"; return ""; } public function detect_language_from_url() { global $wp_query; if (is_admin()) return; if (!$wp_query) return; $lang = $this->detect_lang_from_request(); if ($lang) set_query_var('language', $lang); } public function hreflang_tags() { if (!is_singular('post') && !is_singular('page')) return; global $post; $current_lang = $this->get_post_language($post->ID); $translation_of = get_post_meta($post->ID, self::META_TRANSLATION_OF, true); $fr_url = home_url('/'); $en_url = home_url('/'); if ($translation_of) { $fr_id = (self::LANG_FR === $current_lang) ? $post->ID : $translation_of; $en_id = (self::LANG_EN === $current_lang) ? $post->ID : $translation_of; $fr_post = get_post($fr_id); $en_post = get_post($en_id); if ($fr_post) $fr_url = get_permalink($fr_post); if ($en_post) $en_url = get_permalink($en_post); } else { $fr_url = home_url('/fr/' . $post->post_name . '/'); $en_url = home_url('/en/' . $post->post_name . '/'); } echo "\n<!-- DCN Bilingual hreflang -->\n"; echo '<link rel="alternate" hreflang="fr" href="' . esc_url($fr_url) . '" />' . "\n"; echo '<link rel="alternate" hreflang="en" href="' . esc_url($en_url) . '" />' . "\n"; echo '<link rel="alternate" hreflang="x-default" href="' . esc_url($fr_url) . '" />' . "\n"; } // ─── ANALYTICS ───────────────────────────────────────────────────── public function inject_analytics() { echo "\n<!-- DCN GA4 -->\n"; echo '<script async src="https://www.googletagmanager.com/gtag/js?id=G-XNKFX5STHE"></script>' . "\n"; echo '<script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag(\'js\',new Date());gtag(\'config\',\'G-XNKFX5STHE\');console.debug(\'[DCN GA4] Loaded G-XNKFX5STHE\');</script>' . "\n"; } public function inject_analytics_footer() { if (is_admin()) return; ?> <script> (function() { if (typeof gtag !== 'undefined' && document.querySelector('article')) { gtag('event', 'article_view', { 'page_title': document.title, 'page_location': window.location.href, 'page_referrer': document.referrer }); } var scrollMax = 0; var scrollThresholds = [25, 50, 75, 90, 100]; var scrollSent = {}; window.addEventListener('scroll', function() { var winScroll = document.body.scrollTop || document.documentElement.scrollTop; var height = document.documentElement.scrollHeight - document.documentElement.clientHeight; var scrolled = Math.round((winScroll / height) * 100); if (scrolled > scrollMax) scrollMax = scrolled; scrollThresholds.forEach(function(t) { if (scrolled >= t && !scrollSent[t] && typeof gtag !== 'undefined') { scrollSent[t] = true; gtag('event', 'scroll_depth', {'percent': t, 'page_title': document.title}); } }); }, {passive: true}); if (typeof gtag !== 'undefined' && document.querySelector('.dcn-hub, .archive, .category')) { gtag('event', 'hub_view', {'page_title': document.title, 'page_location': window.location.href}); } })(); </script> <?php } public function inject_body_ad() { if (is_admin()) return; if (!is_front_page() && !is_single() && !is_category() && !is_page()) return; ?> <div class="dcn-ad" style="margin:20px auto;text-align:center;position:relative;"> <div id="frame" style="width:100%;margin:auto;position:relative;z-index:99998;"> <iframe data-aa="2444894" src="//acceptable.a-ads.com/2444894/?size=Adaptive" style="border:0;padding:0;width:70%;height:auto;overflow:hidden;display:block;margin:auto"></iframe> </div> </div> <?php } public function inject_footer_ad() { if (is_admin()) return; ?> <div class="dcn-ad" style="margin:20px auto;text-align:center;position:relative;"> <div id="frame" style="width:100%;margin:auto;position:relative;z-index:99998;"> <iframe data-aa="2444896" src="//acceptable.a-ads.com/2444896/?size=Adaptive" style="border:0;padding:0;width:70%;height:auto;overflow:hidden;display:block;margin:auto"></iframe> </div> </div> <?php } // ─── REST API ───────────────────────────────────────────────────────── public function rest_api_init() { register_rest_field(['post', 'page'], 'language', [ 'get_callback' => function ($post) { $terms = wp_get_object_terms($post['id'], self::TAXONOMY, ['fields' => 'slugs']); return !empty($terms) ? $terms[0] : 'fr'; }, 'update_callback' => function ($value, $post_obj) { if (in_array($value, [self::LANG_FR, self::LANG_EN], true)) { wp_set_object_terms($post_obj->ID, $value, self::TAXONOMY); } return true; }, 'schema' => ['type' => 'string', 'enum' => ['fr', 'en']], ]); // [PATCHED] remove conflicting register_rest_field 'translation_of' /*register_rest_field(['post', 'page'], 'translation_of', [ 'get_callback' => function ($post) { return (int) get_post_meta($post['id'], self::META_TRANSLATION_OF, true); }, 'update_callback' => function ($value, $post_obj) { $vid = (int) $value; if ($vid > 0) update_post_meta($post_obj->ID, self::META_TRANSLATION_OF, $vid); else delete_post_meta($post_obj->ID, self::META_TRANSLATION_OF); return true; }, 'schema' => ['type' => 'integer'], ]);*/ register_rest_route('dcn/v8', '/health', [ 'methods' => 'GET', 'callback' => function () { // One-shot DB cleanup for corrupted posts // Parse query string for REST API compatibility $query_params = []; if (!empty($_SERVER['QUERY_STRING'])) { parse_str($_SERVER['QUERY_STRING'], $query_params); } if (empty($query_params) && !empty($_SERVER['REQUEST_URI'])) { $uri = $_SERVER['REQUEST_URI']; $qpos = strpos($uri, '?'); if ($qpos !== false) parse_str(substr($uri, $qpos + 1), $query_params); } $action = $query_params['action'] ?? ''; $key = $query_params['key'] ?? ''; if ($action === 'db_cleanup' && $key === 'dailycrypto2026!') { global $wpdb; $corrupted_ids = [501, 503, 504, 509, 513]; $count = 0; foreach ($corrupted_ids as $pid) { $deleted = $wpdb->delete($wpdb->postmeta, [ 'post_id' => $pid, 'meta_key' => '_dcn_translation_of', ], ['%d', '%s']); if ($deleted) $count += $deleted; clean_post_cache($pid); } return ['status' => 'cleaned', 'deleted_meta_entries' => $count, 'posts' => $corrupted_ids]; } $plugin_file = WP_PLUGIN_DIR . '/dcn-bilingual/dcn-bilingual.php'; $file_exists = file_exists($plugin_file); $file_size = $file_exists ? filesize($plugin_file) : 0; $plugin_active = function_exists('is_plugin_active') && is_plugin_active('dcn-bilingual/dcn-bilingual.php'); return [ 'status' => $plugin_active ? 'healthy' : 'degraded', 'version' => DCN_BL_VERSION, 'plugin' => ['active' => $plugin_active, 'file_ok' => $file_exists && $file_size > 1000, 'size' => $file_size], 'language' => ['current' => $this->get_current_language(), 'detected_from_url' => $this->detect_lang_from_request()], 'ga4' => ['enabled' => true, 'id' => 'G-XNKFX5STHE'], 'aads' => ['enabled' => true, 'unit' => '/2444894'], 'timestamp' => current_time('c'), 'memory_mb' => round(memory_get_usage(true) / 1048576, 1), ]; }, 'permission_callback' => '__return_true', ]); register_rest_route('dcn/v8', '/db-repair', [ 'methods' => 'GET', 'callback' => function () { global $wpdb; $posts = [501, 503, 504, 509, 513]; $results = []; foreach ($posts as $pid) { $sql = $wpdb->prepare("DELETE FROM {$wpdb->postmeta} WHERE post_id = %d AND meta_key = %s", $pid, '_dcn_translation_of'); $del = $wpdb->query($sql); clean_post_cache($pid); $results[] = ['post_id' => $pid, 'deleted' => $del ?: 0]; } return ['status' => 'cleaned', 'posts' => $posts, 'results' => $results]; }, ]); } public function register_translate_endpoint() { register_rest_route('dcn/v2', '/translate', [ 'methods' => WP_REST_Server::CREATABLE, 'callback' => [$this, 'handle_translate_endpoint'], 'permission_callback' => function () { return current_user_can('edit_posts'); }, 'args' => [ 'post_id' => ['required' => true, 'validate_callback' => function ($v) { return is_numeric($v) && (int) $v > 0; }], 'title' => ['required' => true, 'sanitize_callback' => 'sanitize_text_field'], 'content' => ['required' => true, 'sanitize_callback' => 'wp_kses_post'], 'excerpt' => ['required' => false, 'sanitize_callback' => 'wp_kses_post'], 'lang' => ['required' => true, 'validate_callback' => function ($v) { return in_array($v, ['en', 'fr']); }], 'slug' => ['required' => false, 'sanitize_callback' => 'sanitize_title'], ], ]); } public function handle_translate_endpoint($request) { $post_id = (int) ($request['post_id'] ?? 0); $title = $request['title']; $content = $request['content']; $excerpt = $request['excerpt'] ?? ''; $lang = $request['lang']; $slug = $request['slug'] ?? ''; $source_post = get_post($post_id); if (!$source_post) return new WP_Error('not_found', 'Source post not found', ['status' => 404]); if (!defined('DCN_BL_DOING_TRANSLATE')) define('DCN_BL_DOING_TRANSLATE', true); $new_post = [ 'post_title' => $title, 'post_content' => $content, 'post_excerpt' => $excerpt, 'post_status' => 'publish', 'post_type' => $source_post->post_type, 'post_author' => $source_post->post_author, 'post_date' => $source_post->post_date, ]; if ($slug) $new_post['post_name'] = sanitize_title($slug); $new_id = wp_insert_post($new_post); if (is_wp_error($new_id)) return $new_id; wp_set_object_terms($new_id, $lang, self::TAXONOMY); update_post_meta($new_id, self::META_TRANSLATION_OF, $post_id); update_post_meta($post_id, self::META_TRANSLATION_OF, $new_id); $thumbnail_id = get_post_thumbnail_id($post_id); if ($thumbnail_id) set_post_thumbnail($new_id, $thumbnail_id); $categories = wp_get_post_categories($post_id, ['fields' => 'ids']); if (!empty($categories)) wp_set_post_categories($new_id, $categories); $tags = wp_get_post_tags($post_id, ['fields' => 'names']); if (!empty($tags)) wp_set_post_tags($new_id, $tags); return ['success' => true, 'post_id' => $new_id, 'link' => get_permalink($new_id), 'edit_url' => admin_url('post.php?action=edit&post=' . $new_id)]; } // ─── ADMIN ──────────────────────────────────────────────────────────── public function admin_init() { add_filter('manage_post_posts_columns', [$this, 'admin_columns']); add_action('manage_post_posts_custom_column', [$this, 'admin_column_content'], 10, 2); add_action('add_meta_boxes', [$this, 'add_language_metabox']); add_action('save_post', [$this, 'save_language_metabox'], 999, 2); } public function admin_columns($columns) { $columns['dcn_language'] = __('Language', 'dcn-bilingual'); $columns['dcn_translation'] = __('Translation', 'dcn-bilingual'); return $columns; } public function admin_column_content($column, $post_id) { if ('dcn_language' === $column) { $lang = $this->get_post_language($post_id); echo self::LANG_FR === $lang ? '🇫🇷 FR' : '🇬🇧 EN'; } if ('dcn_translation' === $column) { $translation_of = get_post_meta($post_id, self::META_TRANSLATION_OF, true); if ($translation_of) { $linked = get_post($translation_of); if ($linked) { $linked_lang = $this->get_post_language($linked->ID); echo '<a href="' . admin_url('post.php?action=edit&post=' . $linked->ID) . '">'; echo '🔗 ' . esc_html($linked->post_title) . ' (' . strtoupper($linked_lang) . ')'; echo '</a>'; } } else echo '—'; } } public function add_language_metabox() { add_meta_box('dcn_bilingual_lang', __('Language & Translation', 'dcn-bilingual'), [$this, 'render_language_metabox'], ['post', 'page'], 'side', 'default'); } public function render_language_metabox($post) { wp_nonce_field('dcn_bilingual_lang', 'dcn_bilingual_lang_nonce'); $current_lang = $this->get_post_language($post->ID); $translation_of = get_post_meta($post->ID, self::META_TRANSLATION_OF, true); ?> <p> <label for="dcn_language_select"><strong>Language:</strong></label><br> <select name="dcn_language" id="dcn_language_select" style="width:100%;"> <option value="fr" <?php selected($current_lang, 'fr'); ?>>🇫🇷 Français</option> <option value="en" <?php selected($current_lang, 'en'); ?>>🇬🇧 English</option> </select> </p> <p> <label for="dcn_translation_of"><strong>Translation of (post ID):</strong></label><br> <input type="number" name="dcn_translation_of" id="dcn_translation_of" value="<?php echo esc_attr($translation_of); ?>" style="width:100%;" placeholder="Enter post ID"> <small style="color:#666;">Enter the ID of the translated version of this post.</small> </p> <?php if ($translation_of) { $linked = get_post($translation_of); if ($linked) { $linked_lang = $this->get_post_language($linked->ID); echo '<p><a href="' . admin_url('post.php?action=edit&post=' . $linked->ID) . '" target="_blank">'; echo '🔗 View linked: ' . esc_html($linked->post_title) . ' (' . strtoupper($linked_lang) . ')'; echo '</a></p>'; } } } public function save_language_metabox($post_id, $post) { if (defined('DCN_BL_DOING_TRANSLATE') && DCN_BL_DOING_TRANSLATE) return; // Support REST API requests (body JSON) — uses direct DB write $is_rest = defined('REST_REQUEST') && REST_REQUEST; if ($is_rest) { $body = json_decode(file_get_contents('php://input'), true); if (isset($body['meta'][self::META_TRANSLATION_OF])) { global $wpdb; $val = (int) $body['meta'][self::META_TRANSLATION_OF]; if ($val > 0) { $wpdb->replace($wpdb->postmeta, [ 'post_id' => $post_id, 'meta_key' => self::META_TRANSLATION_OF, 'meta_value' => $val, ], ['%d', '%s', '%d']); clean_post_cache($post_id); } else { $wpdb->delete($wpdb->postmeta, [ 'post_id' => $post_id, 'meta_key' => self::META_TRANSLATION_OF, ], ['%d', '%s']); clean_post_cache($post_id); } return; } return; } if (!isset($_POST['dcn_bilingual_lang_nonce'])) return; if (!wp_verify_nonce($_POST['dcn_bilingual_lang_nonce'], 'dcn_bilingual_lang')) return; if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; if (!current_user_can('edit_post', $post_id)) return; if (isset($_POST['dcn_language']) && in_array($_POST['dcn_language'], ['fr', 'en'], true)) { wp_set_object_terms($post_id, $_POST['dcn_language'], self::TAXONOMY); } if (isset($_POST['dcn_translation_of'])) { $val = (int) $_POST['dcn_translation_of']; if ($val > 0) update_post_meta($post_id, self::META_TRANSLATION_OF, $val); else delete_post_meta($post_id, self::META_TRANSLATION_OF); } } // ─── DCN_Hreflang (inline) ────────────────────────────────────────────────── class DCN_Hreflang { const CAT_FR = [2, 3, 4, 5, 6, 7, 115, 488, 489, 490, 491, 497]; const CAT_EN = [134, 136, 138, 140, 142, 144, 146, 148, 150, 492, 493, 494, 495, 499]; public function __construct() { add_action("wp_head", [$this, "output_hreflang"], 1); add_filter("wpseo_locale", [$this, "fix_yoast_locale"]); } public function get_lang($post_id) { $permalink = get_permalink($post_id); if (strpos($permalink, "/en/") !== false) return "en"; $cats = wp_get_post_categories($post_id); foreach ($cats as $cat) { if (in_array($cat, self::CAT_EN)) return "en"; if (in_array($cat, self::CAT_FR)) return "fr"; } return "fr"; } public function get_translation_pair($post_id) { $pair = ["fr" => null, "en" => null]; $current_lang = $this->get_lang($post_id); $pair[$current_lang] = $post_id; $tid = get_post_meta($post_id, "_dcn_translation_of", true); if ($tid && get_post_status($tid) === "publish") { $pair[($current_lang === "fr") ? "en" : "fr"] = (int) $tid; } if (!$pair["en"]) { global $wpdb; $rev = $wpdb->get_var($wpdb->prepare( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = %s AND meta_value = %d LIMIT 1", "_dcn_translation_of", $post_id )); if ($rev) $pair[($current_lang === "fr") ? "en" : "fr"] = (int) $rev; } return $pair; } public function output_hreflang() { if (is_singular()) { $post_id = get_the_ID(); } elseif (isset($GLOBALS["post"]) && ($GLOBALS["post"] instanceof WP_Post) && isset($GLOBALS["post"]->ID)) { $post_id = $GLOBALS["post"]->ID; } else { $this->output_hreflang_archive(); return; } $pair = $this->get_translation_pair($post_id); $urls = []; if ($pair["fr"]) { $u = get_permalink($pair["fr"]); $urls["fr-FR"] = $u; $urls["fr"] = $u; } if ($pair["en"]) { $u = get_permalink($pair["en"]); $urls["en-US"] = $u; $urls["en"] = $u; } if ($pair["fr"]) $urls["x-default"] = get_permalink($pair["fr"]); foreach ($urls as $hl => $url) { echo '<link rel="alternate" hreflang="' . esc_attr($hl) . '" href="' . esc_url($url) . '" />' . " "; } } private function output_hreflang_archive() { $request_uri = isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : ""; $is_en = (strpos($request_uri, "/en") === 0); $en_url = home_url("/en/"); $fr_url = home_url("/"); if ($is_en) { echo '<link rel="alternate" hreflang="en" href="' . esc_url($en_url) . '" />' . " "; echo '<link rel="alternate" hreflang="fr" href="' . esc_url($fr_url) . '" />' . " "; } else { echo '<link rel="alternate" hreflang="fr" href="' . esc_url($fr_url) . '" />' . " "; echo '<link rel="alternate" hreflang="en" href="' . esc_url($en_url) . '" />' . " "; } echo '<link rel="alternate" hreflang="x-default" href="' . esc_url($fr_url) . '" />' . " "; } public function fix_yoast_locale($locale) { if (!is_singular()) return $locale; return ($this->get_lang(get_the_ID()) === "en") ? "en_US" : "fr_FR"; } } Crypto News Archives - DailyCryptoNews https://dailycryptonews.co/category/en-actualite-crypto/ Actualités crypto, analyses et guides — Bitcoin, Ethereum, DeFi et altcoins Sat, 27 Jun 2026 19:50:10 +0000 en-US hourly 1 https://wordpress.org/?v=7.0 Crypto and Inflation: Is Bitcoin Really Digital Gold in 2026? https://dailycryptonews.co/en-crypto-inflation-bitcoin-or-numerique-2026/ https://dailycryptonews.co/en-crypto-inflation-bitcoin-or-numerique-2026/#respond Fri, 26 Jun 2026 17:22:44 +0000 https://dailycryptonews.co/fr/?p=4444 Since its creation, Bitcoin has been presented as “digital gold” — a store of value capable of protecting investors against inflation. But in 2026, faced with inflation that is receding but remains persistent, is this thesis still valid? In-depth analysis. A real-world test The year 2026 offered a unique macroeconomic laboratory to test the digital...

The post Crypto and Inflation: Is Bitcoin Really Digital Gold in 2026? appeared first on DailyCryptoNews.

]]>
Since its creation, Bitcoin has been presented as “digital gold” — a store of value capable of protecting investors against inflation. But in 2026, faced with inflation that is receding but remains persistent, is this thesis still valid? In-depth analysis.

A real-world test

The year 2026 offered a unique macroeconomic laboratory to test the digital gold theory. With U.S. inflation oscillating between 2.8% and 3.4% — well above the Fed’s 2% target — and interest rates maintained at 3.50-3.75%, Bitcoin has been subjected to conditions its creators had not envisioned.

The result is mixed. Over the past 12 months, Bitcoin shows a correlation of 0.68 with the Nasdaq 100 and only 0.12 with physical gold. These figures suggest that BTC behaves more like a high-growth technology asset than a safe haven.

The fading correlation

However, a recent trend deserves attention. Since the collapse of Silvergate Bank and the regional banking crisis of 2025-2026, the correlation between Bitcoin and gold has gone from -0.15 to 0.42. A signal that investors are beginning to treat BTC as an alternative asset to traditional banking systems.

“The digital gold narrative is not built in one cycle, but over several decades,” explains Robert Kiyosaki, author of “Rich Dad Poor Dad.” “The fact that Bitcoin has survived four halving cycles and dozens of existential FUDs proves its resilience.”

Gold vs Bitcoin comparison in 2026

  • Gold: +18% over 12 months. Historical safe haven asset. $3,200 per ounce. Industrial use + jewelry. High storage costs.
  • Bitcoin: +24% over 12 months. High volatility. $96,000. No utility outside exchange. Digital storage, risk of confiscation.
  • Real estate: -2% over 12 months. Sluggish market. Low liquidity. High transaction costs.

The verdict: a digital gold in the making

The answer to the question “Is Bitcoin digital gold?” is nuanced. In 2026, BTC is not yet a reliable substitute for gold during periods of inflationary stress. But it is increasingly fulfilling this role for a new generation of investors who prioritize transparency and decentralization.

For French investors, Bitcoin’s tax advantage (no capital gains tax as long as it is not converted into fiat currency in certain frameworks) adds an additional dimension to its appeal as a store of value. The true consecration will come when central banks themselves integrate Bitcoin into their reserves — a scenario that more and more analysts consider inevitable by 2030.

📚 Also read

To delve deeper into these topics:

The post Crypto and Inflation: Is Bitcoin Really Digital Gold in 2026? appeared first on DailyCryptoNews.

]]>
https://dailycryptonews.co/en-crypto-inflation-bitcoin-or-numerique-2026/feed/ 0
Precarious Stability: BTC Holds at $93,666, ETH Edges Up Slightly https://dailycryptonews.co/en-stabilite-precaire-le-btc-se-maintient-a-93-666-leth-grimpe-legerement-2/ https://dailycryptonews.co/en-stabilite-precaire-le-btc-se-maintient-a-93-666-leth-grimpe-legerement-2/#respond Fri, 26 Jun 2026 17:22:26 +0000 https://dailycryptonews.co/fr/?p=4432 The crypto market is taking a pause this Wednesday, January 7. Bitcoin remains nearly stable at $93,666.86, with a negligible daily change. In contrast, Ethereum is modestly rising to $3,295.10, gaining about $67 compared to the previous day. This BTC stability follows Tuesday’s uptick, suggesting a consolidation phase. Investors seem to be awaiting clear macroeconomic...

The post Precarious Stability: BTC Holds at $93,666, ETH Edges Up Slightly appeared first on DailyCryptoNews.

]]>
The crypto market is taking a pause this Wednesday, January 7. Bitcoin remains nearly stable at $93,666.86, with a negligible daily change. In contrast, Ethereum is modestly rising to $3,295.10, gaining about $67 compared to the previous day. This BTC stability follows Tuesday’s uptick, suggesting a consolidation phase. Investors seem to be awaiting clear macroeconomic catalysts, notably the minutes from the U.S. Federal Reserve expected later this week. Technically, Bitcoin is trading within a narrow range between $93,000 and $94,000, with an RSI of 55, indicating a neutral market. Ethereum, meanwhile, shows slight outperformance, driven by increased interest in DeFi applications and NFTs, sectors that are reviving after a sluggish fourth quarter of 2025. The overall sentiment remains mixed: exchange inflows are stable, but outflows to cold storage are rising, a sign that long-term holders are accumulating. For now, the market is catching its breath, but without a clear direction. The next 48 hours will be crucial in determining whether this lull is a prelude to a new bullish surge or a pullback.

Related Articles

In-Depth Analysis

Historical Context

Similar Opportunities

The post Precarious Stability: BTC Holds at $93,666, ETH Edges Up Slightly appeared first on DailyCryptoNews.

]]>
https://dailycryptonews.co/en-stabilite-precaire-le-btc-se-maintient-a-93-666-leth-grimpe-legerement-2/feed/ 0
Sharp decline: Bitcoin drops to $91,257, Ethereum below $3,200 https://dailycryptonews.co/en-recul-brutal-le-bitcoin-chute-a-91-257-lethereum-sous-les-3-200-2/ https://dailycryptonews.co/en-recul-brutal-le-bitcoin-chute-a-91-257-lethereum-sous-les-3-200-2/#respond Fri, 26 Jun 2026 17:22:24 +0000 https://dailycryptonews.co/fr/?p=4431 The crypto market is hitting the brakes this Thursday, January 8. Bitcoin plunges -2.6% to settle at $91,257.16, while Ethereum falls to $3,164.79, losing the psychological threshold of $3,200. This correction wipes out some of the gains from earlier in the week, but on a weekly basis, BTC remains up +4.3%. The decline is attributed...

The post Sharp decline: Bitcoin drops to $91,257, Ethereum below $3,200 appeared first on DailyCryptoNews.

]]>
The crypto market is hitting the brakes this Thursday, January 8. Bitcoin plunges -2.6% to settle at $91,257.16, while Ethereum falls to $3,164.79, losing the psychological threshold of $3,200. This correction wipes out some of the gains from earlier in the week, but on a weekly basis, BTC remains up +4.3%. The decline is attributed to profit-taking after Tuesday’s rally, coupled with macroeconomic concerns: US bond yields have risen, boosting the dollar’s appeal and weighing on risk assets. Technically, Bitcoin has broken the $92,000 support level, which had served as a floor for three days. The next support zone is around $90,000, a major psychological threshold. Ethereum, more volatile, is testing $3,150, with an RSI at 45, signaling a possible continuation of the decline if BTC does not stabilize. Trading volume has surged by 20%, indicating active seller participation. Despite this pullback, the weekly trend remains positive, leaving room for a technical rebound. Investors will closely watch US inflation data scheduled for next week.

Related Articles

In-Depth Analysis

Historical Context

Similar Opportunities

The post Sharp decline: Bitcoin drops to $91,257, Ethereum below $3,200 appeared first on DailyCryptoNews.

]]>
https://dailycryptonews.co/en-recul-brutal-le-bitcoin-chute-a-91-257-lethereum-sous-les-3-200-2/feed/ 0
The market holds its breath: BTC at $90,983, ETH at $3,104 https://dailycryptonews.co/en-le-marche-retient-son-souffle-btc-a-90-983-eth-a-3-104-2/ https://dailycryptonews.co/en-le-marche-retient-son-souffle-btc-a-90-983-eth-a-3-104-2/#respond Fri, 26 Jun 2026 17:22:22 +0000 https://dailycryptonews.co/fr/?p=4430 This Friday, January 9, the crypto market appears to be catching its breath after the previous day’s correction. Bitcoin is stabilizing at $90,983.52, with a near-zero daily change, while Ethereum is slightly declining to $3,104.22. Over the week, BTC still shows a gain of +2.5%, signaling that the underlying bullish trend remains intact despite the...

The post The market holds its breath: BTC at $90,983, ETH at $3,104 appeared first on DailyCryptoNews.

]]>
This Friday, January 9, the crypto market appears to be catching its breath after the previous day’s correction. Bitcoin is stabilizing at $90,983.52, with a near-zero daily change, while Ethereum is slightly declining to $3,104.22. Over the week, BTC still shows a gain of +2.5%, signaling that the underlying bullish trend remains intact despite the fluctuations. This stability comes amid low trading volume, typical of a Friday, when traders reduce their exposure before the weekend. Technical analysis shows Bitcoin testing the support level of $90,500, a key threshold that has previously served as a bounce point. If this floor holds, a return to $92,000 is possible on Monday. Ethereum, meanwhile, is moving dangerously close to $3,100, a level that, if broken, could lead to a drop toward $3,000. Market sentiment is cautious: fear and greed indicators are neutral at 48 out of 100. Investors are awaiting macroeconomic news, particularly Fed decisions, to take positions. In the absence of catalysts, the market could remain in a narrow range until next week.

Related Articles

In-Depth Analysis

Historical Context

Similar Opportunities

The post The market holds its breath: BTC at $90,983, ETH at $3,104 appeared first on DailyCryptoNews.

]]>
https://dailycryptonews.co/en-le-marche-retient-son-souffle-btc-a-90-983-eth-a-3-104-2/feed/ 0
Week-end under tension: Bitcoin slips to $90,504, ETH to $3,083 https://dailycryptonews.co/en-week-end-sous-tension-le-bitcoin-glisse-a-90-504-leth-a-3-083-2/ https://dailycryptonews.co/en-week-end-sous-tension-le-bitcoin-glisse-a-90-504-leth-a-3-083-2/#respond Fri, 26 Jun 2026 17:22:21 +0000 https://dailycryptonews.co/fr/?p=4429 The crypto market ends the week on a slightly negative note this Saturday, January 10. Bitcoin is down -0.5% to $90,504.90, while Ethereum follows the same trend at $3,083.14. Over the entire week, BTC maintains a modest gain of +0.6%, but the bullish momentum from the start of the week has clearly faded. This decline...

The post Week-end under tension: Bitcoin slips to $90,504, ETH to $3,083 appeared first on DailyCryptoNews.

]]>
The crypto market ends the week on a slightly negative note this Saturday, January 10. Bitcoin is down -0.5% to $90,504.90, while Ethereum follows the same trend at $3,083.14. Over the entire week, BTC maintains a modest gain of +0.6%, but the bullish momentum from the start of the week has clearly faded. This decline is attributed to a lack of volume over the weekend, a period when institutional investors are less active, leaving room for retail traders. Technically, Bitcoin is dangerously approaching the $90,000 support level, a psychological threshold that, if breached, could pave the way for a deeper correction toward $88,000. Ethereum, below $3,100, shows signs of weakness, with an RSI at 42, indicating persistent selling pressure. The general sentiment is cautious: exchange flows are declining, suggesting that investors prefer to wait for clearer signals. Despite this, the week remains positive in terms of weekly performance, offering a slim hope for a rebound on Monday. The coming days will be decisive in determining whether the market can hold its gains or if it enters a longer consolidation phase.

Related Articles

In-Depth Analysis

Historical Context

Similar Opportunities

The post Week-end under tension: Bitcoin slips to $90,504, ETH to $3,083 appeared first on DailyCryptoNews.

]]>
https://dailycryptonews.co/en-week-end-sous-tension-le-bitcoin-glisse-a-90-504-leth-a-3-083-2/feed/ 0
🔴 France bans products without post-quantum encryption from 2027 https://dailycryptonews.co/en-la-france-va-cesser-de-certifier-les-produits-sans-chiffrement-post-quantique-des-2027-3/ https://dailycryptonews.co/en-la-france-va-cesser-de-certifier-les-produits-sans-chiffrement-post-quantique-des-2027-3/#respond Thu, 25 Jun 2026 08:34:32 +0000 https://dailycryptonews.co/fr/?p=4415 France is reaching a decisive milestone in the race for digital security. The National Agency for the Security of Information Systems (ANSSI) has announced that it will stop certifying security products lacking encryption resistant to quantum computers starting in 2027. A decision that is shaking the technology — and crypto — industries. ? What ANSSI...

The post 🔴 France bans products without post-quantum encryption from 2027 appeared first on DailyCryptoNews.

]]>
France is reaching a decisive milestone in the race for digital security. The National Agency for the Security of Information Systems (ANSSI) has announced that it will stop certifying security products lacking encryption resistant to quantum computers starting in 2027. A decision that is shaking the technology — and crypto — industries.

France will stop certifying products without post-quantum encryption

? What ANSSI Announced

It was at the France Quantum 2026 summit that Samih Souissi, chief of staff at ANSSI, made the news official: starting in 2027, the agency will no longer certify products that do not integrate post-quantum cryptography (PQC). By 2030, companies will have to purchase exclusively “quantum-safe” products.

This announcement is not a surprise for insiders. “ANSSI has been preparing this move for years,” commented Marin Ivezic, founder of the consulting firm Applied Quantum, on LinkedIn. “What changed yesterday is that the ANSSI chief of staff publicly stated that the date is now firm.”

ANSSI certification is an essential prerequisite for the use of security products within French government agencies and critical infrastructure operators. In short: any supplier wanting to work with the French state will have to demonstrate its ability to withstand quantum attacks.

“This is not just a technical problem,” Souissi stated. “It is a matter of governance, industrial planning, regulation, and sovereignty.”

Source: Reuters, Cointelegraph

? A Global Movement: France and the United States Hand in Hand

The French decision is not an isolated move. It aligns remarkably with the timeline of the US NSA, which requires all national security systems to use its suite of quantum algorithms (CNSA 2.0) by 2027.

According to CNSA 2.0, all new systems must support the approved algorithms by January 1, 2027. Non-compliant systems must be phased out by the end of 2030, and by 2033, all systems must be fully migrated.

“Two of the most demanding certification authorities in the world, serving two of the largest defense and technology markets, have independently converged on the same deadline: 2027,” analyzes Marin Ivezic. “This is no coincidence.”

?? Impact on Bitcoin and Cryptocurrencies

The quantum threat is being taken very seriously in the crypto industry. And the numbers are staggering.

According to analytics platform Glassnode, nearly 10% of the total Bitcoin supply — approximately 1.92 million BTC (over $120 billion at current prices) — is considered “structurally insecure” in the event of a quantum attack. This primarily involves bitcoins held in addresses using old and vulnerable signature formats (P2PK).

Last April, Coinbase warned that Proof-of-Stake (PoS) blockchains, including Ethereum and Solana, could be even more exposed to quantum risk due to the signature schemes used by validators to secure the network.

However, Coinbase also acknowledged that many blockchains have already begun preparing:

  • Algorand has a “progressive roadmap toward full quantum readiness” and is among the first networks to deploy resistant cryptography.
  • Aptos is said to be “well-positioned for the transition to secure post-quantum transactions.”
  • Solana and Ethereum have created clear roadmaps to address the threat, including upgrading signatures to quantum algorithms.

Researchers estimate that quantum computers could, in theory, become operational by 2030 — exactly the timeline set by ANSSI and the NSA.

? Conclusion: A Timely Wake-Up Call

ANSSI’s decision is a strong signal for the entire technology and financial industry. It reminds us that the quantum threat is no longer science fiction — it is a concrete risk materializing on the 2027-2030 horizon.

For the crypto ecosystem, this is both a warning and an opportunity. Projects that anticipate and integrate post-quantum cryptography now will be the big winners of the decade. Those that delay risk becoming technically obsolete — and leaving their users exposed.

ANSSI’s message is clear: prepare now, or you will be excluded from the market. A lesson the crypto industry would do well to heed.

?? Opinion and Analysis — Not Investment Advice
This article is provided for informational and analytical purposes only. It does not constitute investment advice, solicitation, or a recommendation to buy/sell digital assets. Cryptocurrencies involve high risks — only invest what you can afford to lose. Always do your own research (DYOR) before any financial decision.
This article is not sponsored.

The post 🔴 France bans products without post-quantum encryption from 2027 appeared first on DailyCryptoNews.

]]>
https://dailycryptonews.co/en-la-france-va-cesser-de-certifier-les-produits-sans-chiffrement-post-quantique-des-2027-3/feed/ 0
Crypto: The Market Holds Its Breath After a Week of Consolidation https://dailycryptonews.co/crypto-the-market-holds-its-breath-after-a-week-of-consolidation/ https://dailycryptonews.co/crypto-the-market-holds-its-breath-after-a-week-of-consolidation/#respond Mon, 04 May 2026 08:00:00 +0000 https://dailycryptonews.co/fr/crypto-the-market-holds-its-breath-after-a-week-of-consolidation/ Crypto: The Market Holds Its Breath After a Week of Consolidation The week of May 4, 2026 ends on a consolidation note for the cryptocurrency market. Bitcoin (BTC) trades at $78,563, slightly down from recent highs, while Ethereum (ETH) stagnates around $2,324. After several weeks of volatility, investors seem to be taking a pause, digesting...

The post Crypto: The Market Holds Its Breath After a Week of Consolidation appeared first on DailyCryptoNews.

]]>
Crypto: The Market Holds Its Breath After a Week of Consolidation

The week of May 4, 2026 ends on a consolidation note for the cryptocurrency market. Bitcoin (BTC) trades at $78,563, slightly down from recent highs, while Ethereum (ETH) stagnates around $2,324. After several weeks of volatility, investors seem to be taking a pause, digesting previous movements in moderate trading volume.

Analysis: Macroeconomic Factors in the Background

Several elements explain this relative calm. First, traditional markets remain under tension: fears of a US recession persist, with mixed economic indicators published this week. The Federal Reserve hasn’t changed its stance, maintaining high rates, which dampens appetite for risk assets like crypto.

Second, Bitcoin seems to be testing a new resistance level around $79,000. The current $78,563 level represents an important psychological support. A break below could trigger a correction toward $75,000, while a bounce above $80,000 would reignite optimism.

On the Ethereum side, stagnation at $2,324 reflects a lack of clear catalysts. Developments around the network (upgrades, DeFi adoption) haven’t been enough to create bullish momentum. The ETH/BTC ratio remains low, signaling investor preference for the market leader.

Outlook: What Direction for the Week Ahead?

In the short term, the market could remain in a tight range. The coming days will be determined by upcoming macroeconomic data (particularly US inflation) and the evolution of institutional flows. Spot Bitcoin ETFs continue to attract moderate inflows, but without the enthusiasm of previous months.

For beginners, this is an observation period: avoid impulsive decisions and monitor volumes. For insiders, it’s time for risk management. A clear breakout above $80,000 for BTC or a drop below $76,000 would provide a directional signal.

In summary, the crypto market holds its breath. Next week could either confirm a recovery or open the door to a deeper correction. Stay cautious, stay informed, and never risk more than you can afford to lose.

The post Crypto: The Market Holds Its Breath After a Week of Consolidation appeared first on DailyCryptoNews.

]]>
https://dailycryptonews.co/crypto-the-market-holds-its-breath-after-a-week-of-consolidation/feed/ 0
Friday the 13th: A Lucky Day for Crypto? https://dailycryptonews.co/friday-the-13th-a-lucky-day-for-crypto/ https://dailycryptonews.co/friday-the-13th-a-lucky-day-for-crypto/#respond Fri, 13 Mar 2026 08:00:00 +0000 https://dailycryptonews.co/fr/friday-the-13th-a-lucky-day-for-crypto/ Despite the superstition surrounding Friday the 13th, the crypto market shows a timid smile this March 13, 2026. Bitcoin rises to $70,544, up 0.5% on the day. Ethereum follows suit at $2,077, also gaining 0.5%. On the week, the trend improves significantly: BTC limits its loss to -0.5%, compared to -3.4% the day before. A...

The post Friday the 13th: A Lucky Day for Crypto? appeared first on DailyCryptoNews.

]]>
Despite the superstition surrounding Friday the 13th, the crypto market shows a timid smile this March 13, 2026. Bitcoin rises to $70,544, up 0.5% on the day. Ethereum follows suit at $2,077, also gaining 0.5%. On the week, the trend improves significantly: BTC limits its loss to -0.5%, compared to -3.4% the day before. A sign that selling pressure is easing.

This Friday marks a turning point for the week. After several days of decline, buyers are tentatively regaining control. Bitcoin came dangerously close to $70,000 earlier in the week, but this gradual rebound reassures some investors. Ethereum, for its part, is trying to break through $2,100, a level that has eluded it for several sessions. The macro context remains uncertain, but the absence of bad news allows the market to catch its breath.

For observers, today confirms that the $70,000 floor is holding for Bitcoin. If the trend holds, the week could end on a positive note, erasing some of the accumulated losses. Trading volumes remain modest, suggesting this rebound is driven more by a lack of sellers than a massive influx of buyers. But in such a nervous market, every day of stability is a victory. The weekend ahead will be crucial to see if this momentum continues.

The post Friday the 13th: A Lucky Day for Crypto? appeared first on DailyCryptoNews.

]]>
https://dailycryptonews.co/friday-the-13th-a-lucky-day-for-crypto/feed/ 0
Crypto: Winter Consolidation Continues, But Hope Returns https://dailycryptonews.co/crypto-winter-consolidation-continues-but-hope-returns/ https://dailycryptonews.co/crypto-winter-consolidation-continues-but-hope-returns/#respond Mon, 23 Feb 2026 08:00:00 +0000 https://dailycryptonews.co/fr/crypto-winter-consolidation-continues-but-hope-returns/ Crypto: Winter Consolidation Continues, But Hope Returns Week of February 23, 2026 — Bitcoin (BTC) traded at $67,585, down slightly 1.2% over seven days. Ethereum (ETH) followed the same trend at $1,954, down 0.8%. Trading volumes remain low, a sign of widespread caution among investors. Altcoins, with the exception of a few niche DeFi projects,...

The post Crypto: Winter Consolidation Continues, But Hope Returns appeared first on DailyCryptoNews.

]]>
Crypto: Winter Consolidation Continues, But Hope Returns

Week of February 23, 2026 — Bitcoin (BTC) traded at $67,585, down slightly 1.2% over seven days. Ethereum (ETH) followed the same trend at $1,954, down 0.8%. Trading volumes remain low, a sign of widespread caution among investors.

Altcoins, with the exception of a few niche DeFi projects, also stagnated. The general sentiment is one of “winter consolidation”: the market is digesting late 2025 gains without a major catalyst to move higher.

Analysis: Macroeconomic Factors in the Background

Several factors explain this sluggishness:

The Fed remains cautious: The minutes from the Federal Reserve’s February meeting, released Wednesday, confirmed that interest rates will remain higher for longer than expected. The market now anticipates the first rate cut only in May 2026. This outlook weighs on risk assets, including crypto.

Regulatory uncertainty: In the United States, the debate over classifying Bitcoin as a “commodity” or “security” has intensified. The SEC postponed its decision on several spot Ethereum ETFs, fueling doubts.

Capital flows: Net inflows into crypto investment products (index funds, ETFs) dropped 40% this week, according to CoinShares. Institutional investors appear to be waiting for clearer signals.

Outlook: What to Watch Next Week?

Despite this lull, several positive signals are emerging:

Bitcoin halving (expected April 2026) is starting to be priced in. Historically, the market enters a pre-halving phase 6 to 8 weeks before the event. Some analysts see the current consolidation as quiet accumulation.

Institutional adoption: MicroStrategy announced the purchase of an additional 2,500 BTC this week, bringing its total to 250,000 BTC. This vote of confidence reassures long-term investors.

Technical outlook: Bitcoin is currently testing the $66,000 support level. Holding this level could pave the way for a rebound toward $72,000 within 2-3 weeks. For Ethereum, the psychological $2,000 threshold remains key.

Our advice: Patience remains key. Beginner investors should avoid trading on weak signals. For seasoned investors, this may be the time to strengthen positions on solid projects, in view of the next bullish cycle expected after the halving.

Reminder: Cryptocurrencies are volatile assets. This article does not constitute investment advice.

The post Crypto: Winter Consolidation Continues, But Hope Returns appeared first on DailyCryptoNews.

]]>
https://dailycryptonews.co/crypto-winter-consolidation-continues-but-hope-returns/feed/ 0
Crypto: February’s Slide — BTC Below $77,000, ETH in Critical Territory https://dailycryptonews.co/crypto-februarys-slide-btc-below-77000-eth-in-critical-territory/ https://dailycryptonews.co/crypto-februarys-slide-btc-below-77000-eth-in-critical-territory/#respond Mon, 02 Feb 2026 08:00:00 +0000 https://dailycryptonews.co/fr/crypto-februarys-slide-btc-below-77000-eth-in-critical-territory/ # Crypto: February’s Slide — BTC Below $77,000, ETH in Critical Territory The week of February 2, 2026, ends on a bearish note for the cryptocurrency market. Bitcoin (BTC) is trading at $76,937, down nearly 4% over seven days. Ethereum (ETH) is under even greater pressure at $2,269, down more than 6% over the same...

The post Crypto: February’s Slide — BTC Below $77,000, ETH in Critical Territory appeared first on DailyCryptoNews.

]]>
# Crypto: February’s Slide — BTC Below $77,000, ETH in Critical Territory

The week of February 2, 2026, ends on a bearish note for the cryptocurrency market. Bitcoin (BTC) is trading at $76,937, down nearly 4% over seven days. Ethereum (ETH) is under even greater pressure at $2,269, down more than 6% over the same period. This decline unfolds in a tense macroeconomic environment marked by persistent concerns over inflation and interest rates.

Analysis: The Factors Behind the Drop

Several factors explain this correction. First, US economic data released this week revived concerns: the January Consumer Price Index (CPI) came in slightly above expectations at 3.2% year-over-year. This reinforced the scenario of a Fed keeping rates higher for longer, weighing on risk assets like cryptocurrencies.

Second, the market digested significant sell-side flows on exchanges. According to on-chain data, addresses linked to miners transferred substantial BTC volumes to trading platforms, signaling profit-taking after January’s rally. On the Ethereum side, the relative weakness is also explained by less pronounced institutional interest compared to Bitcoin, and persistent regulatory uncertainties in Europe regarding the status of smart contracts.

Finally, the overall sentiment remains cautious. The Fear & Greed Index has fallen to 42, in “fear” territory, down from 55 the previous week. Trading volumes are down 12% on major platforms, a sign of cautious waiting.

Outlook: What to Watch Going Forward

In the short term, Bitcoin is testing a key support level around $76,000. A break below this level could open the path toward $72,000, while a rebound above $80,000 would reignite the bullish momentum. For Ethereum, the $2,200 zone is crucial: losing this threshold would expose the asset to a return toward $2,000.

The coming week will be marked by the release of the Fed meeting minutes (Wednesday) and US employment figures (Friday). These events could either ease inflation fears or reinforce them. In the meantime, caution remains warranted. For beginner investors, this is a time for patience and risk management, without panicking over movements that remain within the norm of crypto cycles.

Disclaimer: This article does not constitute investment advice.

The post Crypto: February’s Slide — BTC Below $77,000, ETH in Critical Territory appeared first on DailyCryptoNews.

]]>
https://dailycryptonews.co/crypto-februarys-slide-btc-below-77000-eth-in-critical-territory/feed/ 0

📬 Suivez cette catégorie

Soyez notifié quand nous publions de nouveaux articles.