'PURGE' ) ); // } ); self::notify_purge( $permalink ); // Statische voorpagina? Dan óók de home-URL purgen — sommige caches bewaren die // los van de pagina-URL. if ( (int) get_option( 'page_on_front' ) === $post_id ) { self::purge_home(); } // Een blogbericht staat óók op de pagina's die hem opsommen. Zonder deze // regel bleef finivlam.nl/tips-en-advies/ (page_for_posts) na een publicatie // de FlyingPress-kopie van 12 dagen eerder serveren: oude berichten die // 404 gaven, de nieuwe ontbrak (21-09-2026). Recursie kan niet: het // blogoverzicht is een 'page'. if ( 'post' === get_post_type( $post_id ) ) { $blog = (int) get_option( 'page_for_posts' ); if ( $blog > 0 && $blog !== $post_id ) { self::purge_post( $blog ); } if ( 'posts' === get_option( 'show_on_front' ) ) { self::purge_home(); } // ponytail: alleen categorie-archieven; tags/auteur/datum-archieven erbij als een klant ze toont. foreach ( (array) wp_get_post_categories( $post_id ) as $cat ) { self::purge_url( get_category_link( (int) $cat ) ); } } } /** * FlyingPress purgen (no-op als de plugin er niet is). * * FlyingPress haakt niet op `clean_post_cache` en heeft een eigen API * (non-blocking, dus veilig binnen een REST-handler). Die verwacht de URL * zoals de site 'm zelf serveert — en permalinks komen hier al canoniek * binnen. Alleen een extensieloos pad normaliseren we daarom via * user_trailingslashit(), dat de permalink-instelling van de site volgt. * Een vaste trailingslashit() zou op sites zónder slash-permalinks de * verkeerde cache-sleutel purgen, en van /llms.txt "/llms.txt/" maken. * * @param string $url Volledige URL. */ private static function purge_flying_press( $url ) { if ( ! is_string( $url ) || '' === $url || ! class_exists( '\FlyingPress\Purge' ) ) { return; } $path = (string) wp_parse_url( $url, PHP_URL_PATH ); if ( '' === (string) pathinfo( $path, PATHINFO_EXTENSION ) && function_exists( 'user_trailingslashit' ) ) { $url = user_trailingslashit( $url ); } \FlyingPress\Purge::purge_urls( array( $url ) ); } /** * Seraphinite Accelerator purgen (no-op als de plugin er niet is). * * Seraphinite purgt zelf alleen op `post_updated`. Wat wij schrijven (post-meta, * opties) ziet hij nooit, en dan krijgt de bezoeker de oude kopie tot die verloopt: * gemeten op websyte.nl (12-10-2026) na de schema-aanvulling van 1.0.0, op / en * /contact/. `OperateCache` zet een taak in zijn wachtrij en blokkeert niet. * * @param string|null $url Volledige URL; null = de hele cache. */ private static function purge_seraphinite( $url = null ) { if ( ! class_exists( '\seraph_accel\API' ) || ( null !== $url && ( ! is_string( $url ) || '' === $url ) ) ) { return; } try { \seraph_accel\API::OperateCache( \seraph_accel\API::CACHE_OP_DEL, $url ); } catch ( \Throwable $e ) { return; // een andere Seraphinite-versie: nooit een pagina kosten. } } /** * Meld aan de site zelf dat deze URL geïnvalideerd moet worden. * * Bestaat voor beheerders die hun eigen full-page-cache draaien en dus niet * op een cache-plugin-hook zitten. Wij weten niet hoe hun cache werkt; zij * wel. Deze action geeft ze het haakje zonder dat wij iets aannemen. * * @param string $url Volledige URL die vervallen is. */ public static function notify_purge( $url ) { if ( is_string( $url ) && '' !== $url ) { do_action( 'aigeschikt_purged_url', $url ); } } /** * Purge de cache voor een URL of pad (voor de url-edits die niet post-gebonden zijn). * * @param string $url_or_path Volledige URL of pad ("/diensten"). */ public static function purge_url( $url_or_path ) { $url = is_string( $url_or_path ) ? trim( $url_or_path ) : ''; if ( '' === $url ) { return; } if ( '/' === $url[0] ) { $url = home_url( $url ); } // Laat zich dit pad naar een post herleiden? Dan is de post-purge het meest gedekt. $pid = url_to_postid( $url ); if ( $pid ) { self::purge_post( $pid ); return; } do_action( 'litespeed_purge_url', $url ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- LiteSpeed Cache hook, not ours. self::purge_flying_press( $url ); self::purge_seraphinite( $url ); self::notify_purge( $url ); if ( trailingslashit( $url ) === trailingslashit( home_url( '/' ) ) ) { self::purge_home(); } } /** * Purge de HELE full-page-cache. Voor bulk-acties (reset) die veel pagina's raken. */ public static function purge_all() { do_action( 'litespeed_purge_all' ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- LiteSpeed Cache hook, not ours. if ( function_exists( 'rocket_clean_domain' ) ) { rocket_clean_domain(); // WP Rocket. } if ( function_exists( 'w3tc_flush_all' ) ) { w3tc_flush_all(); // W3 Total Cache. } if ( class_exists( '\FlyingPress\Purge' ) ) { \FlyingPress\Purge::purge_everything(); // FlyingPress. } self::purge_seraphinite(); // Seraphinite Accelerator: alles. /** * Een bulk-purge kent geen URL-lijst, dus `aigeschikt_purged_url` kan * hier niet per pagina vuren. Beheerders met een eigen server-cache * hangen hier een "leeg alles"-regel aan. */ do_action( 'aigeschikt_purged_all' ); self::purge_home(); } /** * Purge de homepage/voorpagina. */ public static function purge_home() { do_action( 'litespeed_purge_url', home_url( '/' ) ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound -- LiteSpeed Cache hook, not ours. if ( function_exists( 'rocket_clean_home' ) ) { rocket_clean_home(); } self::purge_flying_press( home_url( '/' ) ); self::purge_seraphinite( home_url( '/' ) ); $front = (int) get_option( 'page_on_front' ); if ( $front > 0 && function_exists( 'clean_post_cache' ) ) { clean_post_cache( $front ); } // De homepage is óók een URL: zonder deze regel vuurde het seintje voor // juist de meest gecachete pagina van de site nooit. self::notify_purge( home_url( '/' ) ); } }