PluginProbe
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages / 3.3.4
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages v3.3.4
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 2.3.2 2.3.3 All 194 releases
convertkit / admin / class-convertkit-admin-post.php

class-convertkit-admin-post.php in Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages 3.3.4, at admin/class-convertkit-admin-post.php

355 lines 10.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * ConvertKit Admin Post class.
4 *
5 * @package ConvertKit
6 * @author ConvertKit
7 */
8
9 /**
10 * Registers a metabox on Posts, Pages and public facing Custom Post Types
11 * that do not use the block editor, saving settings when the Post is saved
12 * in the WordPress Administration interface.
13 *
14 * @package ConvertKit
15 * @author ConvertKit
16 */
17 class ConvertKit_Admin_Post {
18
19 /**
20 * Registers action and filter hooks.
21 *
22 * @since 1.9.6
23 */
24 public function __construct() {
25
26 // Register "Add New" Kit button on Pages.
27 add_filter( 'views_edit-page', array( $this, 'output_wp_list_table_buttons' ) );
28
29 add_action( 'post_submitbox_misc_actions', array( $this, 'output_pre_publish_actions' ) );
30 add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ), 10, 2 );
31 add_action( 'save_post', array( $this, 'save_post_meta' ) );
32
33 }
34
35 /**
36 * Registers 'Add New' buttons for the given Post Type's admin screen.
37 *
38 * If no options are registered, no button is displayed.
39 *
40 * JS will move this button to be displayed next to the "Add New" button when viewing the table of Pages or Posts,
41 * as there is not a native WordPress action/filter for registering buttons next to the "Add New" button.
42 *
43 * @since 2.5.5
44 *
45 * @param array $views Views.
46 * @return array Views
47 */
48 public function output_wp_list_table_buttons( $views ) {
49
50 // Get current post type that we're viewing.
51 $post_type = $this->get_current_post_type();
52
53 // Don't output any buttons if we couldn't determine the current post type.
54 if ( ! $post_type ) {
55 return $views;
56 }
57
58 // Define a blank array of buttons to be filtered.
59 $buttons = array();
60
61 /**
62 * Registers 'Add New' buttons for the given Post Type's admin screen.
63 *
64 * @since 2.5.5
65 *
66 * @param array $buttons Buttons.
67 * @param string $post_type Post Type.
68 */
69 $buttons = apply_filters( 'convertkit_admin_post_register_add_new_buttons', $buttons, $post_type );
70
71 // Bail if no buttons are registered for display.
72 if ( ! count( $buttons ) ) {
73 return $views;
74 }
75
76 // Enqueue JS and CSS.
77 wp_enqueue_script( 'convertkit-admin-wp-list-table-buttons', CONVERTKIT_PLUGIN_URL . 'resources/backend/js/wp-list-table-buttons.js', array( 'jquery' ), CONVERTKIT_PLUGIN_VERSION, true );
78 wp_enqueue_style( 'convertkit-admin-wp-list-table-buttons', CONVERTKIT_PLUGIN_URL . 'resources/backend/css/wp-list-table-buttons.css', array(), CONVERTKIT_PLUGIN_VERSION );
79
80 // Build buttons HTML.
81 $html = '';
82 foreach ( $buttons as $button_name => $button ) {
83 $html .= sprintf(
84 '<a href="%s">%s</a>',
85 esc_attr( $button['url'] ),
86 esc_html( $button['label'] )
87 );
88 }
89
90 // Register an 'Add New' dropdown button, with buttons HTML.
91 $views['convertkit'] = sprintf(
92 '<span class="convertkit-action page-title-action hidden">%s<span class="convertkit-actions hidden">%s</span></span>',
93 __( 'Add New', 'convertkit' ),
94 $html
95 );
96
97 return $views;
98
99 }
100
101 /**
102 * Enqueue JavaScript when editing a Page, Post or Custom Post Type that outputs
103 * ConvertKit Plugin settings.
104 *
105 * @since 1.9.6.4
106 */
107 public function enqueue_scripts() {
108
109 // Enqueue Select2 JS.
110 convertkit_select2_enqueue_scripts();
111
112 /**
113 * Enqueue JavaScript when editing a Page, Post or Custom Post Type that outputs
114 * ConvertKit Plugin settings.
115 *
116 * @since 1.9.6.4
117 */
118 do_action( 'convertkit_admin_post_enqueue_scripts' );
119
120 }
121
122 /**
123 * Enqueue CSS when editing a Page, Post or Custom Post Type that outputs
124 * ConvertKit Plugin settings.
125 *
126 * @since 1.9.6.4
127 */
128 public function enqueue_styles() {
129
130 // Enqueue Select2 CSS.
131 convertkit_select2_enqueue_styles();
132
133 // Enqueue Post CSS.
134 wp_enqueue_style( 'convertkit-post', CONVERTKIT_PLUGIN_URL . 'resources/backend/css/post.css', array(), CONVERTKIT_PLUGIN_VERSION );
135
136 // Enqueue Refresh Resources CSS.
137 wp_enqueue_style( 'convertkit-admin-refresh-resources', CONVERTKIT_PLUGIN_URL . 'resources/backend/css/refresh-resources.css', array(), CONVERTKIT_PLUGIN_VERSION );
138
139 /**
140 * Enqueue CSS for the Settings Screen at Settings > Kit
141 *
142 * @since 1.9.6.4
143 */
144 do_action( 'convertkit_admin_post_enqueue_styles' );
145
146 }
147
148 /**
149 * Registers actions in the pre-publish actions section of the Publish metabox
150 * in the Classic Editor.
151 *
152 * @since 2.4.0
153 *
154 * @param WP_Post $post WordPress Post.
155 */
156 public function output_pre_publish_actions( $post ) {
157
158 // Bail if no actions registered.
159 $pre_publish_actions = convertkit_get_pre_publish_actions();
160 if ( ! count( $pre_publish_actions ) ) {
161 return;
162 }
163
164 // Bail if Post is not a supported Post Type.
165 if ( get_post_type( $post ) !== 'post' ) {
166 return;
167 }
168
169 // Bail if Post is not a draft.
170 if ( ! in_array( $post->post_status, array( 'draft', 'auto-draft' ), true ) ) {
171 return;
172 }
173
174 // Load pre-publish actions view.
175 include CONVERTKIT_PLUGIN_PATH . '/views/backend/post/pre-publish-actions.php';
176
177 }
178
179 /**
180 * Adds a meta box for the given Post Type.
181 *
182 * @since 1.9.6
183 *
184 * @param string $post_type Post Type.
185 * @param WP_Post $post Post.
186 */
187 public function add_meta_boxes( $post_type, $post ) {
188
189 // Don't register the meta box if this Post Type isn't supported.
190 $supported_post_types = convertkit_get_supported_post_types();
191 if ( ! in_array( $post_type, $supported_post_types, true ) ) {
192 return;
193 }
194
195 // Don't register the meta box if the block editor is being used, as register_post_meta() handles saving post meta.
196 if ( function_exists( 'use_block_editor_for_post' ) && use_block_editor_for_post( $post ) ) {
197 return;
198 }
199
200 // Register Meta Box.
201 add_meta_box( 'wp-convertkit-meta-box', __( 'Kit', 'convertkit' ), array( $this, 'display_meta_box' ), $post_type, 'normal' );
202
203 // Enqueue JS and CSS.
204 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
205 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_styles' ) );
206
207 }
208
209 /**
210 * Outputs the meta box.
211 *
212 * @since 1.9.6
213 *
214 * @param WP_Post $post The Post being edited.
215 */
216 public function display_meta_box( $post ) {
217
218 // Don't register the meta box if this Post is the blog archive page.
219 if ( $post->ID === get_option( 'page_for_posts' ) ) {
220 return;
221 }
222
223 // Show a warning if the API credentials haven't been set.
224 $settings = new ConvertKit_Settings();
225 if ( ! $settings->has_access_and_refresh_token() ) {
226 $post_type = get_post_type_object( $post->post_type );
227 $api = new ConvertKit_API_V4( CONVERTKIT_OAUTH_CLIENT_ID, CONVERTKIT_OAUTH_CLIENT_REDIRECT_URI );
228 include CONVERTKIT_PLUGIN_PATH . '/views/backend/post/no-api-key.php';
229 return;
230 }
231
232 // Initialize Restrict Content Settings class.
233 $restrict_content_settings = new ConvertKit_Settings_Restrict_Content();
234
235 // Fetch Post Settings, Forms, Landing Pages and Tags.
236 $convertkit_post = new ConvertKit_Post( $post->ID );
237 $convertkit_forms = new ConvertKit_Resource_Forms();
238
239 $convertkit_landing_pages = new ConvertKit_Resource_Landing_Pages();
240 $convertkit_products = new ConvertKit_Resource_Products();
241 $convertkit_tags = new ConvertKit_Resource_Tags();
242
243 // Get settings page link.
244 $settings_link = convertkit_get_settings_link();
245
246 // Load metabox view.
247 include CONVERTKIT_PLUGIN_PATH . '/views/backend/post/meta-box.php';
248
249 }
250
251 /**
252 * Saves Post Settings when either editing a Post/Page or using the Quick Edit functionality.
253 *
254 * @since 1.9.6
255 *
256 * @param int $post_id Post ID.
257 */
258 public function save_post_meta( $post_id ) {
259
260 // Bail if this is an autosave.
261 if ( wp_is_post_autosave( $post_id ) ) {
262 return;
263 }
264
265 // Bail if this is a post revision.
266 if ( wp_is_post_revision( $post_id ) ) {
267 return;
268 }
269
270 // Bail if no nonce field exists.
271 if ( ! isset( $_POST['wp-convertkit-save-meta-nonce'] ) ) {
272 return;
273 }
274
275 // Bail if the nonce verification fails.
276 if ( ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['wp-convertkit-save-meta-nonce'] ) ), 'wp-convertkit-save-meta' ) ) {
277 return;
278 }
279
280 // Bail if no ConvertKit settings were posted.
281 if ( ! isset( $_POST['wp-convertkit'] ) ) {
282 return;
283 }
284
285 // Save Post's settings.
286 $this->save_post_settings( $post_id, wp_unslash( $_POST['wp-convertkit'] ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
287
288 }
289
290 /**
291 * Saves the Post's settings submitted via $_POST or $_REQUEST.
292 * Can be used across Edit, Quick Edit and Bulk Edit.
293 *
294 * @since 1.9.8.0
295 *
296 * @param int $post_id Post ID.
297 * @param array $settings Settings.
298 */
299 public function save_post_settings( $post_id, $settings ) {
300
301 // Get Post's settings.
302 $convertkit_post = new ConvertKit_Post( $post_id );
303 $meta = $convertkit_post->get();
304
305 // Update Post's setting values if they were included in the $_POST data.
306 // Some values may not be included in the $_POST data e.g. if Quick Edit is used and no Landing Page was specified,
307 // in which case the existing Post's value will be used.
308 // This ensures settings are not deleted by accident.
309 foreach ( $meta as $key => $existing_value ) {
310 // Skip if this setting isn't included in the $_POST data.
311 if ( ! isset( $settings[ $key ] ) ) {
312 continue;
313 }
314
315 // Sanitize value.
316 $new_value = sanitize_text_field( $settings[ $key ] );
317
318 // Skip if the setting value is -2, as this means it's a Bulk Edit request and this setting
319 // is set as 'No Change'.
320 if ( $new_value == '-2' ) { // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
321 continue;
322 }
323
324 // Update setting using posted value.
325 $meta[ $key ] = $new_value;
326 }
327
328 // Save settings.
329 $convertkit_post->save( $meta );
330
331 // If a Form or Landing Page was specified, request a review.
332 // This can safely be called multiple times, as the review request
333 // class will ensure once a review request is dismissed by the user,
334 // it is never displayed again.
335 if ( $meta['form'] || $meta['landing_page'] ) {
336 WP_ConvertKit()->get_class( 'review_request' )->request_review();
337 }
338
339 }
340
341 /**
342 * Get the current post type based on the screen that is viewed.
343 *
344 * @since 2.5.5
345 *
346 * @return bool|string
347 */
348 private function get_current_post_type() {
349
350 return convertkit_get_current_screen( 'post_type' );
351
352 }
353
354 }
355