Problematika indexování velkého e-shopu
Na e-shopu s cca 8000 produkty (variace, několik vlastních taxonomií pro atributy) se mi po každém přegenerování indexu Bricks Query Filters joby vždycky zasekly na stejném místě. Cron nepomohl, ruční “pokračovat v indexování” taky ne.
Nejdřív jsem podezírala firewall – background indexace v Bricks jede přes request, který si web posílá sám sobě, a bezpečnostní pluginy (6G/7G firewall) tenhle typ requestu rády blokují jako false positive. Vypnutí pomohlo částečně, ale zaseklo se to znovu. Když jsem indexaci spustila přímo přes PHP (bez HTTP), padalo to na stejném místě dál – problém teda nebyl v přenosu, ale v samotném dotazu.
Skutečná příčina: Bricks u filtrů typu taxonomy (běžné filtrování podle vlastní taxonomie, třeba barvy) staví indexační dotaz přes všechny post types v databázi – nejen produkty, ale i varianty, přílohy, objednávky, stránky. Na katalogu s tisíci variant to znamená zbytečně obří dotaz, který na běžném hostingu spadne na limit paměti nebo času. Zajímavé je, že vestavěné WooCommerce filtry (cena, sklad) tenhle problém nemají – ty si dotaz omezují jen na produkty. U obecných taxonomy filtrů to Bricks prostě chybí.
Řešení
Řešení je mu-plugin, který přes filter hook bricks/query_filters/index_args omezí dotaz jen na product a product_variation pro konkrétní taxonomie. Stačí nahrát do wp-content/mu-plugins/ – nic se neaktivuje, načte se automaticky. Po nasazení a smazání zaseknutých jobů reindex doběhl v pořádku.
Vytvořte mu-plugin
(pokud složka mu-plugins neexistuje, vytvořte ji)
wp-content/mu-plugins/bricks-fix-taxonomy-index.php
Kód pro mu-plugin
Upravte si seznam taxonomií, které používáte pro produkty a varianty.
<?php
/**
* Zúží indexační dotaz pro vybrané "taxonomy" filtry jen na produkty a varianty,
* místo výchozích VŠECH post types (stránky, přílohy, objednávky...).
*/
add_filter( 'bricks/query_filters/index_args', function( $args, $filter_source, $filter_settings, $query_type ) {
if ( $filter_source === 'taxonomy' && $query_type === 'wp_query' ) {
$taxonomy = $filter_settings['filterTaxonomy'] ?? '';
// Doplňte sem slugy všech vašich produktových/atributových taxonomií
$product_taxonomies = [
'product-brand',
'product-colour',
'product-usage',
'product-technical-info',
'product_brand',
'product_cat',
'product_tag',
];
if ( in_array( $taxonomy, $product_taxonomies, true ) ) {
$args['post_type'] = [ 'product', 'product_variation' ];
}
}
return $args;
}, 10, 4 );
A to je vše :-)

