/** * Funbox Skate Shop — svuota la cache di WP Rocket quando cambia una giacenza. * * DUE PEZZI: * * 1) Ascolta i cambi di giacenza fatti DENTRO WordPress (pannello, WooCommerce) * e butta dalla cache solo le schede toccate. Questo pezzo funziona: e' stato * provato il 28/07 modificando una taglia a mano dal pannello. * * 2) Un indirizzo riservato, protetto da parola d'ordine, che serve a svuotare * dall'esterno. Serve perche' la sincro col gestionale (syncrocommerce) * scrive dritto nel database senza far girare WordPress: nessun codice messo * qui dentro potra' mai accorgersene. Il guardiano esterno confronta le * giacenze via API e, quando qualcosa cambia, chiama questo indirizzo. * * PRIMA DI INCOLLARE: sostituisci la parola d'ordine qui sotto con quella che * ti ho mandato in privato. E' l'unica riga da toccare. * * Come si installa: plugin "Code Snippets" -> Aggiungi nuovo -> incolla QUESTO * testo (senza il tag get_id() : (int) $product; if ( ! $product_id ) { return; } $parent_id = wp_get_post_parent_id( $product_id ); funbox_stock_purge_queue( $parent_id ? $parent_id : $product_id ); } /** * Svuota davvero le pagine in coda. Restituisce quante ne ha buttate; * -1 vuol dire "svuotata tutta la cache in un colpo solo". */ function funbox_flush_stock_purges() { $queue = funbox_stock_purge_queue(); if ( empty( $queue ) ) { return 0; } if ( count( $queue ) >= FUNBOX_PURGE_FULL_THRESHOLD ) { if ( function_exists( 'rocket_clean_domain' ) ) { rocket_clean_domain(); return -1; } return 0; } if ( ! function_exists( 'rocket_clean_post' ) ) { return 0; } $done = 0; foreach ( array_keys( $queue ) as $post_id ) { rocket_clean_post( $post_id ); $done++; } return $done; } add_action( 'woocommerce_updated_product_stock', 'funbox_queue_stock_purge' ); add_action( 'woocommerce_product_set_stock', 'funbox_queue_stock_purge' ); add_action( 'woocommerce_variation_set_stock', 'funbox_queue_stock_purge' ); add_action( 'shutdown', 'funbox_flush_stock_purges', 5 ); /* ------------------------------------------------------------------ * * Pezzo 2 — indirizzo riservato per svuotare dall'esterno * * Indirizzo: POST /wp-json/funbox/v1/purge * Parola d'ordine: nell'intestazione X-Funbox-Token: * Cosa gli si manda: * {"ids": [138915, 139553]} -> butta solo quelle schede * {"all": true} -> svuota tutta la cache * Risposta: {"purged": , "full": true|false} * ------------------------------------------------------------------ */ /** * Controlla la parola d'ordine. Confronto a tempo costante, cosi' non si puo' * indovinare un carattere alla volta. */ function funbox_purge_authorized( $request ) { $given = $request->get_header( 'x-funbox-token' ); if ( ! $given ) { $given = $request->get_param( 'token' ); } if ( ! is_string( $given ) || '' === $given ) { return new WP_Error( 'funbox_no_token', 'Parola d\'ordine mancante.', array( 'status' => 401 ) ); } if ( ! hash_equals( FUNBOX_PURGE_TOKEN, $given ) ) { return new WP_Error( 'funbox_bad_token', 'Parola d\'ordine sbagliata.', array( 'status' => 403 ) ); } return true; } /** * Svuota. Non tocca nient'altro: non scrive prodotti, non cambia impostazioni. */ function funbox_purge_endpoint( $request ) { $body = $request->get_json_params(); if ( ! is_array( $body ) ) { $body = array(); } $full = ! empty( $body['all'] ) || $request->get_param( 'all' ); if ( $full ) { if ( ! function_exists( 'rocket_clean_domain' ) ) { return new WP_Error( 'funbox_no_rocket', 'WP Rocket non e\' attivo.', array( 'status' => 503 ) ); } rocket_clean_domain(); return array( 'purged' => -1, 'full' => true, ); } $ids = isset( $body['ids'] ) ? (array) $body['ids'] : array(); if ( empty( $ids ) ) { $raw = $request->get_param( 'ids' ); if ( is_string( $raw ) && '' !== $raw ) { $ids = explode( ',', $raw ); } } $ids = array_filter( array_map( 'absint', $ids ) ); if ( empty( $ids ) ) { return new WP_Error( 'funbox_no_ids', 'Nessun prodotto indicato.', array( 'status' => 400 ) ); } // Riusa la stessa coda del pezzo 1: stessa logica, stessa soglia. foreach ( $ids as $id ) { $parent_id = wp_get_post_parent_id( $id ); funbox_stock_purge_queue( $parent_id ? $parent_id : $id ); } $done = funbox_flush_stock_purges(); return array( 'purged' => $done, 'full' => ( -1 === $done ), ); } add_action( 'rest_api_init', function () { register_rest_route( 'funbox/v1', '/purge', array( 'methods' => 'POST', 'callback' => 'funbox_purge_endpoint', 'permission_callback' => 'funbox_purge_authorized', ) ); } );