PluginProbe
Copy Anything to Clipboard for WordPress – Copy Button, Copy Text & Copy Code / 3.8.0
Copy Anything to Clipboard for WordPress – Copy Button, Copy Text & Copy Code v3.8.0
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 3.8.0, at classes/class-copy-the-code-page.php

589 lines 15.2 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 __( 'Copy to Clipboard 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 if ( ! $vars['selectors'] ) {
309 return;
310 }
311
312 $conditions = [];
313 foreach ( $vars['selectors'] as $selector ) {
314 if ( ! $selector['conditions'] ) {
315 continue;
316 }
317
318 $conditions = array_merge( $conditions, $selector['conditions'] );
319 }
320 if ( ! $this->meet_conditions( $conditions ) ) {
321 return;
322 }
323
324 wp_enqueue_style( 'copy-the-code', COPY_THE_CODE_URI . 'assets/css/copy-the-code.css', null, COPY_THE_CODE_VER, 'all' );
325 wp_enqueue_script( 'copy-the-code', COPY_THE_CODE_URI . 'assets/js/copy-the-code.js', [ 'jquery' ], COPY_THE_CODE_VER, true );
326 wp_localize_script(
327 'copy-the-code',
328 'copyTheCode',
329 $vars
330 );
331 }
332
333 /**
334 * Meet Conditions
335 *
336 * @param array $conditions Conditions.
337 * @return boolean
338 */
339 public function meet_conditions( $conditions = [] ) {
340 if ( ! $conditions ) {
341 return true;
342 }
343
344 $meet = true;
345 foreach ( $conditions as $condition ) {
346 $meet = $this->meet_condition( $condition );
347 if ( ! $meet ) {
348 return false;
349 }
350 }
351
352 return $meet;
353 }
354
355 /**
356 * Meet Condition
357 *
358 * @param array $condition Condition.
359 * @return boolean
360 */
361 public function meet_condition( $condition = [] ) {
362 if ( ! $condition ) {
363 return true;
364 }
365
366 $meet = false;
367 switch ( $condition['type'] ) {
368 case 'post_type':
369 $meet = $this->meet_post_type_condition( $condition );
370 break;
371 case 'user_role':
372 $meet = $this->meet_user_role_condition( $condition );
373 break;
374 case 'taxonomy':
375 $meet = $this->meet_taxonomy_condition( $condition );
376 break;
377 }
378
379 return $meet;
380 }
381
382 /**
383 * Meet Post Type Condition
384 *
385 * @param array $condition Condition.
386 * @return boolean
387 */
388 public function meet_post_type_condition( $condition = [] ) {
389 if ( ! $condition ) {
390 return true;
391 }
392
393 $post_type = get_post_type();
394 if ( ! $post_type ) {
395 return false;
396 }
397
398 $meet = false;
399 switch ( $condition['operator'] ) {
400 case '=':
401 $meet = $post_type === $condition['value'];
402 break;
403 case '!=':
404 $meet = $post_type !== $condition['value'];
405 break;
406 }
407
408 return $meet;
409 }
410
411 /**
412 * Meet User Role Condition
413 *
414 * @param array $condition Condition.
415 * @return boolean
416 */
417 public function meet_user_role_condition( $condition = [] ) {
418 if ( ! $condition ) {
419 return true;
420 }
421
422 $user = wp_get_current_user();
423 if ( ! $user ) {
424 return false;
425 }
426
427 $meet = false;
428 switch ( $condition['operator'] ) {
429 case '=':
430 $meet = in_array( $condition['value'], $user->roles, true );
431 break;
432 case '!=':
433 $meet = ! in_array( $condition['value'], $user->roles, true );
434 break;
435 }
436
437 return $meet;
438 }
439
440 /**
441 * Meet Taxonomy Condition
442 *
443 * @param array $condition Condition.
444 * @return boolean
445 */
446 public function meet_taxonomy_condition( $condition = [] ) {
447 if ( ! $condition ) {
448 return true;
449 }
450
451 $taxonomy = get_current_screen()->taxonomy;
452 if ( ! $taxonomy ) {
453 return false;
454 }
455
456 $meet = false;
457 switch ( $condition['operator'] ) {
458 case '=':
459 $meet = $taxonomy === $condition['value'];
460 break;
461 case '!=':
462 $meet = $taxonomy !== $condition['value'];
463 break;
464 }
465
466 return $meet;
467 }
468
469 /**
470 * Localize Vars
471 *
472 * @return array
473 */
474 function get_localize_vars() {
475
476 $query_args = [
477 'post_type' => 'copy-to-clipboard',
478
479 // Query performance optimization.
480 'fields' => 'ids',
481 'no_found_rows' => true,
482 'posts_per_page' => -1,
483 ];
484
485 $query = new WP_Query( $query_args );
486 $selectors = [];
487 if ( $query->posts ) {
488 foreach ( $query->posts as $key => $post_id ) {
489 $selectors[] = [
490 'selector' => get_post_meta( $post_id, 'selector', true ),
491 'style' => get_post_meta( $post_id, 'style', true ),
492 // '/ $copy_as' => get_post_meta( $post_id, 'copy-as', true ),
493 'button_text' => get_post_meta( $post_id, 'button-text', true ),
494 'button_title' => get_post_meta( $post_id, 'button-title', true ),
495 'button_copy_text' => get_post_meta( $post_id, 'button-copy-text', true ),
496 'button_position' => get_post_meta( $post_id, 'button-position', true ),
497 'copy_format' => get_post_meta( $post_id, 'copy-format', true ),
498 'conditions' => get_post_meta( $post_id, 'conditions', true ),
499 ];
500 }
501 }
502
503 return apply_filters(
504 'copy_the_code_localize_vars',
505 [
506 'trim_lines' => false,
507 'remove_spaces' => true,
508 'copy_content_as' => '',
509 'previewMarkup' => '&lt;h2&gt;Hello World&lt;/h2&gt;',
510 'buttonMarkup' => '<button class="copy-the-code-button" title=""></button>',
511 'buttonSvg' => Helpers::get_svg_copy_icon(),
512 'selectors' => $selectors,
513 'selector' => 'pre', // Selector in which have the actual `<code>`.
514 'settings' => $this->get_page_settings(),
515 'string' => [
516 'title' => $this->get_page_setting( 'button-title', __( 'Copy to Clipboard', 'copy-the-code' ) ),
517 'copy' => $this->get_page_setting( 'button-text', __( 'Copy', 'copy-the-code' ) ),
518 'copied' => $this->get_page_setting( 'button-copy-text', __( 'Copied!', 'copy-the-code' ) ),
519 ],
520 'image-url' => COPY_THE_CODE_URI . '/assets/images/copy-1.svg',
521 'redirect_url' => '',
522 ]
523 );
524 }
525
526 /**
527 * Get Setting
528 *
529 * @param string $key Setting key.
530 * @param string $default_value Setting default value.
531 * @return mixed Single Setting.
532 */
533 function get_page_setting( $key = '', $default_value = '' ) {
534 $settings = $this->get_page_settings();
535
536 if ( array_key_exists( $key, $settings ) ) {
537 return $settings[ $key ];
538 }
539
540 return $default_value;
541 }
542
543 /**
544 * Settings
545 *
546 * @return array Settings.
547 */
548 function get_page_settings() {
549 $defaults = apply_filters(
550 'copy_the_code_default_page_settings',
551 [
552 'selector' => 'pre',
553 // 'copy-as' => 'text',
554 'button-text' => __( 'Copy', 'copy-the-code' ),
555 'button-title' => __( 'Copy to Clipboard', 'copy-the-code' ),
556 'button-copy-text' => __( 'Copied!', 'copy-the-code' ),
557 'button-position' => 'inside',
558 'copy-format' => 'default',
559 ]
560 );
561
562 $stored = get_option( 'copy-the-code-settings', $defaults );
563
564 return apply_filters( 'copy_the_code_page_settings', wp_parse_args( $stored, $defaults ) );
565 }
566
567 /**
568 * Show action links on the plugin screen.
569 *
570 * @param mixed $links Plugin Action links.
571 * @return array
572 */
573 function action_links( $links ) {
574 $action_links = [
575 '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>',
576 ];
577
578 return array_merge( $action_links, $links );
579 }
580
581 }
582
583 /**
584 * Initialize class object with 'get_instance()' method
585 */
586 Copy_The_Code_Page::get_instance();
587
588 endif;
589