PluginProbe
BlockSpare – Gutenberg Blocks, AI Content Generator & Site Builder for News, Magazine & Blogs / 5.0.1
BlockSpare – Gutenberg Blocks, AI Content Generator & Site Builder for News, Magazine & Blogs v5.0.1
5.0.1 4.1.0 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.1.0 1.1.1 1.1.2 1.2.0 1.2.1 1.2.2 1.2.3 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 2.1.2 2.5.0 2.5.3 All 39 releases
← All changes | inc/init.php +522 -208 2.1.2 → 5.0.1 View file →
@@ -1,230 +1,544 @@
1 1 <?php
2 -
3 - //Exit if directly acess
4 - defined('ABSPATH') or die('No script kiddies please!');
5 2
6 - if(!class_exists('BlockspareInit')){
7 - class BlockspareInit{
8 - /**
9 - * Member Variable
10 - *
11 - * @var instance
12 - */
13 - private static $instance;
3 +/**
4 + * inc/init.php
5 + * @package Blockspare
6 + */
14 7
15 - /**
16 - * Initiator
17 - */
18 - public static function get_instance()
19 - {
20 - if (!isset(self::$instance))
21 - {
22 - self::$instance = new self();
23 - }
24 - return self::$instance;
8 +defined('ABSPATH') or die('No script kiddies please!');
9 +
10 +class Blockspare_Init
11 +{
12 + public function __construct()
13 + {
14 +
15 + // 1. Hooks
16 + add_action('init', [$this, 'blockspare_plugin_init']);
17 + add_action('admin_enqueue_scripts', [$this, 'blockspare_enqueue_editor_assets']);
18 + add_action('customize_controls_enqueue_scripts', [$this, 'blockspare_enqueue_customizer_assets']);
19 + add_action('enqueue_block_assets', [$this, 'blockspare_fb_enqueue_frontend_assets']);
20 +
21 + add_action('wp_enqueue_scripts', [$this, 'blockspare_enqueue_frontend_script']);
22 + add_filter('block_categories_all', [$this, 'blockspare_register_custom_categories'], 10, 2);
23 + add_action('plugins_loaded', [$this, 'blockspare_load_dynamic_blocks']);
24 + add_action('rest_api_init', array($this, 'blockspare_blocks_register_api_endpoints'));
25 + }
26 +
27 + public function blockspare_plugin_init()
28 + {
29 + $this->blockspare_blocks_register_blocks();
30 + //$this->blockspare_fb_enqueue_frontend_assets();
31 + $this->blockspare_load_load_text_domain();
32 + }
33 + // ══════════════════════════════════════════════════════════════════════════
34 + // Helper Functions
35 + // ══════════════════════════════════════════════════════════════════════════
36 + public static function get_post_types()
37 + {
38 + static $cache = null;
39 + if ($cache !== null) return $cache;
40 +
41 + $transient = get_transient('blockspare_post_types');
42 + if ($transient !== false) {
43 + $cache = $transient;
44 + return $cache;
45 + }
46 +
47 +
48 + $args = ['public' => true, 'show_in_rest' => true];
49 + $post_types = get_post_types($args, 'objects');
50 + $excluded_post_types = [
51 + 'attachment',
52 + 'bs_templates',
53 + ];
54 + $output = [];
55 +
56 +
57 + foreach ($post_types as $post_type) {
58 +
59 + if (in_array($post_type->name, $excluded_post_types, true)) {
60 + continue;
61 + }
62 +
63 + $output[] = [
64 + 'value' => $post_type->name,
65 + 'label' => $post_type->label,
66 + ];
67 + }
68 +
69 + set_transient('blockspare_post_types', $output, HOUR_IN_SECONDS);
70 + $cache = apply_filters('aft_blocks_post_types', $output);
71 +
72 + return $cache;
73 + }
74 +
75 + public static function get_taxonomies()
76 + {
77 + static $cache = null;
78 + if ($cache !== null) return $cache;
79 +
80 + $transient = get_transient('blockspare_taxonomies');
81 + if ($transient !== false) {
82 + $cache = $transient;
83 + return $cache;
84 + }
85 +
86 + $post_types = self::get_post_types();
87 + $output = [];
88 +
89 + foreach ($post_types as $post_type) {
90 + $pt = $post_type['value'];
91 + $taxonomies = get_object_taxonomies($pt, 'objects');
92 +
93 + foreach ($taxonomies as $term_slug => $term) {
94 + if (!$term->public || !$term->show_ui) continue;
95 +
96 + $terms = get_terms([
97 + 'taxonomy' => $term_slug,
98 + 'hide_empty' => false,
99 + ]);
100 +
101 + if (!empty($terms) && !is_wp_error($terms)) {
102 + foreach ($terms as $term_item) {
103 + $output[$pt]['terms'][$term_slug][] = [
104 + 'value' => $term_item->term_id,
105 + 'label' => $term_item->name,
106 + ];
107 + }
25 108 }
26 - public function __construct()
27 - {
28 - add_action('init', array($this, 'blockspare_blocks_block_assets' ));
29 - add_action('enqueue_block_editor_assets', array($this,'blockspare_create_block'));
30 - add_action('wp_enqueue_scripts', array($this,'blockspare_load_scripts'));
31 - add_action('plugins_loaded', array($this,'blockspare_blocks_loader'));
32 - add_action( 'rest_api_init', array($this,'blockspare_blocks_register_api_endpoints' ));
109 + }
110 +
111 + $output[$pt]['taxonomy'] = $taxonomies;
112 + }
113 +
114 + set_transient('blockspare_taxonomies', $output, HOUR_IN_SECONDS);
115 + $cache = apply_filters('aft_blocks_taxonomies', $output);
116 +
117 + return $cache;
118 + }
119 +
120 + // ══════════════════════════════════════════════════════════════════════════
121 + // 1. Register blocks
122 + // ══════════════════════════════════════════════════════════════════════════
123 + public function blockspare_blocks_register_blocks()
124 + {
125 + $blocks = glob(BLOCKSPARE_PLUGIN_DIR . 'build/block/*/block.json');
126 +
127 + if ($blocks) {
128 + foreach ($blocks as $block) {
129 + register_block_type(dirname($block));
130 + }
131 + }
132 +
133 + wp_enqueue_style(
134 + 'blockspare-fontawesome',
135 + BLOCKSPARE_PLUGIN_URL . 'assets/fontawesome/css/all.css',
136 + [],
137 + BLOCKSPARE_VERSION
138 + );
139 + }
140 +
141 + public function blockspare_enqueue_frontend_script()
142 + {
143 + wp_register_style(
144 + 'slick',
145 + BLOCKSPARE_PLUGIN_URL . 'assets/slick/css/slick.min.css',
146 + array(),
147 + BLOCKSPARE_VERSION
148 + );
149 +
150 + wp_register_script(
151 + 'slick',
152 + BLOCKSPARE_PLUGIN_URL . 'assets/slick/js/slick.min.js',
153 + array('jquery'),
154 + BLOCKSPARE_VERSION,
155 + true
156 + );
157 + global $post;
158 +
159 + if ($post && has_blocks($post->post_content)) {
160 + $content = $post->post_content;
161 +
162 + $hasCarousel = has_block('blockspare/blockspare-carousel', $content);
163 + $hasSlider = has_block('blockspare/blockspare-slider', $content);
164 + $hasMasonry = has_block('blockspare/blockspare-masonry', $content);
165 +
166 + if ($hasCarousel || $hasSlider) {
167 + wp_enqueue_style('slick');
168 + wp_enqueue_script('slick');
169 + }
170 + if ($hasMasonry) {
171 + wp_enqueue_script('jquery-masonry');
172 + }
173 + }
174 +
175 +
176 +
177 +
178 + wp_enqueue_script(
179 + 'block_animation_script',
180 + BLOCKSPARE_PLUGIN_URL . 'dist/block_animation_script.js',
181 + ['jquery'],
182 + BLOCKSPARE_VERSION,
183 + true
184 + );
185 + wp_register_script(
186 + 'block_pagination_script',
187 + BLOCKSPARE_PLUGIN_URL . 'dist/block_pagination_script.js',
188 + ['jquery'],
189 + BLOCKSPARE_VERSION,
190 + true
191 + );
192 + wp_localize_script('block_pagination_script', 'blocsparePagination', array(
193 + 'ajaxurl' => admin_url('admin-ajax.php'),
194 + 'nonce' => wp_create_nonce('blockspare-load-more-nonce'),
195 + ));
196 + }
197 +
198 + // ══════════════════════════════════════════════════════════════════════════
199 + // 2. Editor-only assets
200 + // ══════════════════════════════════════════════════════════════════════════
201 + public function blockspare_enqueue_editor_assets()
202 + {
203 +
204 + global $pagenow;
205 +
206 + // ✅ Prevent unnecessary loading
207 + if (!in_array($pagenow, ['post.php', 'post-new.php', 'widgets.php'])) {
208 + return;
209 + }
210 +
211 + wp_register_script(
212 + 'blockspare-category',
213 + BLOCKSPARE_PLUGIN_URL . 'dist/block_category.js',
214 + [
215 + 'wp-blocks',
216 + 'wp-i18n',
217 + 'wp-element',
218 + 'wp-components',
219 + 'wp-block-editor',
220 + 'wp-api-fetch',
221 + ],
222 + BLOCKSPARE_VERSION,
223 + true
224 + );
225 +
226 + global $pagenow;
227 + $loadscripton = ($pagenow === 'widgets.php' || is_customize_preview());
228 +
229 + wp_add_inline_script(
230 + 'wp-blocks',
231 + 'var blockspare_globals = ' . wp_json_encode($this->blockspare_get_globals()) . ';',
232 + 'before'
233 + );
234 +
235 +
236 + wp_enqueue_script('blockspare-category');
237 +
238 + wp_enqueue_style(
239 + 'blockspare-panel',
240 + BLOCKSPARE_PLUGIN_URL . 'dist/panel.css',
241 + ['wp-edit-blocks'],
242 + BLOCKSPARE_VERSION
243 + );
244 + wp_enqueue_style(
245 + 'blockspare-animation-blocks',
246 + BLOCKSPARE_PLUGIN_URL . 'dist/block_animation.css',
247 + [],
248 + BLOCKSPARE_VERSION
249 + );
250 + if (is_admin()):
251 + wp_enqueue_script(
252 + 'blockspare-design-btn',
253 + BLOCKSPARE_PLUGIN_URL . 'dist/block_design_btn.js',
254 + array('blockspare-category'),
255 + BLOCKSPARE_VERSION,
256 + true
257 + );
258 + endif;
259 +
260 +
261 + wp_localize_script('blockspare-category', 'cbvData', [
262 + 'isLoggedIn' => is_user_logged_in(),
263 + ]);
264 + }
265 +
266 + public function blockspare_enqueue_customizer_assets()
267 + {
268 + global $pagenow;
269 + if (!in_array($pagenow, ['customize.php'])) {
270 + return;
271 + }
272 + // Register globals as a standalone no-file script
273 + wp_register_script(
274 + 'blockspare-globals',
275 + false, // ← no actual JS file
276 + [],
277 + null,
278 + false
279 + );
280 +
281 + wp_add_inline_script(
282 + 'blockspare-globals',
283 + 'var blockspare_globals = ' . wp_json_encode($this->blockspare_get_globals()) . ';'
284 + );
285 +
286 + wp_enqueue_script('blockspare-globals');
287 +
288 + // Also enqueue your category script for the widgets customizer
289 + wp_enqueue_script(
290 + 'blockspare-category',
291 + BLOCKSPARE_PLUGIN_URL . 'dist/block_category.js',
292 + [
293 + 'blockspare-globals', // ← depends on globals, so globals loads first
294 + 'wp-blocks',
295 + 'wp-i18n',
296 + 'wp-element',
297 + 'wp-components',
298 + 'wp-block-editor',
299 + 'wp-api-fetch',
300 + 'wp-plugins',
301 + 'wp-edit-post',
302 + ],
303 + BLOCKSPARE_VERSION,
304 + true
305 + );
306 +
307 + wp_enqueue_style(
308 + 'blockspare-panel',
309 + BLOCKSPARE_PLUGIN_URL . 'dist/panel.css',
310 + ['wp-edit-blocks'],
311 + BLOCKSPARE_VERSION
312 + );
313 + }
314 +
315 + private function blockspare_get_globals(): array
316 + {
317 + $blockspare_priview_img_url = BLOCKSPARE_PLUGIN_URL . 'assets/blockspare-placeholder-img.jpg';
318 + $blockspare_food_img_url = BLOCKSPARE_PLUGIN_URL . 'assets/blockspare-placeholder-img-square.jpg';
319 + $blockspare_promo_img = BLOCKSPARE_PLUGIN_URL . 'assets/banner-promo-1120-wu-1.png';
320 + $date = wp_kses_post(date_i18n(get_option('date_format')));
321 + $date_format = date_i18n(get_option('date_format'), current_time('timestamp'));
322 + $open_design = isset($_GET['blockspare_show_intro']) && $_GET['blockspare_show_intro'] === 'true';
323 + $blockData = '';
324 +
325 + if (isset($_GET['blockspare_create_block'])) {
326 +
327 + $blockName = sanitize_text_field($_GET['blockspare_create_block']);
328 + $blockTitle = sanitize_text_field($_GET['post_title']);
329 +
330 + // Get from template library filter
331 + $filterdata = apply_filters('blockspare_template_library', []);
332 +
333 + foreach ($filterdata as $block) {
334 + if (isset($block['key']) && $block['key'] === $blockName) {
335 + $blockData = $block['content'];
336 + break;
33 337 }
338 + }
34 339
35 - function blockspare_blocks_block_assets(){
36 - wp_enqueue_style(
37 - 'blockspare-blocks-fontawesome-front',
38 - plugins_url('assets/fontawesome/css/all.css', dirname(__FILE__)),
39 - array()
40 - );
41 - // Load the compiled styles.
42 - wp_enqueue_style(
43 - 'blockspare-frontend-block-style-css',
44 - plugins_url('dist/style-blocks.css', dirname(__FILE__)),
45 - array()
46 - );
47 -
48 -
49 - wp_enqueue_style('slick-css', BLOCKSPARE_PLUGIN_URL . 'assets/slick/css/slick.css', array(), '', 'all');
340 + // Get from bs_templates post type if not found
341 + if (empty($blockData) && ! empty($blockTitle)) {
342 +
343 + $templates = get_posts([
344 + 'post_type' => 'bs_templates',
345 + 'post_status' => 'publish',
346 + 'title' => $blockTitle,
347 + 'posts_per_page' => 1,
348 + ]);
349 +
350 + if (! empty($templates)) {
351 + $blockData = $templates[0]->post_content;
50 352 }
353 + }
354 + }
51 355
52 - function blockspare_load_scripts(){
53 - $min = (SCRIPT_DEBUG == true) ? '' : '.min';
54 - wp_enqueue_script('slick-js', BLOCKSPARE_PLUGIN_URL . 'assets/slick/js/slick.js', array('jquery'), '', true);
55 - wp_register_script('countup', BLOCKSPARE_PLUGIN_URL . 'assets/js/countup/jquery.counterup' . $min . '.js', array('waypoint'), true);
56 - wp_enqueue_script('waypoint', BLOCKSPARE_PLUGIN_URL . 'assets/js/countup/waypoints.min.js', array('jquery'), '', true);
57 - wp_enqueue_script('jquery-masonry');
58 - wp_enqueue_script('blockspare-animation', BLOCKSPARE_PLUGIN_URL . 'dist/block_animation.js', array(), '', true);
59 - wp_enqueue_script('blockspare-script', BLOCKSPARE_PLUGIN_URL . 'dist/block_frontend.js', array('jquery', 'waypoint', 'countup'), '', true);
60 - wp_enqueue_script('blockspare-tabs', BLOCKSPARE_PLUGIN_URL . 'dist/block_tabs.js', array('jquery'), '', true);
61 - wp_enqueue_script('blockspare-pagination-js', BLOCKSPARE_PLUGIN_URL . 'dist/block_pagination.js', array(), '', true);
356 + $blockspare_current_wp_version = get_bloginfo('version');
357 + $loadscripton = (isset($GLOBALS['pagenow']) && $GLOBALS['pagenow'] === 'widgets.php') || is_customize_preview();
62 358
63 - wp_localize_script('blockspare-pagination-js', 'blocsparePagination',array(
64 - 'ajaxurl' => admin_url( 'admin-ajax.php' ),
65 - 'nonce'=>wp_create_nonce('blockspare-load-more-nonce')
66 - ));
67 - }
359 + return [
360 + 'srcUrl' => untrailingslashit(plugins_url('/', BLOCKSPARE_BASE_DIR . '/build/')),
361 + 'rest_url' => esc_url(rest_url()),
362 + 'nonce' => wp_create_nonce('wp_rest'),
363 + 'img' => $blockspare_priview_img_url,
364 + 'menu_img_url' => $blockspare_food_img_url,
365 + 'block_key' => '',
366 + 'homeUrl' => home_url(),
367 + 'blogUrl' => get_site_url(),
368 + 'postTypes' => self::get_post_types(),
369 + 'taxonomies' => self::get_taxonomies(),
370 + 'postQueryEndpoint' => 'aft/v1/post-query',
371 + 'config' => '',
372 + 'configuration' => '',
373 + 'settings' => '',
374 + 'bs_date' => $date,
375 + 'promo_img' => $blockspare_promo_img,
376 + 'imagePath' => 'https:raw.githubusercontent.com/afthemes/blockspare-demo-data/master/blocks/new/',
377 + 'open_design' => $open_design,
378 + 'date_format' => $date_format,
379 + 'blockData' => $blockData,
380 + 'template_link' => admin_url('edit.php?post_type=bs_templates'),
381 + 'newTemlateUrl' => admin_url('post-new.php?post_type=bs_templates&blockspare_create_block&blockspare_show_intro=true'),
382 + 'loadscripton' => $loadscripton,
383 + 'wpversion' => (version_compare($blockspare_current_wp_version, '6.6') >= 0) ? 'true' : 'false',
384 + 'inspector_imgs' => BLOCKSPARE_PLUGIN_URL . 'assets/images',
385 + 'upgradeUrl' => 'https://afthemes.com/blockspare-pro/',
386 + 'isPro' => false,
387 + 'allowedFonts' => $this->blockspare_allow_fonts()
388 + ];
389 + }
390 + public function blockspare_allow_fonts()
391 + {
392 + return ['ABeeZee', 'Abel', 'Lato', 'Oswald'];
393 + }
68 394
69 - function blockspare_create_block(){
395 + public function blockspare_fb_enqueue_frontend_assets()
396 + {
397 + wp_enqueue_style(
398 + 'blockspare-fontawesome',
399 + BLOCKSPARE_PLUGIN_URL . 'assets/fontawesome/css/all.css',
400 + [],
401 + BLOCKSPARE_VERSION
402 + );
403 + wp_enqueue_style(
404 + 'blockspare-common-latest-post',
405 + BLOCKSPARE_PLUGIN_URL . 'dist/lates_post_css.css',
406 + [],
407 + BLOCKSPARE_VERSION
408 + );
70 409
71 - $script_dep_path = BLOCKSPARE_BASE_DIR . 'dist/blocks.asset.php';
72 - $script_info = file_exists($script_dep_path) ? include $script_dep_path : array(
73 - 'dependencies' => array() ,
74 - 'version' => BLOCKSPARE_VERSION,
75 - );
76 - if (version_compare(get_bloginfo('version') , '5.8', '<'))
77 - {
78 - $script_dep = array_merge($script_info['dependencies'],array(
79 - 'wp-blocks',
80 - 'wp-i18n',
81 - 'wp-element',
82 - 'wp-components',
83 - 'wp-editor',
84 - 'wp-api-fetch'
85 - ));
86 - }
87 - else
88 - {
89 - $script_dep = $script_info['dependencies'];
90 - }
410 + wp_enqueue_style(
411 + 'blockspare-common-all-blocks',
412 + BLOCKSPARE_PLUGIN_URL . 'dist/common_all_blocks.css',
413 + [],
414 + BLOCKSPARE_VERSION
415 + );
416 + wp_enqueue_style(
417 + 'blockspare-animation-blocks',
418 + BLOCKSPARE_PLUGIN_URL . 'dist/block_animation.css',
419 + [],
420 + BLOCKSPARE_VERSION
421 + );
422 + }
91 423
92 - wp_enqueue_script('blockspare-blocks-block-js', // Handle.
93 - BLOCKSPARE_PLUGIN_URL . 'dist/blocks.js', $script_dep, // Dependencies, defined above.
94 - $script_info['version'], // AFT_PRICING_TABLE_VERSION.
95 - true
96 - // Enqueue the script in the footer.
97 - );
424 + // ══════════════════════════════════════════════════════════════════════════
425 + // 3. Custom block categories
426 + // ══════════════════════════════════════════════════════════════════════════
427 + public function blockspare_register_custom_categories($categories)
428 + {
429 + $custom = [
430 + [
431 + 'slug' => 'blockspare-post',
432 + 'title' => __('Editorial & Content', 'blockspare'),
98 433
99 - if (is_admin()) :
100 - wp_enqueue_style(
101 - 'blockspare-block-edit-style',
102 - BLOCKSPARE_PLUGIN_URL . 'dist/blocks.css',
103 - array('wp-edit-blocks')
104 - );
105 - endif;
106 -
107 -
108 - $blockspare_priview_img_url = BLOCKSPARE_PLUGIN_URL . 'assets/blockspare-placeholder-img.jpg';
109 - $blockspare_food_img_url = BLOCKSPARE_PLUGIN_URL . 'assets/blockspare-placeholder-img-square.jpg';
110 -
111 - $taxonomies = get_categories();
112 - $txnm = array();
113 -
114 - foreach( $taxonomies as $type ) {
115 -
116 -
117 - $txnm[] = array(
118 - 'label' => $type->name,
119 - 'value' => $type->term_id,
120 - );
121 - }
122 -
123 -
124 - wp_localize_script(
125 - 'blockspare-blocks-block-js',
126 - 'blockspare_globals',
127 - array(
128 - 'srcUrl' => untrailingslashit(plugins_url('/', BLOCKSPARE_BASE_DIR . '/dist/')),
129 - 'rest_url' => esc_url(rest_url()),
130 - 'img' => $blockspare_priview_img_url,
131 - 'menu_img_url' => $blockspare_food_img_url,
132 - 'postTypes' => $this->aft_get_post_types(),
133 - 'taxonomies' => $this->aft_get_taxonomies(),
134 - 'postQueryEndpoint'=>'aft/v1/post-query',
135 - 'config' => '',
136 - 'configuration' => '',
137 - 'settings' => '',
138 - )
139 - );
140 - }
434 + ],
435 + [
436 + 'slug' => 'blockspare',
437 + 'title' => __('Business & Layout', 'blockspare'),
141 438
142 - function aft_get_post_types(){
143 - $args = array(
144 - 'public' => true,
145 - 'show_in_rest' => true,
146 - );
147 - $post_types = get_post_types( $args, 'objects' );
148 - $output = array();
149 - foreach ( $post_types as $post_type ) {
150 -
151 - if ( 'attachment' == $post_type->name ) {
152 - continue;
153 - }
154 - $output[] = array(
155 - 'value' => $post_type->name,
156 - 'label' => $post_type->label,
157 - );
158 - }
439 + ],
159 440
160 - return apply_filters( 'aft_blocks_post_types', $output );
161 - }
441 + ];
162 442
163 - function aft_get_taxonomies() {
164 - $post_types = $this->aft_get_post_types();
165 - $output = array();
166 - foreach ( $post_types as $key => $post_type ) {
167 - $taxonomies = get_object_taxonomies( $post_type['value'], 'objects' );
168 - $taxs = array();
169 - foreach ( $taxonomies as $term_slug => $term ) {
170 - if ( ! $term->public || ! $term->show_ui ) {
171 - continue;
172 - }
173 - $taxs[ $term_slug ] = $term;
174 - $terms = get_terms( $term_slug );
175 - $term_items = array();
176 - if ( ! empty( $terms ) ) {
177 - foreach ( $terms as $term_key => $term_item ) {
178 - $term_items[] = array(
179 - 'value' => $term_item->term_id,
180 - 'label' => $term_item->name,
181 - );
182 - }
183 - $output[ $post_type['value'] ]['terms'][ $term_slug ] = $term_items;
184 - }
185 - }
186 - $output[ $post_type['value'] ]['taxonomy'] = $taxs;
187 - }
188 -
189 - return apply_filters( 'aft_blocks_taxonomies', $output );
190 - }
443 + return array_merge($custom, $categories);
444 + }
191 445
192 - function blockspare_blocks_loader(){
193 -
194 - //Load Gutenberg Block php Files
195 - include(BLOCKSPARE_PLUGIN_DIR . '/inc/other-block/social-sharing/index.php');
196 - include(BLOCKSPARE_PLUGIN_DIR . '/inc/latest-post-block/posts-grid/index.php');
197 - include(BLOCKSPARE_PLUGIN_DIR . '/inc/latest-post-block/posts-list/index.php');
198 -
199 - include(BLOCKSPARE_PLUGIN_DIR . '/inc/latest-post-block/posts-express-grid/index.php');
200 -
201 -
202 - include(BLOCKSPARE_PLUGIN_DIR . '/inc/latest-post-block/posts-carousel-grid/index.php');
203 - include(BLOCKSPARE_PLUGIN_DIR . '/inc/latest-post-block/posts-slider/index.php');
204 -
205 - include(BLOCKSPARE_PLUGIN_DIR . '/inc/block-banner/banner-1/index.php');
206 - include(BLOCKSPARE_PLUGIN_DIR . '/inc/block-banner/banner-2/index.php');
207 - include(BLOCKSPARE_PLUGIN_DIR . 'inc/block-posts-config/ajax-pagination.php');
208 - include(BLOCKSPARE_PLUGIN_DIR . 'inc/block-posts-config/class-post-rest-api.php');
209 - include(BLOCKSPARE_PLUGIN_DIR . 'inc/block-posts-config/class-multiauthor-backend.php');
210 - include(BLOCKSPARE_PLUGIN_DIR . 'inc/block-posts-config/class-multiauthor-frontend.php');
211 - include(BLOCKSPARE_PLUGIN_DIR . 'inc/block-posts-config/tax-category.php');
212 - include(BLOCKSPARE_PLUGIN_DIR . 'inc/block-posts-config/class-bs-post.php');
213 - include(BLOCKSPARE_PLUGIN_DIR . 'inc/block-banner/frontend-render/post-banner-config.php');
214 - include(BLOCKSPARE_PLUGIN_DIR . 'inc/block-banner/frontend-render/post-banner-style.php');
215 - }
446 + // ══════════════════════════════════════════════════════════════════════════
447 + // 4. Load server-side render files
448 + // ══════════════════════════════════════════════════════════════════════════
449 + public function blockspare_load_dynamic_blocks()
450 + {
451 + $this->load_layout_dependencies();
452 + $this->load_block_includes();
453 + }
216 454
217 - function blockspare_blocks_register_api_endpoints(){
218 -
219 - $posts_controller = new Aft_Post_Rest_Controller();
220 - $posts_controller->register_routes();
221 -
455 + private function load_layout_dependencies()
456 + {
457 + if (PHP_VERSION_ID < 50600) {
458 + return;
459 + }
222 460
223 - }
461 + $layout_files = [
462 + 'inc/layout/class-image-importer.php',
463 + 'inc/layout/functions.php',
464 + 'inc/layout/registry.php',
465 + 'inc/layout/components.php',
466 + 'inc/layout/endpoints.php',
467 + 'inc/layout/save-templates.php',
468 + ];
224 469
470 + $this->include_files($layout_files);
471 + }
472 +
473 + private function load_block_includes()
474 + {
475 + $block_files = [
476 + 'inc/rest-api-function.php',
477 + 'inc/latest-post-block/posts-grid/index.php',
478 + 'inc/latest-post-block/posts-carousel-grid/index.php',
479 + 'inc/latest-post-block/posts-slider/index.php',
480 + 'inc/latest-post-block/posts-list/index.php',
481 + 'inc/latest-post-block/posts-flash/index.php',
482 + 'inc/latest-post-block/posts-express-grid/index.php',
483 + 'inc/other-block/date-time/index.php',
484 + 'inc/latest-post-block/posts-popular-tags/index.php',
485 + 'inc/blockspare-functions.php',
486 + 'inc/block-posts-config/class-post-rest-api.php',
487 + 'inc/block-posts-config/class-multiauthor-backend.php',
488 + 'inc/block-posts-config/class-multiauthor-frontend.php',
489 + 'inc/block-posts-config/tax-category.php',
490 + 'inc/block-posts-config/class-bs-post.php',
491 + 'inc/block-posts-config/latest-post-tile-common.php',
492 + 'inc/other-block/social-sharing/index.php',
493 + 'inc/other-block/search/index.php',
494 + 'inc/block-banner/frontend-render/post-category-style.php',
495 + 'inc/block-banner/frontend-render/post-banner-config.php',
496 + 'inc/block-banner/frontend-render/post-banner-style.php',
497 + 'inc/block-posts-config/ajax-pagination.php',
498 +
499 + 'inc/post-banner/banner-1/index.php',
500 + 'inc/post-banner/banner-2/index.php',
501 + 'inc/post-banner/banner-9/index.php',
502 + ];
503 + $this->include_files($block_files);
504 + }
505 +
506 + /**
507 + * Reusable file loader
508 + */
509 + private function include_files($files = [])
510 + {
511 +
512 + foreach ($files as $file) {
513 + $filepath = BLOCKSPARE_PLUGIN_DIR . $file;
514 +
515 + if (file_exists($filepath)) {
516 + include_once $filepath;
517 + }
225 518 }
226 - BlockspareInit::get_instance();
519 + }
520 +
521 + public function blockspare_blocks_register_api_endpoints()
522 + {
523 +
524 + $posts_controller = new Aft_Post_Rest_Controller();
525 + $posts_controller->register_routes();
526 + }
527 +
528 +
529 +
530 + // ══════════════════════════════════════════════════════════════════════════
531 + // 5. Load text domain
532 + // ══════════════════════════════════════════════════════════════════════════
533 + public function blockspare_load_load_text_domain()
534 + {
535 + load_plugin_textdomain(
536 + 'blockspare',
537 + false,
538 + dirname(plugin_basename(BLOCKSPARE_BASE_FILE)) . '/languages'
539 + );
540 + }
227 541 }
228 -
229 -
230 -
542 +
543 +// Initialize the class
544 +new Blockspare_Init();