WooCommerce Block-Vorlagen entfernen
Veröffentlicht: – 1 Kommentar
Wenn es um Performance-Verbesserungen geht, wird vermutlich eines der letzten Dinge sein, Block-Vorlagen zu beachten. Aber hier sind wir nun. Und als ich entdeckte, dass ich mehrere doppelte SQL-Abfragen wegen Block-Vorlagen von WooCommerce hatte, habe ich geschaut, wie ich sie deaktivieren kann.
Tatsächlich habe ich meine lokale Umgebung via Query Monitor überwacht und 14 doppelte SQL-Abfragen bemerkt, die alle durch das Registrieren verschiedener Block-Vorlagen innerhalb von WooCommerce kamen. Daher wollte ich sie deaktivieren.
Ja, man kann Block-Vorlagen einfach deaktivieren, indem man sie nach ihrer Registrierung wieder de-registriert. Allerdings hilft das in dem Fall nicht, die doppelten SQL-Abfragen von ihrer Registrierung zu entfernen. Deshalb habe ich nach einem Weg gesucht, sie komplett zu deaktivieren, sodass gar keine entsprechenden SQL-Abfragen mehr ausgeführt werden.
Leider gibt es dafür (noch) keine Einstellung. Ich habe einen offenen Issue über das Deaktivieren von Block-Vorlagen von WooCommerce gefunden, aber er ist nach wie vor offen und bisher nicht implementiert. Dann fand ich einen Artikel von OnPoint Plugins über das Deaktivieren von WooCommerce-Blöcken, in dem ich den ersten Teil meiner Lösung fand, um Actions zu entfernen, die WooCommerce hinzufügt. Doch da dieser Beitrag die WooCommerce-Blöcke selbst entfernt, bleiben die Block-Vorlagen unangetastet. Also habe ich den Quellcode selbst durchstöbert, um zu sehen, welches WooCommerce-Paket die Vorlagen registriert.
Dabei gibt es mehrere Bereiche, in denen Block-Vorlagen registriert werden. Zwei davon können über den oben gezeichneten Weg entfernt werden (siehe die Zeilen 10 – 13), während andere durch das Entfernen direkt am wp_loaded-Hook deaktiviert werden können (Zeilen 18 – 37).
Der vollständige Code sieht so aus und kann als MU-Plugin unter /wp-content/mu-plugins/ verwendet werden.
<?php
use Automattic\WooCommerce\Blocks\BlockPatterns;
use Automattic\WooCommerce\Blocks\BlockTypesController;
use Automattic\WooCommerce\Blocks\BlockTypes\Cart;
use Automattic\WooCommerce\Blocks\Package;
/**
* Remove default block patterns.
*/
\add_action( 'woocommerce_blocks_loaded', static function() {
\remove_action( 'init', [ Package::container()->get( BlockPatterns::class ), 'register_block_patterns' ] );
\remove_action( 'init', [ Package::container()->get( BlockPatterns::class ), 'register_ptk_patterns' ] );
} );
/**
* Remove additional block patterns.
*/
\add_action( 'wp_loaded', static function() {
global $wp_filter;
foreach ( $wp_filter['wp_loaded']->callbacks[10] as $filter ) {
if ( ! is_callable( $filter['function'] ) ) {
continue;
}
if ( ! is_array( $filter['function'] ) ) {
continue;
}
if (
( $filter['function'][0] instanceof Cart && $filter['function'][1] === 'register_patterns' )
|| ( $filter['function'][0] instanceof BlockTypesController && $filter['function'][1] === 'register_block_patterns' )
) {
\remove_action( 'wp_loaded', $filter['function'] );
}
}
}, \PHP_INT_MIN );
Code-Sprache: PHP (php)
Füg doch mal in dem Issue hinzu das es ein Performance-Problem ist und doppelte SQL-Queries auslöst. Das bringt vllt Schung in das Ticket