PluginProbe
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages / 2.5.7
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages v2.5.7
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 2.3.2 All 195 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 2.5.7, at admin/class-convertkit-admin-post.php

354 lines 9.7 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 * and saves its settings when the Post is saved in the WordPress Administration
12 * 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" ConvertKit 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' ) );
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 /**
137 * Enqueue CSS for the Settings Screen at Settings > ConvertKit
138 *
139 * @since 1.9.6.4
140 */
141 do_action( 'convertkit_admin_post_enqueue_styles' );
142
143 }
144
145 /**
146 * Registers actions in the pre-publish actions section of the Publish metabox
147 * in the Classic Editor.
148 *
149 * @since 2.4.0
150 *
151 * @param WP_Post $post WordPress Post.
152 */
153 public function output_pre_publish_actions( $post ) {
154
155 // Bail if no actions registered.
156 $pre_publish_actions = convertkit_get_pre_publish_actions();
157 if ( ! count( $pre_publish_actions ) ) {
158 return;
159 }
160
161 // Bail if Post is not a supported Post Type.
162 if ( get_post_type( $post ) !== 'post' ) {
163 return;
164 }
165
166 // Bail if Post is not a draft.
167 if ( ! in_array( $post->post_status, array( 'draft', 'auto-draft' ), true ) ) {
168 return;
169 }
170
171 // Load pre-publish actions view.
172 include CONVERTKIT_PLUGIN_PATH . '/views/backend/post/pre-publish-actions.php';
173
174 }
175
176 /**
177 * Adds a meta box for the given Post Type.
178 *
179 * @since 1.9.6
180 *
181 * @param string $post_type Post Type.
182 */
183 public function add_meta_boxes( $post_type ) {
184
185 // Don't register the meta box if this Post Type isn't supported.
186 $supported_post_types = convertkit_get_supported_post_types();
187 if ( ! in_array( $post_type, $supported_post_types, true ) ) {
188 return;
189 }
190
191 // Register Meta Box.
192 add_meta_box( 'wp-convertkit-meta-box', __( 'ConvertKit', 'convertkit' ), array( $this, 'display_meta_box' ), $post_type, 'normal' );
193
194 // Enqueue JS and CSS.
195 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
196 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_styles' ) );
197
198 }
199
200 /**
201 * Outputs the meta box.
202 *
203 * @since 1.9.6
204 *
205 * @param WP_Post $post The Post being edited.
206 */
207 public function display_meta_box( $post ) {
208
209 // Don't register the meta box if this Post is the blog archive page.
210 if ( $post->ID === get_option( 'page_for_posts' ) ) {
211 return;
212 }
213
214 // Show a warning if the API credentials haven't been set.
215 $settings = new ConvertKit_Settings();
216 if ( ! $settings->has_access_and_refresh_token() ) {
217 $post_type = get_post_type_object( $post->post_type );
218 $api = new ConvertKit_API_V4( CONVERTKIT_OAUTH_CLIENT_ID, CONVERTKIT_OAUTH_CLIENT_REDIRECT_URI );
219 include CONVERTKIT_PLUGIN_PATH . '/views/backend/post/no-api-key.php';
220 return;
221 }
222
223 // Initialize Restrict Content Settings class.
224 $restrict_content_settings = new ConvertKit_Settings_Restrict_Content();
225
226 // Fetch Post Settings, Forms, Landing Pages and Tags.
227 $convertkit_post = new ConvertKit_Post( $post->ID );
228 $convertkit_forms = new ConvertKit_Resource_Forms();
229 $convertkit_landing_pages = new ConvertKit_Resource_Landing_Pages();
230 $convertkit_products = new ConvertKit_Resource_Products();
231 $convertkit_tags = new ConvertKit_Resource_Tags();
232
233 // Get settings page link.
234 $settings_link = convertkit_get_settings_link();
235
236 // Load metabox view.
237 include CONVERTKIT_PLUGIN_PATH . '/views/backend/post/meta-box.php';
238
239 }
240
241 /**
242 * Saves Post Settings when either editing a Post/Page or using the Quick Edit functionality.
243 *
244 * @since 1.9.6
245 *
246 * @param int $post_id Post ID.
247 */
248 public function save_post_meta( $post_id ) {
249
250 // Bail if this is an autosave.
251 if ( wp_is_post_autosave( $post_id ) ) {
252 return;
253 }
254
255 // Bail if this is a post revision.
256 if ( wp_is_post_revision( $post_id ) ) {
257 return;
258 }
259
260 // Bail if no nonce field exists.
261 if ( ! isset( $_POST['wp-convertkit-save-meta-nonce'] ) ) {
262 return;
263 }
264
265 // Bail if the nonce verification fails.
266 if ( ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['wp-convertkit-save-meta-nonce'] ) ), 'wp-convertkit-save-meta' ) ) {
267 return;
268 }
269
270 // Bail if no ConvertKit settings were posted.
271 if ( ! isset( $_POST['wp-convertkit'] ) ) {
272 return;
273 }
274
275 // Save Post's settings.
276 $this->save_post_settings( $post_id, $_POST['wp-convertkit'] );
277
278 }
279
280 /**
281 * Saves the Post's settings submitted via $_POST or $_REQUEST.
282 * Can be used across Edit, Quick Edit and Bulk Edit.
283 *
284 * @since 1.9.8.0
285 *
286 * @param int $post_id Post ID.
287 * @param array $settings Settings.
288 */
289 public function save_post_settings( $post_id, $settings ) {
290
291 // Get Post's settings.
292 $convertkit_post = new ConvertKit_Post( $post_id );
293 $meta = $convertkit_post->get();
294
295 // Update Post's setting values if they were included in the $_POST data.
296 // Some values may not be included in the $_POST data e.g. if Quick Edit is used and no Landing Page was specified,
297 // in which case the existing Post's value will be used.
298 // This ensures settings are not deleted by accident.
299 foreach ( $meta as $key => $existing_value ) {
300 // Skip if this setting isn't included in the $_POST data.
301 if ( ! isset( $settings[ $key ] ) ) {
302 continue;
303 }
304
305 // Sanitize value.
306 $new_value = sanitize_text_field( wp_unslash( $settings[ $key ] ) );
307
308 // Skip if the setting value is -2, as this means it's a Bulk Edit request and this setting
309 // is set as 'No Change'.
310 if ( $new_value == '-2' ) { // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
311 continue;
312 }
313
314 // Update setting using posted value.
315 $meta[ $key ] = $new_value;
316 }
317
318 // Save settings.
319 $convertkit_post->save( $meta );
320
321 // If a Form or Landing Page was specified, request a review.
322 // This can safely be called multiple times, as the review request
323 // class will ensure once a review request is dismissed by the user,
324 // it is never displayed again.
325 if ( $meta['form'] || $meta['landing_page'] ) {
326 WP_ConvertKit()->get_class( 'review_request' )->request_review();
327 }
328
329 }
330
331 /**
332 * Get the current post type based on the screen that is viewed.
333 *
334 * @since 2.5.5
335 *
336 * @return bool|string
337 */
338 private function get_current_post_type() {
339
340 // Bail if we cannot determine the screen.
341 if ( ! function_exists( 'get_current_screen' ) ) {
342 return false;
343 }
344
345 // Get screen.
346 $screen = get_current_screen();
347
348 // Return post type.
349 return $screen->post_type;
350
351 }
352
353 }
354