Version Description
- 2021-12-01
- Enhancement : Code Optimization.
- Enhancement : Add compatibility of Mozilla Firefox on dashboard settings.
- Compatibility : Compatible with WordPress 5.8.
- Compatibility : Compatible with PHP 8.0.
Download this release
Release Info
Developer | WPBrigade |
Plugin | Insert Headers And Footers |
Version | 1.3.1 |
Comparing to | |
See all releases |
Code changes from version 1.3.0 to 1.3.1
- asset/js/script.js +5 -3
- classes/class-settings-api.php +128 -105
- classes/class-setup.php +42 -10
- classes/plugin-meta.php +45 -32
- languages/wp-header-and-footer.pot +0 -101
- lib/wpb-sdk/includes/wpb-sdk-logger.php +395 -0
- lib/wpb-sdk/includes/wpb-sdk-track.php +60 -0
- lib/wpb-sdk/init.php +13 -0
- lib/wpb-sdk/views/wpb-sdk-deactivate-form.php +327 -0
- readme.txt +15 -8
- wp-headers-and-footers.php +104 -64
asset/js/script.js
CHANGED
@@ -1,7 +1,9 @@
|
|
1 |
(function($) {
|
2 |
$(window).on('load', function() {
|
3 |
-
|
4 |
-
|
5 |
-
|
|
|
|
|
6 |
});
|
7 |
})(jQuery);
|
1 |
(function($) {
|
2 |
$(window).on('load', function() {
|
3 |
+
$.ready.then(function(){
|
4 |
+
wp.codeEditor.initialize($('[id="wpheaderandfooter_basics[wp_header_textarea]"]'));
|
5 |
+
wp.codeEditor.initialize($('[id="wpheaderandfooter_basics[wp_body_textarea]"]'));
|
6 |
+
wp.codeEditor.initialize($('[id="wpheaderandfooter_basics[wp_footer_textarea]"]'));
|
7 |
+
});
|
8 |
});
|
9 |
})(jQuery);
|
classes/class-settings-api.php
CHANGED
@@ -1,13 +1,18 @@
|
|
1 |
<?php
|
2 |
-
|
3 |
/**
|
4 |
* WP Header and Footer Settings API wrapper class
|
|
|
|
|
5 |
*/
|
|
|
6 |
if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
|
|
|
|
|
7 |
class WPHeaderAndFooter_Settings_API {
|
8 |
|
9 |
/**
|
10 |
-
*
|
11 |
*
|
12 |
* @var array
|
13 |
*/
|
@@ -20,6 +25,9 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
20 |
*/
|
21 |
protected $settings_fields = array();
|
22 |
|
|
|
|
|
|
|
23 |
public function __construct() {
|
24 |
add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
|
25 |
}
|
@@ -27,7 +35,7 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
27 |
/**
|
28 |
* Enqueue scripts and styles
|
29 |
*/
|
30 |
-
function admin_enqueue_scripts() {
|
31 |
wp_enqueue_style( 'wp-color-picker' );
|
32 |
|
33 |
wp_enqueue_media();
|
@@ -38,9 +46,9 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
38 |
/**
|
39 |
* Set settings sections
|
40 |
*
|
41 |
-
* @param array $sections setting sections array
|
42 |
*/
|
43 |
-
function set_sections( $sections ) {
|
44 |
$this->settings_sections = $sections;
|
45 |
|
46 |
return $this;
|
@@ -49,9 +57,9 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
49 |
/**
|
50 |
* Add a single section
|
51 |
*
|
52 |
-
* @param array $section
|
53 |
*/
|
54 |
-
function add_section( $section ) {
|
55 |
$this->settings_sections[] = $section;
|
56 |
|
57 |
return $this;
|
@@ -60,15 +68,21 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
60 |
/**
|
61 |
* Set settings fields
|
62 |
*
|
63 |
-
* @param array $fields settings fields array
|
64 |
*/
|
65 |
-
function set_fields( $fields ) {
|
66 |
$this->settings_fields = $fields;
|
67 |
|
68 |
return $this;
|
69 |
}
|
70 |
|
71 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
72 |
$defaults = array(
|
73 |
'name' => '',
|
74 |
'label' => '',
|
@@ -90,16 +104,16 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
90 |
* This function gets the initiated settings sections and fields. Then
|
91 |
* registers them to WordPress and ready for use.
|
92 |
*/
|
93 |
-
function admin_init() {
|
94 |
-
// register settings sections
|
95 |
foreach ( $this->settings_sections as $section ) {
|
96 |
-
if ( false
|
97 |
add_option( $section['id'] );
|
98 |
}
|
99 |
|
100 |
if ( isset( $section['desc'] ) && ! empty( $section['desc'] ) ) {
|
101 |
$section['desc'] = '<div class="inside">' . $section['desc'] . '</div>';
|
102 |
-
$callback
|
103 |
} elseif ( isset( $section['callback'] ) ) {
|
104 |
$callback = $section['callback'];
|
105 |
} else {
|
@@ -109,7 +123,7 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
109 |
add_settings_section( $section['id'], $section['title'], $callback, $section['id'] );
|
110 |
}
|
111 |
|
112 |
-
// register settings fields
|
113 |
foreach ( $this->settings_fields as $section => $field ) {
|
114 |
foreach ( $field as $option ) {
|
115 |
|
@@ -140,7 +154,7 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
140 |
}
|
141 |
}
|
142 |
|
143 |
-
// creates our settings in the options table
|
144 |
foreach ( $this->settings_sections as $section ) {
|
145 |
register_setting( $section['id'], $section['id'], array( $this, 'sanitize_options' ) );
|
146 |
}
|
@@ -149,7 +163,7 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
149 |
/**
|
150 |
* Get field description for display
|
151 |
*
|
152 |
-
* @param array $args settings field args
|
153 |
*/
|
154 |
public function get_field_description( $args ) {
|
155 |
if ( ! empty( $args['desc'] ) ) {
|
@@ -164,9 +178,9 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
164 |
/**
|
165 |
* Displays a text field for a settings field
|
166 |
*
|
167 |
-
* @param array $args settings field args
|
168 |
*/
|
169 |
-
function callback_text( $args ) {
|
170 |
|
171 |
$value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
172 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : 'regular';
|
@@ -176,24 +190,24 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
176 |
$html = sprintf( '<input type="%1$s" class="%2$s-text" id="%3$s[%4$s]" name="%3$s[%4$s]" value="%5$s"%6$s/>', $type, $size, $args['section'], $args['id'], $value, $placeholder );
|
177 |
$html .= $this->get_field_description( $args );
|
178 |
|
179 |
-
echo $html;
|
180 |
}
|
181 |
|
182 |
/**
|
183 |
* Displays a url field for a settings field
|
184 |
*
|
185 |
-
* @param array $args settings field args
|
186 |
*/
|
187 |
-
function callback_url( $args ) {
|
188 |
$this->callback_text( $args );
|
189 |
}
|
190 |
|
191 |
/**
|
192 |
* Displays a number field for a settings field
|
193 |
*
|
194 |
-
* @param array $args settings field args
|
195 |
*/
|
196 |
-
function callback_number( $args ) {
|
197 |
$value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
198 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : 'regular';
|
199 |
$type = isset( $args['type'] ) ? $args['type'] : 'number';
|
@@ -205,15 +219,15 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
205 |
$html = sprintf( '<input type="%1$s" class="%2$s-number" id="%3$s[%4$s]" name="%3$s[%4$s]" value="%5$s"%6$s%7$s%8$s%9$s/>', $type, $size, $args['section'], $args['id'], $value, $placeholder, $min, $max, $step );
|
206 |
$html .= $this->get_field_description( $args );
|
207 |
|
208 |
-
echo $html;
|
209 |
}
|
210 |
|
211 |
/**
|
212 |
* Displays a checkbox for a settings field
|
213 |
*
|
214 |
-
* @param array $args settings field args
|
215 |
*/
|
216 |
-
function callback_checkbox( $args ) {
|
217 |
|
218 |
$value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
219 |
|
@@ -224,15 +238,15 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
224 |
$html .= sprintf( '%1$s</label>', $args['desc'] );
|
225 |
$html .= '</fieldset>';
|
226 |
|
227 |
-
echo $html;
|
228 |
}
|
229 |
|
230 |
/**
|
231 |
* Displays a multicheckbox a settings field
|
232 |
*
|
233 |
-
* @param array $args settings field args
|
234 |
*/
|
235 |
-
function callback_multicheck( $args ) {
|
236 |
|
237 |
$value = $this->get_option( $args['id'], $args['section'], $args['std'] );
|
238 |
$html = '<fieldset>';
|
@@ -247,15 +261,15 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
247 |
$html .= $this->get_field_description( $args );
|
248 |
$html .= '</fieldset>';
|
249 |
|
250 |
-
echo $html;
|
251 |
}
|
252 |
|
253 |
/**
|
254 |
* Displays a multicheckbox a settings field
|
255 |
*
|
256 |
-
* @param array $args settings field args
|
257 |
*/
|
258 |
-
function callback_radio( $args ) {
|
259 |
|
260 |
$value = $this->get_option( $args['id'], $args['section'], $args['std'] );
|
261 |
$html = '<fieldset>';
|
@@ -269,15 +283,15 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
269 |
$html .= $this->get_field_description( $args );
|
270 |
$html .= '</fieldset>';
|
271 |
|
272 |
-
echo $html;
|
273 |
}
|
274 |
|
275 |
/**
|
276 |
* Displays a selectbox for a settings field
|
277 |
*
|
278 |
-
* @param array $args settings field args
|
279 |
*/
|
280 |
-
function callback_select( $args ) {
|
281 |
|
282 |
$value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
283 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : 'regular';
|
@@ -290,15 +304,15 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
290 |
$html .= sprintf( '</select>' );
|
291 |
$html .= $this->get_field_description( $args );
|
292 |
|
293 |
-
echo $html;
|
294 |
}
|
295 |
|
296 |
/**
|
297 |
* Displays a textarea for a settings field
|
298 |
*
|
299 |
-
* @param array $args settings field args
|
300 |
*/
|
301 |
-
function callback_textarea( $args ) {
|
302 |
|
303 |
$value = esc_textarea( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
304 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : 'regular';
|
@@ -307,30 +321,29 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
307 |
$html = sprintf( '<textarea rows="5" cols="100" class="%1$s-text" id="%2$s[%3$s]" name="%2$s[%3$s]"%4$s>%5$s</textarea>', $size, $args['section'], $args['id'], $placeholder, $value );
|
308 |
$html .= $this->get_field_description( $args );
|
309 |
|
310 |
-
echo $html;
|
311 |
}
|
312 |
|
313 |
/**
|
314 |
* Displays a textarea for a settings field
|
315 |
*
|
316 |
-
* @param array $args settings field args
|
317 |
-
* @return string
|
318 |
*/
|
319 |
-
function callback_html( $args ) {
|
320 |
-
echo $this->get_field_description( $args );
|
321 |
}
|
322 |
|
323 |
/**
|
324 |
* Displays a rich text textarea for a settings field
|
325 |
*
|
326 |
-
* @param array $args settings field args
|
327 |
*/
|
328 |
-
function callback_wysiwyg( $args ) {
|
329 |
|
330 |
$value = $this->get_option( $args['id'], $args['section'], $args['std'] );
|
331 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : '500px';
|
332 |
|
333 |
-
echo '<div style="max-width: ' . $size . ';">';
|
334 |
|
335 |
$editor_settings = array(
|
336 |
'teeny' => true,
|
@@ -346,15 +359,15 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
346 |
|
347 |
echo '</div>';
|
348 |
|
349 |
-
echo $this->get_field_description( $args );
|
350 |
}
|
351 |
|
352 |
/**
|
353 |
* Displays a file upload field for a settings field
|
354 |
*
|
355 |
-
* @param array $args settings field args
|
356 |
*/
|
357 |
-
function callback_file( $args ) {
|
358 |
|
359 |
$value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
360 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : 'regular';
|
@@ -365,15 +378,15 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
365 |
$html .= '<input type="button" class="button wpsa-browse" value="' . $label . '" />';
|
366 |
$html .= $this->get_field_description( $args );
|
367 |
|
368 |
-
echo $html;
|
369 |
}
|
370 |
|
371 |
/**
|
372 |
* Displays a password field for a settings field
|
373 |
*
|
374 |
-
* @param array $args settings field args
|
375 |
*/
|
376 |
-
function callback_password( $args ) {
|
377 |
|
378 |
$value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
379 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : 'regular';
|
@@ -381,15 +394,15 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
381 |
$html = sprintf( '<input type="password" class="%1$s-text" id="%2$s[%3$s]" name="%2$s[%3$s]" value="%4$s"/>', $size, $args['section'], $args['id'], $value );
|
382 |
$html .= $this->get_field_description( $args );
|
383 |
|
384 |
-
echo $html;
|
385 |
}
|
386 |
|
387 |
/**
|
388 |
* Displays a color picker field for a settings field
|
389 |
*
|
390 |
-
* @param array $args settings field args
|
391 |
*/
|
392 |
-
function callback_color( $args ) {
|
393 |
|
394 |
$value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
395 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : 'regular';
|
@@ -397,15 +410,18 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
397 |
$html = sprintf( '<input type="text" class="%1$s-text wp-color-picker-field" id="%2$s[%3$s]" name="%2$s[%3$s]" value="%4$s" data-default-color="%5$s" />', $size, $args['section'], $args['id'], $value, $args['std'] );
|
398 |
$html .= $this->get_field_description( $args );
|
399 |
|
400 |
-
echo $html;
|
401 |
}
|
402 |
|
403 |
/**
|
404 |
* Sanitize callback for Settings API
|
405 |
*
|
|
|
406 |
* @return mixed
|
407 |
*/
|
408 |
-
function sanitize_options( $options ) {
|
|
|
|
|
409 |
|
410 |
if ( ! $options ) {
|
411 |
return $options;
|
@@ -414,36 +430,41 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
414 |
foreach ( $options as $option_slug => $option_value ) {
|
415 |
$sanitize_callback = $this->get_sanitize_callback( $option_slug );
|
416 |
|
417 |
-
// If callback is set, call it
|
418 |
if ( $sanitize_callback ) {
|
419 |
$options[ $option_slug ] = call_user_func( $sanitize_callback, $option_value );
|
420 |
continue;
|
421 |
}
|
|
|
|
|
|
|
422 |
}
|
423 |
|
|
|
|
|
424 |
return $options;
|
425 |
}
|
426 |
|
427 |
/**
|
428 |
* Get sanitization callback for given option slug
|
429 |
*
|
430 |
-
* @param string $slug option slug
|
431 |
*
|
432 |
* @return mixed string or bool false
|
433 |
*/
|
434 |
-
function get_sanitize_callback( $slug = '' ) {
|
435 |
if ( empty( $slug ) ) {
|
436 |
return false;
|
437 |
}
|
438 |
|
439 |
-
// Iterate over registered fields and see if we can find proper callback
|
440 |
foreach ( $this->settings_fields as $section => $options ) {
|
441 |
foreach ( $options as $option ) {
|
442 |
-
if ( $option['name']
|
443 |
continue;
|
444 |
}
|
445 |
|
446 |
-
// Return the callback name
|
447 |
return isset( $option['sanitize_callback'] ) && is_callable( $option['sanitize_callback'] ) ? $option['sanitize_callback'] : false;
|
448 |
}
|
449 |
}
|
@@ -454,12 +475,12 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
454 |
/**
|
455 |
* Get the value of a settings field
|
456 |
*
|
457 |
-
* @param string $option settings field name
|
458 |
-
* @param string $section the section name this field belongs to
|
459 |
-
* @param string $default default text if it's not found
|
460 |
-
* @return string
|
461 |
*/
|
462 |
-
function get_option( $option, $section, $default = '' ) {
|
463 |
|
464 |
$options = get_option( $section );
|
465 |
|
@@ -475,23 +496,18 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
475 |
*
|
476 |
* Shows all the settings section labels as tab
|
477 |
*/
|
478 |
-
function show_navigation() {
|
479 |
$html = '<h2 class="nav-tab-wrapper">';
|
480 |
|
481 |
$count = count( $this->settings_sections );
|
482 |
|
483 |
-
// don't show the navigation if only one section exists
|
484 |
-
if ( $count === 1 ) {
|
485 |
-
// return;
|
486 |
-
}
|
487 |
-
|
488 |
foreach ( $this->settings_sections as $tab ) {
|
489 |
$html .= sprintf( '<a href="#%1$s" class="nav-tab" id="%1$s-tab">%2$s</a>', $tab['id'], $tab['title'] );
|
490 |
}
|
491 |
|
492 |
$html .= '</h2>';
|
493 |
|
494 |
-
echo $html;
|
495 |
}
|
496 |
|
497 |
/**
|
@@ -499,11 +515,11 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
499 |
*
|
500 |
* This function displays every sections in a different form
|
501 |
*/
|
502 |
-
function show_forms() {
|
503 |
?>
|
504 |
<div class="header-and-footer-setting">
|
505 |
<?php foreach ( $this->settings_sections as $form ) { ?>
|
506 |
-
<div id="<?php echo $form['id']; ?>" class="group" style="display: none;">
|
507 |
<form method="post" action="options.php">
|
508 |
<?php
|
509 |
do_action( 'wsa_form_top_' . $form['id'], $form );
|
@@ -550,24 +566,24 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
550 |
<ul class="plugins_lists">
|
551 |
<li>
|
552 |
<a href="https://wpbrigade.com/wordpress/plugins/loginpress-pro/?utm_source=wp-headers-and-footers&utm_medium=sidebar&utm_campaign=pro-upgrade" data-count="none" target="_blank" title="<?php esc_html_e( 'Customize your login screen', 'wp-headers-and-footers' ); ?>">
|
553 |
-
<?php esc_html_e( 'LoginPress - Login Customizer', 'wp-headers-and-footers' ) ?>
|
554 |
</a>
|
555 |
</li>
|
556 |
|
557 |
<li>
|
558 |
<a href="https://analytify.io/ref/73/?utm_source=wp-headers-and-footers&utm_medium=sidebar&utm_campaign=pro-upgrade" target="_blank" title="<?php esc_html_e( 'Share with your facebook friends about this awesome plugin.', 'wp-headers-and-footers' ); ?>">
|
559 |
-
<?php esc_html_e( 'Google Analytics by Analytify', 'wp-headers-and-footers' ) ?>
|
560 |
</a>
|
561 |
</li>
|
562 |
|
563 |
<li>
|
564 |
<a href="https://simplesocialbuttons.com?utm_source=wp-headers-and-footers&utm_medium=sidebar&utm_campaign=pro-upgrade" target="_blank" title="<?php esc_html_e( 'Socialize your Website', 'wp-headers-and-footers' ); ?>">
|
565 |
-
<?php esc_html_e( 'Simple Social Buttons', 'wp-headers-and-footers' ) ?>
|
566 |
</a>
|
567 |
</li>
|
568 |
-
|
569 |
<a href="http://wpbrigade.com/recommend/maintenance-mode?utm_source=wp-headers-and-footers&utm_medium=sidebar&utm_campaign=pro-upgrade" target="_blank" title="<?php esc_html_e( 'Socialize your Website', 'wp-headers-and-footers' ); ?>">
|
570 |
-
|
571 |
</a>
|
572 |
</li>
|
573 |
</ul>
|
@@ -582,7 +598,7 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
582 |
*
|
583 |
* This code uses localstorage for displaying active tabs
|
584 |
*/
|
585 |
-
function script() {
|
586 |
?>
|
587 |
<script>
|
588 |
jQuery(document).ready(function($) {
|
@@ -654,10 +670,13 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
654 |
});
|
655 |
</script>
|
656 |
<?php
|
657 |
-
$this->
|
658 |
}
|
659 |
|
660 |
-
|
|
|
|
|
|
|
661 |
global $wp_version;
|
662 |
|
663 |
if ( version_compare( $wp_version, '3.8', '<=' ) ) :
|
@@ -672,33 +691,37 @@ if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
|
672 |
}
|
673 |
|
674 |
/**
|
675 |
-
|
676 |
-
|
677 |
-
|
678 |
-
|
679 |
-
|
680 |
-
|
|
|
681 |
return $desc;
|
682 |
}
|
683 |
|
684 |
/**
|
685 |
-
|
686 |
-
|
687 |
-
|
688 |
-
|
689 |
-
|
|
|
690 |
global $wp_settings_sections, $wp_settings_fields;
|
691 |
|
692 |
-
if ( !isset($wp_settings_sections) || !isset($wp_settings_sections[$page]) )
|
693 |
-
|
|
|
694 |
|
695 |
-
foreach ( (array) $wp_settings_sections[$page] as $section ) {
|
696 |
-
echo "<h3>{$section['title']}</h3>\n";
|
697 |
-
echo
|
698 |
-
if ( !isset($wp_settings_fields) || !isset($wp_settings_fields[$page]) || !isset($wp_settings_fields[$page][$section['id']]) )
|
699 |
-
|
|
|
700 |
echo '<table class="form-table">';
|
701 |
-
do_settings_fields($page, $section['id']);
|
702 |
echo '</table>';
|
703 |
}
|
704 |
}
|
1 |
<?php
|
|
|
2 |
/**
|
3 |
* WP Header and Footer Settings API wrapper class
|
4 |
+
*
|
5 |
+
* @package wp-headers-and-footers
|
6 |
*/
|
7 |
+
|
8 |
if ( ! class_exists( 'WPHeaderAndFooter_Settings_API' ) ) :
|
9 |
+
/**
|
10 |
+
* Class WPHeaderAndFooter_Settings_API
|
11 |
+
*/
|
12 |
class WPHeaderAndFooter_Settings_API {
|
13 |
|
14 |
/**
|
15 |
+
* Settings sections array
|
16 |
*
|
17 |
* @var array
|
18 |
*/
|
25 |
*/
|
26 |
protected $settings_fields = array();
|
27 |
|
28 |
+
/**
|
29 |
+
* The WPHeaderAndFooter_Settings_API constructor
|
30 |
+
*/
|
31 |
public function __construct() {
|
32 |
add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
|
33 |
}
|
35 |
/**
|
36 |
* Enqueue scripts and styles
|
37 |
*/
|
38 |
+
public function admin_enqueue_scripts() {
|
39 |
wp_enqueue_style( 'wp-color-picker' );
|
40 |
|
41 |
wp_enqueue_media();
|
46 |
/**
|
47 |
* Set settings sections
|
48 |
*
|
49 |
+
* @param array $sections setting sections array.
|
50 |
*/
|
51 |
+
public function set_sections( $sections ) {
|
52 |
$this->settings_sections = $sections;
|
53 |
|
54 |
return $this;
|
57 |
/**
|
58 |
* Add a single section
|
59 |
*
|
60 |
+
* @param array $section The section.
|
61 |
*/
|
62 |
+
public function add_section( $section ) {
|
63 |
$this->settings_sections[] = $section;
|
64 |
|
65 |
return $this;
|
68 |
/**
|
69 |
* Set settings fields
|
70 |
*
|
71 |
+
* @param array $fields settings fields array.
|
72 |
*/
|
73 |
+
public function set_fields( $fields ) {
|
74 |
$this->settings_fields = $fields;
|
75 |
|
76 |
return $this;
|
77 |
}
|
78 |
|
79 |
+
/**
|
80 |
+
* Add field in settings.
|
81 |
+
*
|
82 |
+
* @param array $section the section.
|
83 |
+
* @param array $field the field.
|
84 |
+
*/
|
85 |
+
public function add_field( $section, $field ) {
|
86 |
$defaults = array(
|
87 |
'name' => '',
|
88 |
'label' => '',
|
104 |
* This function gets the initiated settings sections and fields. Then
|
105 |
* registers them to WordPress and ready for use.
|
106 |
*/
|
107 |
+
public function admin_init() {
|
108 |
+
// register settings sections.
|
109 |
foreach ( $this->settings_sections as $section ) {
|
110 |
+
if ( false === get_option( $section['id'] ) ) {
|
111 |
add_option( $section['id'] );
|
112 |
}
|
113 |
|
114 |
if ( isset( $section['desc'] ) && ! empty( $section['desc'] ) ) {
|
115 |
$section['desc'] = '<div class="inside">' . $section['desc'] . '</div>';
|
116 |
+
$callback = call_user_func( array( $this, 'get_description' ), $section['desc'] );
|
117 |
} elseif ( isset( $section['callback'] ) ) {
|
118 |
$callback = $section['callback'];
|
119 |
} else {
|
123 |
add_settings_section( $section['id'], $section['title'], $callback, $section['id'] );
|
124 |
}
|
125 |
|
126 |
+
// register settings fields.
|
127 |
foreach ( $this->settings_fields as $section => $field ) {
|
128 |
foreach ( $field as $option ) {
|
129 |
|
154 |
}
|
155 |
}
|
156 |
|
157 |
+
// creates our settings in the options table.
|
158 |
foreach ( $this->settings_sections as $section ) {
|
159 |
register_setting( $section['id'], $section['id'], array( $this, 'sanitize_options' ) );
|
160 |
}
|
163 |
/**
|
164 |
* Get field description for display
|
165 |
*
|
166 |
+
* @param array $args settings field args.
|
167 |
*/
|
168 |
public function get_field_description( $args ) {
|
169 |
if ( ! empty( $args['desc'] ) ) {
|
178 |
/**
|
179 |
* Displays a text field for a settings field
|
180 |
*
|
181 |
+
* @param array $args settings field args.
|
182 |
*/
|
183 |
+
public function callback_text( $args ) {
|
184 |
|
185 |
$value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
186 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : 'regular';
|
190 |
$html = sprintf( '<input type="%1$s" class="%2$s-text" id="%3$s[%4$s]" name="%3$s[%4$s]" value="%5$s"%6$s/>', $type, $size, $args['section'], $args['id'], $value, $placeholder );
|
191 |
$html .= $this->get_field_description( $args );
|
192 |
|
193 |
+
echo $html; // @codingStandardsIgnoreLine.
|
194 |
}
|
195 |
|
196 |
/**
|
197 |
* Displays a url field for a settings field
|
198 |
*
|
199 |
+
* @param array $args settings field args.
|
200 |
*/
|
201 |
+
public function callback_url( $args ) {
|
202 |
$this->callback_text( $args );
|
203 |
}
|
204 |
|
205 |
/**
|
206 |
* Displays a number field for a settings field
|
207 |
*
|
208 |
+
* @param array $args settings field args.
|
209 |
*/
|
210 |
+
public function callback_number( $args ) {
|
211 |
$value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
212 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : 'regular';
|
213 |
$type = isset( $args['type'] ) ? $args['type'] : 'number';
|
219 |
$html = sprintf( '<input type="%1$s" class="%2$s-number" id="%3$s[%4$s]" name="%3$s[%4$s]" value="%5$s"%6$s%7$s%8$s%9$s/>', $type, $size, $args['section'], $args['id'], $value, $placeholder, $min, $max, $step );
|
220 |
$html .= $this->get_field_description( $args );
|
221 |
|
222 |
+
echo $html; // @codingStandardsIgnoreLine.
|
223 |
}
|
224 |
|
225 |
/**
|
226 |
* Displays a checkbox for a settings field
|
227 |
*
|
228 |
+
* @param array $args settings field args.
|
229 |
*/
|
230 |
+
public function callback_checkbox( $args ) {
|
231 |
|
232 |
$value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
233 |
|
238 |
$html .= sprintf( '%1$s</label>', $args['desc'] );
|
239 |
$html .= '</fieldset>';
|
240 |
|
241 |
+
echo $html; // @codingStandardsIgnoreLine.
|
242 |
}
|
243 |
|
244 |
/**
|
245 |
* Displays a multicheckbox a settings field
|
246 |
*
|
247 |
+
* @param array $args settings field args.
|
248 |
*/
|
249 |
+
public function callback_multicheck( $args ) {
|
250 |
|
251 |
$value = $this->get_option( $args['id'], $args['section'], $args['std'] );
|
252 |
$html = '<fieldset>';
|
261 |
$html .= $this->get_field_description( $args );
|
262 |
$html .= '</fieldset>';
|
263 |
|
264 |
+
echo $html; // @codingStandardsIgnoreLine.
|
265 |
}
|
266 |
|
267 |
/**
|
268 |
* Displays a multicheckbox a settings field
|
269 |
*
|
270 |
+
* @param array $args settings field args.
|
271 |
*/
|
272 |
+
public function callback_radio( $args ) {
|
273 |
|
274 |
$value = $this->get_option( $args['id'], $args['section'], $args['std'] );
|
275 |
$html = '<fieldset>';
|
283 |
$html .= $this->get_field_description( $args );
|
284 |
$html .= '</fieldset>';
|
285 |
|
286 |
+
echo $html; // @codingStandardsIgnoreLine.
|
287 |
}
|
288 |
|
289 |
/**
|
290 |
* Displays a selectbox for a settings field
|
291 |
*
|
292 |
+
* @param array $args settings field args.
|
293 |
*/
|
294 |
+
public function callback_select( $args ) {
|
295 |
|
296 |
$value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
297 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : 'regular';
|
304 |
$html .= sprintf( '</select>' );
|
305 |
$html .= $this->get_field_description( $args );
|
306 |
|
307 |
+
echo $html; // @codingStandardsIgnoreLine.
|
308 |
}
|
309 |
|
310 |
/**
|
311 |
* Displays a textarea for a settings field
|
312 |
*
|
313 |
+
* @param array $args settings field args.
|
314 |
*/
|
315 |
+
public function callback_textarea( $args ) {
|
316 |
|
317 |
$value = esc_textarea( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
318 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : 'regular';
|
321 |
$html = sprintf( '<textarea rows="5" cols="100" class="%1$s-text" id="%2$s[%3$s]" name="%2$s[%3$s]"%4$s>%5$s</textarea>', $size, $args['section'], $args['id'], $placeholder, $value );
|
322 |
$html .= $this->get_field_description( $args );
|
323 |
|
324 |
+
echo $html; // @codingStandardsIgnoreLine.
|
325 |
}
|
326 |
|
327 |
/**
|
328 |
* Displays a textarea for a settings field
|
329 |
*
|
330 |
+
* @param array $args settings field args.
|
|
|
331 |
*/
|
332 |
+
public function callback_html( $args ) {
|
333 |
+
echo $this->get_field_description( $args ); // @codingStandardsIgnoreLine.
|
334 |
}
|
335 |
|
336 |
/**
|
337 |
* Displays a rich text textarea for a settings field
|
338 |
*
|
339 |
+
* @param array $args settings field args.
|
340 |
*/
|
341 |
+
public function callback_wysiwyg( $args ) {
|
342 |
|
343 |
$value = $this->get_option( $args['id'], $args['section'], $args['std'] );
|
344 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : '500px';
|
345 |
|
346 |
+
echo '<div style="max-width: ' . $size . ';">'; // @codingStandardsIgnoreLine.
|
347 |
|
348 |
$editor_settings = array(
|
349 |
'teeny' => true,
|
359 |
|
360 |
echo '</div>';
|
361 |
|
362 |
+
echo $this->get_field_description( $args ); // @codingStandardsIgnoreLine.
|
363 |
}
|
364 |
|
365 |
/**
|
366 |
* Displays a file upload field for a settings field
|
367 |
*
|
368 |
+
* @param array $args settings field args.
|
369 |
*/
|
370 |
+
public function callback_file( $args ) {
|
371 |
|
372 |
$value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
373 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : 'regular';
|
378 |
$html .= '<input type="button" class="button wpsa-browse" value="' . $label . '" />';
|
379 |
$html .= $this->get_field_description( $args );
|
380 |
|
381 |
+
echo $html; // @codingStandardsIgnoreLine.
|
382 |
}
|
383 |
|
384 |
/**
|
385 |
* Displays a password field for a settings field
|
386 |
*
|
387 |
+
* @param array $args settings field args.
|
388 |
*/
|
389 |
+
public function callback_password( $args ) {
|
390 |
|
391 |
$value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
392 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : 'regular';
|
394 |
$html = sprintf( '<input type="password" class="%1$s-text" id="%2$s[%3$s]" name="%2$s[%3$s]" value="%4$s"/>', $size, $args['section'], $args['id'], $value );
|
395 |
$html .= $this->get_field_description( $args );
|
396 |
|
397 |
+
echo $html; // @codingStandardsIgnoreLine.
|
398 |
}
|
399 |
|
400 |
/**
|
401 |
* Displays a color picker field for a settings field
|
402 |
*
|
403 |
+
* @param array $args settings field args.
|
404 |
*/
|
405 |
+
public function callback_color( $args ) {
|
406 |
|
407 |
$value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
|
408 |
$size = isset( $args['size'] ) && ! is_null( $args['size'] ) ? $args['size'] : 'regular';
|
410 |
$html = sprintf( '<input type="text" class="%1$s-text wp-color-picker-field" id="%2$s[%3$s]" name="%2$s[%3$s]" value="%4$s" data-default-color="%5$s" />', $size, $args['section'], $args['id'], $value, $args['std'] );
|
411 |
$html .= $this->get_field_description( $args );
|
412 |
|
413 |
+
echo $html; // @codingStandardsIgnoreLine.
|
414 |
}
|
415 |
|
416 |
/**
|
417 |
* Sanitize callback for Settings API
|
418 |
*
|
419 |
+
* @param array $options santize option.
|
420 |
* @return mixed
|
421 |
*/
|
422 |
+
public function sanitize_options( $options ) {
|
423 |
+
|
424 |
+
$logger_settings = array();
|
425 |
|
426 |
if ( ! $options ) {
|
427 |
return $options;
|
430 |
foreach ( $options as $option_slug => $option_value ) {
|
431 |
$sanitize_callback = $this->get_sanitize_callback( $option_slug );
|
432 |
|
433 |
+
// If callback is set, call it.
|
434 |
if ( $sanitize_callback ) {
|
435 |
$options[ $option_slug ] = call_user_func( $sanitize_callback, $option_value );
|
436 |
continue;
|
437 |
}
|
438 |
+
|
439 |
+
$logger_settings[ 'is_using_' . $option_slug ] = !empty( trim( $option_value ) ) ? true : false;
|
440 |
+
|
441 |
}
|
442 |
|
443 |
+
update_option( 'wpheaderandfooter_basics_logger', $logger_settings );
|
444 |
+
|
445 |
return $options;
|
446 |
}
|
447 |
|
448 |
/**
|
449 |
* Get sanitization callback for given option slug
|
450 |
*
|
451 |
+
* @param string $slug option slug.
|
452 |
*
|
453 |
* @return mixed string or bool false
|
454 |
*/
|
455 |
+
public function get_sanitize_callback( $slug = '' ) {
|
456 |
if ( empty( $slug ) ) {
|
457 |
return false;
|
458 |
}
|
459 |
|
460 |
+
// Iterate over registered fields and see if we can find proper callback.
|
461 |
foreach ( $this->settings_fields as $section => $options ) {
|
462 |
foreach ( $options as $option ) {
|
463 |
+
if ( $option['name'] !== $slug ) {
|
464 |
continue;
|
465 |
}
|
466 |
|
467 |
+
// Return the callback name.
|
468 |
return isset( $option['sanitize_callback'] ) && is_callable( $option['sanitize_callback'] ) ? $option['sanitize_callback'] : false;
|
469 |
}
|
470 |
}
|
475 |
/**
|
476 |
* Get the value of a settings field
|
477 |
*
|
478 |
+
* @param string $option settings field name.
|
479 |
+
* @param string $section the section name this field belongs to.
|
480 |
+
* @param string $default default text if it's not found.
|
481 |
+
* @return string $default the default text if it's not found or settings field name.
|
482 |
*/
|
483 |
+
public function get_option( $option, $section, $default = '' ) {
|
484 |
|
485 |
$options = get_option( $section );
|
486 |
|
496 |
*
|
497 |
* Shows all the settings section labels as tab
|
498 |
*/
|
499 |
+
public function show_navigation() {
|
500 |
$html = '<h2 class="nav-tab-wrapper">';
|
501 |
|
502 |
$count = count( $this->settings_sections );
|
503 |
|
|
|
|
|
|
|
|
|
|
|
504 |
foreach ( $this->settings_sections as $tab ) {
|
505 |
$html .= sprintf( '<a href="#%1$s" class="nav-tab" id="%1$s-tab">%2$s</a>', $tab['id'], $tab['title'] );
|
506 |
}
|
507 |
|
508 |
$html .= '</h2>';
|
509 |
|
510 |
+
echo $html; // @codingStandardsIgnoreLine.
|
511 |
}
|
512 |
|
513 |
/**
|
515 |
*
|
516 |
* This function displays every sections in a different form
|
517 |
*/
|
518 |
+
public function show_forms() {
|
519 |
?>
|
520 |
<div class="header-and-footer-setting">
|
521 |
<?php foreach ( $this->settings_sections as $form ) { ?>
|
522 |
+
<div id="<?php echo esc_attr( $form['id'] ); ?>" class="group" style="display: none;">
|
523 |
<form method="post" action="options.php">
|
524 |
<?php
|
525 |
do_action( 'wsa_form_top_' . $form['id'], $form );
|
566 |
<ul class="plugins_lists">
|
567 |
<li>
|
568 |
<a href="https://wpbrigade.com/wordpress/plugins/loginpress-pro/?utm_source=wp-headers-and-footers&utm_medium=sidebar&utm_campaign=pro-upgrade" data-count="none" target="_blank" title="<?php esc_html_e( 'Customize your login screen', 'wp-headers-and-footers' ); ?>">
|
569 |
+
<?php esc_html_e( 'LoginPress - Login Customizer', 'wp-headers-and-footers' ); ?>
|
570 |
</a>
|
571 |
</li>
|
572 |
|
573 |
<li>
|
574 |
<a href="https://analytify.io/ref/73/?utm_source=wp-headers-and-footers&utm_medium=sidebar&utm_campaign=pro-upgrade" target="_blank" title="<?php esc_html_e( 'Share with your facebook friends about this awesome plugin.', 'wp-headers-and-footers' ); ?>">
|
575 |
+
<?php esc_html_e( 'Google Analytics by Analytify', 'wp-headers-and-footers' ); ?>
|
576 |
</a>
|
577 |
</li>
|
578 |
|
579 |
<li>
|
580 |
<a href="https://simplesocialbuttons.com?utm_source=wp-headers-and-footers&utm_medium=sidebar&utm_campaign=pro-upgrade" target="_blank" title="<?php esc_html_e( 'Socialize your Website', 'wp-headers-and-footers' ); ?>">
|
581 |
+
<?php esc_html_e( 'Simple Social Buttons', 'wp-headers-and-footers' ); ?>
|
582 |
</a>
|
583 |
</li>
|
584 |
+
<li>
|
585 |
<a href="http://wpbrigade.com/recommend/maintenance-mode?utm_source=wp-headers-and-footers&utm_medium=sidebar&utm_campaign=pro-upgrade" target="_blank" title="<?php esc_html_e( 'Socialize your Website', 'wp-headers-and-footers' ); ?>">
|
586 |
+
<?php esc_html_e( 'Under Construction & Maintenance mode', 'wp-headers-and-footers' ); ?>
|
587 |
</a>
|
588 |
</li>
|
589 |
</ul>
|
598 |
*
|
599 |
* This code uses localstorage for displaying active tabs
|
600 |
*/
|
601 |
+
public function script() {
|
602 |
?>
|
603 |
<script>
|
604 |
jQuery(document).ready(function($) {
|
670 |
});
|
671 |
</script>
|
672 |
<?php
|
673 |
+
$this->style_fix();
|
674 |
}
|
675 |
|
676 |
+
/**
|
677 |
+
* The style fix if WP version is less than 5.8
|
678 |
+
*/
|
679 |
+
public function style_fix() {
|
680 |
global $wp_version;
|
681 |
|
682 |
if ( version_compare( $wp_version, '3.8', '<=' ) ) :
|
691 |
}
|
692 |
|
693 |
/**
|
694 |
+
* Get Section Description
|
695 |
+
*
|
696 |
+
* @param string $desc The section description.
|
697 |
+
*
|
698 |
+
* @since 1.2.0
|
699 |
+
*/
|
700 |
+
public function get_description( $desc ) {
|
701 |
return $desc;
|
702 |
}
|
703 |
|
704 |
/**
|
705 |
+
* Prints out all settings sections added to a particular settings page
|
706 |
+
*
|
707 |
+
* @param string $page the page.
|
708 |
+
* @since 1.2.1
|
709 |
+
*/
|
710 |
+
public function do_settings_sections( $page ) {
|
711 |
global $wp_settings_sections, $wp_settings_fields;
|
712 |
|
713 |
+
if ( ! isset( $wp_settings_sections ) || ! isset( $wp_settings_sections[ $page ] ) ) {
|
714 |
+
return;
|
715 |
+
}
|
716 |
|
717 |
+
foreach ( (array) $wp_settings_sections[ $page ] as $section ) {
|
718 |
+
echo "<h3>{$section['title']}</h3>\n"; // @codingStandardsIgnoreLine.
|
719 |
+
echo $section['callback']; // @codingStandardsIgnoreLine.
|
720 |
+
if ( ! isset( $wp_settings_fields ) || ! isset( $wp_settings_fields[ $page ] ) || ! isset( $wp_settings_fields[ $page ][ $section['id'] ] ) ) {
|
721 |
+
continue;
|
722 |
+
}
|
723 |
echo '<table class="form-table">';
|
724 |
+
do_settings_fields( $page, $section['id'] );
|
725 |
echo '</table>';
|
726 |
}
|
727 |
}
|
classes/class-setup.php
CHANGED
@@ -2,13 +2,27 @@
|
|
2 |
|
3 |
/**
|
4 |
* WordPress Header and Footer Setup
|
|
|
|
|
5 |
*/
|
|
|
6 |
if ( ! class_exists( 'WPHeaderAndFooter_Setting' ) ) :
|
|
|
|
|
|
|
7 |
class WPHeaderAndFooter_Setting {
|
8 |
|
|
|
|
|
|
|
|
|
|
|
9 |
private $settings_api;
|
10 |
|
11 |
-
|
|
|
|
|
|
|
12 |
|
13 |
include_once WPHEADERANDFOOTER_DIR_PATH . 'classes/class-settings-api.php';
|
14 |
$this->settings_api = new WPHeaderAndFooter_Settings_API();
|
@@ -17,25 +31,35 @@ if ( ! class_exists( 'WPHeaderAndFooter_Setting' ) ) :
|
|
17 |
add_action( 'admin_menu', array( $this, 'register_options_page' ) );
|
18 |
}
|
19 |
|
20 |
-
|
|
|
|
|
|
|
21 |
|
22 |
-
//
|
23 |
$this->settings_api->set_sections( $this->get_settings_sections() );
|
24 |
$this->settings_api->set_fields( $this->get_settings_fields() );
|
25 |
|
26 |
-
//
|
27 |
$this->settings_api->admin_init();
|
28 |
}
|
29 |
|
30 |
/**
|
31 |
* Register the plugin settings panel
|
|
|
|
|
32 |
*/
|
33 |
-
function register_options_page() {
|
34 |
|
35 |
add_submenu_page( 'options-general.php', __( 'WP Headers and Footers', 'wp-headers-and-footers' ), __( 'WP Headers and Footers', 'wp-headers-and-footers' ), 'manage_options', 'wp-headers-and-footers', array( $this, 'wp_header_and_footer_callback' ) );
|
36 |
}
|
37 |
|
38 |
-
|
|
|
|
|
|
|
|
|
|
|
39 |
$sections = array(
|
40 |
array(
|
41 |
'id' => 'wpheaderandfooter_basics',
|
@@ -51,27 +75,30 @@ if ( ! class_exists( 'WPHeaderAndFooter_Setting' ) ) :
|
|
51 |
*
|
52 |
* @since 1.0.0
|
53 |
* @version 1.2.3
|
54 |
-
*
|
55 |
* @return array settings fields
|
56 |
*/
|
57 |
-
function get_settings_fields() {
|
58 |
$settings_fields = array(
|
59 |
'wpheaderandfooter_basics' => array(
|
60 |
array(
|
61 |
'name' => 'wp_header_textarea',
|
62 |
'label' => __( 'Scripts in Header', 'wp-headers-and-footers' ),
|
|
|
63 |
'desc' => sprintf( __( 'These scripts will be printed in the %1$s section.', 'wp-headers-and-footers' ), '<head>' ),
|
64 |
'type' => 'textarea',
|
65 |
),
|
66 |
array(
|
67 |
'name' => 'wp_body_textarea',
|
68 |
'label' => __( 'Scripts in Body', 'wp-headers-and-footers' ),
|
|
|
69 |
'desc' => sprintf( __( 'These scripts will be printed below the %1$s tag.', 'wp-headers-and-footers' ), '<body>' ),
|
70 |
'type' => 'textarea',
|
71 |
),
|
72 |
array(
|
73 |
'name' => 'wp_footer_textarea',
|
74 |
'label' => __( 'Scripts in Footer', 'wp-headers-and-footers' ),
|
|
|
75 |
'desc' => sprintf( __( 'These scripts will be printed below the %1$s tag.', 'wp-headers-and-footers' ), '<footer>' ),
|
76 |
'type' => 'textarea',
|
77 |
),
|
@@ -81,7 +108,12 @@ if ( ! class_exists( 'WPHeaderAndFooter_Setting' ) ) :
|
|
81 |
return $settings_fields;
|
82 |
}
|
83 |
|
84 |
-
|
|
|
|
|
|
|
|
|
|
|
85 |
echo '<div class="wrap wp-headers-and-footers">';
|
86 |
|
87 |
$this->settings_api->show_navigation();
|
@@ -95,7 +127,7 @@ if ( ! class_exists( 'WPHeaderAndFooter_Setting' ) ) :
|
|
95 |
*
|
96 |
* @return array page names with key value pairs
|
97 |
*/
|
98 |
-
function get_pages() {
|
99 |
$pages = get_pages();
|
100 |
$pages_options = array();
|
101 |
if ( $pages ) {
|
2 |
|
3 |
/**
|
4 |
* WordPress Header and Footer Setup
|
5 |
+
*
|
6 |
+
* @package wp-headers-and-footers
|
7 |
*/
|
8 |
+
|
9 |
if ( ! class_exists( 'WPHeaderAndFooter_Setting' ) ) :
|
10 |
+
/**
|
11 |
+
* The WPHeaderAndFooter Settings class
|
12 |
+
*/
|
13 |
class WPHeaderAndFooter_Setting {
|
14 |
|
15 |
+
/**
|
16 |
+
* Settings sections array
|
17 |
+
*
|
18 |
+
* @var array $settings_api The settings API array.
|
19 |
+
*/
|
20 |
private $settings_api;
|
21 |
|
22 |
+
/**
|
23 |
+
* The constructor of WPHeaderAndFooter Settings class
|
24 |
+
*/
|
25 |
+
public function __construct() {
|
26 |
|
27 |
include_once WPHEADERANDFOOTER_DIR_PATH . 'classes/class-settings-api.php';
|
28 |
$this->settings_api = new WPHeaderAndFooter_Settings_API();
|
31 |
add_action( 'admin_menu', array( $this, 'register_options_page' ) );
|
32 |
}
|
33 |
|
34 |
+
/**
|
35 |
+
* Admin initialize function.
|
36 |
+
*/
|
37 |
+
public function admin_init() {
|
38 |
|
39 |
+
// Set the settings.
|
40 |
$this->settings_api->set_sections( $this->get_settings_sections() );
|
41 |
$this->settings_api->set_fields( $this->get_settings_fields() );
|
42 |
|
43 |
+
// Initialize settings.
|
44 |
$this->settings_api->admin_init();
|
45 |
}
|
46 |
|
47 |
/**
|
48 |
* Register the plugin settings panel
|
49 |
+
*
|
50 |
+
* @since 1.1.0
|
51 |
*/
|
52 |
+
public function register_options_page() {
|
53 |
|
54 |
add_submenu_page( 'options-general.php', __( 'WP Headers and Footers', 'wp-headers-and-footers' ), __( 'WP Headers and Footers', 'wp-headers-and-footers' ), 'manage_options', 'wp-headers-and-footers', array( $this, 'wp_header_and_footer_callback' ) );
|
55 |
}
|
56 |
|
57 |
+
/**
|
58 |
+
* The settings section.
|
59 |
+
*
|
60 |
+
* @since 1.1.0
|
61 |
+
*/
|
62 |
+
public function get_settings_sections() {
|
63 |
$sections = array(
|
64 |
array(
|
65 |
'id' => 'wpheaderandfooter_basics',
|
75 |
*
|
76 |
* @since 1.0.0
|
77 |
* @version 1.2.3
|
78 |
+
*
|
79 |
* @return array settings fields
|
80 |
*/
|
81 |
+
public function get_settings_fields() {
|
82 |
$settings_fields = array(
|
83 |
'wpheaderandfooter_basics' => array(
|
84 |
array(
|
85 |
'name' => 'wp_header_textarea',
|
86 |
'label' => __( 'Scripts in Header', 'wp-headers-and-footers' ),
|
87 |
+
/* Translators: The header textarea description */
|
88 |
'desc' => sprintf( __( 'These scripts will be printed in the %1$s section.', 'wp-headers-and-footers' ), '<head>' ),
|
89 |
'type' => 'textarea',
|
90 |
),
|
91 |
array(
|
92 |
'name' => 'wp_body_textarea',
|
93 |
'label' => __( 'Scripts in Body', 'wp-headers-and-footers' ),
|
94 |
+
/* Translators: The body textarea description */
|
95 |
'desc' => sprintf( __( 'These scripts will be printed below the %1$s tag.', 'wp-headers-and-footers' ), '<body>' ),
|
96 |
'type' => 'textarea',
|
97 |
),
|
98 |
array(
|
99 |
'name' => 'wp_footer_textarea',
|
100 |
'label' => __( 'Scripts in Footer', 'wp-headers-and-footers' ),
|
101 |
+
/* Translators: The footer textarea description */
|
102 |
'desc' => sprintf( __( 'These scripts will be printed below the %1$s tag.', 'wp-headers-and-footers' ), '<footer>' ),
|
103 |
'type' => 'textarea',
|
104 |
),
|
108 |
return $settings_fields;
|
109 |
}
|
110 |
|
111 |
+
/**
|
112 |
+
* The header and footer settings section and forms callback
|
113 |
+
*
|
114 |
+
* @since 1.1.0
|
115 |
+
*/
|
116 |
+
public function wp_header_and_footer_callback() {
|
117 |
echo '<div class="wrap wp-headers-and-footers">';
|
118 |
|
119 |
$this->settings_api->show_navigation();
|
127 |
*
|
128 |
* @return array page names with key value pairs
|
129 |
*/
|
130 |
+
public function get_pages() {
|
131 |
$pages = get_pages();
|
132 |
$pages_options = array();
|
133 |
if ( $pages ) {
|
classes/plugin-meta.php
CHANGED
@@ -1,58 +1,71 @@
|
|
1 |
<?php
|
2 |
/**
|
3 |
* WordPress Header and Footer plugins meta
|
|
|
|
|
4 |
* @since 1.2.1
|
5 |
*/
|
6 |
|
7 |
if ( ! class_exists( 'WPHeaderAndFooter_Plugin_Meta' ) ) :
|
8 |
-
|
|
|
|
|
|
|
9 |
class WPHeaderAndFooter_Plugin_Meta {
|
10 |
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
|
|
|
|
|
|
|
|
|
|
15 |
}
|
16 |
|
17 |
/**
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
|
|
24 |
|
25 |
-
|
26 |
|
27 |
-
|
28 |
-
|
29 |
|
30 |
-
|
31 |
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
|
41 |
-
|
42 |
-
|
43 |
|
44 |
-
|
45 |
-
|
46 |
|
47 |
-
|
48 |
}
|
49 |
-
|
50 |
/**
|
51 |
* Add a link to the settings page to the plugins list
|
52 |
*
|
|
|
|
|
53 |
* @since 1.2.1
|
54 |
*/
|
55 |
-
public function
|
56 |
|
57 |
static $this_plugin;
|
58 |
|
@@ -61,8 +74,8 @@ if ( ! class_exists( 'WPHeaderAndFooter_Plugin_Meta' ) ) :
|
|
61 |
$this_plugin = 'wp-headers-and-footers/wp-headers-and-footers.php';
|
62 |
}
|
63 |
|
64 |
-
if ( $file
|
65 |
-
|
66 |
$settings_link = sprintf( esc_html__( '%1$s Settings %2$s', 'wp-headers-and-footers' ), '<a href="' . admin_url( 'options-general.php?page=wp-headers-and-footers' ) . '">', '</a>' );
|
67 |
|
68 |
array_unshift( $links, $settings_link );
|
@@ -74,4 +87,4 @@ if ( ! class_exists( 'WPHeaderAndFooter_Plugin_Meta' ) ) :
|
|
74 |
}
|
75 |
endif;
|
76 |
|
77 |
-
new WPHeaderAndFooter_Plugin_Meta();
|
1 |
<?php
|
2 |
/**
|
3 |
* WordPress Header and Footer plugins meta
|
4 |
+
*
|
5 |
+
* @package wp-headers-and-footers
|
6 |
* @since 1.2.1
|
7 |
*/
|
8 |
|
9 |
if ( ! class_exists( 'WPHeaderAndFooter_Plugin_Meta' ) ) :
|
10 |
+
|
11 |
+
/**
|
12 |
+
* The Meta class of Header and Footer
|
13 |
+
*/
|
14 |
class WPHeaderAndFooter_Plugin_Meta {
|
15 |
|
16 |
+
/**
|
17 |
+
* The class constructor
|
18 |
+
*
|
19 |
+
* @since 1.0.0.
|
20 |
+
*/
|
21 |
+
public function __construct() {
|
22 |
+
|
23 |
+
add_filter( 'plugin_row_meta', array( $this, 'row_meta' ), 10, 2 );
|
24 |
+
add_action( 'plugin_action_links', array( $this, 'action_links' ), 10, 2 );
|
25 |
}
|
26 |
|
27 |
/**
|
28 |
+
* Add rating icon on plugins page.
|
29 |
+
*
|
30 |
+
* @param string $meta_fields the meta field.
|
31 |
+
* @param string $file the file name.
|
32 |
+
* @since 1.2.1
|
33 |
+
*/
|
34 |
+
public function row_meta( $meta_fields, $file ) {
|
35 |
|
36 |
+
if ( 'wp-headers-and-footers/wp-headers-and-footers.php' !== $file ) {
|
37 |
|
38 |
+
return $meta_fields;
|
39 |
+
}
|
40 |
|
41 |
+
echo '<style>.wp-headers-and-footers-rate-stars { display: inline-block; color: #ffb900; position: relative; top: 3px; }.wp-headers-and-footers-rate-stars svg{ fill:#ffb900; } .wp-headers-and-footers-rate-stars svg:hover{ fill:#ffb900 } .wp-headers-and-footers-rate-stars svg:hover ~ svg{ fill:none; } </style>';
|
42 |
|
43 |
+
$plugin_rate = 'https://wordpress.org/support/plugin/wp-headers-and-footers/reviews/?rate=5#new-post';
|
44 |
+
$plugin_filter = 'https://wordpress.org/support/plugin/wp-headers-and-footers/reviews/?filter=5';
|
45 |
+
$svg_xmlns = 'https://www.w3.org/2000/svg';
|
46 |
+
$svg_icon = '';
|
47 |
|
48 |
+
for ( $i = 0; $i < 5; $i++ ) {
|
49 |
+
$svg_icon .= "<svg xmlns='" . esc_url( $svg_xmlns ) . "' width='15' height='15' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-star'><polygon points='12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2'/></svg>";
|
50 |
+
}
|
51 |
|
52 |
+
// Set icon for thumbsup.
|
53 |
+
$meta_fields[] = '<a href="' . esc_url( $plugin_filter ) . '" target="_blank"><span class="dashicons dashicons-thumbs-up"></span>' . __( 'Vote!', 'wp-headers-and-footers' ) . '</a>';
|
54 |
|
55 |
+
// Set icon for 5-star reviews. v1.1.22.
|
56 |
+
$meta_fields[] = "<a href='" . esc_url( $plugin_rate ) . "' target='_blank' title='" . esc_html__( 'Rate', 'wp-headers-and-footers' ) . "'><i class='wp-headers-and-footers-rate-stars'>" . $svg_icon . '</i></a>';
|
57 |
|
58 |
+
return $meta_fields;
|
59 |
}
|
60 |
+
|
61 |
/**
|
62 |
* Add a link to the settings page to the plugins list
|
63 |
*
|
64 |
+
* @param URL $links the action link.
|
65 |
+
* @param string $file the file name.
|
66 |
* @since 1.2.1
|
67 |
*/
|
68 |
+
public function action_links( $links, $file ) {
|
69 |
|
70 |
static $this_plugin;
|
71 |
|
74 |
$this_plugin = 'wp-headers-and-footers/wp-headers-and-footers.php';
|
75 |
}
|
76 |
|
77 |
+
if ( $file === $this_plugin ) {
|
78 |
+
/* Translators: Settings tab */
|
79 |
$settings_link = sprintf( esc_html__( '%1$s Settings %2$s', 'wp-headers-and-footers' ), '<a href="' . admin_url( 'options-general.php?page=wp-headers-and-footers' ) . '">', '</a>' );
|
80 |
|
81 |
array_unshift( $links, $settings_link );
|
87 |
}
|
88 |
endif;
|
89 |
|
90 |
+
new WPHeaderAndFooter_Plugin_Meta();
|
languages/wp-header-and-footer.pot
DELETED
@@ -1,101 +0,0 @@
|
|
1 |
-
# Copyright (C) 2020 WPBrigade
|
2 |
-
# This file is distributed under the same license as the WP Headers and Footers plugin.
|
3 |
-
msgid ""
|
4 |
-
msgstr ""
|
5 |
-
"Project-Id-Version: 1.1.0\n"
|
6 |
-
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wp-header-and-footer\n"
|
7 |
-
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
8 |
-
"Language-Team: LANGUAGE <LL@li.org>\n"
|
9 |
-
"MIME-Version: 1.0\n"
|
10 |
-
"Content-Type: text/plain; charset=UTF-8\n"
|
11 |
-
"Content-Transfer-Encoding: 8bit\n"
|
12 |
-
"POT-Creation-Date: 2020-02-21T10:55:12+00:00\n"
|
13 |
-
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
14 |
-
"X-Generator: WP-CLI 2.4.0\n"
|
15 |
-
"X-Domain: wp-header-and-footer\n"
|
16 |
-
|
17 |
-
#. Plugin Name of the plugin
|
18 |
-
#: classes/class-setup.php:35
|
19 |
-
msgid "WP Headers and Footers"
|
20 |
-
msgstr ""
|
21 |
-
|
22 |
-
#. Plugin URI of the plugin
|
23 |
-
msgid "http://www.WPBrigade.com/wordpress/plugins/wp-headers-and-footers/"
|
24 |
-
msgstr ""
|
25 |
-
|
26 |
-
#. Description of the plugin
|
27 |
-
msgid "Allows you to insert code or text in the header or footer of your WordPress site."
|
28 |
-
msgstr ""
|
29 |
-
|
30 |
-
#. Author of the plugin
|
31 |
-
msgid "WPBrigade"
|
32 |
-
msgstr ""
|
33 |
-
|
34 |
-
#. Author URI of the plugin
|
35 |
-
msgid "https://www.WPBrigade.com/"
|
36 |
-
msgstr ""
|
37 |
-
|
38 |
-
#: classes/class-settings-api.php:525
|
39 |
-
msgid "Spread the Word"
|
40 |
-
msgstr ""
|
41 |
-
|
42 |
-
#: classes/class-settings-api.php:528
|
43 |
-
msgid "Post to Twitter Now"
|
44 |
-
msgstr ""
|
45 |
-
|
46 |
-
#: classes/class-settings-api.php:528
|
47 |
-
msgid "Share on Twitter"
|
48 |
-
msgstr ""
|
49 |
-
|
50 |
-
#: classes/class-settings-api.php:531
|
51 |
-
msgid "Share with your facebook friends about this awesome plugin"
|
52 |
-
msgstr ""
|
53 |
-
|
54 |
-
#: classes/class-settings-api.php:531
|
55 |
-
msgid "Share on Facebook"
|
56 |
-
msgstr ""
|
57 |
-
|
58 |
-
#: classes/class-settings-api.php:535
|
59 |
-
msgid "Rate on WordPress.org"
|
60 |
-
msgstr ""
|
61 |
-
|
62 |
-
#: classes/class-settings-api.php:541
|
63 |
-
msgid "Recommended Plugins"
|
64 |
-
msgstr ""
|
65 |
-
|
66 |
-
#: classes/class-settings-api.php:545
|
67 |
-
msgid "Customize your login screen"
|
68 |
-
msgstr ""
|
69 |
-
|
70 |
-
#: classes/class-settings-api.php:549
|
71 |
-
msgid "Share with your facebook friends about this awesome plugin."
|
72 |
-
msgstr ""
|
73 |
-
|
74 |
-
#: classes/class-settings-api.php:554
|
75 |
-
#: classes/class-settings-api.php:558
|
76 |
-
msgid "Socialize your Website"
|
77 |
-
msgstr ""
|
78 |
-
|
79 |
-
#: classes/class-setup.php:42
|
80 |
-
msgid "Settings"
|
81 |
-
msgstr ""
|
82 |
-
|
83 |
-
#: classes/class-setup.php:43
|
84 |
-
msgid "WP Headers and Footers."
|
85 |
-
msgstr ""
|
86 |
-
|
87 |
-
#: classes/class-setup.php:59
|
88 |
-
msgid "Scripts in Header"
|
89 |
-
msgstr ""
|
90 |
-
|
91 |
-
#: classes/class-setup.php:60
|
92 |
-
msgid "These scripts will be printed in the %1$s%2$s%3$s section."
|
93 |
-
msgstr ""
|
94 |
-
|
95 |
-
#: classes/class-setup.php:65
|
96 |
-
msgid "Scripts in Footer"
|
97 |
-
msgstr ""
|
98 |
-
|
99 |
-
#: classes/class-setup.php:66
|
100 |
-
msgid "These scripts will be printed above the %1$s%2$s%3$s tag."
|
101 |
-
msgstr ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lib/wpb-sdk/includes/wpb-sdk-logger.php
ADDED
@@ -0,0 +1,395 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Logger responsible for gathering user logs and send.
|
4 |
+
* In effort to provide better customer experience.
|
5 |
+
*
|
6 |
+
* @package WPB_SDK
|
7 |
+
* @since 1.4.0
|
8 |
+
*/
|
9 |
+
|
10 |
+
namespace WPHeaderAndFooter_SDK;
|
11 |
+
|
12 |
+
/**
|
13 |
+
* Class responsible for logs data collection.
|
14 |
+
*/
|
15 |
+
class Logger {
|
16 |
+
|
17 |
+
/**
|
18 |
+
* Contains products data for logging.
|
19 |
+
*
|
20 |
+
* @var array
|
21 |
+
*/
|
22 |
+
private static $product_data;
|
23 |
+
|
24 |
+
/**
|
25 |
+
* Contains products that have a Pro version.
|
26 |
+
*
|
27 |
+
* @var array
|
28 |
+
*/
|
29 |
+
private static $has_pro_version = array( 'wp-analytify', 'loginpress', 'simple-social-buttons' );
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Class constructor.
|
33 |
+
*
|
34 |
+
* @param array $product_data variable.
|
35 |
+
* @return void
|
36 |
+
*/
|
37 |
+
public function __construct( $product_data ) {
|
38 |
+
|
39 |
+
self::$product_data = $product_data;
|
40 |
+
$this->hooks();
|
41 |
+
}
|
42 |
+
|
43 |
+
/**
|
44 |
+
* Call wp hooks to initialize logger actions.
|
45 |
+
*
|
46 |
+
* @return void
|
47 |
+
*/
|
48 |
+
public function hooks() {
|
49 |
+
|
50 |
+
add_action( 'init', array( $this, 'set_logs_schedule' ) );
|
51 |
+
add_action( 'wpb_logger_cron_' . self::$product_data['slug'], array( $this, 'log_plugin' ) );
|
52 |
+
add_action( 'admin_footer', array( $this, 'deactivation_model' ) );
|
53 |
+
add_action( 'wp_ajax_wpb_sdk_' . self::$product_data['slug'] . '_deactivation', array( $this, 'ajax_deactivation' ) );
|
54 |
+
|
55 |
+
register_activation_hook( self::$product_data['path'], array( __CLASS__, 'log_activation' ) );
|
56 |
+
register_deactivation_hook( self::$product_data['path'], array( __CLASS__, 'product_deactivation' ) );
|
57 |
+
register_uninstall_hook( self::$product_data['path'], array( __CLASS__, 'log_uninstallation' ) );
|
58 |
+
}
|
59 |
+
|
60 |
+
/**
|
61 |
+
* Set logs schedule.
|
62 |
+
*/
|
63 |
+
public function set_logs_schedule() {
|
64 |
+
|
65 |
+
if ( ! wp_next_scheduled( 'wpb_logger_cron_' . self::$product_data['slug'] ) ) {
|
66 |
+
wp_schedule_event( time(), 'weekly', 'wpb_logger_cron_' . self::$product_data['slug'] );
|
67 |
+
}
|
68 |
+
}
|
69 |
+
|
70 |
+
/**
|
71 |
+
* Add deactivation model.
|
72 |
+
*
|
73 |
+
* @return void
|
74 |
+
*/
|
75 |
+
public function deactivation_model() {
|
76 |
+
|
77 |
+
if ( function_exists( 'get_current_screen' ) ) {
|
78 |
+
|
79 |
+
$screen = get_current_screen();
|
80 |
+
|
81 |
+
if ( 'plugins.php' === $screen->parent_file ) {
|
82 |
+
|
83 |
+
$product_slug = self::$product_data['slug'];
|
84 |
+
$product_name = self::$product_data['name'];
|
85 |
+
|
86 |
+
$has_pro_version = ( in_array( $product_slug, self::$has_pro_version ) ) ? true : false;
|
87 |
+
|
88 |
+
include dirname( __DIR__ ) . '/views/wpb-sdk-deactivate-form.php';
|
89 |
+
}
|
90 |
+
}
|
91 |
+
}
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Ajax callback when product deactivated.
|
95 |
+
* Shows deactivation model.
|
96 |
+
*
|
97 |
+
* @return void
|
98 |
+
*/
|
99 |
+
public function ajax_deactivation() {
|
100 |
+
|
101 |
+
if ( isset( $_POST['nonce'] ) && empty( $_POST['nonce'] ) ) {
|
102 |
+
return;
|
103 |
+
}
|
104 |
+
|
105 |
+
$nonce = sanitize_text_field( wp_unslash( $_POST['nonce'] ) );
|
106 |
+
$verify_nonce = wp_verify_nonce( $nonce, 'deactivate-plugin_' . plugin_basename( self::$product_data['path'] ) );
|
107 |
+
|
108 |
+
if ( ! $verify_nonce ) {
|
109 |
+
return;
|
110 |
+
}
|
111 |
+
|
112 |
+
$this->log_deactivation();
|
113 |
+
|
114 |
+
wp_die();
|
115 |
+
}
|
116 |
+
|
117 |
+
/**
|
118 |
+
* Send plugin logs on cron.
|
119 |
+
*
|
120 |
+
* @return $wpb_sdk_track SDK track record.
|
121 |
+
*/
|
122 |
+
public function log_plugin() {
|
123 |
+
|
124 |
+
/**
|
125 |
+
* Adding a activation check to prevent 2 hits from getting send on activation
|
126 |
+
*/
|
127 |
+
if ( get_transient( 'wpb_logger_cron_' . self::$product_data['slug'] ) ) {
|
128 |
+
return;
|
129 |
+
}
|
130 |
+
|
131 |
+
$logs_data = array_merge(
|
132 |
+
self::get_logs_data(),
|
133 |
+
array(
|
134 |
+
'explicit_logs' => array(
|
135 |
+
'action' => 'weekly',
|
136 |
+
),
|
137 |
+
)
|
138 |
+
);
|
139 |
+
|
140 |
+
$wpb_sdk_track = new Track( $logs_data );
|
141 |
+
$wpb_sdk_track->send();
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* Send logs when plugin is activated.
|
146 |
+
*/
|
147 |
+
public static function log_activation() {
|
148 |
+
|
149 |
+
/**
|
150 |
+
* Setting a transient to add a check in the weekly track report
|
151 |
+
*/
|
152 |
+
set_transient( 'wpb_logger_cron_' . self::$product_data['slug'], true, 60 );
|
153 |
+
|
154 |
+
$logs_data = array_merge(
|
155 |
+
self::get_logs_data(),
|
156 |
+
array(
|
157 |
+
'explicit_logs' => array(
|
158 |
+
'action' => 'activate',
|
159 |
+
),
|
160 |
+
)
|
161 |
+
);
|
162 |
+
|
163 |
+
$wpb_sdk_track = new Track( $logs_data );
|
164 |
+
$wpb_sdk_track->send();
|
165 |
+
}
|
166 |
+
|
167 |
+
/**
|
168 |
+
* Send logs when plugin is deactivated.
|
169 |
+
*/
|
170 |
+
public function log_deactivation() {
|
171 |
+
$reason = isset( $_POST['reason'] ) ? $_POST['reason'] : '';
|
172 |
+
$reason_detail = isset( $_POST['reason_detail'] ) ? $_POST['reason_detail'] : '';
|
173 |
+
|
174 |
+
$logs_data = array_merge(
|
175 |
+
self::get_logs_data(),
|
176 |
+
array(
|
177 |
+
'explicit_logs' => array(
|
178 |
+
'action' => 'deactivate',
|
179 |
+
'reason' => sanitize_text_field( wp_unslash( $reason ) ),
|
180 |
+
'reason_detail' => sanitize_text_field( wp_unslash( $reason_detail ) ),
|
181 |
+
),
|
182 |
+
)
|
183 |
+
);
|
184 |
+
|
185 |
+
$wpb_sdk_track = new Track( $logs_data );
|
186 |
+
$wpb_sdk_track->send();
|
187 |
+
}
|
188 |
+
|
189 |
+
/**
|
190 |
+
* Remove cron schedules on deactivation.
|
191 |
+
*/
|
192 |
+
public static function product_deactivation() {
|
193 |
+
|
194 |
+
wp_clear_scheduled_hook( 'wpb_logger_cron_' . self::$product_data['slug'] );
|
195 |
+
}
|
196 |
+
|
197 |
+
/**
|
198 |
+
* Send logs when plugin is uninstalled.
|
199 |
+
*/
|
200 |
+
public static function log_uninstallation() {
|
201 |
+
|
202 |
+
$logs_data = array_merge(
|
203 |
+
self::get_logs_data(),
|
204 |
+
array(
|
205 |
+
'explicit_logs' => array(
|
206 |
+
'action' => 'uninstall',
|
207 |
+
),
|
208 |
+
)
|
209 |
+
);
|
210 |
+
|
211 |
+
$wpb_sdk_track = new Track( $logs_data );
|
212 |
+
$wpb_sdk_track->send();
|
213 |
+
}
|
214 |
+
|
215 |
+
/**
|
216 |
+
* Collect all data for logging.
|
217 |
+
*
|
218 |
+
* @return array
|
219 |
+
*/
|
220 |
+
private static function get_logs_data() {
|
221 |
+
|
222 |
+
global $wpdb;
|
223 |
+
|
224 |
+
$data = array();
|
225 |
+
$theme_data = wp_get_theme();
|
226 |
+
$curl_version = '';
|
227 |
+
$external_http_blocked = '';
|
228 |
+
$users_count = '';
|
229 |
+
|
230 |
+
$admin_users = get_users( array( 'role' => 'Administrator' ) );
|
231 |
+
$admin = isset( $admin_users[0] ) ? $admin_users[0]->data : '';
|
232 |
+
$admin_meta = ! empty( $admin ) ? get_user_meta( $admin->ID ) : '';
|
233 |
+
|
234 |
+
if ( ! function_exists( 'get_plugins' ) ) {
|
235 |
+
include ABSPATH . '/wp-admin/includes/plugin.php';
|
236 |
+
}
|
237 |
+
|
238 |
+
if ( function_exists( 'count_users' ) ) {
|
239 |
+
$users_count = count_users();
|
240 |
+
$users_count = isset( $users_count['total_users'] ) ? intval( $users_count['total_users'] ) : '';
|
241 |
+
}
|
242 |
+
|
243 |
+
// Check external http request blocked.
|
244 |
+
if ( ! defined( 'WP_HTTP_BLOCK_EXTERNAL' ) || ! WP_HTTP_BLOCK_EXTERNAL ) {
|
245 |
+
$external_http_blocked = 'none';
|
246 |
+
} else {
|
247 |
+
$external_http_blocked = defined( 'WP_ACCESSIBLE_HOSTS' ) ? 'partially (accessible hosts: ' . esc_html( WP_ACCESSIBLE_HOSTS ) . ')' : 'all';
|
248 |
+
}
|
249 |
+
|
250 |
+
// Curl version.
|
251 |
+
if ( function_exists( 'curl_init' ) ) {
|
252 |
+
$curl = curl_version();
|
253 |
+
$curl_version = '(' . $curl['version'] . ' ' . $curl['ssl_version'] . ')';
|
254 |
+
}
|
255 |
+
|
256 |
+
$data['site_info'] = array(
|
257 |
+
'site_url' => site_url(),
|
258 |
+
'home_url' => home_url(),
|
259 |
+
);
|
260 |
+
$data['site_meta_info'] = array(
|
261 |
+
'is_multisite' => is_multisite(),
|
262 |
+
'multisites' => self::get_multisites(),
|
263 |
+
'php_version' => phpversion(),
|
264 |
+
'wp_version' => get_bloginfo( 'version' ),
|
265 |
+
'server' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? $_SERVER['SERVER_SOFTWARE'] : '',
|
266 |
+
'timezoneoffset' => date('P'),
|
267 |
+
'ext/mysqli' => ! empty( $wpdb->use_mysqli ) ? true : false,
|
268 |
+
'mysql_version' => empty( $wpdb->use_mysqli ) ? mysql_get_server_info() : mysqli_get_server_info( $wpdb->dbh ),
|
269 |
+
'memory_limit' => ( defined( WP_MEMORY_LIMIT ) ? WP_MEMORY_LIMIT : ini_get( 'memory_limit' ) ) ? ini_get( 'memory_limit' ) : '',
|
270 |
+
'external_http_blocked' => $external_http_blocked,
|
271 |
+
'wp_locale' => get_locale(),
|
272 |
+
'db_charset' => defined( 'DB_CHARSET' ) ? DB_CHARSET : '',
|
273 |
+
'debug_mode' => defined( 'WP_DEBUG' ) && WP_DEBUG ? true : false,
|
274 |
+
'wp_max_upload' => size_format( wp_max_upload_size() ),
|
275 |
+
'php_time_limit' => function_exists( 'ini_get' ) ? ini_get( 'max_execution_time' ) : '',
|
276 |
+
'php_error_log' => function_exists( 'ini_get' ) ? ini_get( 'error_log' ) : '',
|
277 |
+
'fsockopen' => function_exists( 'fsockopen' ) ? true : false,
|
278 |
+
'open_ssl' => defined( 'OPENSSL_VERSION_TEXT' ) ? OPENSSL_VERSION_TEXT : '',
|
279 |
+
'curl' => $curl_version,
|
280 |
+
'ip' => self::get_ip(),
|
281 |
+
'user_count' => $users_count,
|
282 |
+
'admin_email' => sanitize_email( get_bloginfo( 'admin_email' ) ),
|
283 |
+
'theme_name' => sanitize_text_field( $theme_data->Name ),
|
284 |
+
'theme_version' => sanitize_text_field( $theme_data->Version ),
|
285 |
+
);
|
286 |
+
$data['site_plugins_info'] = self::get_plugins();
|
287 |
+
$data['user_info'] = array(
|
288 |
+
'user_email' => ! empty( $admin ) ? sanitize_email( $admin->user_email ) : '',
|
289 |
+
'user_nickname' => ! empty( $admin ) ? sanitize_text_field( $admin->user_nicename ) : '',
|
290 |
+
'user_firstname' => isset( $admin_meta['first_name'][0] ) ? sanitize_text_field( $admin_meta['first_name'][0] ) : '',
|
291 |
+
'user_lastname' => isset( $admin_meta['last_name'][0] ) ? sanitize_text_field( $admin_meta['last_name'][0] ) : ''
|
292 |
+
);
|
293 |
+
$data['product_info'] = self::get_product_data();
|
294 |
+
$data['sdk_version'] = '1.0.0';
|
295 |
+
|
296 |
+
return $data;
|
297 |
+
}
|
298 |
+
|
299 |
+
/**
|
300 |
+
* Collect multisite data.
|
301 |
+
*
|
302 |
+
* @return array
|
303 |
+
*/
|
304 |
+
private static function get_multisites() {
|
305 |
+
|
306 |
+
if ( ! is_multisite() ) {
|
307 |
+
return false;
|
308 |
+
}
|
309 |
+
|
310 |
+
$sites_info = array();
|
311 |
+
$sites = get_sites();
|
312 |
+
|
313 |
+
foreach ( $sites as $site ) {
|
314 |
+
$sites_info[ $site->blog_id ] = array(
|
315 |
+
'name' => get_blog_details( $site->blog_id )->blogname,
|
316 |
+
'domain' => $site->domain,
|
317 |
+
'path' => $site->path,
|
318 |
+
);
|
319 |
+
}
|
320 |
+
|
321 |
+
return $sites_info;
|
322 |
+
}
|
323 |
+
|
324 |
+
/**
|
325 |
+
* Collect plugins information: Active/Inactive plugins.
|
326 |
+
*
|
327 |
+
* @return string
|
328 |
+
*/
|
329 |
+
private static function get_plugins() {
|
330 |
+
|
331 |
+
$plugins = array_keys( get_plugins() );
|
332 |
+
$active_plugins = get_option( 'active_plugins', array() );
|
333 |
+
|
334 |
+
foreach ( $plugins as $key => $plugin ) {
|
335 |
+
if ( in_array( $plugin, $active_plugins ) ) {
|
336 |
+
// Remove active plugins from list.
|
337 |
+
unset( $plugins[ $key ] );
|
338 |
+
}
|
339 |
+
}
|
340 |
+
|
341 |
+
return wp_json_encode(
|
342 |
+
array(
|
343 |
+
'active' => $active_plugins,
|
344 |
+
'inactive' => $plugins,
|
345 |
+
)
|
346 |
+
);
|
347 |
+
}
|
348 |
+
|
349 |
+
/**
|
350 |
+
* Get user IP information.
|
351 |
+
*
|
352 |
+
* @return string|null
|
353 |
+
*/
|
354 |
+
private static function get_ip() {
|
355 |
+
|
356 |
+
$fields = array(
|
357 |
+
'HTTP_CF_CONNECTING_IP',
|
358 |
+
'HTTP_CLIENT_IP',
|
359 |
+
'HTTP_X_FORWARDED_FOR',
|
360 |
+
'HTTP_X_FORWARDED',
|
361 |
+
'HTTP_FORWARDED_FOR',
|
362 |
+
'HTTP_FORWARDED',
|
363 |
+
'REMOTE_ADDR',
|
364 |
+
);
|
365 |
+
|
366 |
+
foreach ( $fields as $ip_field ) {
|
367 |
+
if ( ! empty( $_SERVER[ $ip_field ] ) ) {
|
368 |
+
return $_SERVER[ $ip_field ];
|
369 |
+
}
|
370 |
+
}
|
371 |
+
|
372 |
+
return null;
|
373 |
+
}
|
374 |
+
|
375 |
+
/**
|
376 |
+
* Get product data.
|
377 |
+
*
|
378 |
+
* @return array
|
379 |
+
*/
|
380 |
+
private static function get_product_data() {
|
381 |
+
|
382 |
+
$product_data = self::$product_data;
|
383 |
+
$product_settings = array();
|
384 |
+
|
385 |
+
// Pull settings data from db.
|
386 |
+
foreach ( $product_data['settings'] as $option_name => $default_value ) {
|
387 |
+
$get_option = get_option( $option_name );
|
388 |
+
$product_settings[ $option_name ] = ! empty( $get_option ) ? $get_option : $default_value;
|
389 |
+
}
|
390 |
+
|
391 |
+
$product_data['settings'] = wp_json_encode( $product_settings );
|
392 |
+
|
393 |
+
return $product_data;
|
394 |
+
}
|
395 |
+
}
|
lib/wpb-sdk/includes/wpb-sdk-track.php
ADDED
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Send tracking data (logs) to WPB server.
|
4 |
+
*
|
5 |
+
* @package WPB_SDK
|
6 |
+
* @since 1.4.0
|
7 |
+
*/
|
8 |
+
|
9 |
+
namespace WPHeaderAndFooter_SDK;
|
10 |
+
|
11 |
+
/**
|
12 |
+
* Class responsible for sending logs data.
|
13 |
+
*/
|
14 |
+
class Track {
|
15 |
+
|
16 |
+
/**
|
17 |
+
* The logger data to be send.
|
18 |
+
*
|
19 |
+
* @var array
|
20 |
+
*/
|
21 |
+
private $payload = array();
|
22 |
+
|
23 |
+
/**
|
24 |
+
* Logger tracking endpoint.
|
25 |
+
*
|
26 |
+
* @var string
|
27 |
+
*/
|
28 |
+
private $tracking_endpoint = 'https://app.telemetry.wpbrigade.com/api/logger';
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Class constructor.
|
32 |
+
*
|
33 |
+
* @param Obj $payload variable.
|
34 |
+
*
|
35 |
+
* @return void
|
36 |
+
*/
|
37 |
+
public function __construct( $payload ) {
|
38 |
+
|
39 |
+
$this->payload = $payload;
|
40 |
+
}
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Send the logs to the api endpoint.
|
44 |
+
*
|
45 |
+
* @return object
|
46 |
+
*/
|
47 |
+
public function send() {
|
48 |
+
|
49 |
+
wp_remote_post(
|
50 |
+
$this->tracking_endpoint,
|
51 |
+
array(
|
52 |
+
'method' => 'POST',
|
53 |
+
'body' => $this->payload,
|
54 |
+
'timeout' => 5,
|
55 |
+
'headers' => array(),
|
56 |
+
)
|
57 |
+
);
|
58 |
+
}
|
59 |
+
}
|
60 |
+
|
lib/wpb-sdk/init.php
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* WPBrigade SDK
|
4 |
+
*
|
5 |
+
* @package WPB_SDK
|
6 |
+
*/
|
7 |
+
|
8 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
9 |
+
exit;
|
10 |
+
}
|
11 |
+
|
12 |
+
require_once dirname( __FILE__ ) . '/includes/wpb-sdk-track.php';
|
13 |
+
require_once dirname( __FILE__ ) . '/includes/wpb-sdk-logger.php';
|
lib/wpb-sdk/views/wpb-sdk-deactivate-form.php
ADDED
@@ -0,0 +1,327 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<style>
|
2 |
+
.wpb-sdk_deactivation-frm-hidden {
|
3 |
+
overflow: hidden;
|
4 |
+
}
|
5 |
+
|
6 |
+
.wpb-sdk_deactivation-frm-popup-overlay .wpb-sdk_deactivation-frm-internal-message {
|
7 |
+
margin: 3px 0 3px 22px;
|
8 |
+
display: none;
|
9 |
+
}
|
10 |
+
|
11 |
+
.wpb-sdk_deactivation-frm-reason-input {
|
12 |
+
margin: 3px 0 3px 22px;
|
13 |
+
display: none;
|
14 |
+
}
|
15 |
+
|
16 |
+
.wpb-sdk_deactivation-frm-pro-message {
|
17 |
+
margin: 3px 0 3px 22px;
|
18 |
+
display: none;
|
19 |
+
color: #ed1515;
|
20 |
+
font-size: 14px;
|
21 |
+
font-weight: 600;
|
22 |
+
}
|
23 |
+
|
24 |
+
.wpb-sdk_deactivation-frm-reason-input input[type="text"] {
|
25 |
+
width: 100%;
|
26 |
+
display: block;
|
27 |
+
}
|
28 |
+
|
29 |
+
.wpb-sdk_deactivation-frm-popup-overlay {
|
30 |
+
background: rgba(0, 0, 0, .8);
|
31 |
+
position: fixed;
|
32 |
+
top: 0;
|
33 |
+
left: 0;
|
34 |
+
height: 100%;
|
35 |
+
width: 100%;
|
36 |
+
z-index: 1000;
|
37 |
+
overflow: auto;
|
38 |
+
visibility: hidden;
|
39 |
+
opacity: 0;
|
40 |
+
transition: opacity 0.3s ease-in-out:
|
41 |
+
}
|
42 |
+
|
43 |
+
.wpb-sdk_deactivation-frm-popup-overlay.wpb-sdk_deactivation-frm-active {
|
44 |
+
opacity: 1;
|
45 |
+
visibility: visible;
|
46 |
+
}
|
47 |
+
|
48 |
+
.wpb-sdk_deactivation-frm-serveypanel {
|
49 |
+
width: 600px;
|
50 |
+
background: #fff;
|
51 |
+
margin: 65px auto 0;
|
52 |
+
}
|
53 |
+
|
54 |
+
.wpb-sdk_deactivation-frm-popup-header {
|
55 |
+
background: #f1f1f1;
|
56 |
+
padding: 20px;
|
57 |
+
border-bottom: 1px solid #ccc;
|
58 |
+
}
|
59 |
+
|
60 |
+
.wpb-sdk_deactivation-frm-popup-header h2 {
|
61 |
+
margin: 0;
|
62 |
+
}
|
63 |
+
|
64 |
+
.wpb-sdk_deactivation-frm-popup-body {
|
65 |
+
padding: 10px 20px;
|
66 |
+
}
|
67 |
+
|
68 |
+
.wpb-sdk_deactivation-frm-popup-footer {
|
69 |
+
background: #f9f3f3;
|
70 |
+
padding: 10px 20px;
|
71 |
+
border-top: 1px solid #ccc;
|
72 |
+
}
|
73 |
+
|
74 |
+
.wpb-sdk_deactivation-frm-popup-footer:after {
|
75 |
+
content: "";
|
76 |
+
display: table;
|
77 |
+
clear: both;
|
78 |
+
}
|
79 |
+
|
80 |
+
.action-btns {
|
81 |
+
float: right;
|
82 |
+
}
|
83 |
+
|
84 |
+
.wpb-sdk_deactivation-frm-anonymous {
|
85 |
+
display: none;
|
86 |
+
}
|
87 |
+
|
88 |
+
.attention,
|
89 |
+
.error-message {
|
90 |
+
color: red;
|
91 |
+
font-weight: 600;
|
92 |
+
display: none;
|
93 |
+
}
|
94 |
+
|
95 |
+
.wpb-sdk_deactivation-frm-spinner {
|
96 |
+
display: none;
|
97 |
+
}
|
98 |
+
|
99 |
+
.wpb-sdk_deactivation-frm-spinner img {
|
100 |
+
margin-top: 3px;
|
101 |
+
}
|
102 |
+
</style>
|
103 |
+
<div class="<?php echo $product_slug ?>-deactivate-wrapper">
|
104 |
+
<div class="wpb-sdk_deactivation-frm-popup-overlay">
|
105 |
+
<div class="wpb-sdk_deactivation-frm-serveypanel">
|
106 |
+
<form action="#" method="post" class="wpb-sdk_deactivation-frm-deactivate-form">
|
107 |
+
|
108 |
+
<div class="wpb-sdk_deactivation-frm-popup-header">
|
109 |
+
<h2><?php _e( 'Quick feedback about ' . $product_name, 'ucmm-wpbrigade' ); ?></h2>
|
110 |
+
</div>
|
111 |
+
|
112 |
+
<div class="wpb-sdk_deactivation-frm-popup-body">
|
113 |
+
|
114 |
+
<h3><?php _e( 'If you have a moment, please let us know why you are deactivating:', 'ucmm-wpbrigade' ); ?></h3>
|
115 |
+
|
116 |
+
<ul id="wpb-sdk_deactivation-frm-reason-list">
|
117 |
+
<?php if ( $has_pro_version ) { ?>
|
118 |
+
<li class="wpb-sdk_deactivation-frm-reason wpb-sdk_deactivation-frm-reason-pro" data-input-type="" data-input-placeholder="">
|
119 |
+
<label>
|
120 |
+
<span><input type="radio" name="wpb-sdk_deactivation-frm-selected-reason" value="pro">
|
121 |
+
</span><span><?php _e( 'I upgraded to ' . $product_name . ' Pro', 'ucmm-wpbrigade' ); ?></span>
|
122 |
+
</label>
|
123 |
+
<div class="wpb-sdk_deactivation-frm-pro-message">
|
124 |
+
<?php _e( 'No need to deactivate this ' . $product_name . ' Core version. Pro version works as an add-on with Core version.', 'ucmm-wpbrigade' ); ?>
|
125 |
+
</div>
|
126 |
+
</li>
|
127 |
+
<?php } ?>
|
128 |
+
<li class="wpb-sdk_deactivation-frm-reason" data-input-type="" data-input-placeholder="">
|
129 |
+
<label>
|
130 |
+
<span><input type="radio" name="wpb-sdk_deactivation-frm-selected-reason" value="1"></span>
|
131 |
+
<span><?php _e( 'I only needed the plugin for a short period', 'ucmm-wpbrigade' ); ?></span>
|
132 |
+
</label>
|
133 |
+
<div class="wpb-sdk_deactivation-frm-internal-message"></div>
|
134 |
+
</li>
|
135 |
+
<li class="wpb-sdk_deactivation-frm-reason has-input" data-input-type="textfield">
|
136 |
+
<label>
|
137 |
+
<span><input type="radio" name="wpb-sdk_deactivation-frm-selected-reason" value="2"></span>
|
138 |
+
<span><?php _e( 'I found a better plugin', 'ucmm-wpbrigade' ); ?></span>
|
139 |
+
</label>
|
140 |
+
<div class="wpb-sdk_deactivation-frm-internal-message"></div>
|
141 |
+
<div class="wpb-sdk_deactivation-frm-reason-input">
|
142 |
+
<span class="message error-message"><?php _e( 'Kindly tell us the name of plugin', 'ucmm-wpbrigade' ); ?></span>
|
143 |
+
<input type="text" name="better_plugin" placeholder="<?php _e( "What's the plugin's name?", 'ucmm-wpbrigade' ); ?>">
|
144 |
+
</div>
|
145 |
+
</li>
|
146 |
+
<li class="wpb-sdk_deactivation-frm-reason" data-input-type="" data-input-placeholder="">
|
147 |
+
<label>
|
148 |
+
<span><input type="radio" name="wpb-sdk_deactivation-frm-selected-reason" value="3"></span>
|
149 |
+
<span><?php _e( 'The plugin broke my site', 'ucmm-wpbrigade' ); ?></span>
|
150 |
+
</label>
|
151 |
+
<div class="wpb-sdk_deactivation-frm-internal-message"></div>
|
152 |
+
</li>
|
153 |
+
<li class="wpb-sdk_deactivation-frm-reason" data-input-type="" data-input-placeholder="">
|
154 |
+
<label>
|
155 |
+
<span><input type="radio" name="wpb-sdk_deactivation-frm-selected-reason" value="4"></span>
|
156 |
+
<span><?php _e( 'The plugin suddenly stopped working', 'ucmm-wpbrigade' ); ?></span>
|
157 |
+
</label>
|
158 |
+
<div class="wpb-sdk_deactivation-frm-internal-message"></div>
|
159 |
+
</li>
|
160 |
+
<li class="wpb-sdk_deactivation-frm-reason" data-input-type="" data-input-placeholder="">
|
161 |
+
<label>
|
162 |
+
<span><input type="radio" name="wpb-sdk_deactivation-frm-selected-reason" value="5"></span>
|
163 |
+
<span><?php _e( 'I no longer need the plugin', 'ucmm-wpbrigade' ); ?></span>
|
164 |
+
</label>
|
165 |
+
<div class="wpb-sdk_deactivation-frm-internal-message"></div>
|
166 |
+
</li>
|
167 |
+
<li class="wpb-sdk_deactivation-frm-reason" data-input-type="" data-input-placeholder="">
|
168 |
+
<label>
|
169 |
+
<span><input type="radio" name="wpb-sdk_deactivation-frm-selected-reason" value="6"></span>
|
170 |
+
<span><?php _e( "It's a temporary deactivation. I'm just debugging an issue.", 'ucmm-wpbrigade' ); ?></span>
|
171 |
+
</label>
|
172 |
+
<div class="wpb-sdk_deactivation-frm-internal-message"></div>
|
173 |
+
</li>
|
174 |
+
<li class="wpb-sdk_deactivation-frm-reason has-input" data-input-type="textfield">
|
175 |
+
<label>
|
176 |
+
<span><input type="radio" name="wpb-sdk_deactivation-frm-selected-reason" value="7"></span>
|
177 |
+
<span><?php _e( 'Other', 'ucmm-wpbrigade' ); ?></span>
|
178 |
+
</label>
|
179 |
+
<div class="wpb-sdk_deactivation-frm-internal-message"></div>
|
180 |
+
<div class="wpb-sdk_deactivation-frm-reason-input"><span class="message error-message "><?php _e( 'Kindly tell us the reason so we can improve.', 'ucmm-wpbrigade' ); ?></span>
|
181 |
+
<input type="text" name="other_reason" placeholder="<?php _e( "Would you like to share what's other reason ?", 'ucmm-wpbrigade' ); ?>">
|
182 |
+
</div>
|
183 |
+
</li>
|
184 |
+
</ul>
|
185 |
+
</div>
|
186 |
+
|
187 |
+
<div class="wpb-sdk_deactivation-frm-popup-footer">
|
188 |
+
<label class="wpb-sdk_deactivation-frm-anonymous">
|
189 |
+
<input type="checkbox" />
|
190 |
+
<?php _e( 'Anonymous feedback', 'ucmm-wpbrigade' ); ?>
|
191 |
+
</label>
|
192 |
+
<input type="button" class="button button-secondary button-skip wpb-sdk_deactivation-frm-popup-skip-feedback" value="Skip & Deactivate">
|
193 |
+
<div class="action-btns">
|
194 |
+
<span class="wpb-sdk_deactivation-frm-spinner"><img src="<?php echo admin_url( '/images/spinner.gif' ); ?>" alt=""></span>
|
195 |
+
<input type="submit" class="button button-secondary button-deactivate wpb-sdk_deactivation-frm-popup-allow-deactivate" value="Submit & Deactivate" disabled="disabled">
|
196 |
+
<a href="#" class="button button-primary wpb-sdk_deactivation-frm-popup-button-close">
|
197 |
+
<?php _e( 'Cancel', 'ucmm-wpbrigade' ); ?>
|
198 |
+
</a>
|
199 |
+
</div>
|
200 |
+
</div>
|
201 |
+
|
202 |
+
</form>
|
203 |
+
</div>
|
204 |
+
</div>
|
205 |
+
</div>
|
206 |
+
<script>
|
207 |
+
document.addEventListener("DOMContentLoaded", function(event) {
|
208 |
+
(function($) {
|
209 |
+
$(function() {
|
210 |
+
|
211 |
+
var pluginSlug = "<?php echo $product_slug; ?>";
|
212 |
+
var pluginName = "<?php echo $product_name; ?>";
|
213 |
+
|
214 |
+
var loggerDeactiveNonce;
|
215 |
+
|
216 |
+
$(document).on('click', 'tr[data-slug="' + pluginSlug + '"] .deactivate', function(e) {
|
217 |
+
e.preventDefault();
|
218 |
+
loggerDeactiveNonce = $(this).find('a').attr('href').split("wpnonce=")[1];
|
219 |
+
$('.<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-popup-overlay').addClass('wpb-sdk_deactivation-frm-active');
|
220 |
+
$('body').addClass('wpb-sdk_deactivation-frm-hidden');
|
221 |
+
});
|
222 |
+
|
223 |
+
$(document).on('click', '.<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-popup-button-close', function() {
|
224 |
+
close_popup();
|
225 |
+
});
|
226 |
+
|
227 |
+
$(document).on('click', ".<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-serveypanel,tr[data-slug='" + pluginSlug + "'] .deactivate", function(e) {
|
228 |
+
e.stopPropagation();
|
229 |
+
});
|
230 |
+
|
231 |
+
$(document).on('click', function() {
|
232 |
+
close_popup();
|
233 |
+
});
|
234 |
+
|
235 |
+
$('.<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-reason label').on('click', function() {
|
236 |
+
if($(this).find('input[type="radio"]').is(':checked')) {
|
237 |
+
//$('.wpb-sdk_deactivation-frm-anonymous').show();
|
238 |
+
$(this).next().next('.wpb-sdk_deactivation-frm-reason-input').show().end().end().parent().siblings().find('.wpb-sdk_deactivation-frm-reason-input').hide();
|
239 |
+
}
|
240 |
+
$('.<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-pro-message').hide();
|
241 |
+
});
|
242 |
+
|
243 |
+
$('.<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-reason-pro label').on('click', function() {
|
244 |
+
if($(this).find('input[type="radio"]').is(':checked')) {
|
245 |
+
$(this).next('.<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-pro-message').show().end().end().parent().siblings().find('.wpb-sdk_deactivation-frm-reason-input').hide();
|
246 |
+
$('.<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-popup-allow-deactivate').attr('disabled', 'disabled');
|
247 |
+
$('.<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-popup-skip-feedback').attr('disabled', 'disabled');
|
248 |
+
}
|
249 |
+
});
|
250 |
+
|
251 |
+
$('.<?php echo $product_slug; ?>-deactivate-wrapper input[type="radio"][name="wpb-sdk_deactivation-frm-selected-reason"]').on('click', function(event) {
|
252 |
+
$(".<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-popup-allow-deactivate").removeAttr('disabled');
|
253 |
+
$(".<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-popup-skip-feedback").removeAttr('disabled');
|
254 |
+
});
|
255 |
+
|
256 |
+
$(document).on('submit', '.<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-deactivate-form', function(event) {
|
257 |
+
event.preventDefault();
|
258 |
+
var reason = $(this).find('input[type="radio"][name="wpb-sdk_deactivation-frm-selected-reason"]:checked').val();
|
259 |
+
var reasonDetails = '';
|
260 |
+
if(reason == '2') {
|
261 |
+
reasonDetails = $(this).find("input[type='text'][name='better_plugin']").val();
|
262 |
+
} else if(reason == '7') {
|
263 |
+
reasonDetails = $(this).find("input[type='text'][name='other_reason']").val();
|
264 |
+
}
|
265 |
+
if((reason == '7' || reason == '2') && reasonDetails == '') {
|
266 |
+
$('.message.error-message').show();
|
267 |
+
return;
|
268 |
+
}
|
269 |
+
|
270 |
+
let returnURL = $("tr[data-slug='" + pluginSlug + "'] .deactivate a").attr('href');
|
271 |
+
|
272 |
+
send_log(
|
273 |
+
'wpb_sdk_' + pluginSlug + '_deactivation',
|
274 |
+
reason,
|
275 |
+
reasonDetails,
|
276 |
+
loggerDeactiveNonce,
|
277 |
+
returnURL
|
278 |
+
);
|
279 |
+
|
280 |
+
});
|
281 |
+
|
282 |
+
$('.<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-popup-skip-feedback').on('click', function(e) {
|
283 |
+
send_log(
|
284 |
+
'wpb_sdk_' + pluginSlug + '_deactivation',
|
285 |
+
9,
|
286 |
+
'',
|
287 |
+
loggerDeactiveNonce,
|
288 |
+
$("tr[data-slug='" + pluginSlug + "'] .deactivate a").attr('href')
|
289 |
+
);
|
290 |
+
});
|
291 |
+
|
292 |
+
function close_popup() {
|
293 |
+
$('.<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-popup-overlay').removeClass('wpb-sdk_deactivation-frm-active');
|
294 |
+
$('.<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-deactivate-form').trigger("reset");
|
295 |
+
$(".<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-popup-allow-deactivate").attr('disabled', 'disabled');
|
296 |
+
$(".<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-reason-input").hide();
|
297 |
+
$('body').removeClass('wpb-sdk_deactivation-frm-hidden');
|
298 |
+
$('.message.error-message').hide();
|
299 |
+
}
|
300 |
+
|
301 |
+
function send_log( _action, _reason, _reasonDetails, _nonce, returnURL ) {
|
302 |
+
$.ajax({
|
303 |
+
url: ajaxurl,
|
304 |
+
type: 'POST',
|
305 |
+
data: {
|
306 |
+
action: _action,
|
307 |
+
reason: _reason,
|
308 |
+
reason_detail: _reasonDetails,
|
309 |
+
nonce: _nonce
|
310 |
+
},
|
311 |
+
beforeSend: function() {
|
312 |
+
$(".<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-spinner").show();
|
313 |
+
$(".<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-popup-allow-deactivate").attr("disabled", "disabled");
|
314 |
+
$(".<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-popup-skip-feedback").attr("disabled", "disabled");
|
315 |
+
}
|
316 |
+
}).done(function(res) {
|
317 |
+
$(".<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-spinner").hide();
|
318 |
+
$(".<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-popup-allow-deactivate").removeAttr("disabled");
|
319 |
+
$(".<?php echo $product_slug; ?>-deactivate-wrapper .wpb-sdk_deactivation-frm-popup-skip-feedback").removeAttr("disabled");
|
320 |
+
window.location.href = returnURL;
|
321 |
+
});
|
322 |
+
}
|
323 |
+
|
324 |
+
});
|
325 |
+
})(jQuery);
|
326 |
+
});
|
327 |
+
</script>
|
readme.txt
CHANGED
@@ -4,8 +4,8 @@ Author URI: https://wpbrigade.com/?utm_source=wphf-org&utm_medium=author-url-lin
|
|
4 |
Donate link: Author URI: https://wpbrigade.com/?utm_source=wphf-org&utm_medium=donate-url-link
|
5 |
Tags: header, footer, Google Analytics, custom css, Facebook Pixel
|
6 |
Requires at least: 5.0
|
7 |
-
Tested up to: 5.
|
8 |
-
Stable tag: 1.3.
|
9 |
License: GPLv3 or later
|
10 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
11 |
|
@@ -31,7 +31,7 @@ Google Tag Manager code/script insertion
|
|
31 |
Can add Bing webmaster tool code for website verification
|
32 |
Add Google AdSense code
|
33 |
|
34 |
-
|
35 |
|
36 |
* [Analytify - Google Analytics Plugin](https://analytify.io/ref/73/?utm_source=wp-headers-and-footers&utm_medium=readme&utm_campaign=pro-upgrade)
|
37 |
* [LoginPress](https://loginpress.pro/) - For Custom login page and login page security
|
@@ -75,27 +75,34 @@ You can insert code in Header, Body and Footer areas of any WordPress site.
|
|
75 |
|
76 |
|
77 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
= 1.3.0 - 2021-06-05
|
79 |
* New Feature: Introducing Code Editor for writing scripts.
|
80 |
* Bugfix: Plugin language domain updated to 'wp-headers-and-footers'
|
81 |
* Enhancement: Dashboard design updated.
|
82 |
* Enhancement : Code Optimization.
|
83 |
-
* Compatibility : WordPress 5.7
|
84 |
|
85 |
= 1.2.2 - 2021-04-04
|
86 |
-
* Compatibility : WordPress 5.7
|
87 |
* Compatibility : PHP 8.0
|
88 |
* Enhancement : Code Optimization.
|
89 |
|
90 |
= 1.2.1 - 2020-12-08 =
|
91 |
-
* Compatibility : WordPress 5.6
|
92 |
* Bugfix: PHP Error.
|
93 |
|
94 |
= 1.2.0 - 2020-12-08 =
|
95 |
* Bugfix: Remove PHP 7 deprecated function.
|
96 |
|
97 |
= 1.1.0 - 2020-03-21 =
|
98 |
-
* Compatibility : WordPress 5.4
|
99 |
* Enhancement: Dashboard Design updated.
|
100 |
|
101 |
= 1.0.0 =
|
@@ -104,5 +111,5 @@ You can insert code in Header, Body and Footer areas of any WordPress site.
|
|
104 |
|
105 |
== Upgrade Notice ==
|
106 |
|
107 |
-
= 1.3.
|
108 |
* Upgrade Immediately.
|
4 |
Donate link: Author URI: https://wpbrigade.com/?utm_source=wphf-org&utm_medium=donate-url-link
|
5 |
Tags: header, footer, Google Analytics, custom css, Facebook Pixel
|
6 |
Requires at least: 5.0
|
7 |
+
Tested up to: 5.8
|
8 |
+
Stable tag: 1.3.1
|
9 |
License: GPLv3 or later
|
10 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
11 |
|
31 |
Can add Bing webmaster tool code for website verification
|
32 |
Add Google AdSense code
|
33 |
|
34 |
+
**If you find our plugin useful, please leave a good rating/review and check our other plugins.**
|
35 |
|
36 |
* [Analytify - Google Analytics Plugin](https://analytify.io/ref/73/?utm_source=wp-headers-and-footers&utm_medium=readme&utm_campaign=pro-upgrade)
|
37 |
* [LoginPress](https://loginpress.pro/) - For Custom login page and login page security
|
75 |
|
76 |
|
77 |
== Changelog ==
|
78 |
+
|
79 |
+
= 1.3.1 - 2021-12-01
|
80 |
+
* Enhancement : Code Optimization.
|
81 |
+
* Enhancement : Add compatibility of Mozilla Firefox on dashboard settings.
|
82 |
+
* Compatibility : Compatible with WordPress 5.8.
|
83 |
+
* Compatibility : Compatible with PHP 8.0.
|
84 |
+
|
85 |
= 1.3.0 - 2021-06-05
|
86 |
* New Feature: Introducing Code Editor for writing scripts.
|
87 |
* Bugfix: Plugin language domain updated to 'wp-headers-and-footers'
|
88 |
* Enhancement: Dashboard design updated.
|
89 |
* Enhancement : Code Optimization.
|
90 |
+
* Compatibility : Compatible with WordPress 5.7.
|
91 |
|
92 |
= 1.2.2 - 2021-04-04
|
93 |
+
* Compatibility : Compatible with WordPress 5.7.
|
94 |
* Compatibility : PHP 8.0
|
95 |
* Enhancement : Code Optimization.
|
96 |
|
97 |
= 1.2.1 - 2020-12-08 =
|
98 |
+
* Compatibility : Compatible with WordPress 5.6.
|
99 |
* Bugfix: PHP Error.
|
100 |
|
101 |
= 1.2.0 - 2020-12-08 =
|
102 |
* Bugfix: Remove PHP 7 deprecated function.
|
103 |
|
104 |
= 1.1.0 - 2020-03-21 =
|
105 |
+
* Compatibility : Compatible with WordPress 5.4.
|
106 |
* Enhancement: Dashboard Design updated.
|
107 |
|
108 |
= 1.0.0 =
|
111 |
|
112 |
== Upgrade Notice ==
|
113 |
|
114 |
+
= 1.3.1 =
|
115 |
* Upgrade Immediately.
|
wp-headers-and-footers.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
* Plugin Name: WP Headers And Footers
|
4 |
* Plugin URI: https://www.WPBrigade.com/wordpress/plugins/wp-headers-and-footers/
|
5 |
* Description: Allows you to insert code or text in the header or footer of your WordPress site.
|
6 |
-
* Version: 1.3.
|
7 |
* Author: WPBrigade
|
8 |
* Author URI: https://wpbrigade.com/?utm_source=plugin-meta&utm_medium=author-uri-link
|
9 |
* License: GPLv3
|
@@ -15,65 +15,97 @@
|
|
15 |
* @author WPBrigade
|
16 |
*/
|
17 |
|
18 |
-
|
19 |
if ( ! class_exists( 'WPHeaderAndFooter' ) ) :
|
20 |
|
|
|
|
|
|
|
21 |
final class WPHeaderAndFooter {
|
22 |
|
23 |
/**
|
24 |
-
*
|
|
|
|
|
25 |
*/
|
26 |
-
public $version = '1.3.
|
27 |
|
28 |
/**
|
29 |
-
*
|
30 |
-
*
|
|
|
31 |
*/
|
|
|
32 |
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
* * * * * * * * *
|
37 |
-
* Class constructor
|
38 |
-
* * * * * * * * * */
|
39 |
public function __construct() {
|
40 |
|
41 |
$this->define_constants();
|
42 |
$this->includes();
|
43 |
-
$this->
|
44 |
-
|
45 |
}
|
46 |
|
47 |
/**
|
48 |
* Include required core files used in admin and on the frontend.
|
|
|
|
|
49 |
*/
|
50 |
-
|
51 |
public function includes() {
|
52 |
|
53 |
include_once WPHEADERANDFOOTER_DIR_PATH . 'classes/class-setup.php';
|
54 |
include_once WPHEADERANDFOOTER_DIR_PATH . 'classes/plugin-meta.php';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
55 |
}
|
56 |
|
57 |
/**
|
58 |
* Hook into actions and filters
|
59 |
*
|
60 |
* @since 1.0.0
|
61 |
-
*
|
62 |
-
* @version 1.2.3
|
63 |
-
*
|
64 |
*/
|
65 |
-
private function
|
66 |
|
67 |
add_action( 'plugins_loaded', array( $this, 'textdomain' ) );
|
68 |
-
add_action( 'admin_enqueue_scripts', array( $this, '
|
69 |
-
add_action( 'wp_print_scripts', array( $this, '
|
70 |
-
add_action( 'wp_head', array( $this, '
|
71 |
-
|
72 |
-
if( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
|
73 |
-
add_action( 'wp_body_open', array( $this, '
|
74 |
}
|
75 |
-
|
76 |
-
add_action( 'wp_footer', array( $this, '
|
77 |
}
|
78 |
|
79 |
/**
|
@@ -89,7 +121,13 @@ if ( ! class_exists( 'WPHeaderAndFooter' ) ) :
|
|
89 |
$this->define( 'WPHEADERANDFOOTER_FEEDBACK_SERVER', 'https://wpbrigade.com/' );
|
90 |
}
|
91 |
|
92 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
93 |
|
94 |
if ( 'settings_page_wp-headers-and-footers' === $page ) {
|
95 |
|
@@ -100,16 +138,16 @@ if ( ! class_exists( 'WPHeaderAndFooter' ) ) :
|
|
100 |
if ( ! current_user_can( 'unfiltered_html' ) || ! current_user_can( 'manage_options' ) ) {
|
101 |
$editor_args['codemirror']['readOnly'] = true;
|
102 |
}
|
103 |
-
|
104 |
// Enqueue code editor and settings for manipulating HTML.
|
105 |
$settings = wp_enqueue_code_editor( $editor_args );
|
106 |
-
|
107 |
// Bail if user disabled CodeMirror.
|
108 |
if ( false === $settings ) {
|
109 |
return;
|
110 |
}
|
111 |
|
112 |
-
wp_enqueue_script( 'wpheaderandfooter_script', plugins_url( 'asset/js/script.js', __FILE__ ), array( 'jquery' ), WPHEADERANDFOOTER_VERSION );
|
113 |
|
114 |
}
|
115 |
}
|
@@ -117,8 +155,8 @@ if ( ! class_exists( 'WPHeaderAndFooter' ) ) :
|
|
117 |
/**
|
118 |
* Define constant if not already set
|
119 |
*
|
120 |
-
* @param
|
121 |
-
* @param
|
122 |
*/
|
123 |
private function define( $name, $value ) {
|
124 |
if ( ! defined( $name ) ) {
|
@@ -135,10 +173,10 @@ if ( ! class_exists( 'WPHeaderAndFooter' ) ) :
|
|
135 |
* @return Main instance
|
136 |
*/
|
137 |
public static function instance() {
|
138 |
-
if ( is_null( self::$
|
139 |
-
self::$
|
140 |
}
|
141 |
-
return self::$
|
142 |
}
|
143 |
|
144 |
|
@@ -154,58 +192,60 @@ if ( ! class_exists( 'WPHeaderAndFooter' ) ) :
|
|
154 |
}
|
155 |
|
156 |
/**
|
157 |
-
* Outputs script /
|
|
|
158 |
* @since 1.0.0
|
159 |
-
*
|
160 |
-
* @version 1.2.3
|
161 |
*/
|
162 |
-
function
|
163 |
-
$this->
|
164 |
}
|
165 |
|
166 |
/**
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
function
|
173 |
-
$this->
|
174 |
}
|
175 |
-
|
176 |
/**
|
177 |
-
* Outputs script /
|
|
|
178 |
* @since 1.0.0
|
179 |
-
*
|
180 |
-
* @version 1.0.0
|
181 |
*/
|
182 |
-
function
|
183 |
-
$this->
|
184 |
}
|
185 |
|
186 |
/**
|
187 |
* Outputs the given setting, if conditions are met
|
188 |
*
|
189 |
-
* @param string $script Setting Name
|
|
|
|
|
190 |
* @return output
|
191 |
*/
|
192 |
-
function
|
193 |
|
194 |
-
// Ignore admin, feed, robots or
|
195 |
if ( is_admin() || is_feed() || is_robots() || is_trackback() ) :
|
196 |
return;
|
197 |
endif;
|
198 |
|
199 |
-
// Get meta
|
200 |
-
$
|
201 |
-
$meta = ! empty( $
|
202 |
|
203 |
-
if ( trim( $meta )
|
204 |
return;
|
205 |
endif;
|
206 |
|
207 |
-
// Output
|
208 |
-
echo wp_unslash( $meta ) . PHP_EOL;
|
209 |
|
210 |
}
|
211 |
|
@@ -224,6 +264,6 @@ function wpheaderandfooter_loader() {
|
|
224 |
return WPHeaderAndFooter::instance();
|
225 |
}
|
226 |
|
227 |
-
// Call the function
|
228 |
wpheaderandfooter_loader();
|
229 |
new WPHeaderAndFooter_Setting();
|
3 |
* Plugin Name: WP Headers And Footers
|
4 |
* Plugin URI: https://www.WPBrigade.com/wordpress/plugins/wp-headers-and-footers/
|
5 |
* Description: Allows you to insert code or text in the header or footer of your WordPress site.
|
6 |
+
* Version: 1.3.1
|
7 |
* Author: WPBrigade
|
8 |
* Author URI: https://wpbrigade.com/?utm_source=plugin-meta&utm_medium=author-uri-link
|
9 |
* License: GPLv3
|
15 |
* @author WPBrigade
|
16 |
*/
|
17 |
|
|
|
18 |
if ( ! class_exists( 'WPHeaderAndFooter' ) ) :
|
19 |
|
20 |
+
/**
|
21 |
+
* The class WPHeaderAndFooter
|
22 |
+
*/
|
23 |
final class WPHeaderAndFooter {
|
24 |
|
25 |
/**
|
26 |
+
* The single instance of the class.
|
27 |
+
*
|
28 |
+
* @var string $version
|
29 |
*/
|
30 |
+
public $version = '1.3.1';
|
31 |
|
32 |
/**
|
33 |
+
* The single instance of the class.
|
34 |
+
*
|
35 |
+
* @var object $instance
|
36 |
*/
|
37 |
+
protected static $instance = null;
|
38 |
|
39 |
+
/**
|
40 |
+
* WPHeaderAndFooter Class constructor
|
41 |
+
*/
|
|
|
|
|
|
|
42 |
public function __construct() {
|
43 |
|
44 |
$this->define_constants();
|
45 |
$this->includes();
|
46 |
+
$this->hooks();
|
|
|
47 |
}
|
48 |
|
49 |
/**
|
50 |
* Include required core files used in admin and on the frontend.
|
51 |
+
*
|
52 |
+
* @version 1.4.0
|
53 |
*/
|
|
|
54 |
public function includes() {
|
55 |
|
56 |
include_once WPHEADERANDFOOTER_DIR_PATH . 'classes/class-setup.php';
|
57 |
include_once WPHEADERANDFOOTER_DIR_PATH . 'classes/plugin-meta.php';
|
58 |
+
|
59 |
+
// set the logger settings option if was not set before.
|
60 |
+
if ( ! get_option( 'wpheaderandfooter_basics_logger' ) ) {
|
61 |
+
|
62 |
+
$setting = get_option( 'wpheaderandfooter_basics' );
|
63 |
+
|
64 |
+
$logger_value = array();
|
65 |
+
|
66 |
+
$logger_value['is_using_wp_header_textarea'] = isset( $setting['wp_header_textarea'] ) && ! empty( trim( $setting['wp_header_textarea'] ) ) ? true : false;
|
67 |
+
$logger_value['is_using_wp_body_textarea'] = isset( $setting['wp_body_textarea'] ) && ! empty( trim( $setting['wp_body_textarea'] ) ) ? true : false;
|
68 |
+
$logger_value['is_using_wp_footer_textarea'] = isset( $setting['wp_footer_textarea'] ) && ! empty( trim( $setting['wp_footer_textarea'] ) ) ? true : false;
|
69 |
+
|
70 |
+
update_option( 'wpheaderandfooter_basics_logger', $logger_value );
|
71 |
+
}
|
72 |
+
|
73 |
+
// init logger.
|
74 |
+
include_once WPHEADERANDFOOTER_DIR_PATH . 'lib/wpb-sdk/init.php';
|
75 |
+
|
76 |
+
new WPHeaderAndFooter_SDK\Logger(
|
77 |
+
array(
|
78 |
+
'name' => 'WP Headers And Footers',
|
79 |
+
'slug' => 'wp-headers-and-footers',
|
80 |
+
'path' => __FILE__,
|
81 |
+
'version' => $this->version,
|
82 |
+
'license' => '',
|
83 |
+
'settings' => array(
|
84 |
+
'wpheaderandfooter_basics_logger' => false,
|
85 |
+
),
|
86 |
+
)
|
87 |
+
);
|
88 |
+
|
89 |
}
|
90 |
|
91 |
/**
|
92 |
* Hook into actions and filters
|
93 |
*
|
94 |
* @since 1.0.0
|
95 |
+
* @version 1.4.0
|
|
|
|
|
96 |
*/
|
97 |
+
private function hooks() {
|
98 |
|
99 |
add_action( 'plugins_loaded', array( $this, 'textdomain' ) );
|
100 |
+
add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );
|
101 |
+
add_action( 'wp_print_scripts', array( $this, 'admin_scripts' ) );
|
102 |
+
add_action( 'wp_head', array( $this, 'frontend_header' ) );
|
103 |
+
|
104 |
+
if ( function_exists( 'wp_body_open' ) && version_compare( get_bloginfo( 'version' ), '5.2', '>=' ) ) {
|
105 |
+
add_action( 'wp_body_open', array( $this, 'frontend_body' ) );
|
106 |
}
|
107 |
+
|
108 |
+
add_action( 'wp_footer', array( $this, 'frontend_footer' ) );
|
109 |
}
|
110 |
|
111 |
/**
|
121 |
$this->define( 'WPHEADERANDFOOTER_FEEDBACK_SERVER', 'https://wpbrigade.com/' );
|
122 |
}
|
123 |
|
124 |
+
/**
|
125 |
+
* Admin Scripts
|
126 |
+
*
|
127 |
+
* @param string $page The page slug.
|
128 |
+
* @version 1.4.0
|
129 |
+
*/
|
130 |
+
public function admin_scripts( $page ) {
|
131 |
|
132 |
if ( 'settings_page_wp-headers-and-footers' === $page ) {
|
133 |
|
138 |
if ( ! current_user_can( 'unfiltered_html' ) || ! current_user_can( 'manage_options' ) ) {
|
139 |
$editor_args['codemirror']['readOnly'] = true;
|
140 |
}
|
141 |
+
|
142 |
// Enqueue code editor and settings for manipulating HTML.
|
143 |
$settings = wp_enqueue_code_editor( $editor_args );
|
144 |
+
|
145 |
// Bail if user disabled CodeMirror.
|
146 |
if ( false === $settings ) {
|
147 |
return;
|
148 |
}
|
149 |
|
150 |
+
wp_enqueue_script( 'wpheaderandfooter_script', plugins_url( 'asset/js/script.js', __FILE__ ), array( 'jquery' ), WPHEADERANDFOOTER_VERSION, false );
|
151 |
|
152 |
}
|
153 |
}
|
155 |
/**
|
156 |
* Define constant if not already set
|
157 |
*
|
158 |
+
* @param string $name The name of the variable.
|
159 |
+
* @param string|bool $value The value of the variable.
|
160 |
*/
|
161 |
private function define( $name, $value ) {
|
162 |
if ( ! defined( $name ) ) {
|
173 |
* @return Main instance
|
174 |
*/
|
175 |
public static function instance() {
|
176 |
+
if ( is_null( self::$instance ) ) {
|
177 |
+
self::$instance = new self();
|
178 |
}
|
179 |
+
return self::$instance;
|
180 |
}
|
181 |
|
182 |
|
192 |
}
|
193 |
|
194 |
/**
|
195 |
+
* Outputs script / style to the header
|
196 |
+
*
|
197 |
* @since 1.0.0
|
198 |
+
* @version 1.4.0
|
|
|
199 |
*/
|
200 |
+
public function frontend_header() {
|
201 |
+
$this->wp_hnf_output( 'wp_header_textarea' );
|
202 |
}
|
203 |
|
204 |
/**
|
205 |
+
* Outputs script / style to the frontend below opening body
|
206 |
+
*
|
207 |
+
* @since 1.0.0
|
208 |
+
* @version 1.4.0
|
209 |
+
*/
|
210 |
+
public function frontend_body() {
|
211 |
+
$this->wp_hnf_output( 'wp_body_textarea' );
|
212 |
}
|
213 |
+
|
214 |
/**
|
215 |
+
* Outputs script / style to the footer
|
216 |
+
*
|
217 |
* @since 1.0.0
|
218 |
+
* @version 1.4.0
|
|
|
219 |
*/
|
220 |
+
public function frontend_footer() {
|
221 |
+
$this->wp_hnf_output( 'wp_footer_textarea' );
|
222 |
}
|
223 |
|
224 |
/**
|
225 |
* Outputs the given setting, if conditions are met
|
226 |
*
|
227 |
+
* @param string $script Setting Name.
|
228 |
+
*
|
229 |
+
* @version 1.4.0
|
230 |
* @return output
|
231 |
*/
|
232 |
+
public function wp_hnf_output( $script ) {
|
233 |
|
234 |
+
// Ignore admin, feed, robots or track backs.
|
235 |
if ( is_admin() || is_feed() || is_robots() || is_trackback() ) :
|
236 |
return;
|
237 |
endif;
|
238 |
|
239 |
+
// Get meta.
|
240 |
+
$wp_hnf_setting = get_option( 'wpheaderandfooter_basics' );
|
241 |
+
$meta = ! empty( $wp_hnf_setting[ $script ] ) ? $wp_hnf_setting[ $script ] : false;
|
242 |
|
243 |
+
if ( '' === trim( $meta ) || ! $meta ) :
|
244 |
return;
|
245 |
endif;
|
246 |
|
247 |
+
// Output.
|
248 |
+
echo wp_unslash( $meta ) . PHP_EOL; // @codingStandardsIgnoreLine.
|
249 |
|
250 |
}
|
251 |
|
264 |
return WPHeaderAndFooter::instance();
|
265 |
}
|
266 |
|
267 |
+
// Call the function.
|
268 |
wpheaderandfooter_loader();
|
269 |
new WPHeaderAndFooter_Setting();
|