' . esc_html__('Accomplice Query Loop Filters requires WordPress 6.8 and PHP 8.2 or later.', 'accomplice-query-loop-filters') . '

'; }); return; } // Keep WordPress.org language packs and bundled/custom translations available. add_action('init', __NAMESPACE__ . '\\register_translation_path', 0); Compatibility\Languages\init(); BlockCategories\init(); BlockHooksAssets\init(); BlocksAssets\init(); Query\Integration\init(); add_filter('register_block_type_args', __NAMESPACE__ . '\\restrict_control_insertion', 20, 2); add_filter('pre_render_block', __NAMESPACE__ . '\\render_saved_pagination', 20, 3); add_filter('pre_render_block', __NAMESPACE__ . '\\guard_unavailable_wrapper', 5, 2); API\Catalog\init(); add_action('init', __NAMESPACE__ . '\\register_editor_constraint_guard', 100); Admin\Instances\init(); Admin\Free\init(); Admin\ExclusionsPanel\init(); } function register_translation_path() { global $wp_textdomain_registry; $wp_textdomain_registry->set_custom_path(FQBPRO_TEXT_DOMAIN, FQBPRO_PLUGIN_DIR . 'languages'); } /** Core editor previews must not drop an unavailable saved Pro query envelope. */ function register_editor_constraint_guard() { foreach (get_post_types(['public' => true, 'show_in_rest' => true], 'objects') as $type) { add_filter('rest_' . $type->name . '_query', static function ($args, $request) { if ($request instanceof \WP_REST_Request && $request->get_param('fqbp')) $args['post__in'] = [0]; return $args; }, 10, 2); } } /** An unregistered legacy wrapper must not render its unrestricted inner Query. */ function guard_unavailable_wrapper($pre_render, $parsed_block) { if (($parsed_block['blockName'] ?? '') !== 'filter-query-block-pro/filter-query-block') return $pre_render; return '

' . esc_html__('This saved legacy filter requires Filter Query Block Pro. Activate Pro to display its results.', 'accomplice-query-loop-filters') . '

'; } function restrict_control_insertion($args, $name) { if (in_array($name, ['filter-query-block-pro/filter-search', 'filter-query-block-pro/filter-date', 'filter-query-block-pro/filter-sort'], true)) $args['supports']['inserter'] = false; return $args; } /** Saved paid navigation falls back to ordinary links without rewriting content. */ function render_saved_pagination($pre_render, $parsed, $parent) { if (($parsed['blockName'] ?? '') !== 'filter-query-block-pro/load-more') return $pre_render; $children = parse_blocks($parsed['attrs']['paginationContent'] ?? ''); $children = array_values(array_filter($children, static function ($child) { return in_array($child['blockName'] ?? '', ['core/query-pagination-previous', 'core/query-pagination-numbers', 'core/query-pagination-next'], true); })); if (!$children) foreach (['previous', 'numbers', 'next'] as $kind) $children[] = ['blockName' => 'core/query-pagination-' . $kind, 'attrs' => [], 'innerBlocks' => [], 'innerContent' => []]; $attributes = $parsed['attrs'] ?? []; unset($attributes['label'], $attributes['paginationContent']); $attributes['layout'] = $attributes['layout'] ?? ['type' => 'flex', 'justifyContent' => 'space-between']; $pagination = ['blockName' => 'core/query-pagination', 'attrs' => $attributes, 'innerBlocks' => $children, 'innerContent' => array_fill(0, count($children), null)]; $context = $parent instanceof \WP_Block ? $parent->context : []; if ($parent instanceof \WP_Block && $parent->name === 'core/query') { $context['queryId'] = $parent->attributes['queryId'] ?? 0; $context['query'] = $parent->attributes['query'] ?? []; } return (new \WP_Block($pagination, $context))->render(); }