PluginProbe
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages / 3.1.0
Kit (formerly ConvertKit) – Email Newsletter, Email Marketing, Membership, Subscribers and Landing Pages v3.1.0
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 3.1.0, at admin/class-convertkit-admin-post.php

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