← All changes
|
includes/blocks/class-convertkit-block-broadcasts.php
+251
-84
2.2.4
→
3.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' => 580, | |
| 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,27 +481,33 @@ | ||
| 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 | - 'general' => array( | |
| 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', |
| 365 | 495 | 'read_more_label', |
| 496 | + ), | |
| 497 | + ), | |
| 498 | + 'pagination' => array( | |
| 499 | + 'label' => __( 'Pagination', 'convertkit' ), | |
| 500 | + 'fields' => array( | |
| 366 | 501 | 'limit', |
| 367 | 502 | 'paginate', |
| 368 | 503 | 'paginate_label_prev', |
| 369 | 504 | 'paginate_label_next', |
| 505 | + ), | |
| 506 | + ), | |
| 507 | + 'styles' => array( | |
| 508 | + 'label' => __( 'Styles', 'convertkit' ), | |
| 509 | + 'fields' => array( | |
| 370 | 510 | 'link_color', |
| 371 | 511 | 'background_color', |
| 372 | 512 | 'text_color', |
| 373 | 513 | ), |
| @@ -386,8 +526,9 @@ | ||
| 386 | 526 | public function get_default_values() { |
| 387 | 527 | |
| 388 | 528 | return array( |
| 389 | 529 | 'display_grid' => false, |
| 530 | + 'display_order' => 'date-broadcast', | |
| 390 | 531 | 'date_format' => 'F j, Y', |
| 391 | 532 | 'display_image' => false, |
| 392 | 533 | 'display_description' => false, |
| 393 | 534 | 'display_read_more' => false, |
| @@ -415,10 +556,10 @@ | ||
| 415 | 556 | * Returns the block's output, based on the supplied configuration attributes. |
| 416 | 557 | * |
| 417 | 558 | * @since 1.9.7.4 |
| 418 | 559 | * |
| 419 | - * @param array $atts Block / Shortcode Attributes. | |
| 420 | - * @return string Output | |
| 560 | + * @param array $atts Block / Shortcode / Page Builder Module Attributes. | |
| 561 | + * @return string | |
| 421 | 562 | */ |
| 422 | 563 | public function render( $atts ) { |
| 423 | 564 | |
| 424 | 565 | // Parse attributes, defining fallback defaults if required |
| @@ -430,19 +571,12 @@ | ||
| 430 | 571 | |
| 431 | 572 | // Fetch Posts. |
| 432 | 573 | $posts = new ConvertKit_Resource_Posts( 'output_broadcasts' ); |
| 433 | 574 | |
| 434 | - // If this is an admin request, refresh the Posts resource now from the API, | |
| 435 | - // as it's an inexpensive query of ~ 0.5 seconds when we're editing a Page | |
| 436 | - // containing this block. | |
| 437 | - if ( function_exists( 'is_admin' ) && is_admin() ) { | |
| 438 | - $posts->refresh(); | |
| 439 | - } | |
| 440 | - | |
| 441 | 575 | // If no Posts exist, bail. |
| 442 | 576 | if ( ! $posts->exist() ) { |
| 443 | 577 | if ( $settings->debug_enabled() ) { |
| 444 | - return '<!-- ' . __( 'No Broadcasts exist in ConvertKit.', 'convertkit' ) . ' -->'; | |
| 578 | + return '<!-- ' . __( 'No Broadcasts exist in Kit.', 'convertkit' ) . ' -->'; | |
| 445 | 579 | } |
| 446 | 580 | |
| 447 | 581 | return ''; |
| 448 | 582 | } |
| @@ -447,9 +581,29 @@ | ||
| 447 | 581 | return ''; |
| 448 | 582 | } |
| 449 | 583 | |
| 450 | 584 | // Build HTML. |
| 451 | - $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 | + } | |
| 452 | 606 | |
| 453 | 607 | /** |
| 454 | 608 | * Filter the block's content immediately before it is output. |
| 455 | 609 | * |
| @@ -454,10 +608,10 @@ | ||
| 454 | 608 | * Filter the block's content immediately before it is output. |
| 455 | 609 | * |
| 456 | 610 | * @since 1.9.7.4 |
| 457 | 611 | * |
| 458 | - * @param string $html ConvertKit Broadcasts HTML. | |
| 459 | - * @param array $atts Block Attributes. | |
| 612 | + * @param string $html ConvertKit Broadcasts HTML. | |
| 613 | + * @param array $atts Block Attributes. | |
| 460 | 614 | */ |
| 461 | 615 | $html = apply_filters( 'convertkit_block_broadcasts_render', $html, $atts ); |
| 462 | 616 | |
| 463 | 617 | return $html; |
| @@ -468,27 +622,27 @@ | ||
| 468 | 622 | * Returns the block's output, based on the supplied configuration attributes, |
| 469 | 623 | * when requested via AJAX. |
| 470 | 624 | * |
| 471 | 625 | * @since 1.9.7.6 |
| 626 | + * | |
| 627 | + * @param WP_REST_Request $request The REST request. | |
| 628 | + * @return string | |
| 472 | 629 | */ |
| 473 | - public function render_ajax() { | |
| 630 | + public function render_ajax( $request ) { | |
| 474 | 631 | |
| 475 | - // Check nonce. | |
| 476 | - check_ajax_referer( 'convertkit-broadcasts', 'nonce' ); | |
| 477 | - | |
| 478 | 632 | // Build attributes array. |
| 479 | 633 | $atts = array( |
| 480 | - 'date_format' => stripslashes( sanitize_text_field( $_REQUEST['date_format'] ) ), | |
| 481 | - 'display_image' => absint( $_REQUEST['display_image'] ), | |
| 482 | - 'display_description' => absint( $_REQUEST['display_description'] ), | |
| 483 | - 'display_read_more' => absint( $_REQUEST['display_read_more'] ), | |
| 484 | - 'read_more_label' => stripslashes( sanitize_text_field( $_REQUEST['read_more_label'] ) ), | |
| 485 | - 'limit' => absint( $_REQUEST['limit'] ), | |
| 486 | - 'page' => absint( $_REQUEST['page'] ), | |
| 487 | - 'paginate' => absint( $_REQUEST['paginate'] ), | |
| 488 | - 'paginate_label_next' => stripslashes( sanitize_text_field( $_REQUEST['paginate_label_next'] ) ), | |
| 489 | - 'paginate_label_prev' => stripslashes( sanitize_text_field( $_REQUEST['paginate_label_prev'] ) ), | |
| 490 | - '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' ), | |
| 491 | 645 | ); |
| 492 | 646 | |
| 493 | 647 | // Parse attributes, defining fallback defaults if required |
| 494 | 648 | // and moving some attributes (such as Gutenberg's styles), if defined. |
| @@ -493,11 +647,23 @@ | ||
| 493 | 647 | // Parse attributes, defining fallback defaults if required |
| 494 | 648 | // and moving some attributes (such as Gutenberg's styles), if defined. |
| 495 | 649 | $atts = $this->sanitize_and_declare_atts( $atts ); |
| 496 | 650 | |
| 651 | + // Setup Settings class. | |
| 652 | + $settings = new ConvertKit_Settings(); | |
| 653 | + | |
| 497 | 654 | // Fetch Posts. |
| 498 | 655 | $posts = new ConvertKit_Resource_Posts( 'output_broadcasts' ); |
| 499 | 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 | + | |
| 500 | 666 | // Build HTML. |
| 501 | 667 | $html = $this->build_html( $posts, $atts, false ); |
| 502 | 668 | |
| 503 | 669 | /** |
| @@ -510,10 +676,9 @@ | ||
| 510 | 676 | * @param array $atts Block Attributes. |
| 511 | 677 | */ |
| 512 | 678 | $html = apply_filters( 'convertkit_block_broadcasts_render_ajax', $html, $atts ); |
| 513 | 679 | |
| 514 | - // Send HTML as response. | |
| 515 | - wp_send_json_success( $html ); | |
| 680 | + return $html; | |
| 516 | 681 | |
| 517 | 682 | } |
| 518 | 683 | |
| 519 | 684 | /** |
| @@ -524,11 +689,13 @@ | ||
| 524 | 689 | * |
| 525 | 690 | * @param ConvertKit_Resource_Posts $posts ConvertKit Posts Resource class. |
| 526 | 691 | * @param array $atts Block attributes. |
| 527 | 692 | * @param bool $include_container Include container div in HTML. |
| 528 | - * @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 | |
| 529 | 696 | */ |
| 530 | - 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() ) { | |
| 531 | 698 | |
| 532 | 699 | // Get paginated subset of Posts. |
| 533 | 700 | $broadcasts = $posts->get_paginated_subset( $atts['page'], $atts['limit'] ); |
| 534 | 701 | |
| @@ -539,9 +706,9 @@ | ||
| 539 | 706 | $html = ''; |
| 540 | 707 | |
| 541 | 708 | // Include container, if required. |
| 542 | 709 | if ( $include_container ) { |
| 543 | - $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 ) . '>'; | |
| 544 | 711 | } |
| 545 | 712 | |
| 546 | 713 | // Start list. |
| 547 | 714 | $html .= '<ul class="convertkit-broadcasts-list">'; |