Version Description
- Multisite Walkthrough Management Support
- Multisite Auto Activations
- Multisite Mass Activations
- Genesis Framework Support
- Fixes issues with composer mode and auto play of walkthroughs
- Fixes issues with select all walkthroughs in settings screen
- Fixes issues with download of file would resume a walkthrough on click event
- Fixes issues playing back hotspots in certain cases
Download this release
Release Info
Developer | raptor235 |
Plugin | Sidekick |
Version | 2.1.0 |
Comparing to | |
See all releases |
Code changes from version 1.6.18 to 2.1.0
- assets/banner-772x250.png +0 -0
- assets/icon-128x128.png +0 -0
- assets/screenshot-1.png +0 -0
- assets/screenshot-2.png +0 -0
- assets/screenshot-3.png +0 -0
- assets/screenshot-4.png +0 -0
- js/sidekick_admin.js +242 -0
- libs/admin_page.php +170 -0
- libs/licensing.php +238 -0
- libs/ms_admin_page.php +217 -0
- libs/sk_config_data.php +205 -0
- libs/walkthrough_config.php +36 -0
- readme.txt +280 -0
- sidekick.php +446 -0
assets/banner-772x250.png
ADDED
Binary file
|
assets/icon-128x128.png
ADDED
Binary file
|
assets/screenshot-1.png
ADDED
Binary file
|
assets/screenshot-2.png
ADDED
Binary file
|
assets/screenshot-3.png
ADDED
Binary file
|
assets/screenshot-4.png
ADDED
Binary file
|
js/sidekick_admin.js
ADDED
@@ -0,0 +1,242 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
// Single Site
|
2 |
+
|
3 |
+
var currently_disabled_wts;
|
4 |
+
var currently_disabled_network_wts;
|
5 |
+
var lastTimeout;
|
6 |
+
|
7 |
+
function sk_populate(data){
|
8 |
+
|
9 |
+
jQuery('.sk_walkthrough_list').html('');
|
10 |
+
|
11 |
+
_.each(data.products,function(item,key){
|
12 |
+
|
13 |
+
if (!item.cacheId) {
|
14 |
+
return false;
|
15 |
+
}
|
16 |
+
|
17 |
+
jQuery('.sk_walkthrough_list').append('<div class="sk_product" id="' + item.cacheId + '"><b>' + item.name + '</b> (<span class="select_all">Toggle All</span>)</div>');
|
18 |
+
|
19 |
+
currently_disabled_wts = sk_config.disable_wts;
|
20 |
+
currently_disabled_network_wts = sk_config.disable_network_wts;
|
21 |
+
sk_config.disable_wts = null;
|
22 |
+
sk_config.currently_disabled_network_wts = null;
|
23 |
+
|
24 |
+
jQuery.ajax({
|
25 |
+
url:sk_config.library + 'products/cache?cacheId=' + item.cacheId,
|
26 |
+
cacheId: item.cacheId,
|
27 |
+
success: function(data,cacheId){
|
28 |
+
|
29 |
+
if (data.payload.buckets) {
|
30 |
+
|
31 |
+
// Clear out disabled wts so that compatibility doesn't screen out wts from this screen. Put it back after we're done.
|
32 |
+
|
33 |
+
console.groupCollapsed('Checking Compatibilities');
|
34 |
+
|
35 |
+
_.each(data.payload.buckets,function(bucket,key){
|
36 |
+
|
37 |
+
clearTimeout(lastTimeout);
|
38 |
+
lastTimeout = setTimeout(function(){setup_events();},1000);
|
39 |
+
|
40 |
+
console.log('sk_config.disable_wts_in_root_bucket_ids %o', sk_config.disable_wts_in_root_bucket_ids);
|
41 |
+
console.log('bucket.id %o', bucket.id);
|
42 |
+
console.log('jQuery.inArray( bucket.id, disable_wts_in_root_bucket_ids ) %o', jQuery.inArray( bucket.id, sk_config.disable_wts_in_root_bucket_ids ));
|
43 |
+
|
44 |
+
|
45 |
+
if (typeof sk_config.disable_wts_in_root_bucket_ids !== 'undefined' && jQuery.inArray( bucket.id, sk_config.disable_wts_in_root_bucket_ids ) > -1) {
|
46 |
+
// Don't draw root bucket
|
47 |
+
return false;
|
48 |
+
}
|
49 |
+
|
50 |
+
jQuery('#' + item.cacheId).append("<li class='sk_bucket' id='sk_bucket_" + bucket.id + "'>" + bucket.name + " (<span class=\"select_all\">Toggle All</span>)<ul></ul></li>");
|
51 |
+
|
52 |
+
var pass_data = {
|
53 |
+
bucket_id: bucket.id,
|
54 |
+
all_walkthroughs: data.payload.walkthroughs
|
55 |
+
};
|
56 |
+
|
57 |
+
_.each(bucket.walkthroughs,function(walkthrough,key){
|
58 |
+
|
59 |
+
var pass = false;
|
60 |
+
|
61 |
+
if (typeof sk_ms_admin === 'undefined' || !sk_ms_admin && jQuery.inArray(parseInt(key,10),currently_disabled_network_wts) > -1) {
|
62 |
+
// If single site and network disabled walkthroughs then don't even show it.
|
63 |
+
return;
|
64 |
+
}
|
65 |
+
|
66 |
+
if (sidekick.compatibilityModel.check_compatiblity_array(this.all_walkthroughs[key]) || (typeof sk_ms_admin !== 'undefined' && sk_ms_admin)){
|
67 |
+
// Only check compatibilities for single sites not network admin page
|
68 |
+
pass = true;
|
69 |
+
}
|
70 |
+
|
71 |
+
if (pass){
|
72 |
+
var checked = false;
|
73 |
+
var selected = false;
|
74 |
+
|
75 |
+
if (jQuery.inArray(parseInt(key,10),currently_disabled_wts) > -1 || jQuery.inArray(parseInt(key,10),currently_disabled_network_wts) > -1) {
|
76 |
+
checked = 'CHECKED';
|
77 |
+
}
|
78 |
+
|
79 |
+
if (sk_config.autostart_walkthrough_id !== 'undefined' && sk_config.autostart_walkthrough_id == parseInt(key,10)) {
|
80 |
+
selected = 'SELECTED';
|
81 |
+
}
|
82 |
+
|
83 |
+
jQuery('#sk_bucket_' + this.bucket_id).find('ul').append("<li class=\" sk_walkthrough\"><span><input type=\"checkbox\" " + checked + " value='" + key + "' name=\"disable_wts[]\"></span><span class='title'>" + this.all_walkthroughs[key].title + "</span></li>");
|
84 |
+
jQuery('[name="sk_autostart_walkthrough_id"]').append('<option ' + selected + ' value="' + key + '">' + this.all_walkthroughs[key].title + '</option>');
|
85 |
+
|
86 |
+
}
|
87 |
+
clearTimeout(lastTimeout);
|
88 |
+
lastTimeout = setTimeout(function(){setup_events();},1000);
|
89 |
+
},pass_data);
|
90 |
+
|
91 |
+
}); //
|
92 |
+
|
93 |
+
jQuery('.configure').show(); //
|
94 |
+
|
95 |
+
console.groupEnd();//
|
96 |
+
|
97 |
+
} else { //
|
98 |
+
jQuery('#' + this.cacheId).remove();
|
99 |
+
}
|
100 |
+
|
101 |
+
}
|
102 |
+
});
|
103 |
+
}); //
|
104 |
+
} //
|
105 |
+
|
106 |
+
function setup_events(){
|
107 |
+
console.log('setup_events');
|
108 |
+
|
109 |
+
jQuery('.select_all').click(function(){
|
110 |
+
var checkBoxes = jQuery(this).parent().find('input[type="checkbox"]');
|
111 |
+
|
112 |
+
_.each(checkBoxes,function(item,key){
|
113 |
+
jQuery(item).attr("checked", !jQuery(item).attr("checked"));
|
114 |
+
});
|
115 |
+
});
|
116 |
+
|
117 |
+
jQuery('[name="disable_wts[]"]').click(function(e){
|
118 |
+
|
119 |
+
if (e.currentTarget.checked) {
|
120 |
+
jQuery('input[value="' + e.currentTarget.value + '"]').attr('checked',true);
|
121 |
+
} else {
|
122 |
+
jQuery('input[value="' + e.currentTarget.value + '"]').attr('checked',false);
|
123 |
+
}
|
124 |
+
|
125 |
+
});
|
126 |
+
|
127 |
+
jQuery('.activate_all').click(function(){
|
128 |
+
jQuery('.activate_sk').each(function(key,item){
|
129 |
+
setTimeout(function() {
|
130 |
+
jQuery(item).trigger('click');
|
131 |
+
}, key*1000);
|
132 |
+
});
|
133 |
+
|
134 |
+
jQuery('.sk_bucket').not(':has(li)').remove();
|
135 |
+
});
|
136 |
+
|
137 |
+
// Set the disable_wts back to original state
|
138 |
+
sk_config.disable_wts = currently_disabled_wts;
|
139 |
+
}
|
140 |
+
|
141 |
+
function load_sk_library($key){
|
142 |
+
|
143 |
+
console.log('BBBB load_sk_library %o', $key);
|
144 |
+
var sk_url;
|
145 |
+
|
146 |
+
if ($key) {
|
147 |
+
sk_url = sk_config.library + 'domains/cache?domainKey=' + $key;
|
148 |
+
} else {
|
149 |
+
sk_url = sk_config.library + 'platform/cache?platformId=1';
|
150 |
+
}
|
151 |
+
|
152 |
+
console.log('sk_url %o', sk_url);
|
153 |
+
|
154 |
+
|
155 |
+
jQuery.ajax({
|
156 |
+
url: sk_url,
|
157 |
+
error: function(data){
|
158 |
+
jQuery('.sk_license_status span').html('Invalid Key').css({color: 'red'});
|
159 |
+
jQuery('.sk_upgrade').show();
|
160 |
+
load_sk_library();
|
161 |
+
},
|
162 |
+
success: function(data){
|
163 |
+
|
164 |
+
if (sk_config.library + 'domains/cache?domainKey=' + sk_config.activation_id == sk_url) {
|
165 |
+
if (!data.payload) {
|
166 |
+
jQuery('.sk_license_status').html('Invalid Key').css({color: 'red'});
|
167 |
+
} else {
|
168 |
+
jQuery('.sk_license_status').html('Valid').css({color: 'green'});
|
169 |
+
}
|
170 |
+
}
|
171 |
+
|
172 |
+
if (!data.payload) {
|
173 |
+
load_sk_library();
|
174 |
+
return false;
|
175 |
+
}
|
176 |
+
|
177 |
+
if (data.payload) {
|
178 |
+
sk_populate(data.payload);
|
179 |
+
}
|
180 |
+
}
|
181 |
+
});
|
182 |
+
}
|
183 |
+
|
184 |
+
jQuery(document).ready(function($) {
|
185 |
+
|
186 |
+
if (typeof sk_ms_admin !== 'undefined' && sk_ms_admin) {
|
187 |
+
|
188 |
+
// Multisite
|
189 |
+
|
190 |
+
var clicked_button;
|
191 |
+
|
192 |
+
if (typeof last_site_key !== 'undefined') {
|
193 |
+
load_sk_library(last_site_key);
|
194 |
+
} else {
|
195 |
+
jQuery('.sk_box.configure').html('Need to activate at least one site to configure walkthroughs').show();
|
196 |
+
}
|
197 |
+
|
198 |
+
jQuery('.activate_sk').click(function(){
|
199 |
+
|
200 |
+
clicked_button = this;
|
201 |
+
jQuery('.single_activation_error').html('');
|
202 |
+
|
203 |
+
var data = {
|
204 |
+
action: 'sk_activate_single',
|
205 |
+
blog_id: jQuery(this).data('blogid'),
|
206 |
+
user_id: jQuery(this).data('userid'),
|
207 |
+
domain: jQuery(this).data('domain'),
|
208 |
+
path: jQuery(this).data('path')
|
209 |
+
};
|
210 |
+
|
211 |
+
jQuery.post(ajaxurl, data, function(e){
|
212 |
+
|
213 |
+
if (!e.success) {
|
214 |
+
jQuery('.single_activation_error').html(e.message);
|
215 |
+
jQuery(clicked_button).parent().html('- <span class="not_active">Error Activating</span>');
|
216 |
+
} else if (e.success) {
|
217 |
+
jQuery(clicked_button).parent().html('- <span class="green">Activated</span>');
|
218 |
+
}
|
219 |
+
},'json');
|
220 |
+
|
221 |
+
});
|
222 |
+
|
223 |
+
} else {
|
224 |
+
jQuery(document).ready(function($) {
|
225 |
+
if (sk_config.activation_id) {
|
226 |
+
load_sk_library(sk_config.activation_id);
|
227 |
+
} else {
|
228 |
+
jQuery('.sk_upgrade').show();
|
229 |
+
}
|
230 |
+
|
231 |
+
jQuery('h3:contains(My Sidekick Account)').click(function(e){
|
232 |
+
if (e.shiftKey) {
|
233 |
+
jQuery('.advanced').show();
|
234 |
+
}
|
235 |
+
});
|
236 |
+
|
237 |
+
});
|
238 |
+
}
|
239 |
+
|
240 |
+
});
|
241 |
+
|
242 |
+
|
libs/admin_page.php
ADDED
@@ -0,0 +1,170 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<script type="text/javascript">
|
2 |
+
if (typeof ajax_url === 'undefined') {
|
3 |
+
ajax_url = '<?php echo admin_url() ?>admin-ajax.php';
|
4 |
+
}
|
5 |
+
var last_site_key = null;
|
6 |
+
var sk_ms_admin = false;
|
7 |
+
</script>
|
8 |
+
|
9 |
+
<div class="page-header"><h2><a id="pluginlogo_32" class="header-icon32" href="http://www.sidekick.pro/modules/wordpress-core-module-premium/?utm_source=plugin&utm_medium=settings&utm_campaign=header" target="_blank"></a>Sidekick Dashboard</h2></div>
|
10 |
+
|
11 |
+
<h3>Welcome to the fastest and easiest way to learn WordPress</h3>
|
12 |
+
|
13 |
+
<?php if (isset($error_message) && $error_message): ?>
|
14 |
+
<div class="error" id="sk_dashboard_message">
|
15 |
+
<p>There was a problem activating your license. The following error occured <?php echo $error_message ?></p>
|
16 |
+
</div>
|
17 |
+
<?php elseif (isset($error) && $error): ?>
|
18 |
+
<div class="error" id="sk_dashboard_message">
|
19 |
+
<p><?php echo $error ?></p>
|
20 |
+
</div>
|
21 |
+
<?php elseif (isset($warn) && $warn): ?>
|
22 |
+
<div class="updated" id="sk_dashboard_message">
|
23 |
+
<p><?php echo $warn ?></p>
|
24 |
+
</div>
|
25 |
+
<?php elseif (isset($success) && $success): ?>
|
26 |
+
<div class="updated" id="sk_dashboard_message">
|
27 |
+
<p><?php echo $success ?></p>
|
28 |
+
</div>
|
29 |
+
<?php endif ?>
|
30 |
+
|
31 |
+
<div class="sidekick_admin">
|
32 |
+
|
33 |
+
<div class="sk_box left">
|
34 |
+
<div class="wrapper_left">
|
35 |
+
<div class="sk_box license">
|
36 |
+
<div class="well">
|
37 |
+
<?php if (!$error): ?>
|
38 |
+
<h3>My Sidekick Account</h3>
|
39 |
+
<form method="post">
|
40 |
+
<?php settings_fields('sk_license'); ?>
|
41 |
+
<table class="form-table">
|
42 |
+
<tbody>
|
43 |
+
<tr valign="top">
|
44 |
+
<th scope="row" valign="top">Activation ID</th>
|
45 |
+
<?php if (defined('MULTISITE')): ?>
|
46 |
+
<?php if (isset($activation_id) && $activation_id): ?>
|
47 |
+
<td><input class='regular-text' style='color: gray;' type='text' name='activation_id' value='xxxxxxxx-xxxx-xxxx-xxxx-<?php echo substr($activation_id, 25,20) ?>'></input></td>
|
48 |
+
<?php else: ?>
|
49 |
+
<td><input class='regular-text' style='color: gray;' type='text' name='activation_id' ></input></td>
|
50 |
+
<?php endif ?>
|
51 |
+
<?php else: ?>
|
52 |
+
<td><input class='regular-text' type='text' name='activation_id' value='<?php echo $activation_id ?>'></input></td>
|
53 |
+
<?php endif ?>
|
54 |
+
</tr>
|
55 |
+
|
56 |
+
<tr valign="top">
|
57 |
+
<th scope="row" valign="top">Status</th>
|
58 |
+
<td><span style='color: blue' class='sk_license_status'><span><?php echo ucfirst($status) ?></span> <a style='display: none' class='sk_upgrade' href='http://www.sidekick.pro/modules/wordpress-core-module-premium/?utm_source=plugin&utm_medium=settings&utm_campaign=upgrade' target="_blank"> Upgrade Now!</a> </span></td>
|
59 |
+
</tr>
|
60 |
+
|
61 |
+
<tr valign="top">
|
62 |
+
<th scope="row" valign="top">
|
63 |
+
Data Tracking
|
64 |
+
</th>
|
65 |
+
<td>
|
66 |
+
<input name="sk_track_data" type="checkbox" <?php if ($sk_track_data): ?>CHECKED<?php endif ?> />
|
67 |
+
<input type='hidden' name='status' value='<?php echo $status ?>'/>
|
68 |
+
<label class="description" for="track_data">Help Sidekick by providing tracking data which will help us build better help tools.</label>
|
69 |
+
</td>
|
70 |
+
</tr>
|
71 |
+
|
72 |
+
<tr valign="top" style='display: none'>
|
73 |
+
<th scope="row" valign="top">
|
74 |
+
Enable Composer Mode
|
75 |
+
</th>
|
76 |
+
<td>
|
77 |
+
<input name="sk_composer_button" type="checkbox" <?php if (get_option('sk_composer_button')): ?>CHECKED<?php endif ?> />
|
78 |
+
<label class="description" for="track_data">Enable Walkthrough creation.</label>
|
79 |
+
</td>
|
80 |
+
</tr>
|
81 |
+
</tbody>
|
82 |
+
</table>
|
83 |
+
<?php submit_button('Update'); ?>
|
84 |
+
<?php wp_nonce_field( 'update_sk_settings' ); ?>
|
85 |
+
</form>
|
86 |
+
<?php endif ?>
|
87 |
+
</div>
|
88 |
+
</div>
|
89 |
+
|
90 |
+
<div class="sk_box composer">
|
91 |
+
<div class="well">
|
92 |
+
<h3>Build Your Own Walkthroughs</h3>
|
93 |
+
<a href='http://www.sidekick.pro/plans/create_wp_walkthroughs/?utm_source=plugin&utm_medium=settings&utm_campaign=composer' target='_blank'><div class='composer_beta_button'>Build Your Own<br/>Walkthroughs</div></a>
|
94 |
+
<ul>
|
95 |
+
<li>Get more info about <a href='http://www.sidekick.pro/how-it-works/?utm_source=plugin&utm_medium=settings&utm_campaign=composer' target='_blank'>Custom Walkthroughs</a> now!</li>
|
96 |
+
<li><a href="http://www.sidekick.pro/plans/create_wp_walkthroughs/?utm_source=plugin&utm_medium=settings&utm_campaign=composer" target="_blank">Check out our custom walkthroughs plans</a></li>
|
97 |
+
</ul>
|
98 |
+
</div>
|
99 |
+
</div>
|
100 |
+
|
101 |
+
<div class="sk_box you_should_know">
|
102 |
+
<div class="well">
|
103 |
+
<h3>Few Things you should know:</h3>
|
104 |
+
<div class="">
|
105 |
+
<ul>
|
106 |
+
<li>Clicking the check-box above will allow us to link your email address to the stats we collect so we can contact you if we have a question or notice an issue. It’s not mandatory, but it would help us out.</li>
|
107 |
+
<li>Your Activation ID is unique and limited to your production, staging, and development urls.</li>
|
108 |
+
<li>The Sidekick team adheres strictly to CANSPAM. From time to time we may send critical updates (such as security notices) to the email address setup as the Administrator on this site.</li>
|
109 |
+
<li>If you have any questions, bug reports or feedback, please send them to <a target="_blank" href="mailto:support@sidekick.pro">us</a> </li>
|
110 |
+
<li>You can find our terms of use <a target="_blank" href="http://www.sidekick.pro/terms-of-use/">here</a></li>
|
111 |
+
</ul>
|
112 |
+
</div>
|
113 |
+
</div>
|
114 |
+
</div>
|
115 |
+
|
116 |
+
<div class="sk_box advanced">
|
117 |
+
<div class="well">
|
118 |
+
<h3>Advanced</h3>
|
119 |
+
<form method="post">
|
120 |
+
<table class="form-table">
|
121 |
+
<tbody>
|
122 |
+
<tr valign="top">
|
123 |
+
<th scope="row" valign="top">API</th>
|
124 |
+
<td>
|
125 |
+
<select name='sk_api'>
|
126 |
+
<?php if (get_option('sk_api') == 'production'): ?>
|
127 |
+
<option value='production' SELECTED>Production</option>
|
128 |
+
<option value='staging'>Staging</option>
|
129 |
+
<?php else: ?>
|
130 |
+
<option value='production' >Production</option>
|
131 |
+
<option value='staging' SELECTED>Staging</option>
|
132 |
+
<?php endif ?>
|
133 |
+
</select>
|
134 |
+
</td>
|
135 |
+
</tr>
|
136 |
+
</tbody>
|
137 |
+
</table>
|
138 |
+
|
139 |
+
<?php wp_nonce_field( 'update_sk_settings' ); ?>
|
140 |
+
<input class='button button-primary' type='submit' value='Save'/>
|
141 |
+
</form>
|
142 |
+
|
143 |
+
</div>
|
144 |
+
</div>
|
145 |
+
|
146 |
+
</div>
|
147 |
+
</div>
|
148 |
+
|
149 |
+
<div class="sk_box right">
|
150 |
+
<div class="wrapper_right">
|
151 |
+
|
152 |
+
<?php require_once('walkthrough_config.php') ?>
|
153 |
+
|
154 |
+
<div class="sk_box love">
|
155 |
+
<div class="well">
|
156 |
+
<h3>Love the Sidekick plugin?</h3>
|
157 |
+
<ul>
|
158 |
+
<li>Please help spread the word!</li>
|
159 |
+
<li><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://sidekick.pro" data-text="I use @sidekickhelps for the fastest and easiest way to learn WordPress." data-via="sidekickhelps" data-size="large">Tweet</a><script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script></li>
|
160 |
+
<li>Like SIDEKICK? Please leave us a 5 star rating on <a href='http://WordPress.org' target='_blank'>WordPress.org</a></li>
|
161 |
+
<li><a href="http://www.sidekick.pro/plans/wordpress-basics/">Sign up for a full WordPress Basics package</a></li>
|
162 |
+
<li><a href="http://support.sidekick.pro/category/85-getting-started" target="_blank"><strong>Visit the SIDEKICK Quick Start guides</strong></a>.</li>
|
163 |
+
</ul>
|
164 |
+
</div>
|
165 |
+
</div>
|
166 |
+
</div>
|
167 |
+
</div>
|
168 |
+
|
169 |
+
|
170 |
+
|
libs/licensing.php
ADDED
@@ -0,0 +1,238 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class sidekickMassActivator{
|
4 |
+
|
5 |
+
function activate($blog_id, $user_id, $domain, $path){
|
6 |
+
// mlog('FUNCTION: activate');
|
7 |
+
|
8 |
+
$sk_auto_activations = get_option( 'sk_auto_activations');
|
9 |
+
|
10 |
+
if ($sk_auto_activations) {
|
11 |
+
|
12 |
+
$user = get_user_by('id',$user_id);
|
13 |
+
$email = ($user) ? $user->user_email : 'unknown';
|
14 |
+
|
15 |
+
// TODO: Send Domain for good measure
|
16 |
+
|
17 |
+
$sk_selected_subscription = get_option("sk_selected_subscription");
|
18 |
+
|
19 |
+
$result = $this->send_request('post','/domains',array('domainName' => $domain . $path, 'subscriptionId' => $sk_selected_subscription));
|
20 |
+
|
21 |
+
if (isset($result->success) && $result->success == true && $result->payload->domainKey) {
|
22 |
+
|
23 |
+
if (!get_option('sk_activation_id')) {
|
24 |
+
// Use the first site's activation key for the network key
|
25 |
+
update_option('sk_activation_id',$result->payload->domainKey);
|
26 |
+
}
|
27 |
+
|
28 |
+
switch_to_blog($blog_id);
|
29 |
+
update_option('sk_activation_id',$result->payload->domainKey);
|
30 |
+
update_option('sk_email',$email);
|
31 |
+
restore_current_blog();
|
32 |
+
|
33 |
+
delete_option('sk_auto_activation_error');
|
34 |
+
} else {
|
35 |
+
update_option('sk_auto_activation_error',$result->message);
|
36 |
+
wp_mail( 'support@sidekick.pro', 'Failed Mass Domain Add', json_encode($result));
|
37 |
+
}
|
38 |
+
return $result;
|
39 |
+
}
|
40 |
+
return false;
|
41 |
+
}
|
42 |
+
|
43 |
+
function activate_single(){
|
44 |
+
die(json_encode($this->activate($_POST['blog_id'], $_POST['user_id'], $_POST['domain'], $_POST['path'])));
|
45 |
+
}
|
46 |
+
|
47 |
+
function send_request_curl($url, $post){
|
48 |
+
$ch = curl_init($url);
|
49 |
+
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
|
50 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
51 |
+
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
|
52 |
+
curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode($post));
|
53 |
+
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
|
54 |
+
$result = curl_exec($ch);
|
55 |
+
curl_close($ch);
|
56 |
+
return $result;
|
57 |
+
}
|
58 |
+
|
59 |
+
function send_request($type,$end_point, $data = null,$second_attempt = null){
|
60 |
+
// var_dump('send_request');
|
61 |
+
//var_dump("FUNCTION: send_request");
|
62 |
+
|
63 |
+
if (strpos($_SERVER['SERVER_PROTOCOL'], 'https') === false) {
|
64 |
+
$protocol = 'http:';
|
65 |
+
} else {
|
66 |
+
$protocol = 'https:';
|
67 |
+
}
|
68 |
+
|
69 |
+
$url = $protocol . SK_API . $end_point;
|
70 |
+
$sk_token = get_transient('sk_token');
|
71 |
+
|
72 |
+
if (!$sk_token && $end_point !== '/login') {
|
73 |
+
$this->login();
|
74 |
+
$sk_token = get_transient('sk_token');
|
75 |
+
}
|
76 |
+
|
77 |
+
$headers = array('Content-Type:application/json');
|
78 |
+
|
79 |
+
if ($sk_token && $end_point !== '/login') {
|
80 |
+
$headers[] = "Authorization: $sk_token";
|
81 |
+
}
|
82 |
+
|
83 |
+
$ch = curl_init($url);
|
84 |
+
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, strtoupper($type));
|
85 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
86 |
+
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
87 |
+
if ($data) {
|
88 |
+
curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode($data));
|
89 |
+
}
|
90 |
+
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
|
91 |
+
$result = curl_exec($ch);
|
92 |
+
curl_close($ch);
|
93 |
+
|
94 |
+
// echo $result;
|
95 |
+
// var_dump($url);
|
96 |
+
// var_dump($headers);
|
97 |
+
// var_dump($data);
|
98 |
+
// var_dump($result);
|
99 |
+
// die();
|
100 |
+
|
101 |
+
if ($result == 'HTTP/1.1 401 Unauthorized' && !$second_attempt) {
|
102 |
+
// var_dump('Getting rid of token and trying again');
|
103 |
+
$this->login();
|
104 |
+
delete_transient('sk_token');
|
105 |
+
$this->send_request('post',$type,$data,true);
|
106 |
+
}
|
107 |
+
|
108 |
+
return json_decode($result);
|
109 |
+
}
|
110 |
+
|
111 |
+
function setup_menu(){
|
112 |
+
add_submenu_page( 'settings.php', 'Sidekick - Licensing', 'Sidekick - Licensing', 'activate_plugins','sidekick-licensing', array(&$this,'admin_page'));
|
113 |
+
}
|
114 |
+
|
115 |
+
function login(){
|
116 |
+
global $login_error;
|
117 |
+
//var_dump("FUNCTION: login");
|
118 |
+
$email = get_option('sk_account');
|
119 |
+
$password = get_option('sk_password');
|
120 |
+
|
121 |
+
if (!$password || !$email) {
|
122 |
+
return false;
|
123 |
+
}
|
124 |
+
|
125 |
+
// mlog('$email',$email);
|
126 |
+
// mlog('$password',$password);
|
127 |
+
|
128 |
+
// $password = $e->decrypt($password, 'key');
|
129 |
+
|
130 |
+
$string = $password;
|
131 |
+
$key = 'hash';
|
132 |
+
$decrypted_password = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($password), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
|
133 |
+
|
134 |
+
$result = $this->send_request('post','/login',array('email' => $email, 'password' => $decrypted_password));
|
135 |
+
|
136 |
+
// var_dump($result);
|
137 |
+
|
138 |
+
if (!isset($result) || !$result->success) {
|
139 |
+
delete_option( 'sk_token' );
|
140 |
+
return array('error' => $result->message);
|
141 |
+
} else {
|
142 |
+
set_transient( 'sk_token', $result->payload->token->value, 24 * HOUR_IN_SECONDS );
|
143 |
+
$this->load_subscriptions($result->payload->token->value);
|
144 |
+
return array('success' => true);
|
145 |
+
}
|
146 |
+
}
|
147 |
+
|
148 |
+
function load_user_data(){
|
149 |
+
return $this->send_request('get','/users/');
|
150 |
+
}
|
151 |
+
|
152 |
+
function load_subscriptions(){
|
153 |
+
// var_dump('load_subscriptions');
|
154 |
+
$result = $this->send_request('get','/users/subscriptions');
|
155 |
+
// var_dump($result);
|
156 |
+
if ($result->success) {
|
157 |
+
foreach ($result->payload as &$sub) {
|
158 |
+
if ($sub->PlanId == 1) {
|
159 |
+
// Basics or Enterprise can only be used right now
|
160 |
+
update_option( 'sk_selected_subscription', $sub->id );
|
161 |
+
$current_subscription = $sub;
|
162 |
+
}
|
163 |
+
// var_dump($sub->Domains);
|
164 |
+
if (count($sub->Domains) > 0) {
|
165 |
+
foreach ($sub->Domains as &$domain) {
|
166 |
+
if (!$domain->DomainSubscription->end) {
|
167 |
+
if (isset($sub->activeDomainCount)) {
|
168 |
+
$sub->activeDomainCount++;
|
169 |
+
} else {
|
170 |
+
$sub->activeDomainCount = 1;
|
171 |
+
}
|
172 |
+
}
|
173 |
+
}
|
174 |
+
} else {
|
175 |
+
$sub->activeDomainCount = 0;
|
176 |
+
}
|
177 |
+
|
178 |
+
}
|
179 |
+
$data['subscriptions'] = $result->payload;
|
180 |
+
if (isset($current_subscription)) {
|
181 |
+
$data['current_subscription'] = $current_subscription;
|
182 |
+
} else {
|
183 |
+
delete_option('sk_auto_activations');
|
184 |
+
}
|
185 |
+
return $data;
|
186 |
+
}
|
187 |
+
return null;
|
188 |
+
}
|
189 |
+
|
190 |
+
function admin_page(){
|
191 |
+
if (isset($_POST['sk_account'])) {
|
192 |
+
|
193 |
+
if (isset($_POST['sk_password']) && $_POST['sk_password'] && isset($_POST['sk_account']) && $_POST['sk_account']) {
|
194 |
+
$key = 'hash';
|
195 |
+
$string = $_POST['sk_password'];
|
196 |
+
|
197 |
+
$encrypted_password = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
|
198 |
+
$decrypted_password = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted_password), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
|
199 |
+
|
200 |
+
update_option( 'sk_account', $_POST['sk_account'] );
|
201 |
+
update_option( 'sk_password', $encrypted_password );
|
202 |
+
$login_status = $this->login();
|
203 |
+
delete_option('sk_auto_activation_error');
|
204 |
+
} else {
|
205 |
+
update_option( 'sk_selected_subscription', $_POST['sk_selected_subscription'] );
|
206 |
+
}
|
207 |
+
|
208 |
+
if (isset($_POST['sk_auto_activations'])) {
|
209 |
+
update_option( 'sk_auto_activations', true );
|
210 |
+
} else {
|
211 |
+
delete_option( 'sk_auto_activations');
|
212 |
+
}
|
213 |
+
}
|
214 |
+
|
215 |
+
$sk_token = get_transient('sk_token');
|
216 |
+
if (!$sk_token) {
|
217 |
+
$login_status = $this->login();
|
218 |
+
}
|
219 |
+
$sk_subs = $this->load_subscriptions();
|
220 |
+
$user_data = $this->load_user_data();
|
221 |
+
$sk_auto_activations = get_option( 'sk_auto_activations');
|
222 |
+
$sk_auto_activation_error = get_option('sk_auto_activation_error');
|
223 |
+
$sk_selected_subscription = get_option('sk_selected_subscription');
|
224 |
+
$is_ms_admin = true;
|
225 |
+
$curl = function_exists('curl_version') ? true : false;
|
226 |
+
$fgets = file_get_contents(__FILE__) ? true : false;
|
227 |
+
$fgets_url = ini_get('allow_url_fopen') ? true : false;
|
228 |
+
|
229 |
+
// var_dump($sk_subs);
|
230 |
+
|
231 |
+
if ($curl && (!$fgets || !$fgets_url)) {
|
232 |
+
$error = "Sorry, SIDEKICK MultiSite activations require <b>CURL</b> or <b>file_get_contents</b> functions enabled in PHP.";
|
233 |
+
}
|
234 |
+
|
235 |
+
include('ms_admin_page.php');
|
236 |
+
}
|
237 |
+
}
|
238 |
+
|
libs/ms_admin_page.php
ADDED
@@ -0,0 +1,217 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<script type="text/javascript">
|
2 |
+
if (typeof ajax_url === 'undefined') {
|
3 |
+
ajax_url = '<?php echo admin_url() ?>admin-ajax.php';
|
4 |
+
}
|
5 |
+
var last_site_key = null;
|
6 |
+
var sk_ms_admin = true;
|
7 |
+
</script>
|
8 |
+
|
9 |
+
<div class="page-header"><h2><a id="pluginlogo_32" class="header-icon32" href="http://www.sidekick.pro" target="_blank"></a>Sidekick Licensing</h2></div>
|
10 |
+
|
11 |
+
<h3>Welcome to the fastest and easiest way to learn WordPress</h3>
|
12 |
+
|
13 |
+
<?php if (isset($error_message) && $error_message): ?>
|
14 |
+
<div class="error" id="sk_dashboard_message">
|
15 |
+
<p>There was a problem activating your license. The following error occured <?php echo $error_message ?></p>
|
16 |
+
</div>
|
17 |
+
<?php elseif (isset($error) && $error): ?>
|
18 |
+
<div class="error" id="sk_dashboard_message">
|
19 |
+
<p><?php echo $error ?></p>
|
20 |
+
</div>
|
21 |
+
<?php elseif (isset($sk_auto_activation_error) && $sk_auto_activation_error): ?>
|
22 |
+
<div class="error" id="sk_dashboard_message">
|
23 |
+
<p><?php echo $sk_auto_activation_error ?></p>
|
24 |
+
</div>
|
25 |
+
<?php elseif (isset($login_status['error']) && $login_status['error']): ?>
|
26 |
+
<div class="error" id="sk_dashboard_message">
|
27 |
+
<p><?php echo $login_status['error'] ?></p>
|
28 |
+
</div>
|
29 |
+
<?php elseif (isset($warn) && $warn): ?>
|
30 |
+
<div class="updated" id="sk_dashboard_message">
|
31 |
+
<p><?php echo $warn ?></p>
|
32 |
+
</div>
|
33 |
+
<?php elseif (isset($success) && $success): ?>
|
34 |
+
<div class="updated" id="sk_dashboard_message">
|
35 |
+
<p><?php echo $success ?></p>
|
36 |
+
</div>
|
37 |
+
<?php elseif (isset($login_status['success']) && $login_status['success']): ?>
|
38 |
+
<div class="updated" id="sk_dashboard_message">
|
39 |
+
<p>Successful Login!</p>
|
40 |
+
</div>
|
41 |
+
<?php endif ?>
|
42 |
+
|
43 |
+
|
44 |
+
|
45 |
+
<div class="sidekick_admin">
|
46 |
+
|
47 |
+
<div class="sk_box left">
|
48 |
+
<div class="wrapper_left">
|
49 |
+
<div class="sk_box license">
|
50 |
+
<div class="well">
|
51 |
+
<h3>Activate Sidekick Account</h3>
|
52 |
+
<p>Please keep this information <b>private</b>.</p>
|
53 |
+
<p>Once active every site create on this multisite installation will have Sidekick automatically activted.</p>
|
54 |
+
<p><b>Important - </b>Only WordPress basics and Enterprise plans are currently supported. <b>Custom Walkthrough</b> plans will be supported in the near future.</p>
|
55 |
+
|
56 |
+
<form method="post">
|
57 |
+
<?php settings_fields('sk_license'); ?>
|
58 |
+
<table class="form-table">
|
59 |
+
<tbody>
|
60 |
+
<tr valign="top">
|
61 |
+
<th scope="row" valign="top">Account (E-mail)</th>
|
62 |
+
<td>
|
63 |
+
<input id='<?php echo time() ?>' class='regular-text' type='text' name='sk_account' placeholder='<?php echo get_option('sk_account') ?>'></input>
|
64 |
+
</td>
|
65 |
+
</tr>
|
66 |
+
<tr valign="top">
|
67 |
+
<th scope="row" valign="top">Password</th>
|
68 |
+
<td>
|
69 |
+
<input class='regular-text' type='password' name='sk_password' placeholder='********'></input>
|
70 |
+
</td>
|
71 |
+
</tr>
|
72 |
+
<tr valign="top">
|
73 |
+
<th scope="row" valign="top">Subscription</th>
|
74 |
+
<td>
|
75 |
+
<select name='sk_selected_subscription'>
|
76 |
+
<?php if (isset($sk_subs['subscriptions']) && count($sk_subs['subscriptions']) > 0): ?>
|
77 |
+
<?php foreach ($sk_subs['subscriptions'] as $key => $sub): ?>
|
78 |
+
<?php
|
79 |
+
if ($sub->PlanId !== 1) {
|
80 |
+
continue;
|
81 |
+
}
|
82 |
+
if ($sk_selected_subscription == $sub->id) {
|
83 |
+
$selected_sub = $sub;
|
84 |
+
$selected = 'SELECTED';
|
85 |
+
} else {
|
86 |
+
$selected = '';
|
87 |
+
}
|
88 |
+
?>
|
89 |
+
<option <?php echo $selected ?> value='<?php echo $sub->id ?>'><?php echo $sub->Plan->name . ' - ' . $sub->CurrentTier->name ?></option>
|
90 |
+
<?php endforeach ?>
|
91 |
+
<?php if (!isset($selected_sub)): ?>
|
92 |
+
<option value='0'>No Compatible Subscriptions</option>
|
93 |
+
<?php endif ?>
|
94 |
+
<?php else: ?>
|
95 |
+
<option>No Subscriptions</option>
|
96 |
+
<?php endif ?>
|
97 |
+
</select>
|
98 |
+
</td>
|
99 |
+
</tr>
|
100 |
+
<tr valign="top">
|
101 |
+
<th scope="row" valign="top">Enable Auto-Activations</th>
|
102 |
+
<td>
|
103 |
+
<?php if (!isset($selected_sub)): ?>
|
104 |
+
<input class='checkbox' type='checkbox' name='sk_auto_activations' DISABLED>
|
105 |
+
<?php else: ?>
|
106 |
+
<input class='checkbox' type='checkbox' name='sk_auto_activations' <?php echo ($sk_auto_activations) ? 'CHECKED' : '' ?>>
|
107 |
+
<?php endif ?>
|
108 |
+
</td>
|
109 |
+
</tr>
|
110 |
+
<?php if (isset($selected_sub)): ?>
|
111 |
+
<tr>
|
112 |
+
<th scope="row" valign="top">Active Domains</th>
|
113 |
+
<td><?php echo $selected_sub->activeDomainCount ?>/ <?php echo ($selected_sub->CurrentTier->numberOfDomains == -1) ? 'Unlimited' : $selected_sub->CurrentTier->numberOfDomains ?> (<a href='https://www.sidekick.pro/profile/#/overview' target='_blank'>Manage</a>)
|
114 |
+
</td>
|
115 |
+
</tr>
|
116 |
+
<?php endif ?>
|
117 |
+
<?php if (isset($login_status['error']) && $login_status['error']): ?>
|
118 |
+
<tr>
|
119 |
+
<th colspan='2'>
|
120 |
+
<span class='red'><?php echo $login_status['error'] ?></span>
|
121 |
+
</th>
|
122 |
+
</tr>
|
123 |
+
<?php endif ?>
|
124 |
+
<?php if (isset($sk_auto_activation_error) && $sk_auto_activation_error): ?>
|
125 |
+
<tr>
|
126 |
+
<th scope="row" valign="top">Auto Activation Error</th>
|
127 |
+
<td>
|
128 |
+
<span class='red'><?php echo $sk_auto_activation_error ?></span>
|
129 |
+
</td>
|
130 |
+
</tr>
|
131 |
+
<?php endif ?>
|
132 |
+
|
133 |
+
<?php if (isset($login_status['success']) && $login_status['success']): ?>
|
134 |
+
<tr>
|
135 |
+
<th colspan='2'>
|
136 |
+
<span class='green'>Successful! </span>
|
137 |
+
</th>
|
138 |
+
</tr>
|
139 |
+
<?php endif ?>
|
140 |
+
<tr>
|
141 |
+
<th></th>
|
142 |
+
<td><?php submit_button('Update'); ?></td>
|
143 |
+
</tr>
|
144 |
+
</tbody>
|
145 |
+
</table>
|
146 |
+
</form>
|
147 |
+
</div>
|
148 |
+
</div>
|
149 |
+
|
150 |
+
<!-- Sites -->
|
151 |
+
|
152 |
+
<div class="sk_box sites">
|
153 |
+
<div class="well">
|
154 |
+
<h3>Sidekick Network Activations - (<a class='activate_all' href='#'>Activate All</a>)</h3>
|
155 |
+
|
156 |
+
<p>To manage your complete list of domains please login to your <a href='https://www.sidekick.pro/profile/#' target='_blank'>account center</a>.</p>
|
157 |
+
|
158 |
+
<?php $blogs = wp_get_sites(array('limit' => 10000)) ?>
|
159 |
+
<ul>
|
160 |
+
<?php foreach ($blogs as $key => $blog): ?>
|
161 |
+
<?php
|
162 |
+
|
163 |
+
switch_to_blog($blog['blog_id']);
|
164 |
+
|
165 |
+
if ($user = get_user_by('email', get_option('admin_email'))) {
|
166 |
+
$user_id = $user->ID;
|
167 |
+
} else {
|
168 |
+
$user_id = null;
|
169 |
+
}
|
170 |
+
|
171 |
+
$key = get_option('sk_activation_id');
|
172 |
+
if ($key) $last_key = $key;
|
173 |
+
|
174 |
+
$turn_on_button = '';
|
175 |
+
|
176 |
+
if (isset($selected_sub)) {
|
177 |
+
$turn_on_button = "<button class=\"activate_sk\" data-blogid=\"{$blog["blog_id"]}\" data-userid=\"{$user_id}\" data-domain=\"{$blog["domain"]}\" data-path=\"{$blog["path"]}\">Turn On</button>";
|
178 |
+
}
|
179 |
+
|
180 |
+
?>
|
181 |
+
|
182 |
+
<li>
|
183 |
+
<div class='bold'>
|
184 |
+
<h3><?php echo ucfirst(str_replace('/', '', $blog['path'])) ?></h3>
|
185 |
+
<?php echo $blog['domain'] . $blog['path'] ?>
|
186 |
+
<span><?php echo ($key) ? ' - <span class="green">Active</span>' : " - <span class=\"not_active\">Not Activated</span> $turn_on_button" ?></span>
|
187 |
+
</div>
|
188 |
+
</li>
|
189 |
+
<?php endforeach ?>
|
190 |
+
</ul>
|
191 |
+
|
192 |
+
<div class="single_activation_error red"></div>
|
193 |
+
|
194 |
+
|
195 |
+
</div>
|
196 |
+
</div>
|
197 |
+
|
198 |
+
</div>
|
199 |
+
</div>
|
200 |
+
|
201 |
+
<script type="text/javascript">
|
202 |
+
last_site_key = '<?php echo (isset($last_key) && $last_key) ? $last_key : '' ?>';
|
203 |
+
</script>
|
204 |
+
|
205 |
+
|
206 |
+
<div class="sk_box left">
|
207 |
+
<div class="wrapper_left">
|
208 |
+
<?php require_once('walkthrough_config.php') ?>
|
209 |
+
</div>
|
210 |
+
</div>
|
211 |
+
|
212 |
+
|
213 |
+
</div>
|
214 |
+
|
215 |
+
|
216 |
+
|
217 |
+
|
libs/sk_config_data.php
ADDED
@@ -0,0 +1,205 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
class sk_config_data{
|
4 |
+
function get_domain(){
|
5 |
+
$site_url = get_site_url();
|
6 |
+
if(substr($site_url, -1) == '/') {
|
7 |
+
$site_url = substr($site_url, 0, -1);
|
8 |
+
}
|
9 |
+
$site_url = str_replace(array("http://","https://"),array(""),$site_url);
|
10 |
+
return $site_url;
|
11 |
+
}
|
12 |
+
|
13 |
+
function get_post_types(){
|
14 |
+
global $wpdb;
|
15 |
+
$query = "SELECT post_type, count(distinct ID) as count from {$wpdb->prefix}posts group by post_type";
|
16 |
+
$counts = $wpdb->get_results($query);
|
17 |
+
$output = '';
|
18 |
+
|
19 |
+
foreach ($counts as $key => $type) {
|
20 |
+
$type->post_type = str_replace('-', '_', $type->post_type);
|
21 |
+
$output .= "\n post_type_{$type->post_type} : $type->count,";
|
22 |
+
}
|
23 |
+
return $output;
|
24 |
+
}
|
25 |
+
|
26 |
+
function get_themes(){
|
27 |
+
$themes = wp_get_themes( array( 'allowed' => true ) );
|
28 |
+
return count($themes);
|
29 |
+
}
|
30 |
+
|
31 |
+
function get_post_types_and_statuses(){
|
32 |
+
global $wpdb;
|
33 |
+
$query = "SELECT post_type, post_status, count(distinct ID) as count from {$wpdb->prefix}posts group by post_type, post_status";
|
34 |
+
$counts = $wpdb->get_results($query);
|
35 |
+
$output = '';
|
36 |
+
|
37 |
+
foreach ($counts as $key => $type) {
|
38 |
+
$type->post_type = str_replace('-', '_', $type->post_type);
|
39 |
+
$type->post_status = str_replace('-', '_', $type->post_status);
|
40 |
+
|
41 |
+
$output .= "\n post_type_{$type->post_type}_{$type->post_status} : $type->count,";
|
42 |
+
}
|
43 |
+
return $output;
|
44 |
+
}
|
45 |
+
|
46 |
+
function get_taxonomies(){
|
47 |
+
global $wpdb;
|
48 |
+
$query = "SELECT count(distinct term_taxonomy_id) as count, taxonomy from {$wpdb->prefix}term_taxonomy group by taxonomy";
|
49 |
+
$counts = $wpdb->get_results($query);
|
50 |
+
$output = '';
|
51 |
+
|
52 |
+
foreach ($counts as $key => $taxonomy) {
|
53 |
+
$taxonomy->taxonomy = str_replace('-', '_', $taxonomy->taxonomy);
|
54 |
+
$output .= "\n taxonomy_{$taxonomy->taxonomy} : $taxonomy->count,";
|
55 |
+
}
|
56 |
+
return $output;
|
57 |
+
}
|
58 |
+
|
59 |
+
function get_comments(){
|
60 |
+
global $wpdb;
|
61 |
+
$query = "SELECT count(distinct comment_ID) as count from {$wpdb->prefix}comments";
|
62 |
+
$counts = $wpdb->get_var($query);
|
63 |
+
if (!$counts) $counts = 0;
|
64 |
+
return "\n comment_count : $counts,";
|
65 |
+
}
|
66 |
+
|
67 |
+
function get_post_statuses(){
|
68 |
+
global $wpdb;
|
69 |
+
$query = "SELECT post_status, count(ID) as count from {$wpdb->prefix}posts group by post_status";
|
70 |
+
$counts = $wpdb->get_results($query);
|
71 |
+
$output = '';
|
72 |
+
|
73 |
+
foreach ($counts as $key => $type) {
|
74 |
+
$type->post_status = str_replace('-', '_', $type->post_status);
|
75 |
+
$output .= "\n post_status_{$type->post_status} : $type->count,";
|
76 |
+
}
|
77 |
+
return $output;
|
78 |
+
}
|
79 |
+
|
80 |
+
function get_user_data(){
|
81 |
+
global $current_user;
|
82 |
+
|
83 |
+
$data = get_userdata($current_user->ID);
|
84 |
+
$output = "\n user_id : $current_user->ID,";
|
85 |
+
|
86 |
+
foreach ($data->allcaps as $cap => $val) {
|
87 |
+
$cap = sanitize_title($cap);
|
88 |
+
$cap = str_replace('-', '_', $cap);
|
89 |
+
if (!$val) $val = 0;
|
90 |
+
$output .= "\n cap_{$cap} : $val,";
|
91 |
+
}
|
92 |
+
return $output;
|
93 |
+
}
|
94 |
+
|
95 |
+
function get_framework(){
|
96 |
+
global $current_user;
|
97 |
+
|
98 |
+
$frameworks = array('genesis');
|
99 |
+
|
100 |
+
$output = "\n theme_framework : false,";
|
101 |
+
|
102 |
+
foreach ($frameworks as $framework) {
|
103 |
+
switch ($framework) {
|
104 |
+
case 'genesis':
|
105 |
+
if (function_exists( 'genesis' ) ) {
|
106 |
+
if (defined('PARENT_THEME_VERSION')) {
|
107 |
+
$output = "\n theme_framework : {name: '" . $framework . "', version: '" . PARENT_THEME_VERSION . "'},";
|
108 |
+
}
|
109 |
+
}
|
110 |
+
break;
|
111 |
+
}
|
112 |
+
}
|
113 |
+
return $output;
|
114 |
+
}
|
115 |
+
|
116 |
+
function get_current_url() {
|
117 |
+
if (isset($_SERVER['REQUEST_URI'])) {
|
118 |
+
return 'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
|
119 |
+
} else if (isset($_SERVER['PATH_INFO'])) {
|
120 |
+
return $_SERVER['PATH_INFO'];
|
121 |
+
} else {
|
122 |
+
$host = $_SERVER['HTTP_HOST'];
|
123 |
+
$port = $_SERVER['SERVER_PORT'];
|
124 |
+
$request = $_SERVER['PHP_SELF'];
|
125 |
+
$query = isset($_SERVER['argv']) ? substr($_SERVER['argv'][0], strpos($_SERVER['argv'][0], ';') + 1) : '';
|
126 |
+
$toret = $protocol . '://' . $host . ($port == $protocol_port ? '' : ':' . $port) . $request . (empty($query) ? '' : '?' . $query);
|
127 |
+
return $toret;
|
128 |
+
}
|
129 |
+
}
|
130 |
+
|
131 |
+
function get_disabled_wts(){
|
132 |
+
$wts = str_replace('"', '', get_option('sk_disabled_wts'));
|
133 |
+
if ($wts) {
|
134 |
+
return $wts;
|
135 |
+
}
|
136 |
+
return 'false';
|
137 |
+
}
|
138 |
+
|
139 |
+
function get_disabled_network_wts(){
|
140 |
+
$wts = str_replace('"', '', get_site_option('sk_disabled_wts'));
|
141 |
+
|
142 |
+
if ($wts) {
|
143 |
+
return $wts;
|
144 |
+
}
|
145 |
+
return 'false';
|
146 |
+
}
|
147 |
+
|
148 |
+
function get_plugins(){
|
149 |
+
$active_plugins = wp_get_active_and_valid_plugins();
|
150 |
+
$mu_plugins = get_mu_plugins();
|
151 |
+
|
152 |
+
$printed = false;
|
153 |
+
|
154 |
+
$output = '[';
|
155 |
+
$count = 0;
|
156 |
+
|
157 |
+
if (is_array($active_plugins)) {
|
158 |
+
foreach ($active_plugins as $plugins_key => $plugin) {
|
159 |
+
$data = get_plugin_data( $plugin, false, false );
|
160 |
+
|
161 |
+
$plugins[addslashes($data['Name'])] = $data['Version'];
|
162 |
+
if ($plugins_key > 0) $output .= ',';
|
163 |
+
$data['Name'] = addslashes($data['Name']);
|
164 |
+
$output .= "{'{$data['Name']}' : '{$data['Version']}'}";
|
165 |
+
$printed = true;
|
166 |
+
$count++;
|
167 |
+
}
|
168 |
+
}
|
169 |
+
|
170 |
+
if (is_array($mu_plugins)) {
|
171 |
+
foreach ($mu_plugins as $plugins_key => $plugin) {
|
172 |
+
$plugins[addslashes($plugin['Name'])] = $plugin['Version'];
|
173 |
+
if ($printed) $output .= ',';
|
174 |
+
$plugin['Name'] = addslashes($plugin['Name']);
|
175 |
+
$output .= "{'{$plugin['Name']}' : '{$plugin['Version']}'}";
|
176 |
+
$printed = true;
|
177 |
+
$count++;
|
178 |
+
}
|
179 |
+
}
|
180 |
+
$output .= ']';
|
181 |
+
return array('plugins' => $output, 'count' => $count);
|
182 |
+
}
|
183 |
+
|
184 |
+
function get_user_role(){
|
185 |
+
global $current_user, $wp_roles;
|
186 |
+
|
187 |
+
if (is_super_admin($current_user->ID)) {
|
188 |
+
return 'administrator';
|
189 |
+
}
|
190 |
+
|
191 |
+
if(!isset($current_user->caps) || count($current_user->caps) < 1){
|
192 |
+
// In MS in some specific pages current user is returning empty caps so this is a work around for that case.
|
193 |
+
if (current_user_can('activate_plugins')){
|
194 |
+
return 'administrator';
|
195 |
+
}
|
196 |
+
}
|
197 |
+
foreach($wp_roles->role_names as $role => $Role) {
|
198 |
+
if (array_key_exists($role, $current_user->caps)){
|
199 |
+
$user_role = $role;
|
200 |
+
break;
|
201 |
+
}
|
202 |
+
}
|
203 |
+
return $user_role;
|
204 |
+
}
|
205 |
+
}
|
libs/walkthrough_config.php
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div class="sk_box configure">
|
2 |
+
<div class="well">
|
3 |
+
<h3>Configure - Auto Start</h3>
|
4 |
+
|
5 |
+
<form method='post'>
|
6 |
+
|
7 |
+
<p>This Walkthrough will be played once for every user that logs into the backend of WordPress.</p>
|
8 |
+
<select name='sk_autostart_walkthrough_id'>
|
9 |
+
<option value='0'>No Auto Start</option>
|
10 |
+
</select>
|
11 |
+
<input class='button button-primary' type='submit' value='Save'/>
|
12 |
+
<input type='hidden' name='is_ms_admin' value='<?php echo (isset($is_ms_admin)) ? $is_ms_admin : false ?>'/>
|
13 |
+
<input type='hidden' name='sk_setting_autostart' value='true'/>
|
14 |
+
|
15 |
+
<?php wp_nonce_field( 'update_sk_settings' ); ?>
|
16 |
+
</form>
|
17 |
+
</div>
|
18 |
+
</div>
|
19 |
+
|
20 |
+
<div class="sk_box configure">
|
21 |
+
<div class="well">
|
22 |
+
<h3>Configure - Turn Off Walkthroughs</h3>
|
23 |
+
|
24 |
+
<form method='post'>
|
25 |
+
<p>Below you can turn off specific Walkthroughs for this website.</p>
|
26 |
+
<p>Please note, incompatible multisite walkthroughs will be disabled automatically on individual sites already. Here you're being show the raw unfiltered list of all available walkthroughs.</p>
|
27 |
+
<div class='sk_walkthrough_list wrapper_wts'>
|
28 |
+
Loading...
|
29 |
+
</div>
|
30 |
+
<input class='button button-primary' type='submit' value='Save'/>
|
31 |
+
<input type='hidden' name='sk_setting_disabled' value='true'/>
|
32 |
+
<input type='hidden' name='is_ms_admin' value='<?php echo (isset($is_ms_admin)) ? $is_ms_admin : false ?>'/>
|
33 |
+
<?php wp_nonce_field( 'update_sk_settings' ); ?>
|
34 |
+
</form>
|
35 |
+
</div>
|
36 |
+
</div>
|
readme.txt
ADDED
@@ -0,0 +1,280 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
=== Sidekick ===
|
2 |
+
Contributors: raptor235,benfox,kyle_white,bitwit,riavalon,JeffLam
|
3 |
+
Donate link: http://www.sidekick.pro
|
4 |
+
Tags: help, tutorial, training, learn, learning, sidekick, guide, teach, video, manual, videos, wphelp, support, instructions, question, questions, answers, answer, clippy, q&a, wpuniversity, helper, walkthrough
|
5 |
+
Requires at least: 3.7
|
6 |
+
Tested up to: 4.1
|
7 |
+
Stable tag: 2.1.0
|
8 |
+
License: GNU Version 2 or Any Later Version
|
9 |
+
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
+
|
11 |
+
Real-time, voice-guided WordPress training and support straight from your dashboard.
|
12 |
+
|
13 |
+
== Description ==
|
14 |
+
|
15 |
+
[youtube https://www.youtube.com/watch?v=5BHSqdU1Ssk]
|
16 |
+
|
17 |
+
**SIDEKICK is the fastest and easiest way to learn WordPress, Themes & Plugins!**
|
18 |
+
|
19 |
+
Sidekick provides interactive, real-time, narrated guides through the WordPress administration area. These guides (called Walkthroughs) come in three flavours:
|
20 |
+
|
21 |
+
- **Overviews**: Guided tours through admin screens and their features.
|
22 |
+
- **How-Tos**: Step-by-step instructions to help you complete a task.
|
23 |
+
- **Hotspots**: Useful reminders for on-screen elements, features and functions.
|
24 |
+
|
25 |
+
**Walkthroughs for other plugins and themes? You bet!**
|
26 |
+
|
27 |
+
If you're running a plugin or theme that’s supported by Sidekick, we’ll automatically serve up those Walkthroughs, as long as the Walkthroughs are active for your Sidekick account.
|
28 |
+
|
29 |
+
**A modern browser is all you need.**
|
30 |
+
|
31 |
+
Sidekick is built with JavaScript, so you don’t need to download any additional browser extensions or add-ons. Just install the SIDEKICK plugin for WordPress.
|
32 |
+
|
33 |
+
**SIDEKICK is perfect for you, if...**
|
34 |
+
|
35 |
+
*You're new to WordPress.* Instead of jumping back-and-forth between documentation, videos, and your own WordPress site, just follow the step-by-step SIDEKICK walkthroughs. Simple!
|
36 |
+
|
37 |
+
*You're helping someone learn WordPress.* Instead of repeatedly showing them the basics, let SIDEKICK do it for you - just install the plugin and tell them which walkthroughs to follow.
|
38 |
+
|
39 |
+
*You build WordPress sites for a living.* Reduce your training and support costs by installing Sidekick on client websites.
|
40 |
+
|
41 |
+
**Powered by the SIDEKICK platform.**
|
42 |
+
|
43 |
+
WordPress is just the tip of the iceberg! Sidekick can work with any web application, requiring no app or browser extension downloads for the user.
|
44 |
+
|
45 |
+
Walkthroughs are served directly from our servers, so you don't need to download or install additional files as new or updated walkthroughs are released.
|
46 |
+
|
47 |
+
With the user’s permission, Sidekick will collect anonymous data to track walkthrough and platform performance. This helps us improve the product and provide more useful support.
|
48 |
+
|
49 |
+
== Installation ==
|
50 |
+
|
51 |
+
**Plugin Search (Recommended)**
|
52 |
+
|
53 |
+
1. In /wp-admin/, go to Plugins > Add New.
|
54 |
+
2. Search for "Sidekick".
|
55 |
+
3. Look for "Sidekick” (should be the only result) .
|
56 |
+
4. Click Install Now.
|
57 |
+
5. After installation has completed, click Activate Plugin.
|
58 |
+
|
59 |
+
**Manual Upload**
|
60 |
+
|
61 |
+
1. Download the plugin .zip file from wordpress.org/plugins/sidekick/
|
62 |
+
2. In /wp-admin/, go to Plugins > Add New. Click Upload.
|
63 |
+
3. Locate the .zip file on your computer. Click Install Now.
|
64 |
+
4. After installation has completed, click Activate Plugin.
|
65 |
+
|
66 |
+
**Manual FTP**
|
67 |
+
|
68 |
+
1. Download the plugin .zip file from wordpress.org/plugins/sidekick/
|
69 |
+
2. Extract the plugin folder contained in the .zip file.
|
70 |
+
3. Upload the plugin folder, via FTP, to your /wp-content/plugins/ directory.
|
71 |
+
4. On your Plugins screen, under Sidekick, click Activate.
|
72 |
+
|
73 |
+
== Upgrade Notice ==
|
74 |
+
|
75 |
+
Upgrade Notice
|
76 |
+
|
77 |
+
== Activation ==
|
78 |
+
|
79 |
+
After installation you’ll have access to at least 5 Core WordPress Walkthroughs. Activating Sidekick will unlock 30+ free WordPress Core Walkthroughs.
|
80 |
+
|
81 |
+
**Why Upgrade?**
|
82 |
+
|
83 |
+
Purchase a Premium WordPress Core subscription to unlock access to
|
84 |
+
|
85 |
+
== Frequently Asked Questions ==
|
86 |
+
|
87 |
+
= What is Sidekick for WordPress? =
|
88 |
+
|
89 |
+
The Sidekick platform provides real-time, guided support and learning from within any html or PHP based web application or CMS. Support is provided through modules called “Walkthroughs” that guide users through everything from understanding simple aspects of an application to completing complicated tasks.
|
90 |
+
|
91 |
+
The Sidekick plugin for WordPress connects the Sidekick platform with any WordPress Dashboard allowing real-time guided walkthroughs of core and 3rd party WordPress features and functions.
|
92 |
+
|
93 |
+
If you’d like to learn more about Sidekick, go to [Sidekick.pro](http://Sidekick.pro/ "Sidekick")
|
94 |
+
|
95 |
+
= What is a Sidekick Walkthrough? =
|
96 |
+
|
97 |
+
A Sidekick for WordPress Walkthrough is a real-time, guided tutorial that walks you step by step through completing a task inside your WordPress Dashboard. It’s as if your site-builder or theme developer were standing right there with you, helping you get it done.
|
98 |
+
|
99 |
+
= What are Core and 3rd Party WordPress Walkthroughs? =
|
100 |
+
|
101 |
+
When we say “Core Walkthroughs” for WordPress, we are referring to any support and learning that has to do with features and functions provided by a fresh, default install of WordPress, downloaded from WordPress.org. Basically, if a walkthrough is helpng you complete a standard WordPress function like creating a post, it’s a Core Walkthrough and SIDEKICK created it.
|
102 |
+
|
103 |
+
Plugin and theme specific Walkthroughs are called Third Party Walkthroughs and are created and maintained by the plugin or theme creator, unless otherwise mentioned.
|
104 |
+
|
105 |
+
= How do I create Walkthroughs for my Plugin(s) or Theme(s)? =
|
106 |
+
|
107 |
+
At the moment Sidekick Composer, the tool we use to create Walkthroughs, is for in-house use only but we plan for that to change by the end of July 2014. If you’re interested in getting a head start, fill out the form [on this page](http://www.sidekick.pro/developer-program/) and we will send you details on how to join us a little earlier.
|
108 |
+
|
109 |
+
= What does Sidekick for WordPress cost? =
|
110 |
+
|
111 |
+
The Sidekick plugin for WordPress is and always will be free to download and use. Installing the plugin gives you instant and unlimited access to 30 Core WordPress How-To and Overview Walkthroughs.
|
112 |
+
|
113 |
+
If you would like access to the full library of [Core WordPress Walkthroughs (Over 150)](http://www.sidekick.pro/wordpress/modules/wordpress-core-module-premium/) including Hotspots, the cost is $10 a month per URL.
|
114 |
+
|
115 |
+
= Ok, the plugin is installed and activated. How do I use it? =
|
116 |
+
|
117 |
+
Click on the “Help Me” bottom left of your screen to open the Walkthrough menu.
|
118 |
+
You will be presented with the Walkthrough menu. Select your bucket then your walkthrough and away you go.
|
119 |
+
|
120 |
+
= Can I suggest a Walkthrough that I’d like to see or give you feedback on the Sidekick WordPress Plugin? =
|
121 |
+
|
122 |
+
Absolutely. In fact, we rely on users like you to tell us about things that need to be improved or that you’d like to see added to the plugin. Send your email to info@wpuniversity.com. We read and respond to every piece of feedback we get.
|
123 |
+
|
124 |
+
== Screenshots ==
|
125 |
+
|
126 |
+
1. Sidekick in action, shows of the typical screen you will see while a Sidekick walkthrough is playing.
|
127 |
+
2. This widget shows the library of walkthroughs currently available.
|
128 |
+
3. User interaction demonstrated while a user is prompted to perform an action.
|
129 |
+
4. Yet another action requirement by the user is previewed here.
|
130 |
+
|
131 |
+
== Changelog ==
|
132 |
+
|
133 |
+
= 2.1.0 =
|
134 |
+
* Multisite Walkthrough Management Support
|
135 |
+
* Multisite Auto Activations
|
136 |
+
* Multisite Mass Activations
|
137 |
+
* Genesis Framework Support
|
138 |
+
* Fixes issues with composer mode and auto play of walkthroughs
|
139 |
+
* Fixes issues with select all walkthroughs in settings screen
|
140 |
+
* Fixes issues with download of file would resume a walkthrough on click event
|
141 |
+
* Fixes issues playing back hotspots in certain cases
|
142 |
+
|
143 |
+
= 2.0.1 =
|
144 |
+
* Fix walkthrough autostart feature
|
145 |
+
* Update copy
|
146 |
+
|
147 |
+
= 2.0.0 =
|
148 |
+
* Major Composer Release
|
149 |
+
|
150 |
+
= 1.6.17 =
|
151 |
+
* Fixed PHP warning on plugin version
|
152 |
+
|
153 |
+
= 1.6.16 =
|
154 |
+
* Changed deactivation flow so user gets to keep their activation id
|
155 |
+
|
156 |
+
= 1.6.15 =
|
157 |
+
* Fixes hotspots not showing up in certain cases
|
158 |
+
* Fixes harcoded issue with db table prefix
|
159 |
+
* Style fixes on audio only mode
|
160 |
+
* Fixes issue with returning back to regular playback mode from audio only mode
|
161 |
+
* Fixes issue with audio player being muted in certain situations
|
162 |
+
|
163 |
+
= 1.6.5 =
|
164 |
+
* Fixed issue with Hotspot playback
|
165 |
+
|
166 |
+
= 1.6.4 =
|
167 |
+
* Fixed Composer Preview Bug
|
168 |
+
* Prefixed All Class Names
|
169 |
+
|
170 |
+
= 1.6.2 =
|
171 |
+
* Made the move target step optional
|
172 |
+
|
173 |
+
= 1.6.1 =
|
174 |
+
* Audio Fallback Mode added
|
175 |
+
* Sidekick won't show when no compatible walkthroughs are found
|
176 |
+
* Console messages turned off while not in debug mode
|
177 |
+
* Much improved cache invalidation
|
178 |
+
* Fixed a bug that on certain pages Sidekick wouldn't properly stop
|
179 |
+
* Fixed a bug with Sidekick blocking clicks after it's been stopped
|
180 |
+
|
181 |
+
= 1.5.5 =
|
182 |
+
* 4.0 Readiness
|
183 |
+
* Fixed conflict with caused by jquery-show
|
184 |
+
|
185 |
+
= 1.5.4 =
|
186 |
+
* Fixed incompatibility with iThemes Builder and For Loop JS Loops
|
187 |
+
* Added security nonces
|
188 |
+
* Added banner to let users know of Sidekick's existence
|
189 |
+
|
190 |
+
= 1.5.3 =
|
191 |
+
* Super Admin detection added
|
192 |
+
|
193 |
+
= 1.5.2 =
|
194 |
+
* Fixed Multisite issue with role detection on certain pages
|
195 |
+
|
196 |
+
= 1.5.1 =
|
197 |
+
* Added more parameters to tag Walkthroughs againts
|
198 |
+
|
199 |
+
= 1.5.0 =
|
200 |
+
* Paid vs Free Walkthrough Seperation
|
201 |
+
* Clean Up of Logs
|
202 |
+
|
203 |
+
= 1.4.2 =
|
204 |
+
* New Administration Screen
|
205 |
+
* Auto Start of a Walkthrough for each user
|
206 |
+
* Disable Specific Walkthroughs
|
207 |
+
|
208 |
+
= 1.4.1 =
|
209 |
+
* Fixed issue with hotspot button not showing
|
210 |
+
* Added ability to auto start a Walkthrough
|
211 |
+
* Added ability to disable specific Walkthroughs
|
212 |
+
|
213 |
+
= 1.4 =
|
214 |
+
* Switch over to new platform version
|
215 |
+
* Sidekick Activation Bug Fixed
|
216 |
+
* CSS Fixes
|
217 |
+
* Autostart on specific pages
|
218 |
+
* Added Wait_For Event
|
219 |
+
* Changed error messaging
|
220 |
+
* Fixed underscore template conflict with other backbone themes / apps
|
221 |
+
* Added LABjs file loading
|
222 |
+
* Added library load doublecheck
|
223 |
+
* Optimized Tracking
|
224 |
+
* Fixes to display rules boolean operations
|
225 |
+
* Added handlers for open a specific bucket
|
226 |
+
* Added handlers to auto open a specific bucket
|
227 |
+
* Fixed a bug when there were no comments in the blog
|
228 |
+
|
229 |
+
= 1.3.4 =
|
230 |
+
* Updated Modal UI
|
231 |
+
* Dropped www. from domain checking
|
232 |
+
* Walkthroughs now pause when user double clicks on another element
|
233 |
+
* Paid Walkthroughs now show in the free library
|
234 |
+
* Fixed a bug where capabilities have spaces
|
235 |
+
|
236 |
+
= 1.3.3 =
|
237 |
+
* Fixed an issue with custom prefixed databases
|
238 |
+
|
239 |
+
= 1.3.2 =
|
240 |
+
* HTTPs Protocol Adjustments
|
241 |
+
|
242 |
+
= 1.3.1 =
|
243 |
+
* Library loading bug fixed
|
244 |
+
|
245 |
+
= 1.2.2 =
|
246 |
+
* Activation Bug Fix
|
247 |
+
* UI Enchancements
|
248 |
+
|
249 |
+
= 1.2 =
|
250 |
+
* 3.9 Support Added
|
251 |
+
* Suppport for Module Marketplace
|
252 |
+
* HTTPs Support Added
|
253 |
+
* Fixes to "safety layer"
|
254 |
+
* Fix issue with hotspots showing while playing a walkthrough
|
255 |
+
|
256 |
+
= 1.10 =
|
257 |
+
* Brand New User Interface
|
258 |
+
* Hotspot Support Added
|
259 |
+
* 3.8 Support Added
|
260 |
+
* Deeper sub-category support
|
261 |
+
* Sidekick Platform Upgraded
|
262 |
+
* Known bug exists with HTTPs protocols
|
263 |
+
|
264 |
+
= 1.00 =
|
265 |
+
* Added support for buckets
|
266 |
+
|
267 |
+
= 0.78 =
|
268 |
+
* plugin Compatibility issues resolved
|
269 |
+
|
270 |
+
= 0.76 =
|
271 |
+
* Fixed sizing issues when more walkthroughs were added
|
272 |
+
|
273 |
+
= 0.74 =
|
274 |
+
* Fixed loop function bug
|
275 |
+
|
276 |
+
= 0.73 =
|
277 |
+
* Fixed Activation Bug
|
278 |
+
|
279 |
+
= 0.70 =
|
280 |
+
* Initial Beta Release
|
sidekick.php
ADDED
@@ -0,0 +1,446 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/*
|
4 |
+
Plugin Name: Sidekick
|
5 |
+
Plugin URL: http://wordpress.org/plugins/sidekick/
|
6 |
+
Description: Adds a real-time WordPress training walkthroughs right in your Dashboard
|
7 |
+
Requires at least: 3.8
|
8 |
+
Tested up to: 4.0
|
9 |
+
Version: 2.1.0
|
10 |
+
Author: Sidekick.pro
|
11 |
+
Author URI: http://www.sidekick.pro
|
12 |
+
*/
|
13 |
+
|
14 |
+
|
15 |
+
if ( ! defined( 'PLAYER_PATH' ) ) define( 'PLAYER_PATH', 'tag/latest' );
|
16 |
+
if ( ! defined( 'PLAYER_FILE' ) ) define( 'PLAYER_FILE', 'sidekick.min.js' );
|
17 |
+
if ( ! defined( 'COMPOSER_PATH' ) ) define( 'COMPOSER_PATH', 'tag/latest' );
|
18 |
+
if ( ! defined( 'SK_SL_PLUGIN_DIR' ) ) define( 'SK_SL_PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
|
19 |
+
if ( ! defined( 'SK_SL_PLUGIN_URL' ) ) define( 'SK_SL_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
|
20 |
+
if ( ! defined( 'SK_SL_PLUGIN_FILE' ) ) define( 'SK_SL_PLUGIN_FILE', __FILE__ );
|
21 |
+
if ( ! function_exists('mlog')) {
|
22 |
+
function mlog(){}
|
23 |
+
}
|
24 |
+
|
25 |
+
class Sidekick{
|
26 |
+
|
27 |
+
function __construct(){
|
28 |
+
if (!defined('SK_TRACKING_API')) define('SK_TRACKING_API','//tracking.sidekick.pro/');
|
29 |
+
if (!defined('SK_COMPOSER_API')) define('SK_COMPOSER_API','//apiv2.sidekick.pro');
|
30 |
+
if (!defined('SK_API')) define('SK_API','//apiv2.sidekick.pro/');
|
31 |
+
if (!defined('SK_LIBRARY')) define('SK_LIBRARY','//librarycache.sidekick.pro/');
|
32 |
+
if (!defined('SK_ASSETS')) define('SK_ASSETS','//assets.sidekick.pro/');
|
33 |
+
if (!defined('SK_AUDIO')) define('SK_AUDIO','//audio.sidekick.pro/');
|
34 |
+
}
|
35 |
+
|
36 |
+
function enqueue_required(){
|
37 |
+
wp_enqueue_script('jquery' , null );
|
38 |
+
wp_enqueue_script('underscore' , null, array('underscore'));
|
39 |
+
wp_enqueue_script('backbone' , null, array('jquery','underscore'));
|
40 |
+
wp_enqueue_script('jquery-ui-core' , null, array('jquery') );
|
41 |
+
wp_enqueue_script('jquery-ui-position' , null, array('jquery-ui-core') );
|
42 |
+
wp_enqueue_script('jquery-ui-draggable' , null, array('jquery-ui-core') );
|
43 |
+
wp_enqueue_script('jquery-ui-droppable' , null, array('jquery-ui-core') );
|
44 |
+
wp_enqueue_script('jquery-effects-scale' , null, array('jquery-ui-core') );
|
45 |
+
wp_enqueue_script('jquery-effects-highlight' , null, array('jquery-ui-core') );
|
46 |
+
wp_enqueue_script('sidekick-admin' ,plugins_url( '/js/sidekick_admin.js' , __FILE__ ),array( 'jquery' ));
|
47 |
+
}
|
48 |
+
|
49 |
+
function is_https() {
|
50 |
+
if ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443 || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) {
|
51 |
+
return true;
|
52 |
+
} else {
|
53 |
+
return false;
|
54 |
+
}
|
55 |
+
}
|
56 |
+
|
57 |
+
function enqueue(){
|
58 |
+
wp_enqueue_script('sidekick' ,"//player.sidekick.pro/" . PLAYER_PATH . "/" . PLAYER_FILE, array('backbone','jquery','underscore','jquery-effects-highlight'),null);
|
59 |
+
wp_enqueue_style('wp-pointer');
|
60 |
+
wp_enqueue_script('wp-pointer');
|
61 |
+
}
|
62 |
+
|
63 |
+
function setup_menu(){
|
64 |
+
add_submenu_page( 'options-general.php', 'Sidekick', 'Sidekick', 'activate_plugins','sidekick', array(&$this,'admin_page'));
|
65 |
+
}
|
66 |
+
|
67 |
+
function ajax_save(){
|
68 |
+
if (isset($_POST['sk_composer_button']) && $_POST['sk_composer_button'] == "true") {
|
69 |
+
update_option( 'sk_composer_button', true );
|
70 |
+
} elseif (isset($_POST['sk_composer_button']) && $_POST['sk_composer_button'] == "false") {
|
71 |
+
delete_option('sk_composer_button');
|
72 |
+
}
|
73 |
+
}
|
74 |
+
|
75 |
+
function admin_page(){
|
76 |
+
if ( empty( $_POST ) || check_admin_referer( 'update_sk_settings' ) ) {
|
77 |
+
|
78 |
+
if (isset($_POST['option_page']) && $_POST['option_page'] == 'sk_license') {
|
79 |
+
|
80 |
+
if (isset($_POST['activation_id']) && $_POST['activation_id'] && strpos($_POST['activation_id'], '-xxxx-xxxx') === false){
|
81 |
+
$result = $this->activate(true);
|
82 |
+
} else if (isset($_POST['activation_id']) && strpos($_POST['activation_id'], '-xxxx-xxxx') === false) {
|
83 |
+
delete_option('sk_activation_id');
|
84 |
+
}
|
85 |
+
|
86 |
+
if (isset($_POST['sk_composer_button'])) {
|
87 |
+
update_option( 'sk_composer_button', true );
|
88 |
+
} else {
|
89 |
+
delete_option('sk_composer_button');
|
90 |
+
}
|
91 |
+
|
92 |
+
if (isset($_POST['sk_track_data'])) {
|
93 |
+
update_option( 'sk_track_data', true );
|
94 |
+
} else {
|
95 |
+
delete_option('sk_track_data');
|
96 |
+
}
|
97 |
+
|
98 |
+
update_option( 'sk_activated', true );
|
99 |
+
die('<script>window.open("' . get_site_url() . '/wp-admin/options-general.php?page=sidekick","_self")</script>');
|
100 |
+
}
|
101 |
+
|
102 |
+
if (isset($_POST['sk_api'])) {
|
103 |
+
update_option( 'sk_api', $_POST['sk_api'] );
|
104 |
+
} else {
|
105 |
+
delete_option('sk_api');
|
106 |
+
}
|
107 |
+
}
|
108 |
+
|
109 |
+
$activation_id = (get_option( "sk_activation_id" ) ? get_option( "sk_activation_id" ) : '');
|
110 |
+
$sk_track_data = get_option( 'sk_track_data' );
|
111 |
+
$current_user = wp_get_current_user();
|
112 |
+
$status = 'Free';
|
113 |
+
$error = null;
|
114 |
+
|
115 |
+
if (isset($SK_PAID_LIBRARY_FILE) && $activation_id) {
|
116 |
+
$_POST['activation_id'] = $activation_id;
|
117 |
+
$check_activation = $this->activate(true);
|
118 |
+
$status = 'Checking...';
|
119 |
+
}
|
120 |
+
|
121 |
+
global $wp_version;
|
122 |
+
if (version_compare($wp_version, '3.9', '<=')) {
|
123 |
+
$error = "Sorry, Sidekick requires WordPress 3.9 or higher to function.";
|
124 |
+
}
|
125 |
+
|
126 |
+
if (!$activation_id) {
|
127 |
+
$warn = "You're using the <b>free</b> version of Sidekick, to upgrade or get your license key, visit your <a target='_blank' href='http://www.sidekick.pro/plans/#/login?utm_source=plugin&utm_medium=settings&utm_campaign=upgrade_nag'>account page</a> or <a target='_blank' href='http://www.sidekick.pro/plans/?utm_source=plugin&utm_medium=settings&utm_campaign=upgrade_nag'>sign-up</a> for a paid plan.";
|
128 |
+
}
|
129 |
+
|
130 |
+
if(preg_match('/(?i)msie [6-8]/',$_SERVER['HTTP_USER_AGENT'])){
|
131 |
+
$error = "Sorry, Sidekick requires Internet Explorer 9 or higher to function.";
|
132 |
+
}
|
133 |
+
|
134 |
+
?>
|
135 |
+
|
136 |
+
<?php if (get_option('sk_firstuse') == true): ?>
|
137 |
+
<?php delete_option('sk_firstuse') ?>
|
138 |
+
<script type="text/javascript">
|
139 |
+
jQuery(document).ready(function($) {
|
140 |
+
jQuery('#sidekick #logo').trigger('click');
|
141 |
+
});
|
142 |
+
</script>
|
143 |
+
<?php endif ?>
|
144 |
+
|
145 |
+
<div class="wrap">
|
146 |
+
<?php include('libs/admin_page.php') ?>
|
147 |
+
</div>
|
148 |
+
<?php
|
149 |
+
}
|
150 |
+
|
151 |
+
function set_disabled_wts(){
|
152 |
+
if (isset($_POST['disable_wts']) && $_POST['disable_wts']) {
|
153 |
+
update_option('sk_disabled_wts',json_encode($_POST['disable_wts']));
|
154 |
+
update_site_option('sk_disabled_wts',json_encode($_POST['disable_wts']));
|
155 |
+
} else {
|
156 |
+
delete_option('sk_disabled_wts');
|
157 |
+
delete_site_option('sk_disabled_wts');
|
158 |
+
}
|
159 |
+
}
|
160 |
+
|
161 |
+
function set_autostart_wt(){
|
162 |
+
if (isset($_POST['sk_autostart_walkthrough_id']) && intval($_POST['sk_autostart_walkthrough_id']) > 0){
|
163 |
+
update_option('sk_autostart_walkthrough_id',$_POST['sk_autostart_walkthrough_id']);
|
164 |
+
update_site_option('sk_autostart_walkthrough_id',$_POST['sk_autostart_walkthrough_id']);
|
165 |
+
} else {
|
166 |
+
delete_option('sk_autostart_walkthrough_id');
|
167 |
+
delete_site_option('sk_autostart_walkthrough_id');
|
168 |
+
}
|
169 |
+
}
|
170 |
+
|
171 |
+
function footer(){
|
172 |
+
global $current_user;
|
173 |
+
|
174 |
+
require_once('libs/sk_config_data.php');
|
175 |
+
|
176 |
+
$sk_config_data = new sk_config_data;
|
177 |
+
$current_user = wp_get_current_user();
|
178 |
+
$sk_just_activated = get_option( 'sk_just_activated' );
|
179 |
+
$sk_track_data = get_option( 'sk_track_data' );
|
180 |
+
$sk_composer_button = get_option( 'sk_composer_button' );
|
181 |
+
$activation_id = (get_option( "sk_activation_id" ) ? get_option( "sk_activation_id" ) : '');
|
182 |
+
$autostart_network_walkthrough_id = (get_site_option('sk_autostart_walkthrough_id') ? get_site_option('sk_autostart_walkthrough_id') : 'null' );
|
183 |
+
$autostart_walkthrough_id = (get_option('sk_autostart_walkthrough_id') ? get_option('sk_autostart_walkthrough_id') : $autostart_network_walkthrough_id );
|
184 |
+
$custom_class = (get_option( "sk_custom_class" ) ? get_option( "sk_custom_class" ) : '');
|
185 |
+
$theme = wp_get_theme();
|
186 |
+
$not_supported_ie = false;
|
187 |
+
$user_email = '';
|
188 |
+
if ($sk_track_data) {
|
189 |
+
$user_email = $current_user->user_email;
|
190 |
+
}
|
191 |
+
|
192 |
+
$user_role = $sk_config_data->get_user_role();
|
193 |
+
$site_url = $sk_config_data->get_domain();
|
194 |
+
$plugin_data = $sk_config_data->get_plugins();
|
195 |
+
$disabled_wts = $sk_config_data->get_disabled_wts();
|
196 |
+
$disabled_network_wts = $sk_config_data->get_disabled_network_wts();
|
197 |
+
$current_url = $sk_config_data->get_current_url();
|
198 |
+
$post_types = $sk_config_data->get_post_types();
|
199 |
+
$taxonomies = $sk_config_data->get_taxonomies();
|
200 |
+
$user_data = $sk_config_data->get_user_data();
|
201 |
+
$comments = $sk_config_data->get_comments();
|
202 |
+
$post_statuses = $sk_config_data->get_post_statuses();
|
203 |
+
$post_types_and_statuses = $sk_config_data->get_post_types_and_statuses();
|
204 |
+
$number_of_themes = $sk_config_data->get_themes();
|
205 |
+
$frameworks = $sk_config_data->get_framework();
|
206 |
+
|
207 |
+
|
208 |
+
|
209 |
+
|
210 |
+
$installed_plugins = $plugin_data['plugins'];
|
211 |
+
$plugin_count = $plugin_data['count'];
|
212 |
+
|
213 |
+
// $sk_composer_button = true; // BETA
|
214 |
+
|
215 |
+
delete_option( 'sk_just_activated' );
|
216 |
+
if(preg_match('/(?i)msie [6-8]/',$_SERVER['HTTP_USER_AGENT'])) $not_supported_ie = true;
|
217 |
+
|
218 |
+
?>
|
219 |
+
|
220 |
+
<?php if (!$not_supported_ie): ?>
|
221 |
+
|
222 |
+
<script type="text/javascript">
|
223 |
+
|
224 |
+
var sk_config = {
|
225 |
+
// Compatibility
|
226 |
+
|
227 |
+
compatibilities: {
|
228 |
+
<?php echo $post_types ?>
|
229 |
+
<?php echo $taxonomies ?>
|
230 |
+
<?php echo $user_data ?>
|
231 |
+
<?php echo $comments ?>
|
232 |
+
<?php echo $post_statuses ?>
|
233 |
+
<?php echo $frameworks ?>
|
234 |
+
<?php echo $post_types_and_statuses ?>
|
235 |
+
installed_plugins: <?php echo $installed_plugins ?>,
|
236 |
+
plugin_count: <?php echo $plugin_count ?>,
|
237 |
+
is_multisite: <?php echo (is_multisite()) ? "true" : "false" ?>,
|
238 |
+
number_of_themes: <?php echo $number_of_themes ?>,
|
239 |
+
installed_theme: '<?php echo $theme->Name ?>',
|
240 |
+
main_soft_version: '<?php echo get_bloginfo("version") ?>',
|
241 |
+
theme_version: '<?php echo $theme->Version ?>',
|
242 |
+
user_level: '<?php echo $user_role ?>',
|
243 |
+
main_soft_name: 'WordPress',
|
244 |
+
role: '<?php echo $user_role ?>'
|
245 |
+
},
|
246 |
+
|
247 |
+
disable_wts: <?php echo $disabled_wts ?>,
|
248 |
+
disable_network_wts: <?php echo $disabled_network_wts ?>,
|
249 |
+
main_soft_name: 'WordPress',
|
250 |
+
|
251 |
+
// User Settings
|
252 |
+
activation_id: '<?php echo $activation_id ?>',
|
253 |
+
auto_open_root_bucket_id: 79,
|
254 |
+
auto_open_product: 'default',
|
255 |
+
disable_wts_in_root_bucket_ids: [5,87],
|
256 |
+
autostart_walkthrough_id: <?php echo $autostart_walkthrough_id ?>,
|
257 |
+
sk_composer_button: <?php echo ($sk_composer_button ? "true" : "false") ?>,
|
258 |
+
track_data: '<?php echo $sk_track_data ?>',
|
259 |
+
user_email: '<?php echo $user_email ?>',
|
260 |
+
custom_class: '<?php echo $custom_class ?>',
|
261 |
+
|
262 |
+
// Toggles
|
263 |
+
path_not_found_continue: true,
|
264 |
+
show_powered_by: true,
|
265 |
+
show_powered_by_link: true,
|
266 |
+
sk_autostart_only_once: true,
|
267 |
+
use_native_controls: false,
|
268 |
+
composer_upgrade_off: false,
|
269 |
+
basics_upgrade: true,
|
270 |
+
|
271 |
+
// Platform Info
|
272 |
+
library_version: 2,
|
273 |
+
platform_id: 1,
|
274 |
+
|
275 |
+
// Generic Info
|
276 |
+
just_activated: <?php echo ($sk_just_activated) ? "true" : "false" ?>,
|
277 |
+
platform_version: null,
|
278 |
+
plugin_version: '2.1.0',
|
279 |
+
show_login: <?php echo ($sk_just_activated) ? "true" : "false" ?>,
|
280 |
+
|
281 |
+
// SIDEKICK URLS
|
282 |
+
assets: '<?php echo SK_ASSETS ?>',
|
283 |
+
api: '<?php echo SK_API ?>',
|
284 |
+
tracking_api: '<?php echo SK_TRACKING_API ?>',
|
285 |
+
sk_path: '<?php echo PLAYER_PATH ?>',
|
286 |
+
audio: '<?php echo SK_AUDIO ?>',
|
287 |
+
library: '<?php echo SK_LIBRARY ?>',
|
288 |
+
|
289 |
+
// URLS
|
290 |
+
site_url: '<?php echo $site_url ?>',
|
291 |
+
domain: '<?php echo str_replace("http://","",$_SERVER["SERVER_NAME"]) ?>',
|
292 |
+
domain_used: '//player.sidekick.pro/',
|
293 |
+
plugin_url: '<?php echo admin_url("admin.php?page=sidekick") ?>',
|
294 |
+
base_url: '<?php echo site_url() ?>',
|
295 |
+
current_url: '<?php echo $current_url ?>',
|
296 |
+
// fallback_notfication_mp3: '//assets.sidekick.pro/fallback.mp3'
|
297 |
+
}
|
298 |
+
|
299 |
+
var skc_config = {
|
300 |
+
js: '//composer.sidekick.pro/<?php echo COMPOSER_PATH ?>/sidekick-composer.js',
|
301 |
+
css: '//composer.sidekick.pro/<?php echo COMPOSER_PATH ?>/sidekick-composer.css',
|
302 |
+
apiUrl: '<?php echo SK_COMPOSER_API ?>',
|
303 |
+
baseSiteUrl: sk_config.base_url,
|
304 |
+
platformId: 1,
|
305 |
+
compatibilities: sk_config.compatibilities,
|
306 |
+
audioBaseUrl: '<?php echo SK_AUDIO ?>',
|
307 |
+
audioPlaceholderUrl: '//assets.sidekick.pro/walkthrough-audio-placeholder.mp3',
|
308 |
+
siteAjaxUrl: window.ajaxurl || '',
|
309 |
+
trackingUrl: '//tracking.sidekick.pro/'
|
310 |
+
}
|
311 |
+
|
312 |
+
</script>
|
313 |
+
<?php endif ?>
|
314 |
+
|
315 |
+
<?php
|
316 |
+
}
|
317 |
+
|
318 |
+
function track($data){
|
319 |
+
$response = wp_remote_post( SK_TRACKING_API . 'event', array(
|
320 |
+
'method' => 'POST',
|
321 |
+
'timeout' => 45,
|
322 |
+
'redirection' => 5,
|
323 |
+
'httpversion' => '1.0',
|
324 |
+
'blocking' => true,
|
325 |
+
'headers' => array(),
|
326 |
+
'body' => $data,
|
327 |
+
'cookies' => array()
|
328 |
+
)
|
329 |
+
);
|
330 |
+
}
|
331 |
+
|
332 |
+
function activate($return = false){
|
333 |
+
if (isset($_POST['activation_id'])) {
|
334 |
+
update_option('sk_activation_id',$_POST['activation_id']);
|
335 |
+
}
|
336 |
+
}
|
337 |
+
|
338 |
+
function activate_plugin(){
|
339 |
+
update_option( 'sk_firstuse', true );
|
340 |
+
update_option( 'sk_do_activation_redirect', true );
|
341 |
+
$data = array(
|
342 |
+
'source' => 'plugin',
|
343 |
+
'action' => 'track',
|
344 |
+
'type' => 'activate'
|
345 |
+
);
|
346 |
+
$this->track($data);
|
347 |
+
}
|
348 |
+
|
349 |
+
function curl_get_data($url){
|
350 |
+
$ch = curl_init();
|
351 |
+
$timeout = 5;
|
352 |
+
curl_setopt($ch, CURLOPT_URL, $url);
|
353 |
+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
354 |
+
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
|
355 |
+
$data = curl_exec($ch);
|
356 |
+
curl_close($ch);
|
357 |
+
return $data;
|
358 |
+
}
|
359 |
+
|
360 |
+
function redirect(){
|
361 |
+
if (get_option('sk_do_activation_redirect', false)) {
|
362 |
+
delete_option('sk_do_activation_redirect');
|
363 |
+
$siteurl = get_site_url();
|
364 |
+
wp_redirect($siteurl . "/wp-admin/options-general.php?page=sidekick");
|
365 |
+
die();
|
366 |
+
}
|
367 |
+
}
|
368 |
+
|
369 |
+
function admin_notice() {
|
370 |
+
global $current_user ;
|
371 |
+
|
372 |
+
if ( ! get_user_meta($current_user->ID, 'sk_ignore_notice') ) {
|
373 |
+
printf ('<div class="updated"><p>Need help with WordPress? Click HELP ME in the bottom left corner to get started! <a href="%1$s">Hide</a></p></div>','?sk_ignore_notice=1');
|
374 |
+
}
|
375 |
+
}
|
376 |
+
|
377 |
+
function admin_notice_ignore() {
|
378 |
+
global $current_user;
|
379 |
+
if ( isset($_GET['sk_ignore_notice'])) {
|
380 |
+
add_user_meta($current_user->ID, 'sk_ignore_notice', true);
|
381 |
+
}
|
382 |
+
}
|
383 |
+
|
384 |
+
function deactivate_plugin(){
|
385 |
+
$data = array(
|
386 |
+
'source' => 'plugin',
|
387 |
+
'action' => 'track',
|
388 |
+
'type' => 'deactivate',
|
389 |
+
'user' => get_option( "activation_id" )
|
390 |
+
);
|
391 |
+
$this->track($data);
|
392 |
+
?>
|
393 |
+
<script type="text/javascript">
|
394 |
+
window._gaq = window._gaq || [];
|
395 |
+
window._gaq.push(['sk._setAccount', 'UA-39283622-1']);
|
396 |
+
|
397 |
+
(function() {
|
398 |
+
var ga_wpu = document.createElement('script'); ga_sk.type = 'text/javascript'; ga_sk.async = true;
|
399 |
+
ga_sk.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
400 |
+
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga_wpu, s);
|
401 |
+
})();
|
402 |
+
window._gaq.push(['sk._trackEvent', 'Plugin - Deactivate', '', <?php echo plugin_version ?>, 0,true]);
|
403 |
+
</script>
|
404 |
+
<?php
|
405 |
+
delete_option( 'sk_activated' );
|
406 |
+
}
|
407 |
+
}
|
408 |
+
|
409 |
+
$sidekick = new Sidekick;
|
410 |
+
register_activation_hook( __FILE__, array($sidekick,'activate_plugin') );
|
411 |
+
register_deactivation_hook( __FILE__, array($sidekick,'deactivate_plugin') );
|
412 |
+
|
413 |
+
add_action('admin_menu', array($sidekick,'setup_menu'));
|
414 |
+
add_action('admin_init', array($sidekick,'redirect'));
|
415 |
+
add_action('wp_ajax_sk_activate', array($sidekick,'activate'));
|
416 |
+
add_action('wp_ajax_sk_save', array($sidekick,'ajax_save'));
|
417 |
+
add_action('admin_notices', array($sidekick,'admin_notice'));
|
418 |
+
add_action('admin_init', array($sidekick,'admin_notice_ignore'));
|
419 |
+
|
420 |
+
if (isset($_POST['sk_setting_disabled'])) {
|
421 |
+
$sidekick->set_disabled_wts();
|
422 |
+
}
|
423 |
+
if (isset($_POST['sk_setting_autostart'])) {
|
424 |
+
$sidekick->set_autostart_wt();
|
425 |
+
}
|
426 |
+
|
427 |
+
|
428 |
+
if (!defined('SK_PLUGIN_DEGBUG'))
|
429 |
+
require_once('sk_init.php');
|
430 |
+
|
431 |
+
if (!(isset($_GET['tab']) && $_GET['tab'] == 'plugin-information') && !defined('IFRAME_REQUEST')) {
|
432 |
+
add_action('admin_footer', array($sidekick,'footer'));
|
433 |
+
add_action('customize_controls_print_footer_scripts', array($sidekick,'footer'));
|
434 |
+
}
|
435 |
+
|
436 |
+
|
437 |
+
// Multisite Licensing
|
438 |
+
|
439 |
+
if (defined('MULTISITE')) {
|
440 |
+
require_once('libs/licensing.php');
|
441 |
+
$sidekickMassActivator = new sidekickMassActivator;
|
442 |
+
add_action('wpmu_new_blog',array($sidekickMassActivator,'activate'),10,6);
|
443 |
+
add_action('network_admin_menu', array($sidekickMassActivator,'setup_menu'));
|
444 |
+
add_action('wp_ajax_sk_activate_single', array($sidekickMassActivator,'activate_single'));
|
445 |
+
}
|
446 |
+
|