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 +240 -83 2.2.53.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 */
@@ -112,48 +205,59 @@
112 205 */
113 206 public function get_overview() {
114 207
115 208 // Fetch Posts.
116 - $posts = new ConvertKit_Resource_Posts( 'output_broadcasts' );
209 + $posts = new ConvertKit_Resource_Posts( 'output_broadcasts' );
210 + $settings = new ConvertKit_Settings();
117 211
118 212 return array(
119 - 'title' => __( 'ConvertKit Broadcasts', 'convertkit' ),
120 - 'description' => __( 'Displays a list of your ConvertKit broadcasts.', 'convertkit' ),
121 - 'icon' => 'resources/backend/images/block-icon-broadcasts.svg',
122 - 'category' => 'convertkit',
123 - '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(
124 218 __( 'ConvertKit', 'convertkit' ),
219 + __( 'Kit', 'convertkit' ),
125 220 __( 'Broadcasts', 'convertkit' ),
126 221 __( 'Posts', 'convertkit' ),
127 222 ),
128 223
129 224 // Function to call when rendering as a block or a shortcode on the frontend web site.
130 - 'render_callback' => array( $this, 'render' ),
225 + 'render_callback' => array( $this, 'render' ),
131 226
132 227 // Shortcode: TinyMCE / QuickTags Modal Width and Height.
133 - 'modal' => array(
228 + 'modal' => array(
134 229 'width' => 650,
135 - 'height' => 405,
230 + 'height' => 455,
136 231 ),
137 232
138 233 // Shortcode: Include a closing [/shortcode] tag when using TinyMCE or QuickTag Modals.
139 - 'shortcode_include_closing_tag' => false,
234 + 'shortcode_include_closing_tag' => false,
140 235
141 236 // Gutenberg: Block Icon in Editor.
142 - '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' ),
143 238
144 239 // Gutenberg: Example image showing how this block looks when choosing it in Gutenberg.
145 - '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',
146 241
147 - // Gutenberg: Help description, displayed when no Posts exist.
148 - 'gutenberg_help_description' => __( 'No Broadcasts exist in ConvertKit. Send your first Broadcast in ConvertKit to see the link to it here.', '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' ),
248 + ),
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' ),
254 + ),
149 255
150 - // Gutenberg: JS function to call when rendering the block preview in the Gutenberg editor.
151 - // If not defined, render_callback above will be used.
152 - 'gutenberg_preview_render_callback' => 'convertKitGutenbergBroadcastsBlockRenderPreview',
153 -
154 - // Flag to determine if Broadcasts exist.
155 - 'has_posts' => $posts->exist(),
256 + // Whether an API Key exists in the Plugin, and are the required resources (broadcasts) available.
257 + // If no API Key is specified in the Plugin's settings, render the "No API Key" output.
258 + 'has_access_token' => $settings->has_access_and_refresh_token(),
259 + 'has_resources' => $posts->exist(),
156 260 );
157 261
158 262 }
159 263
@@ -169,8 +273,12 @@
169 273 'display_grid' => array(
170 274 'type' => 'boolean',
171 275 'default' => $this->get_default_value( 'display_grid' ),
172 276 ),
277 + 'display_order' => array(
278 + 'type' => 'string',
279 + 'default' => $this->get_default_value( 'display_order' ),
280 + ),
173 281 'date_format' => array(
174 282 'type' => 'string',
175 283 'default' => $this->get_default_value( 'date_format' ),
176 284 ),
@@ -210,9 +318,9 @@
210 318 'type' => 'string',
211 319 'default' => $this->get_default_value( 'paginate_label_next' ),
212 320 ),
213 321
214 - // get_supports() color attribute.
322 + // get_supports() style, color and typography attributes.
215 323 'style' => array(
216 324 'type' => 'object',
217 325 ),
218 326 'backgroundColor' => array(
@@ -220,8 +328,11 @@
220 328 ),
221 329 'textColor' => array(
222 330 'type' => 'string',
223 331 ),
332 + 'fontSize' => array(
333 + 'type' => 'string',
334 + ),
224 335
225 336 // Always required for Gutenberg.
226 337 'is_gutenberg_example' => array(
227 338 'type' => 'boolean',
@@ -240,14 +351,22 @@
240 351 */
241 352 public function get_supports() {
242 353
243 354 return array(
244 - 'className' => true,
245 - 'color' => array(
355 + 'className' => true,
356 + 'color' => array(
246 357 'link' => true,
247 358 'background' => true,
248 359 'text' => true,
249 360 ),
361 + 'typography' => array(
362 + 'fontSize' => true,
363 + 'lineHeight' => true,
364 + ),
365 + 'spacing' => array(
366 + 'margin' => true,
367 + 'padding' => true,
368 + ),
250 369 );
251 370
252 371 }
253 372
@@ -259,13 +378,8 @@
259 378 * @return bool|array
260 379 */
261 380 public function get_fields() {
262 381
263 - // Bail if the request is not for the WordPress Administration or frontend editor.
264 - if ( ! WP_ConvertKit()->is_admin_or_frontend_editor() ) {
265 - return false;
266 - }
267 -
268 382 return array(
269 383 'display_grid' => array(
270 384 'label' => __( 'Display as grid', 'convertkit' ),
271 385 'type' => 'toggle',
@@ -270,8 +384,16 @@
270 384 'label' => __( 'Display as grid', 'convertkit' ),
271 385 'type' => 'toggle',
272 386 'description' => __( 'If enabled, displays broadcasts in a grid, instead of a list.', 'convertkit' ),
273 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 + ),
274 396 'date_format' => array(
275 397 'label' => __( 'Date format', 'convertkit' ),
276 398 'type' => 'select',
277 399 'values' => array(
@@ -296,8 +418,12 @@
296 418 'read_more_label' => array(
297 419 'label' => __( 'Read more label', 'convertkit' ),
298 420 'type' => 'text',
299 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 + ),
300 426 ),
301 427 'limit' => array(
302 428 'label' => __( 'Number of posts', 'convertkit' ),
303 429 'type' => 'number',
@@ -313,13 +439,21 @@
313 439 'paginate_label_prev' => array(
314 440 'label' => __( 'Newer posts label', 'convertkit' ),
315 441 'type' => 'text',
316 442 'description' => __( 'The label to display for the link to newer broadcasts.', 'convertkit' ),
443 + 'display_if' => array(
444 + 'key' => 'paginate',
445 + 'value' => 1,
446 + ),
317 447 ),
318 448 'paginate_label_next' => array(
319 449 'label' => __( 'Older posts label', 'convertkit' ),
320 450 'type' => 'text',
321 451 'description' => __( 'The label to display for the link to older broadcasts.', 'convertkit' ),
452 + 'display_if' => array(
453 + 'key' => 'paginate',
454 + 'value' => 1,
455 + ),
322 456 ),
323 457
324 458 // These fields will only display on the shortcode, and are deliberately not registered in get_attributes(),
325 459 // because Gutenberg will register its own color pickers for link, background and text.
@@ -347,18 +481,14 @@
347 481 * @return bool|array
348 482 */
349 483 public function get_panels() {
350 484
351 - // Bail if the request is not for the WordPress Administration or frontend editor.
352 - if ( ! WP_ConvertKit()->is_admin_or_frontend_editor() ) {
353 - return false;
354 - }
355 -
356 485 return array(
357 486 'general' => array(
358 487 'label' => __( 'General', 'convertkit' ),
359 488 'fields' => array(
360 489 'display_grid',
490 + 'display_order',
361 491 'date_format',
362 492 'display_image',
363 493 'display_description',
364 494 'display_read_more',
@@ -396,8 +526,9 @@
396 526 public function get_default_values() {
397 527
398 528 return array(
399 529 'display_grid' => false,
530 + 'display_order' => 'date-broadcast',
400 531 'date_format' => 'F j, Y',
401 532 'display_image' => false,
402 533 'display_description' => false,
403 534 'display_read_more' => false,
@@ -425,10 +556,10 @@
425 556 * Returns the block's output, based on the supplied configuration attributes.
426 557 *
427 558 * @since 1.9.7.4
428 559 *
429 - * @param array $atts Block / Shortcode Attributes.
430 - * @return string Output
560 + * @param array $atts Block / Shortcode / Page Builder Module Attributes.
561 + * @return string
431 562 */
432 563 public function render( $atts ) {
433 564
434 565 // Parse attributes, defining fallback defaults if required
@@ -440,19 +571,12 @@
440 571
441 572 // Fetch Posts.
442 573 $posts = new ConvertKit_Resource_Posts( 'output_broadcasts' );
443 574
444 - // If this is an admin request, refresh the Posts resource now from the API,
445 - // as it's an inexpensive query of ~ 0.5 seconds when we're editing a Page
446 - // containing this block.
447 - if ( function_exists( 'is_admin' ) && is_admin() ) {
448 - $posts->refresh();
449 - }
450 -
451 575 // If no Posts exist, bail.
452 576 if ( ! $posts->exist() ) {
453 577 if ( $settings->debug_enabled() ) {
454 - return '<!-- ' . __( 'No Broadcasts exist in ConvertKit.', 'convertkit' ) . ' -->';
578 + return '<!-- ' . __( 'No Broadcasts exist in Kit.', 'convertkit' ) . ' -->';
455 579 }
456 580
457 581 return '';
458 582 }
@@ -457,9 +581,29 @@
457 581 return '';
458 582 }
459 583
460 584 // Build HTML.
461 - $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 + }
462 606
463 607 /**
464 608 * Filter the block's content immediately before it is output.
465 609 *
@@ -464,10 +608,10 @@
464 608 * Filter the block's content immediately before it is output.
465 609 *
466 610 * @since 1.9.7.4
467 611 *
468 - * @param string $html ConvertKit Broadcasts HTML.
469 - * @param array $atts Block Attributes.
612 + * @param string $html ConvertKit Broadcasts HTML.
613 + * @param array $atts Block Attributes.
470 614 */
471 615 $html = apply_filters( 'convertkit_block_broadcasts_render', $html, $atts );
472 616
473 617 return $html;
@@ -478,27 +622,27 @@
478 622 * Returns the block's output, based on the supplied configuration attributes,
479 623 * when requested via AJAX.
480 624 *
481 625 * @since 1.9.7.6
626 + *
627 + * @param WP_REST_Request $request The REST request.
628 + * @return string
482 629 */
483 - public function render_ajax() {
630 + public function render_ajax( $request ) {
484 631
485 - // Check nonce.
486 - check_ajax_referer( 'convertkit-broadcasts', 'nonce' );
487 -
488 632 // Build attributes array.
489 633 $atts = array(
490 - 'date_format' => stripslashes( sanitize_text_field( $_REQUEST['date_format'] ) ),
491 - 'display_image' => absint( $_REQUEST['display_image'] ),
492 - 'display_description' => absint( $_REQUEST['display_description'] ),
493 - 'display_read_more' => absint( $_REQUEST['display_read_more'] ),
494 - 'read_more_label' => stripslashes( sanitize_text_field( $_REQUEST['read_more_label'] ) ),
495 - 'limit' => absint( $_REQUEST['limit'] ),
496 - 'page' => absint( $_REQUEST['page'] ),
497 - 'paginate' => absint( $_REQUEST['paginate'] ),
498 - 'paginate_label_next' => stripslashes( sanitize_text_field( $_REQUEST['paginate_label_next'] ) ),
499 - 'paginate_label_prev' => stripslashes( sanitize_text_field( $_REQUEST['paginate_label_prev'] ) ),
500 - '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' ),
501 645 );
502 646
503 647 // Parse attributes, defining fallback defaults if required
504 648 // and moving some attributes (such as Gutenberg's styles), if defined.
@@ -503,11 +647,23 @@
503 647 // Parse attributes, defining fallback defaults if required
504 648 // and moving some attributes (such as Gutenberg's styles), if defined.
505 649 $atts = $this->sanitize_and_declare_atts( $atts );
506 650
651 + // Setup Settings class.
652 + $settings = new ConvertKit_Settings();
653 +
507 654 // Fetch Posts.
508 655 $posts = new ConvertKit_Resource_Posts( 'output_broadcasts' );
509 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 +
510 666 // Build HTML.
511 667 $html = $this->build_html( $posts, $atts, false );
512 668
513 669 /**
@@ -520,10 +676,9 @@
520 676 * @param array $atts Block Attributes.
521 677 */
522 678 $html = apply_filters( 'convertkit_block_broadcasts_render_ajax', $html, $atts );
523 679
524 - // Send HTML as response.
525 - wp_send_json_success( $html );
680 + return $html;
526 681
527 682 }
528 683
529 684 /**
@@ -534,11 +689,13 @@
534 689 *
535 690 * @param ConvertKit_Resource_Posts $posts ConvertKit Posts Resource class.
536 691 * @param array $atts Block attributes.
537 692 * @param bool $include_container Include container div in HTML.
538 - * @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
539 696 */
540 - 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() ) {
541 698
542 699 // Get paginated subset of Posts.
543 700 $broadcasts = $posts->get_paginated_subset( $atts['page'], $atts['limit'] );
544 701
@@ -549,9 +706,9 @@
549 706 $html = '';
550 707
551 708 // Include container, if required.
552 709 if ( $include_container ) {
553 - $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 ) . '>';
554 711 }
555 712
556 713 // Start list.
557 714 $html .= '<ul class="convertkit-broadcasts-list">';