Test Failed
Push — master ( e49d13...adb69b )
by Ravinder
09:52 queued 10s
created

Give_Shortcode_Button::shortcode_ajax()   B

Complexity

Conditions 6
Paths 12

Size

Total Lines 29

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
nc 12
nop 0
dl 0
loc 29
rs 8.8337
c 0
b 0
f 0
1
<?php
2
/**
3
 * Shortcode Button Class
4
 *
5
 * @package     Give
6
 * @subpackage  Admin
7
 * @author      Paul Ryley
8
 * @copyright   Copyright (c) 2016, GiveWP
9
 * @license     https://opensource.org/licenses/gpl-license GNU Public License
10
 * @version     1.0
11
 * @since       1.3.0
12
 */
13
14
// Exit if accessed directly.
15
if ( ! defined( 'ABSPATH' ) ) {
16
	exit;
17
}
18
19
/**
20
 * Class Give_Shortcode_Button
21
 */
22
final class Give_Shortcode_Button {
23
24
	/**
25
	 * All shortcode tags
26
	 *
27
	 * @since 1.0
28
	 */
29
	public static $shortcodes;
30
31
	/**
32
	 * Class constructor
33
	 */
34
	public function __construct() {
35
		add_action( 'current_screen', array( $this, 'init' ), 999 );
36
		add_action( 'admin_init', array( $this, 'ajax_handler' ) );
37
	}
38
39
	/**
40
	 * Initialize
41
	 *
42
	 * @since  2.1.0
43
	 * @access public
44
	 */
45
	public function init() {
46
		if ( $this->is_add_button() ) {
47
			add_filter( 'mce_external_plugins', array( $this, 'mce_external_plugins' ), 15 );
48
49
			add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_assets' ) );
50
			add_action( 'admin_enqueue_scripts', array( $this, 'admin_localize_scripts' ), 13 );
51
			add_action( 'media_buttons', array( $this, 'shortcode_button' ) );
52
		}
53
	}
54
55
56
	/**
57
	 * Ajax handler for shortcode
58
	 *
59
	 * @since 2.3.0
60
	 */
61
	public function ajax_handler(){
62
		add_action( 'wp_ajax_give_shortcode', array( $this, 'shortcode_ajax' ) );
63
	}
64
65
	/**
66
	 * Register any TinyMCE plugins
67
	 *
68
	 * @param array $plugin_array
69
	 *
70
	 * @return array|bool
71
	 *
72
	 * @since 1.0
73
	 */
74
	public function mce_external_plugins( $plugin_array ) {
75
76
		if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
77
			return false;
78
		}
79
80
		$plugin_array['give_shortcode'] = GIVE_PLUGIN_URL . 'includes/admin/shortcodes/mce-plugin.js';
81
82
		return $plugin_array;
83
	}
84
85
	/**
86
	 * Enqueue the admin assets
87
	 *
88
	 * @return void
89
	 *
90
	 * @since 1.0
91
	 */
92
	public function admin_enqueue_assets() {
93
		$direction = ( is_rtl() || isset( $_GET['d'] ) && 'rtl' === $_GET['d'] ) ? '.rtl' : '';
0 ignored issues
show
introduced by
Detected access of super global var $_GET, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_GET
Loading history...
94
95
		wp_enqueue_script(
96
			'give_shortcode',
97
			GIVE_PLUGIN_URL . 'assets/dist/js/admin-shortcodes.js',
98
			array( 'jquery' ),
99
			GIVE_VERSION,
100
			true
101
		);
102
103
		wp_enqueue_style(
104
			'give-admin-shortcode-button-style',
105
			GIVE_PLUGIN_URL . 'assets/dist/css/admin-shortcode-button' . $direction . '.css',
106
			array(),
107
			GIVE_VERSION
108
		);
109
	}
110
111
	/**
112
	 * Localize the admin scripts
113
	 *
114
	 * @return void
115
	 *
116
	 * @since 1.0
117
	 */
118
	public function admin_localize_scripts() {
119
120
		if ( ! empty( self::$shortcodes ) ) {
121
122
			$variables = array();
123
124
			foreach ( self::$shortcodes as $shortcode => $values ) {
125
				if ( ! empty( $values['required'] ) ) {
126
					$variables[ $shortcode ] = $values['required'];
127
				}
128
			}
129
130
			wp_localize_script( 'give_shortcode', 'scShortcodes', $variables );
131
		}
132
	}
133
134
	/**
135
	 * Adds the "Donation Form" button above the TinyMCE Editor on add/edit screens.
136
	 *
137
	 * @return string|bool
138
	 *
139
	 * @since 1.0
140
	 */
