PluginProbe
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages / 3.4.3
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages v3.4.3
3.4.3 3.4.2 3.4.1 3.4.0 3.3.9 3.3.8 3.3.7 3.3.6 3.3.5 3.3.4 3.3.3 3.3.2 3.3.1 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.2.7 2.2.8 2.2.9 2.3.0 2.3.1 All 196 releases
← All changes | includes/blocks/class-convertkit-block-broadcasts.php +234 -89 2.3.13.4.3 View file →
@@ -26,30 +26,87 @@
26 26
27 27 // Register this as a Gutenberg block in the ConvertKit Plugin.
28 28 add_filter( 'convertkit_blocks', array( $this, 'register' ) );
29 29
30 - // Enqueue scripts and styles for this Gutenberg Block in the editor view.
31 - add_action( 'convertkit_gutenberg_enqueue_scripts', array( $this, 'enqueue_scripts_editor' ) );
30 + // Register this block's MCP abilities.
31 + add_filter( 'convertkit_abilities', array( $this, 'register_abilities' ) );
32 32
33 33 // Enqueue scripts and styles for this Gutenberg Block in the editor and frontend views.
34 34 add_action( 'convertkit_gutenberg_enqueue_scripts_editor_and_frontend', array( $this, 'enqueue_scripts' ) );
35 35 add_action( 'convertkit_gutenberg_enqueue_styles_editor_and_frontend', array( $this, 'enqueue_styles' ) );
36 36
37 - // Render Broadcasts block via AJAX.
38 - add_action( 'wp_ajax_nopriv_convertkit_broadcasts_render', array( $this, 'render_ajax' ) );
39 - add_action( 'wp_ajax_convertkit_broadcasts_render', array( $this, 'render_ajax' ) );
37 + // Register REST API routes.
38 + add_action( 'rest_api_init', array( $this, 'register_routes' ) );
40 39
41 40 }
42 41
43 42 /**
44 - * Enqueues scripts for this Gutenberg Block in the editor view.
43 + * Register REST API routes.
45 44 *
46 - * @since 2.0.1
45 + * @since 3.1.8
47 46 */
48 - public function enqueue_scripts_editor() {
47 + public function register_routes() {
49 48
50 - wp_enqueue_script( 'convertkit-gutenberg-block-broadcasts', CONVERTKIT_PLUGIN_URL . 'resources/backend/js/gutenberg-block-broadcasts.js', array( 'convertkit-gutenberg' ), CONVERTKIT_PLUGIN_VERSION, true );
49 + register_rest_route(
50 + 'kit/v1',
51 + '/broadcasts',
52 + array(
53 + 'methods' => WP_REST_Server::READABLE,
54 + 'args' => array(
55 + 'date_format' => array(
56 + 'default' => $this->get_default_value( 'date_format' ),
57 + 'sanitize_callback' => 'sanitize_text_field',
58 + ),
59 + 'display_image' => array(
60 + 'default' => $this->get_default_value( 'display_image' ),
61 + 'sanitize_callback' => 'absint',
62 + ),
63 + 'display_description' => array(
64 + 'default' => $this->get_default_value( 'display_description' ),
65 + 'sanitize_callback' => 'absint',
66 + ),
67 + 'display_read_more' => array(
68 + 'default' => $this->get_default_value( 'display_read_more' ),
69 + 'sanitize_callback' => 'absint',
70 + ),
71 + 'read_more_label' => array(
72 + 'default' => $this->get_default_value( 'read_more_label' ),
73 + 'sanitize_callback' => 'sanitize_text_field',
74 + ),
75 + 'limit' => array(
76 + 'default' => $this->get_default_value( 'limit' ),
77 + 'sanitize_callback' => 'absint',
78 + ),
79 + 'page' => array(
80 + 'default' => $this->get_default_value( 'page' ),
81 + 'sanitize_callback' => 'absint',
82 + ),
83 + 'paginate' => array(
84 + 'default' => $this->get_default_value( 'paginate' ),
85 + 'sanitize_callback' => 'absint',
86 + ),
87 + 'paginate_label_next' => array(
88 + 'default' => $this->get_default_value( 'paginate_label_next' ),
89 + 'sanitize_callback' => 'sanitize_text_field',
90 + ),
91 + 'paginate_label_prev' => array(
92 + 'default' => $this->get_default_value( 'paginate_label_prev' ),
93 + 'sanitize_callback' => 'sanitize_text_field',
94 + ),
95 + 'link_color' => array(
96 + 'default' => $this->get_default_value( 'link_color' ),
97 + 'sanitize_callback' => 'sanitize_text_field',
98 + ),
99 + ),
100 + 'callback' => function ( $request ) {
101 + return rest_ensure_response( $this->render_ajax( $request ) );
102 + },
51 103
104 + // No authentication required, as this is on the frontend site.
105 + 'permission_callback' => '__return_true',
106 + )
107 + );
108 +
52 109 }
53 110
54 111 /**
55 112 * Enqueues scripts for this Gutenberg Block in the editor and frontend views.
@@ -60,23 +117,24 @@
60 117
61 118 // Get ConvertKit Settings.
62 119 $settings = new ConvertKit_Settings();
63 120
64 - wp_enqueue_script( 'convertkit-' . $this->get_name(), CONVERTKIT_PLUGIN_URL . 'resources/frontend/js/broadcasts.js', array( 'jquery' ), CONVERTKIT_PLUGIN_VERSION, true );
121 + // Enqueue frontend JS.
122 + convertkit_enqueue_frontend_js();
123 +
124 + // Define variables.
65 125 wp_localize_script(
66 - 'convertkit-' . $this->get_name(),
126 + 'convertkit-js',
67 127 'convertkit_broadcasts',
68 128 array(
69 - // WordPress AJAX URL endpoint.
70 - 'ajax_url' => admin_url( 'admin-ajax.php' ),
129 + // REST API URL endpoint.
130 + 'ajax_url' => rest_url( 'kit/v1/broadcasts' ),
71 131
72 - // AJAX action registered in __construct().
73 - 'action' => 'convertkit_broadcasts_render',
74 -
75 132 // Whether debugging is enabled.
76 133 'debug' => $settings->debug_enabled(),
77 134 )
78 135 );
136 +
79 137 }
80 138
81 139 /**
82 140 * Enqueues styles for this Gutenberg Block in the editor and frontend views.
@@ -84,9 +142,9 @@
84 142 * @since 1.9.7.4
85 143 */
86 144 public function enqueue_styles() {
87 145
88 - wp_enqueue_style( 'convertkit-' . $this->get_name(), CONVERTKIT_PLUGIN_URL . 'resources/frontend/css/broadcasts.css', array(), CONVERTKIT_PLUGIN_VERSION );
146 + convertkit_enqueue_frontend_css();
89 147
90 148 }
91 149
92 150 /**
@@ -105,8 +163,43 @@
105 163
106 164 }
107 165
108 166 /**
167 + * Returns this block's title.
168 + *
169 + * @since 3.1.1
170 + */
171 + public function get_title() {
172 +
173 + return __( 'Kit Broadcasts', 'convertkit' );
174 +
175 + }
176 +
177 + /**
178 + * Returns this block's plural title.
179 + *
180 + * @since 3.4.0
181 + *
182 + * @return string
183 + */
184 + public function get_title_plural() {
185 +
186 + return __( 'Kit Broadcasts', 'convertkit' );
187 +
188 + }
189 +
190 + /**
191 + * Returns this block's icon.
192 + *
193 + * @since 3.1.1
194 + */
195 + public function get_icon() {
196 +
197 + return 'resources/backend/images/block-icon-broadcasts.svg';
198 +
199 + }
200 +
201 + /**
109 202 * Returns this block's Title, Icon, Categories, Keywords and properties.
110 203 *
111 204 * @since 1.9.7.4
112 205 */
@@ -116,56 +209,55 @@
116 209 $posts = new ConvertKit_Resource_Posts( 'output_broadcasts' );
117 210 $settings = new ConvertKit_Settings();
118 211
119 212 return array(
120 - 'title' => __( 'ConvertKit Broadcasts', 'convertkit' ),
121 - 'description' => __( 'Displays a list of your ConvertKit broadcasts.', 'convertkit' ),
122 - 'icon' => 'resources/backend/images/block-icon-broadcasts.svg',
123 - 'category' => 'convertkit',
124 - 'keywords' => array(
213 + 'title' => $this->get_title(),
214 + 'description' => __( 'Displays a list of your Kit broadcasts.', 'convertkit' ),
215 + 'icon' => $this->get_icon(),
216 + 'category' => 'convertkit',
217 + 'keywords' => array(
125 218 __( 'ConvertKit', 'convertkit' ),
219 + __( 'Kit', 'convertkit' ),
126 220 __( 'Broadcasts', 'convertkit' ),
127 221 __( 'Posts', 'convertkit' ),
128 222 ),
129 223
130 224 // Function to call when rendering as a block or a shortcode on the frontend web site.
131 - 'render_callback' => array( $this, 'render' ),
225 + 'render_callback' => array( $this, 'render' ),
132 226
133 227 // Shortcode: TinyMCE / QuickTags Modal Width and Height.
134 - 'modal' => array(
228 + 'modal' => array(
135 229 'width' => 650,
136 - 'height' => 405,
230 + 'height' => 455,
137 231 ),
138 232
139 233 // Shortcode: Include a closing [/shortcode] tag when using TinyMCE or QuickTag Modals.
140 - 'shortcode_include_closing_tag' => false,
234 + 'shortcode_include_closing_tag' => false,
141 235
142 236 // Gutenberg: Block Icon in Editor.
143 - 'gutenberg_icon' => convertkit_get_file_contents( CONVERTKIT_PLUGIN_PATH . '/resources/backend/images/block-icon-broadcasts.svg' ),
237 + 'gutenberg_icon' => convertkit_get_file_contents( CONVERTKIT_PLUGIN_PATH . '/resources/backend/images/block-icon-broadcasts.svg' ),
144 238
145 239 // Gutenberg: Example image showing how this block looks when choosing it in Gutenberg.
146 - 'gutenberg_example_image' => CONVERTKIT_PLUGIN_URL . 'resources/backend/images/block-example-broadcasts.png',
240 + 'gutenberg_example_image' => CONVERTKIT_PLUGIN_URL . 'resources/backend/images/block-example-broadcasts.png',
147 241
148 - // Help descriptions, displayed when no API key / resources exist and this block/shortcode is added.
149 - 'no_api_key' => array(
150 - 'notice' => __( 'No API Key specified.', 'convertkit' ),
151 - 'link' => convertkit_get_setup_wizard_plugin_link(),
152 - 'link_text' => __( 'Click here to add your API Key.', 'convertkit' ),
242 + // Help descriptions, displayed when no Access Token / resources exist and this block/shortcode is added.
243 + 'no_access_token' => array(
244 + 'notice' => __( 'Not connected to Kit.', 'convertkit' ),
245 + 'link' => convertkit_get_setup_wizard_plugin_link(),
246 + 'link_text' => __( 'Click here to connect your Kit account.', 'convertkit' ),
247 + 'instruction_text' => __( 'Connect your Kit account at Settings > Kit, and then refresh this page to configure broadcasts to display.', 'convertkit' ),
153 248 ),
154 - 'no_resources' => array(
155 - 'notice' => __( 'No broadcasts exist in ConvertKit.', 'convertkit' ),
156 - 'link' => convertkit_get_new_broadcast_url(),
157 - 'link_text' => __( 'Click here to send your first broadcast.', 'convertkit' ),
249 + 'no_resources' => array(
250 + 'notice' => __( 'No broadcasts exist in Kit.', 'convertkit' ),
251 + 'link' => convertkit_get_new_broadcast_url(),
252 + 'link_text' => __( 'Click here to send your first broadcast.', 'convertkit' ),
253 + 'instruction_text' => __( 'Add a broadcast to your Kit account, and then refresh this page to configure broadcasts to display.', 'convertkit' ),
158 254 ),
159 255
160 - // Gutenberg: JS function to call when rendering the block preview in the Gutenberg editor.
161 - // If not defined, render_callback above will be used.
162 - 'gutenberg_preview_render_callback' => 'convertKitGutenbergBroadcastsBlockRenderPreview',
163 -
164 256 // Whether an API Key exists in the Plugin, and are the required resources (broadcasts) available.
165 257 // If no API Key is specified in the Plugin's settings, render the "No API Key" output.
166 - 'has_api_key' => $settings->has_api_key_and_secret(),
167 - 'has_resources' => $posts->exist(),
258 + 'has_access_token' => $settings->has_access_and_refresh_token(),
259 + 'has_resources' => $posts->exist(),
168 260 );
169 261
170 262 }
171 263
@@ -181,8 +273,12 @@
181 273 'display_grid' => array(
182 274 'type' => 'boolean',
183 275 'default' => $this->get_default_value( 'display_grid' ),
184 276 ),
277 + 'display_order' => array(
278 + 'type' => 'string',
279 + 'default' => $this->get_default_value( 'display_order' ),
280 + ),
185 281 'date_format' => array(
186 282 'type' => 'string',
187 283 'default' => $this->get_default_value( 'date_format' ),
188 284 ),
@@ -222,9 +318,9 @@
222 318 'type' => 'string',
223 319 'default' => $this->get_default_value( 'paginate_label_next' ),
224 320 ),
225 321
226 - // get_supports() color attribute.
322 + // get_supports() style, color and typography attributes.
227 323 'style' => array(
228 324 'type' => 'object',
229 325 ),
230 326 'backgroundColor' => array(
@@ -232,8 +328,11 @@
232 328 ),
233 329 'textColor' => array(
234 330 'type' => 'string',
235 331 ),
332 + 'fontSize' => array(
333 + 'type' => 'string',
334 + ),
236 335
237 336 // Always required for Gutenberg.
238 337 'is_gutenberg_example' => array(
239 338 'type' => 'boolean',
@@ -252,14 +351,22 @@
252 351 */
253 352 public function get_supports() {
254 353
255 354 return array(
256 - 'className' => true,
257 - 'color' => array(
355 + 'className' => true,
356 + 'color' => array(
258 357 'link' => true,
259 358 'background' => true,
260 359 'text' => true,
261 360 ),
361 + 'typography' => array(
362 + 'fontSize' => true,
363 + 'lineHeight' => true,
364 + ),
365 + 'spacing' => array(
366 + 'margin' => true,
367 + 'padding' => true,
368 + ),
262 369 );
263 370
264 371 }
265 372
@@ -271,13 +378,8 @@
271 378 * @return bool|array
272 379 */
273 380 public function get_fields() {
274 381
275 - // Bail if the request is not for the WordPress Administration or frontend editor.
276 - if ( ! WP_ConvertKit()->is_admin_or_frontend_editor() ) {
277 - return false;
278 - }
279 -
280 382 return array(
281 383 'display_grid' => array(
282 384 'label' => __( 'Display as grid', 'convertkit' ),
283 385 'type' => 'toggle',
@@ -282,8 +384,16 @@
282 384 'label' => __( 'Display as grid', 'convertkit' ),
283 385 'type' => 'toggle',
284 386 'description' => __( 'If enabled, displays broadcasts in a grid, instead of a list.', 'convertkit' ),
285 387 ),
388 + 'display_order' => array(
389 + 'label' => __( 'Display order', 'convertkit' ),
390 + 'type' => 'select',
391 + 'values' => array(
392 + 'date-broadcast' => __( 'Date, Broadcast', 'convertkit' ),
393 + 'broadcast-date' => __( 'Broadcast, Date', 'convertkit' ),
394 + ),
395 + ),
286 396 'date_format' => array(
287 397 'label' => __( 'Date format', 'convertkit' ),
288 398 'type' => 'select',
289 399 'values' => array(
@@ -308,8 +418,12 @@
308 418 'read_more_label' => array(
309 419 'label' => __( 'Read more label', 'convertkit' ),
310 420 'type' => 'text',
311 421 'description' => __( 'The label to display for the "read more" link below each broadcast.', 'convertkit' ),
422 + 'display_if' => array(
423 + 'key' => 'display_read_more',
424 + 'value' => 1,
425 + ),
312 426 ),
313 427 'limit' => array(
314 428 'label' => __( 'Number of posts', 'convertkit' ),
315 429 'type' => 'number',
@@ -325,13 +439,21 @@
325 439 'paginate_label_prev' => array(
326 440 'label' => __( 'Newer posts label', 'convertkit' ),
327 441 'type' => 'text',
328 442 'description' => __( 'The label to display for the link to newer broadcasts.', 'convertkit' ),
443 + 'display_if' => array(
444 + 'key' => 'paginate',
445 + 'value' => 1,
446 + ),
329 447 ),
330 448 'paginate_label_next' => array(
331 449 'label' => __( 'Older posts label', 'convertkit' ),
332 450 'type' => 'text',
333 451 'description' => __( 'The label to display for the link to older broadcasts.', 'convertkit' ),
452 + 'display_if' => array(
453 + 'key' => 'paginate',
454 + 'value' => 1,
455 + ),
334 456 ),
335 457
336 458 // These fields will only display on the shortcode, and are deliberately not registered in get_attributes(),
337 459 // because Gutenberg will register its own color pickers for link, background and text.
@@ -359,18 +481,14 @@
359 481 * @return bool|array
360 482 */
361 483 public function get_panels() {
362 484
363 - // Bail if the request is not for the WordPress Administration or frontend editor.
364 - if ( ! WP_ConvertKit()->is_admin_or_frontend_editor() ) {
365 - return false;
366 - }
367 -
368 485 return array(
369 486 'general' => array(
370 487 'label' => __( 'General', 'convertkit' ),
371 488 'fields' => array(
372 489 'display_grid',
490 + 'display_order',
373 491 'date_format',
374 492 'display_image',
375 493 'display_description',
376 494 'display_read_more',
@@ -408,8 +526,9 @@
408 526 public function get_default_values() {
409 527
410 528 return array(
411 529 'display_grid' => false,
530 + 'display_order' => 'date-broadcast',
412 531 'date_format' => 'F j, Y',
413 532 'display_image' => false,
414 533 'display_description' => false,
415 534 'display_read_more' => false,
@@ -437,10 +556,10 @@
437 556 * Returns the block's output, based on the supplied configuration attributes.
438 557 *
439 558 * @since 1.9.7.4
440 559 *
441 - * @param array $atts Block / Shortcode Attributes.
442 - * @return string Output
560 + * @param array $atts Block / Shortcode / Page Builder Module Attributes.
561 + * @return string
443 562 */
444 563 public function render( $atts ) {
445 564
446 565 // Parse attributes, defining fallback defaults if required
@@ -452,19 +571,12 @@
452 571
453 572 // Fetch Posts.
454 573 $posts = new ConvertKit_Resource_Posts( 'output_broadcasts' );
455 574
456 - // If this is an admin request, refresh the Posts resource now from the API,
457 - // as it's an inexpensive query of ~ 0.5 seconds when we're editing a Page
458 - // containing this block.
459 - if ( function_exists( 'is_admin' ) && is_admin() ) {
460 - $posts->refresh();
461 - }
462 -
463 575 // If no Posts exist, bail.
464 576 if ( ! $posts->exist() ) {
465 577 if ( $settings->debug_enabled() ) {
466 - return '<!-- ' . __( 'No Broadcasts exist in ConvertKit.', 'convertkit' ) . ' -->';
578 + return '<!-- ' . __( 'No Broadcasts exist in Kit.', 'convertkit' ) . ' -->';
467 579 }
468 580
469 581 return '';
470 582 }
@@ -469,9 +581,29 @@
469 581 return '';
470 582 }
471 583
472 584 // Build HTML.
473 - $html = $this->build_html( $posts, $atts );
585 + if ( $this->is_block_editor_request() ) {
586 + // For the block editor, don't include compiled CSS classes and styles,
587 + // as the block editor will add these to the parent container.
588 + // Otherwise the block will render incorrectly with double padding, double margins etc.
589 + $html = $this->build_html(
590 + $posts,
591 + $atts,
592 + true,
593 + array(
594 + 'convertkit-' . $this->get_name(),
595 + )
596 + );
597 + } else {
598 + $html = $this->build_html(
599 + $posts,
600 + $atts,
601 + true,
602 + $this->get_css_classes(),
603 + $this->get_css_styles( $atts )
604 + );
605 + }
474 606
475 607 /**
476 608 * Filter the block's content immediately before it is output.
477 609 *
@@ -476,10 +608,10 @@
476 608 * Filter the block's content immediately before it is output.
477 609 *
478 610 * @since 1.9.7.4
479 611 *
480 - * @param string $html ConvertKit Broadcasts HTML.
481 - * @param array $atts Block Attributes.
612 + * @param string $html ConvertKit Broadcasts HTML.
613 + * @param array $atts Block Attributes.
482 614 */
483 615 $html = apply_filters( 'convertkit_block_broadcasts_render', $html, $atts );
484 616
485 617 return $html;
@@ -490,27 +622,27 @@
490 622 * Returns the block's output, based on the supplied configuration attributes,
491 623 * when requested via AJAX.
492 624 *
493 625 * @since 1.9.7.6
626 + *
627 + * @param WP_REST_Request $request The REST request.
628 + * @return string
494 629 */
495 - public function render_ajax() {
630 + public function render_ajax( $request ) {
496 631
497 - // Check nonce.
498 - check_ajax_referer( 'convertkit-broadcasts', 'nonce' );
499 -
500 632 // Build attributes array.
501 633 $atts = array(
502 - 'date_format' => stripslashes( sanitize_text_field( $_REQUEST['date_format'] ) ),
503 - 'display_image' => absint( $_REQUEST['display_image'] ),
504 - 'display_description' => absint( $_REQUEST['display_description'] ),
505 - 'display_read_more' => absint( $_REQUEST['display_read_more'] ),
506 - 'read_more_label' => stripslashes( sanitize_text_field( $_REQUEST['read_more_label'] ) ),
507 - 'limit' => absint( $_REQUEST['limit'] ),
508 - 'page' => absint( $_REQUEST['page'] ),
509 - 'paginate' => absint( $_REQUEST['paginate'] ),
510 - 'paginate_label_next' => stripslashes( sanitize_text_field( $_REQUEST['paginate_label_next'] ) ),
511 - 'paginate_label_prev' => stripslashes( sanitize_text_field( $_REQUEST['paginate_label_prev'] ) ),
512 - 'link_color' => stripslashes( sanitize_text_field( $_REQUEST['link_color'] ) ),
634 + 'date_format' => $request->get_param( 'date_format' ),
635 + 'display_image' => $request->get_param( 'display_image' ),
636 + 'display_description' => $request->get_param( 'display_description' ),
637 + 'display_read_more' => $request->get_param( 'display_read_more' ),
638 + 'read_more_label' => $request->get_param( 'read_more_label' ),
639 + 'limit' => $request->get_param( 'limit' ),
640 + 'page' => $request->get_param( 'page' ),
641 + 'paginate' => $request->get_param( 'paginate' ),
642 + 'paginate_label_next' => $request->get_param( 'paginate_label_next' ),
643 + 'paginate_label_prev' => $request->get_param( 'paginate_label_prev' ),
644 + 'link_color' => $request->get_param( 'link_color' ),
513 645 );
514 646
515 647 // Parse attributes, defining fallback defaults if required
516 648 // and moving some attributes (such as Gutenberg's styles), if defined.
@@ -515,11 +647,23 @@
515 647 // Parse attributes, defining fallback defaults if required
516 648 // and moving some attributes (such as Gutenberg's styles), if defined.
517 649 $atts = $this->sanitize_and_declare_atts( $atts );
518 650
651 + // Setup Settings class.
652 + $settings = new ConvertKit_Settings();
653 +
519 654 // Fetch Posts.
520 655 $posts = new ConvertKit_Resource_Posts( 'output_broadcasts' );
521 656
657 + // If no Posts exist, bail.
658 + if ( ! $posts->exist() ) {
659 + if ( $settings->debug_enabled() ) {
660 + return '<!-- ' . __( 'No Broadcasts exist in Kit.', 'convertkit' ) . ' -->';
661 + }
662 +
663 + return '';
664 + }
665 +
522 666 // Build HTML.
523 667 $html = $this->build_html( $posts, $atts, false );
524 668
525 669 /**
@@ -532,10 +676,9 @@
532 676 * @param array $atts Block Attributes.
533 677 */
534 678 $html = apply_filters( 'convertkit_block_broadcasts_render_ajax', $html, $atts );
535 679
536 - // Send HTML as response.
537 - wp_send_json_success( $html );
680 + return $html;
538 681
539 682 }
540 683
541 684 /**
@@ -546,11 +689,13 @@
546 689 *
547 690 * @param ConvertKit_Resource_Posts $posts ConvertKit Posts Resource class.
548 691 * @param array $atts Block attributes.
549 692 * @param bool $include_container Include container div in HTML.
550 - * @return string HTML
693 + * @param array $css_classes CSS classes to apply to block.
694 + * @param array $css_styles CSS inline styles to apply to block.
695 + * @return string
551 696 */
552 - private function build_html( $posts, $atts, $include_container = true ) {
697 + private function build_html( $posts, $atts, $include_container = true, $css_classes = array(), $css_styles = array() ) {
553 698
554 699 // Get paginated subset of Posts.
555 700 $broadcasts = $posts->get_paginated_subset( $atts['page'], $atts['limit'] );
556 701
@@ -561,9 +706,9 @@
561 706 $html = '';
562 707
563 708 // Include container, if required.
564 709 if ( $include_container ) {
565 - $html .= '<div class="' . implode( ' ', map_deep( $atts['_css_classes'], 'sanitize_html_class' ) ) . '" style="' . implode( ';', map_deep( $atts['_css_styles'], 'esc_attr' ) ) . '" ' . $this->get_atts_as_html_data_attributes( $atts ) . '>';
710 + $html .= '<div class="' . implode( ' ', map_deep( $css_classes, 'sanitize_html_class' ) ) . '" style="' . implode( ';', map_deep( $css_styles, 'esc_attr' ) ) . '" ' . $this->get_atts_as_html_data_attributes( $atts ) . '>';
566 711 }
567 712
568 713 // Start list.
569 714 $html .= '<ul class="convertkit-broadcasts-list">';