PluginProbe
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI / 8.0.5
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI v8.0.5
8.0.5 8.0.4 8.0.3 8.0.1 8.0.2 8.0.0 7.9.9.7 7.9.9.6 7.9.9.5 7.9.9.4 7.9.9.3 7.9.9.2 7.9.9.1 7.9.9 7.9.8 7.9.7 7.9.6 7.9.5 7.9.4 7.9.3 7.9.2 7.9.1 7.9.0 7.8.9 7.8.8 All 47 releases
← All changes | includes/shortcodes/shortcodes-editor.php +236 -0 7.8.9 → 8.0.5 View file →
@@ -1,0 +1,236 @@
1 +<?php
2 +/**
3 + * GamiPress Shortcodes Editor Class
4 + *
5 + * @package GamiPress\Shortcodes\Editor
6 + * @author GamiPress <[email protected]>, Ruben Garcia <[email protected]>
7 + * @since 1.0.0
8 +*/
9 +// Exit if accessed directly
10 +if( !defined( 'ABSPATH' ) ) exit;
11 +
12 +class GamiPress_Shortcodes_Editor {
13 +
14 + /**
15 + * @var array $shortcodes All registered shortcodes
16 + * @since 1.4.7
17 + */
18 + public $shortcodes = array();
19 +
20 + /**
21 + * @var bool $button_rendered Flag to check if button has been rendered
22 + * @since 1.4.7
23 + */
24 + public $button_rendered = false;
25 +
26 + /**
27 + * @var bool $rendering_shortcodes Flag to check if currently is rendering shortcodes
28 + * @since 1.4.7.1
29 + */
30 + public $rendering_shortcodes = false;
31 +
32 + public function __construct() {
33 +
34 + $this->shortcodes = gamipress_get_shortcodes();
35 +
36 + add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ), 99 );
37 + add_action( 'media_buttons', array( $this, 'render_button'), 20 );
38 + add_action( 'admin_footer', array( $this, 'render_modal' ) );
39 +
40 + }
41 +
42 + /**
43 + * Enqueue and localize relevant admin scripts
44 + *
45 + * @since 1.0.0
46 + */
47 + public function admin_scripts( $hook ) {
48 +
49 + $min = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
50 +
51 + // Enqueue shortcodes editor
52 + wp_enqueue_script( 'gamipress-shortcodes-editor', GAMIPRESS_URL . 'assets/js/gamipress-shortcodes-editor' . $min . '.js', array( 'jquery', 'gamipress-admin-functions-js', 'gamipress-select2-js' ), GAMIPRESS_VER, true );
53 +
54 + wp_localize_script( 'gamipress-shortcodes-editor', 'gamipress_shortcodes_editor', array(
55 + 'nonce' => gamipress_get_admin_nonce(),
56 + 'id_placeholder' => __( 'Select a Post', 'gamipress' ),
57 + 'id_multiple_placeholder' => __( 'Select Post(s)', 'gamipress' ),
58 + 'user_placeholder' => __( 'Select an User', 'gamipress' ),
59 + 'post_type_placeholder' => __( 'Default: All', 'gamipress' ),
60 + 'rank_placeholder' => __( 'Select a Rank', 'gamipress' ),
61 + ) );
62 +
63 + }
64 +
65 + /**
66 + * Render shortcode modal insert button
67 + *
68 + * @param string $editor_id
69 + *
70 + * @since 1.0.0
71 + */
72 + public function render_button( $editor_id ) {
73 +
74 + // Prevent to render button inside shortcodes editor window
75 + if( $this->rendering_shortcodes ) { return; }
76 +
77 + $this->button_rendered = true;
78 +
79 + echo '<a id="insert_gamipress_shortcodes" href="#TB_inline?width=660&height=800&inlineId=select_gamipress_shortcode" class="thickbox button gamipress_media_link" data-width="800">'
80 + . '<span class="wp-media-buttons-icon dashicons dashicons-gamipress"></span> ' . 'GamiPress'
81 + . '</a>';
82 + }
83 +
84 + /**
85 + * Render shortcode modal content
86 + *
87 + * @since 1.0.0
88 + */
89 + public function render_modal() {
90 +
91 + // Return early if button hasn't been rendered
92 + if( ! $this->button_rendered ) { return; }
93 +
94 + $this->rendering_shortcodes = true;
95 +
96 + ?>
97 +
98 + <div id="select_gamipress_shortcode" style="display:none;">
99 + <div class="wrap">
100 + <h3><?php _e( 'GamiPress shortcode', 'gamipress' ); ?></h3>
101 + <div class="alignleft">
102 + <select id="select_shortcode"><?php echo $this->get_shortcode_selector(); ?></select>
103 + </div>
104 + <div class="alignright">
105 + <a id="gamipress_insert" class="button-primary" href="#" style="color:#fff;"><?php esc_attr_e( 'Insert Shortcode', 'gamipress' ); ?></a>
106 + <a id="gamipress_cancel" class="button-secondary" href="#"><?php esc_attr_e( 'Cancel', 'gamipress' ); ?></a>
107 + </div>
108 + <div id="shortcode_options" class="alignleft clear">
109 + <?php $this->get_shortcode_sections(); ?>
110 + </div>
111 + </div>
112 + </div>
113 +
114 + <?php
115 +
116 + $this->rendering_shortcodes = false;
117 + }
118 +
119 + /**
120 + * Generate the shortcode selector options
121 + *
122 + * @since 1.0.0
123 + * @updated 1.7.6 Added support for shortcode groups
124 + *
125 + * @return string
126 + */
127 + private function get_shortcode_selector() {
128 +
129 + // Setup vars
130 + $output = '';
131 + $current_group = '';
132 + $groups = gamipress_get_shortcodes_groups();
133 +
134 + $shortcodes = array();
135 +
136 + // Make a first loop to reorder all shortcodes by group
137 + foreach( $this->shortcodes as $shortcode ) {
138 +
139 + $group = $shortcode->group;
140 +
141 + // If group is not registered fallback to others
142 + if( ! isset( $groups[$group] ) ) $group = 'others';
143 +
144 + // Initialize shortcode group array
145 + if( ! isset( $shortcodes[$group] ) ) $shortcodes[$group] = array();
146 +
147 + // Add the shortcode to the group
148 + $shortcodes[$group][] = $shortcode;
149 + }
150 +
151 + if( isset( $shortcodes['others'] ) ) {
152 + // Move others to the end
153 + $others = $shortcodes['others'];
154 + unset( $shortcodes['others'] );
155 + $shortcodes['others'] = $others;
156 + }
157 +
158 + foreach( $shortcodes as $group => $group_shortcodes ) {
159 +
160 + // Skip empty groups
161 + if( ! is_array( $group_shortcodes ) ) continue;
162 +
163 + if( $current_group !== $group ) {
164 +
165 + // Close the previous group
166 + if( $current_group !== '' ) $output .= '</optgroup>';
167 +
168 + // Render the shortcode group
169 + $output .= sprintf( '<optgroup label="%1$s">', $groups[$group] );
170 +
171 + // Set the current group for next loop
172 + $current_group = $group;
173 +
174 + }
175 +
176 + // Render the group shortcodes as options
177 + foreach( $group_shortcodes as $shortcode )
178 + $output .= sprintf( '<option value="%1$s">%2$s</option>', $shortcode->slug, $shortcode->name );
179 +
180 + }
181 +
182 + return $output;
183 + }
184 +
185 + /**
186 + * Render all shortcodes sections
187 + *
188 + * @since 1.0.0
189 + *
190 + * @return string
191 + */
192 + private function get_shortcode_sections() {
193 + foreach( $this->shortcodes as $shortcode ) {
194 + $this->get_shortcode_section( $shortcode );
195 + }
196 + }
197 +
198 + /**
199 + * Render a shortcode section
200 + *
201 + * @since 1.0.0
202 + *
203 + * @param GamiPress_Shortcode $shortcode
204 + */
205 + private function get_shortcode_section( $shortcode ) {
206 + ?>
207 + <div class="shortcode-section alignleft" id="<?php echo $shortcode->slug; ?>_wrapper">
208 + <p><strong>[<?php echo $shortcode->slug; ?>]</strong> - <?php echo $shortcode->description; ?></p>
209 +
210 + <?php $shortcode->show_form(); ?>
211 + </div>
212 + <?php
213 + }
214 +}
215 +
216 +/**
217 + * Initialize the shortcodes editor.
218 + *
219 + * @since 1.0.0
220 + */
221 +function gamipress_shortcodes_add_editor_button() {
222 +
223 + global $pagenow;
224 +
225 + // Prevent render on customizer and widgets
226 + if( $pagenow === 'customize.php' || $pagenow === 'widgets.php' ) {
227 + return;
228 + }
229 +
230 + if( (bool) gamipress_get_option( 'disable_shortcodes_editor', false ) ) {
231 + return;
232 + }
233 +
234 + new GamiPress_Shortcodes_Editor();
235 +}
236 +add_action( 'admin_init', 'gamipress_shortcodes_add_editor_button' );