141
	public function shortcode_button() {
142
143
		$shortcodes = array();
144
145
		foreach ( self::$shortcodes as $shortcode => $values ) {
146
147
			/**
148
			 * Filters the condition for including the current shortcode
149
			 *
150
			 * @since 1.0
151
			 */
152
			if ( apply_filters( sanitize_title( $shortcode ) . '_condition', true ) ) {
153
154
				$shortcodes[ $shortcode ] = sprintf(
155
					'<div class="sc-shortcode mce-menu-item give-shortcode-item-%1$s" data-shortcode="%2$s">%3$s</div>',
156
					$shortcode,
157
					$shortcode,
158
					$values['label']
159
				);
160
			}
161
		}
162
163
		if ( ! empty( $shortcodes ) ) {
164
165
			// check current WP version
166
			$img = ( version_compare( get_bloginfo( 'version' ), '3.5', '<' ) )
167
				? '<img src="' . GIVE_PLUGIN_URL . 'assets/dist/images/give-media.png" />'
168
				: '<span class="wp-media-buttons-icon" id="give-media-button" style="background-image: url(' . give_svg_icons( 'give_grey' ) . ');"></span>';
169
170
			reset( $shortcodes );
171
172
			if ( 1 === count( $shortcodes ) ) {
173
174
				$shortcode = key( $shortcodes );
175
176
				printf(
177
					'<button type="button" class="button sc-shortcode" data-shortcode="%s">%s</button>',
178
					$shortcode,
179
					sprintf( '%s %s %s',
180
						$img,
181
						__( 'Insert', 'give' ),
182
						self::$shortcodes[ $shortcode ]['label']
183
					)
184
				);
185
			} else {
186
				printf(
187
					'<div class="sc-wrap">' .
188
					'<button class="button sc-button" type="button">%s %s</button>' .
189
					'<div class="sc-menu mce-menu">%s</div>' .
190
					'</div>',
191
					$img,
192
					__( 'Give Shortcodes', 'give' ),
193
					implode( '', array_values( $shortcodes ) )
194
				);
195
			}
196
		}
197
	}
198
199
	/**
200
	 * Load the shortcode dialog fields via AJAX
201
	 * @todo: handle error
202
	 *
203
	 * @return void
204
	 *
205
	 * @since 1.0
206
	 */
207
	public function shortcode_ajax() {
208
		if( ! current_user_can( 'edit_give_forms' ) ) {
0 ignored issues
show
introduced by
Space after opening control structure is required
Loading history...
introduced by
No space before opening parenthesis is prohibited
Loading history...
209
			wp_die();
210
		}
211
212
		$shortcode = isset( $_POST['shortcode'] ) ? $_POST['shortcode'] : false;
0 ignored issues
show
introduced by
Detected access of super global var $_POST, probably need manual inspection.
Loading history...
introduced by
Detected usage of a non-sanitized input variable: $_POST
Loading history...
213
		$response  = false;
214
215
		if ( $shortcode && array_key_exists( $shortcode, self::$shortcodes ) ) {
216
217
			$data = self::$shortcodes[ $shortcode ];
218
219
			if ( ! empty( $data['errors'] ) ) {
220
				$data['btn_okay'] = array( esc_html__( 'Okay', 'give' ) );
221
			}
222
223
			$response = array(
224
				'body'      => $data['fields'],
225
				'close'     => $data['btn_close'],
226
				'ok'        => $data['btn_okay'],
227
				'shortcode' => $shortcode,
228
				'title'     => $data['title'],
229
			);
230
		} else {
231
			error_log( print_r( 'AJAX error!', 1 ) );
0 ignored issues
show
introduced by
The use of function print_r() is discouraged
Loading history...
232
		}
233
234
		wp_send_json( $response );
235
	}
236
237
238
	/**
239
	 * Flag to check add shortcode button to current screen or not
240
	 *
241
	 * @since  2.1.0
242
	 * @access private
243
	 * @return bool
244
	 */
245
	private function is_add_button() {
246
		global $pagenow;
247
248
		$shortcode_button_pages = apply_filters( 'give_shortcode_button_pages', array(
249
			'post.php',
250
			'page.php',
251
			'post-new.php',
252
			'post-edit.php',
253
			'edit.php',
254
		) );
255
256
		$exclude_post_types = array( 'give_forms' );
257
258
		/* @var WP_Screen $current_screen */
259
		$current_screen = get_current_screen();
260
261
		// Only run in admin post/page creation and edit screens
262
		if (
263
			! is_admin()
264
			|| ! in_array( $pagenow, $shortcode_button_pages )
265
			|| in_array( $current_screen->post_type, $exclude_post_types )
266
267
			/**
268
			 * Fire the filter
269
			 * Use this filter to show Give Shortcode button on custom pages
270
			 *
271
			 * @since 1.0
272
			 *
273
			 */
274
			|| ! apply_filters( 'give_shortcode_button_condition', true )
275
			|| empty( self::$shortcodes )
276
		) {
277
			return false;
278
		}
279
280
		return true;
281
	}
282
}
283
284
new Give_Shortcode_Button;
285