PluginProbe
Copy Anything to Clipboard for WordPress – Copy Button, Copy Text & Copy Code / 4.0.3
Copy Anything to Clipboard for WordPress – Copy Button, Copy Text & Copy Code v4.0.3
5.5.3 3.1.0 3.2.0 3.2.1 3.3.0 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.6.0 3.7.0 3.8.0 3.8.1 3.8.2 3.8.3 4.0.0 4.0.2 4.0.3 4.0.4 4.0.5 4.1.0 4.1.1 All 78 releases
copy-the-code / classes / class-copy-the-code-page.php

class-copy-the-code-page.php in Copy Anything to Clipboard for WordPress – Copy Button, Copy Text & Copy Code 4.0.3, at classes/class-copy-the-code-page.php

595 lines 16.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Settings Page
4 *
5 * @package Copy the Code
6 * @since 1.2.0
7 */
8
9 use CopyTheCode\Helpers;
10
11 if ( ! class_exists( 'Copy_The_Code_Page' ) ) :
12
13 /**
14 * Copy_The_Code_Page
15 *
16 * @since 1.2.0
17 */
18 class Copy_The_Code_Page {
19
20 /**
21 * Instance
22 *
23 * @since 1.2.0
24 *
25 * @access private
26 * @var object Class object.
27 */
28 private static $instance;
29
30 /**
31 * Current selector
32 *
33 * @since 3.0.0
34 *
35 * @access private
36 * @var string Current CSS selector.
37 */
38 private $selector;
39
40 /**
41 * Initiator
42 *
43 * @since 1.2.0
44 *
45 * @return object initialized object of class.
46 */
47 public static function get_instance() {
48 if ( ! isset( self::$instance ) ) {
49 self::$instance = new self();
50 }
51 return self::$instance;
52 }
53
54 /**
55 * Constructor
56 *
57 * @since 1.2.0
58 */
59 public function __construct() {
60 add_filter( 'admin_url', [ $this, 'admin_url' ], 10, 3 );
61 add_action( 'plugin_action_links_' . COPY_THE_CODE_BASE, [ $this, 'action_links' ] );
62 add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_assets' ] );
63 add_action( 'init', [ $this, 'register_post_type' ] );
64 add_action( 'add_meta_boxes', [ $this, 'add_meta_box' ] );
65 add_action( 'manage_copy-to-clipboard_posts_custom_column', [ $this, 'column_markup' ], 10, 2 );
66 add_action( 'manage_copy-to-clipboard_posts_columns', [ $this, 'add_column' ], 10 );
67 }
68
69 /**
70 * Add meta box
71 *
72 * @since 3.0.0
73 */
74 public function add_meta_box() {
75 add_meta_box(
76 'copy-the-code-meta-box',
77 esc_html__( 'Settings', 'copy-the-code' ),
78 [ $this, 'meta_box_markup' ],
79 'copy-to-clipboard',
80 'normal',
81 'high'
82 );
83 }
84
85 /**
86 * Meta box markup
87 *
88 * @param object $post Post object.
89 * @since 3.0.0
90 */
91 public function meta_box_markup( $post ) {
92 $selector = get_post_meta( $post->ID, 'selector', true );
93 $style = get_post_meta( $post->ID, 'style', true );
94 $button_text = get_post_meta( $post->ID, 'button-text', true );
95 $button_title = get_post_meta( $post->ID, 'button-title', true );
96 $button_copy_text = get_post_meta( $post->ID, 'button-copy-text', true );
97 $button_position = get_post_meta( $post->ID, 'button-position', true );
98 $copy_format = get_post_meta( $post->ID, 'copy-format', true );
99
100 ?>
101 <table class="form-table">
102 <tr>
103 <td><?php esc_html_e( 'CSS Selector', 'copy-the-code' ); ?></td>
104 <td><?php echo esc_html( $selector ); ?></td>
105 </tr>
106 <tr>
107 <td><?php esc_html_e( 'Style', 'copy-the-code' ); ?></td>
108 <td><?php echo esc_html( $style ); ?></td>
109 </tr>
110 <tr>
111 <td><?php esc_html_e( 'Button Text', 'copy-the-code' ); ?></td>
112 <td><?php echo esc_html( $button_text ); ?></td>
113 </tr>
114 <tr>
115 <td><?php esc_html_e( 'Button Title', 'copy-the-code' ); ?></td>
116 <td><?php echo esc_html( $button_title ); ?></td>
117 </tr>
118 <tr>
119 <td><?php esc_html_e( 'Button Copy Text', 'copy-the-code' ); ?></td>
120 <td><?php echo esc_html( $button_copy_text ); ?></td>
121 </tr>
122 <tr>
123 <td><?php esc_html_e( 'Button Position', 'copy-the-code' ); ?></td>
124 <td><?php echo esc_html( $button_position ); ?></td>
125 </tr>
126 <tr>
127 <td><?php esc_html_e( 'Copy Format', 'copy-the-code' ); ?></td>
128 <td><?php echo esc_html( $copy_format ); ?></td>
129 </tr>
130 </table>
131
132 <p>
133 <a href="<?php echo esc_url( admin_url( 'options-general.php?page=copy-the-code&id=' . $post->ID ) ); ?>" class="button button-primary"><?php esc_html_e( 'Edit', 'copy-the-code' ); ?></a>
134 </p>
135 <?php
136
137 }
138
139 /**
140 * Add custom column
141 *
142 * @param array $columns Columns.
143 * @since 2.0.0
144 */
145 function add_column( $columns = [] ) {
146
147 if ( isset( $columns['author'] ) ) {
148 unset( $columns['author'] );
149 }
150
151 if ( isset( $columns['date'] ) ) {
152 unset( $columns['date'] );
153 }
154
155 $new_columns = [
156 'style' => __( 'Style', 'copy-the-code' ),
157 'settings' => __( 'Settings', 'copy-the-code' ),
158 'author' => 'Author',
159 'date' => 'Date',
160 ];
161
162 return wp_parse_args( $new_columns, $columns );
163 }
164
165 /**
166 * Column markup
167 *
168 * @since 2.0.0
169 *
170 * @param string $column_name Column slug.
171 * @param integer $post_id Post ID.
172 * @return void
173 */
174 function column_markup( $column_name = '', $post_id = 0 ) {
175
176 if ( 'style' === $column_name ) {
177 $style = get_post_meta( $post_id, 'style', true );
178 switch ( $style ) {
179 case 'cover':
180 echo 'Cover';
181 break;
182 case 'svg-icon':
183 echo 'SVG Icon';
184 break;
185 case 'button':
186 echo 'Button';
187 break;
188 }
189 }
190 if ( 'settings' === $column_name ) {
191 $button_text = get_post_meta( $post_id, 'button-text', true );
192 if ( ! empty( $button_text ) ) {
193 echo '<i>Button Text: </i><b>' . $button_text . '</b><br/>';
194 }
195 $button_title = get_post_meta( $post_id, 'button-title', true );
196 if ( ! empty( $button_title ) ) {
197 echo '<i>Button Title: </i><b>' . $button_title . '</b><br/>';
198 }
199 $button_copy_text = get_post_meta( $post_id, 'button-copy-text', true );
200 if ( ! empty( $button_copy_text ) ) {
201 echo '<i>Button Copy Text: </i><b>' . $button_copy_text . '</b><br/>';
202 }
203 $button_position = get_post_meta( $post_id, 'button-position', true );
204 if ( ! empty( $button_position ) ) {
205 echo '<i>Button Position: </i><b>' . $button_position . '</b><br/>';
206 }
207 $format = get_post_meta( $post_id, 'copy-format', true );
208 if ( ! empty( $format ) ) {
209 echo '<i>Copy Format: </i><b>' . $format . '</b><br/>';
210 }
211 }
212
213 }
214
215 /**
216 * Filters the admin area URL.
217 *
218 * @since 1.0.2
219 *
220 * @param string $url The complete admin area URL including scheme and path.
221 * @param string $path Path relative to the admin area URL. Blank string if no path is specified.
222 * @param int|null $blog_id Site ID, or null for the current site.
223 */
224 public function admin_url( $url, $path, $blog_id ) {
225
226 if ( 'post-new.php?post_type=copy-to-clipboard' !== $path ) {
227 return $url;
228 }
229
230 $url = get_site_url( $blog_id, 'wp-admin/', 'admin' );
231 $path = 'options-general.php?page=copy-the-code';
232
233 if ( $path && is_string( $path ) ) {
234 $url .= ltrim( $path, '/' );
235 }
236
237 return $url;
238 }
239
240 /**
241 * Add new page
242 *
243 * @since 2.0.0
244 */
245 public function add_new_page() {
246 $data = $this->get_page_settings();
247 require_once COPY_THE_CODE_DIR . 'includes/add-new-form.php';
248 }
249
250 /**
251 * Registers a new post type
252 *
253 * @since 2.0.0
254 */
255 function register_post_type() {
256
257 $labels = [
258 'name' => __( 'Copy to Clipboard', 'copy-the-code' ),
259 'singular_name' => __( 'Copy to Clipboard', 'copy-the-code' ),
260 'add_new' => _x( 'Add New', 'copy-the-code', 'copy-the-code' ),
261 'add_new_item' => __( 'Add New', 'copy-the-code' ),
262 'edit_item' => __( 'Edit Copy to Clipboard', 'copy-the-code' ),
263 'new_item' => __( 'New Copy to Clipboard', 'copy-the-code' ),
264 'view_item' => __( 'View Copy to Clipboard', 'copy-the-code' ),
265 'search_items' => __( 'Search Copy to Clipboard', 'copy-the-code' ),
266 'not_found' => __( 'No Copy to Clipboard found', 'copy-the-code' ),
267 'not_found_in_trash' => __( 'No Copy to Clipboard found in Trash', 'copy-the-code' ),
268 'parent_item_colon' => __( 'Parent Copy to Clipboard:', 'copy-the-code' ),
269 'menu_name' => __( 'Copy to Clipboard', 'copy-the-code' ),
270 ];
271
272 $args = [
273 'labels' => $labels,
274 'hierarchical' => false,
275 'description' => 'description',
276 'taxonomies' => [],
277 'public' => false,
278 'show_ui' => true,
279 'show_in_menu' => 'options-general.php',
280 'show_in_admin_bar' => false,
281 'menu_position' => null,
282 'menu_icon' => 'dashicons-clipboard',
283 'show_in_nav_menus' => true,
284 'publicly_queryable' => false,
285 'exclude_from_search' => false,
286 'has_archive' => false,
287 'query_var' => false,
288 'can_export' => true,
289 'rewrite' => false,
290 'capability_type' => 'post',
291 'supports' => [
292 'title',
293 ],
294 ];
295
296 register_post_type( 'copy-to-clipboard', $args );
297 }
298
299 /**
300 * Enqueue Assets.
301 *
302 * @version 1.0.0
303 *
304 * @return void
305 */
306 public function enqueue_assets() {
307 $vars = $this->get_localize_vars();
308 $meets_condition = Helpers::is_shortcode_used( 'copy');
309 if ( ! $meets_condition ) {
310 if ( ! $vars['selectors'] ) {
311 return;
312 }
313
314 $conditions = [];
315 foreach ( $vars['selectors'] as $selector ) {
316 if ( ! $selector['conditions'] ) {
317 continue;
318 }
319
320 $conditions = array_merge( $conditions, $selector['conditions'] );
321 }
322
323 $meets_condition = $this->meet_conditions( $conditions );
324 }
325
326 if ( ! $meets_condition ) {
327 return;
328 }
329
330 wp_enqueue_style( 'copy-the-code', COPY_THE_CODE_URI . 'assets/css/copy-the-code.css', null, COPY_THE_CODE_VER, 'all' );
331 wp_enqueue_script( 'copy-the-code', COPY_THE_CODE_URI . 'assets/js/copy-the-code.js', [ 'jquery' ], COPY_THE_CODE_VER, true );
332 wp_localize_script(
333 'copy-the-code',
334 'copyTheCode',
335 $vars
336 );
337 }
338
339 /**
340 * Meet Conditions
341 *
342 * @param array $conditions Conditions.
343 * @return boolean
344 */
345 public function meet_conditions( $conditions = [] ) {
346 if ( ! $conditions ) {
347 return true;
348 }
349
350 $meet = true;
351 foreach ( $conditions as $condition ) {
352 $meet = $this->meet_condition( $condition );
353 if ( ! $meet ) {
354 return false;
355 }
356 }
357
358 return $meet;
359 }
360
361 /**
362 * Meet Condition
363 *
364 * @param array $condition Condition.
365 * @return boolean
366 */
367 public function meet_condition( $condition = [] ) {
368 if ( ! $condition ) {
369 return true;
370 }
371
372 $meet = false;
373 switch ( $condition['type'] ) {
374 case 'post_type':
375 $meet = $this->meet_post_type_condition( $condition );
376 break;
377 case 'user_role':
378 $meet = $this->meet_user_role_condition( $condition );
379 break;
380 case 'taxonomy':
381 $meet = $this->meet_taxonomy_condition( $condition );
382 break;
383 }
384
385 return $meet;
386 }
387
388 /**
389 * Meet Post Type Condition
390 *
391 * @param array $condition Condition.
392 * @return boolean
393 */
394 public function meet_post_type_condition( $condition = [] ) {
395 if ( ! $condition ) {
396 return true;
397 }
398
399 $post_type = get_post_type();
400 if ( ! $post_type ) {
401 return false;
402 }
403
404 $meet = false;
405 switch ( $condition['operator'] ) {
406 case '=':
407 $meet = $post_type === $condition['value'];
408 break;
409 case '!=':
410 $meet = $post_type !== $condition['value'];
411 break;
412 }
413
414 return $meet;
415 }
416
417 /**
418 * Meet User Role Condition
419 *
420 * @param array $condition Condition.
421 * @return boolean
422 */
423 public function meet_user_role_condition( $condition = [] ) {
424 if ( ! $condition ) {
425 return true;
426 }
427
428 $user = wp_get_current_user();
429 if ( ! $user ) {
430 return false;
431 }
432
433 $meet = false;
434 switch ( $condition['operator'] ) {
435 case '=':
436 $meet = in_array( $condition['value'], $user->roles, true );
437 break;
438 case '!=':
439 $meet = ! in_array( $condition['value'], $user->roles, true );
440 break;
441 }
442
443 return $meet;
444 }
445
446 /**
447 * Meet Taxonomy Condition
448 *
449 * @param array $condition Condition.
450 * @return boolean
451 */
452 public function meet_taxonomy_condition( $condition = [] ) {
453 if ( ! $condition ) {
454 return true;
455 }
456
457 $taxonomy = get_current_screen()->taxonomy;
458 if ( ! $taxonomy ) {
459 return false;
460 }
461
462 $meet = false;
463 switch ( $condition['operator'] ) {
464 case '=':
465 $meet = $taxonomy === $condition['value'];
466 break;
467 case '!=':
468 $meet = $taxonomy !== $condition['value'];
469 break;
470 }
471
472 return $meet;
473 }
474
475 /**
476 * Localize Vars
477 *
478 * @return array
479 */
480 function get_localize_vars() {
481
482 $query_args = [
483 'post_type' => 'copy-to-clipboard',
484
485 // Query performance optimization.
486 'fields' => 'ids',
487 'no_found_rows' => true,
488 'posts_per_page' => -1,
489 ];
490
491 $query = new WP_Query( $query_args );
492 $selectors = [];
493 if ( $query->posts ) {
494 foreach ( $query->posts as $key => $post_id ) {
495 $selectors[] = [
496 'selector' => get_post_meta( $post_id, 'selector', true ),
497 'style' => get_post_meta( $post_id, 'style', true ),
498 // '/ $copy_as' => get_post_meta( $post_id, 'copy-as', true ),
499 'button_text' => get_post_meta( $post_id, 'button-text', true ),
500 'button_title' => get_post_meta( $post_id, 'button-title', true ),
501 'button_copy_text' => get_post_meta( $post_id, 'button-copy-text', true ),
502 'button_position' => get_post_meta( $post_id, 'button-position', true ),
503 'copy_format' => get_post_meta( $post_id, 'copy-format', true ),
504 'conditions' => get_post_meta( $post_id, 'conditions', true ),
505 ];
506 }
507 }
508
509 return apply_filters(
510 'copy_the_code_localize_vars',
511 [
512 'trim_lines' => false,
513 'remove_spaces' => true,
514 'copy_content_as' => '',
515 'previewMarkup' => '&lt;h2&gt;Hello World&lt;/h2&gt;',
516 'buttonMarkup' => '<button class="copy-the-code-button" title=""></button>',
517 'buttonSvg' => Helpers::get_svg_copy_icon(),
518 'selectors' => $selectors,
519 'selector' => 'pre', // Selector in which have the actual `<code>`.
520 'settings' => $this->get_page_settings(),
521 'string' => [
522 'title' => $this->get_page_setting( 'button-title', __( 'Copy to Clipboard', 'copy-the-code' ) ),
523 'copy' => $this->get_page_setting( 'button-text', __( 'Copy to Clipboard', 'copy-the-code' ) ),
524 'copied' => $this->get_page_setting( 'button-copy-text', __( 'Copied!', 'copy-the-code' ) ),
525 ],
526 'image-url' => COPY_THE_CODE_URI . '/assets/images/copy-1.svg',
527 'redirect_url' => '',
528 ]
529 );
530 }
531
532 /**
533 * Get Setting
534 *
535 * @param string $key Setting key.
536 * @param string $default_value Setting default value.
537 * @return mixed Single Setting.
538 */
539 function get_page_setting( $key = '', $default_value = '' ) {
540 $settings = $this->get_page_settings();
541
542 if ( array_key_exists( $key, $settings ) ) {
543 return $settings[ $key ];
544 }
545
546 return $default_value;
547 }
548
549 /**
550 * Settings
551 *
552 * @return array Settings.
553 */
554 public function get_page_settings() {
555 $defaults = apply_filters(
556 'copy_the_code_default_page_settings',
557 [
558 'selector' => 'pre',
559 // 'copy-as' => 'text',
560 'button-text' => __( 'Copy to Clipboard', 'copy-the-code' ),
561 'button-title' => __( 'Copy to Clipboard', 'copy-the-code' ),
562 'button-copy-text' => __( 'Copied!', 'copy-the-code' ),
563 'button-position' => 'inside',
564 'copy-format' => 'default',
565 ]
566 );
567
568 $stored = get_option( 'copy-the-code-settings', $defaults );
569
570 return apply_filters( 'copy_the_code_page_settings', wp_parse_args( $stored, $defaults ) );
571 }
572
573 /**
574 * Show action links on the plugin screen.
575 *
576 * @param mixed $links Plugin Action links.
577 * @return array
578 */
579 function action_links( $links ) {
580 $action_links = [
581 'add-new' => '<a href="' . admin_url( 'options-general.php?page=copy-the-code' ) . '" aria-label="' . esc_attr__( 'Add new', 'copy-the-code' ) . '">' . esc_html__( 'Add new', 'copy-the-code' ) . '</a>',
582 ];
583
584 return array_merge( $action_links, $links );
585 }
586
587 }
588
589 /**
590 * Initialize class object with 'get_instance()' method
591 */
592 Copy_The_Code_Page::get_instance();
593
594 endif;
595