PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 260814
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v260814
260917 260913 260909 260829 260814 260805 110710 110731 110812 110815 110912 110913 110915 110926 110927 111002 111003 111011 111017 111029 111105 111206 111216 111220 120213 All 189 releases
s2member / src / includes / classes / installation.inc.php

installation.inc.php in s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions 260814, at src/includes/classes/installation.inc.php

254 lines 15.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 // @codingStandardsIgnoreFile
3 /**
4 * Installation routines for s2Member.
5 *
6 * Copyright: © 2009-2011
7 * {@link http://websharks-inc.com/ WebSharks, Inc.}
8 * (coded in the USA)
9 *
10 * Released under the terms of the GNU General Public License.
11 * You should have received a copy of the GNU General Public License,
12 * along with this software. In the main directory, see: /licensing/
13 * If not, see: {@link http://www.gnu.org/licenses/}.
14 *
15 * @package s2Member\Installation
16 * @since 3.5
17 */
18 if(!defined('WPINC')) // MUST have WordPress.
19 exit('Do not access this file directly.');
20
21 if(!class_exists('c_ws_plugin__s2member_installation'))
22 {
23 /**
24 * Installation routines for s2Member.
25 *
26 * @package s2Member\Installation
27 * @since 3.5
28 */
29 class c_ws_plugin__s2member_installation
30 {
31 /**
32 * Activation routines for s2Member.
33 *
34 * @package s2Member\Installation
35 * @since 3.5
36 *
37 * @param string $reactivation_reason Optional.
38 */
39 public static function activate($reactivation_reason = '')
40 {
41 global $wpdb;
42 /** @var $wpdb wpdb */
43 global $current_site, $current_blog; // Multisite.
44
45 do_action('ws_plugin__s2member_before_activation', get_defined_vars());
46
47 c_ws_plugin__s2member_roles_caps::config_roles(); // Config Roles/Caps.
48 update_option('ws_plugin__s2member_activated_levels', $GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']);
49
50 if(!is_dir($files_dir = $GLOBALS['WS_PLUGIN__']['s2member']['c']['files_dir']))
51 if(is_writable(dirname(c_ws_plugin__s2member_utils_dirs::strip_dir_app_data($files_dir))))
52 mkdir($files_dir, 0777, TRUE);
53
54 if(is_dir($files_dir) && is_writable($files_dir))
55 if(!is_file($htaccess = $files_dir.'/.htaccess') || !apply_filters('ws_plugin__s2member_preserve_files_dir_htaccess', !is_writable($files_dir.'/.htaccess'), get_defined_vars()))
56 file_put_contents($htaccess, trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($GLOBALS['WS_PLUGIN__']['s2member']['c']['files_dir_htaccess']))));
57
58 c_ws_plugin__s2member_files::write_no_gzip_into_root_htaccess(); // Handle the root `.htaccess` file as well now, for GZIP exclusions.
59
60 if(!is_dir($logs_dir = $GLOBALS['WS_PLUGIN__']['s2member']['c']['logs_dir']))
61 if(is_writable(dirname(c_ws_plugin__s2member_utils_dirs::strip_dir_app_data($logs_dir))))
62 mkdir($logs_dir, 0777, TRUE);
63
64 if(is_dir($logs_dir) && is_writable($logs_dir))
65 if(!is_file($htaccess = $logs_dir.'/.htaccess') || !apply_filters('ws_plugin__s2member_preserve_logs_dir_htaccess', !is_writable($logs_dir.'/.htaccess'), get_defined_vars()))
66 file_put_contents($htaccess, trim(c_ws_plugin__s2member_utilities::evl(file_get_contents($GLOBALS['WS_PLUGIN__']['s2member']['c']['logs_dir_htaccess']))));
67
68 (!is_array(get_option('ws_plugin__s2member_cache'))) ? update_option('ws_plugin__s2member_cache', array()) : NULL;
69 (!is_array(get_option('ws_plugin__s2member_notices'))) ? update_option('ws_plugin__s2member_notices', array()) : NULL;
70 (!is_array(get_option('ws_plugin__s2member_options'))) ? update_option('ws_plugin__s2member_options', array()) : NULL;
71 (!is_numeric(get_option('ws_plugin__s2member_configured'))) ? update_option('ws_plugin__s2member_configured', '0') : NULL;
72
73 //260809 Seed hashed Defuse key mappings on activation after installation or updates; migration is idempotent.
74 c_ws_plugin__s2member_utils_defuse::migrate_legacy_defuse_key_mappings();
75
76 if($GLOBALS['WS_PLUGIN__']['s2member']['c']['configured']) // If we are re-activating.
77 {
78 $v = get_option('ws_plugin__s2member_activated_version'); // Currently.
79
80 if(!$v || !version_compare($v, '3.2', '>=')) // Needs to be upgraded?
81 // Version 3.2 is where `meta_key` names were changed. They're prefixed now.
82 {
83 $like = "`meta_key` LIKE 's2member\\_%' AND `meta_key` NOT LIKE '%s2member\\_originating\\_blog%'";
84 $wpdb->query("UPDATE `".$wpdb->usermeta."` SET `meta_key` = CONCAT('".$wpdb->prefix."', `meta_key`) WHERE ".$like);
85 }
86 if(!$v || !version_compare($v, '3.2.5', '>=')) // Needs to be upgraded?
87 // Version 3.2.5 is where transient names were changed. They're prefixed now.
88 {
89 $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '\\_transient\\_%'");
90 }
91 if(!$v || !version_compare($v, '3.2.6', '>=')) // Needs to be upgraded?
92 // Version 3.2.6 fixed `s2member_ccaps_req` being stored empty and/or w/ one empty element in the array.
93 {
94 $wpdb->query("DELETE FROM `".$wpdb->postmeta."` WHERE `meta_key` = 's2member_ccaps_req' AND `meta_value` IN('','a:0:{}','a:1:{i:0;s:0:\"\";}')");
95 }
96 if((!$v || !version_compare($v, '110912', '>=')) && $GLOBALS['WS_PLUGIN__']['s2member']['o']['filter_wp_query'] === array('all'))
97 // s2Member v110912 changed the way the 'all' option for Alternative Views was handled.
98 {
99 $notice = '<strong>IMPORTANT:</strong> This version of s2Member changes the way your <code>Alternative View Protections</code> work. Please review your options under: <strong>s2Member → Restriction Options → Alternative View Protections</strong>.';
100 c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array('blog|network:plugins.php', 'blog|network:ws-plugin--s2member-start', 'blog|network:ws-plugin--s2member-mms-ops', 'blog|network:ws-plugin--s2member-gen-ops', 'blog|network:ws-plugin--s2member-res-ops'));
101 }
102 if($v && version_compare($v, '130316', '<=')) // This version disables logging by default.
103 {
104 c_ws_plugin__s2member_menu_pages::update_all_options(array('ws_plugin__s2member_gateway_debug_logs' => '0', 'ws_plugin__s2member_gateway_debug_logs_extensive' => '0'), TRUE, FALSE, FALSE, FALSE, FALSE);
105
106 $notice = '<strong>IMPORTANT:</strong> This version of s2Member disables s2Member\'s debug logging by default (for added security). Please see: <a href="'.esc_attr(admin_url('/admin.php?page=ws-plugin--s2member-logs')).'">s2Member → Log Files (Debug) → Configuration</a> for further details.';
107 c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array('blog|network:plugins.php', 'blog|network:ws-plugin--s2member-start', 'blog|network:ws-plugin--s2member-mms-ops', 'blog|network:ws-plugin--s2member-gen-ops', 'blog|network:ws-plugin--s2member-res-ops'));
108
109 $notice = '<strong>IMPORTANT / Regarding s2Member Security Badges:</strong> If debug logging is enabled, your site will no longer qualify for an s2Member Security Badge until you disable logging (and you must also download, and then delete any existing log files from the past). Please see KB Article: <a href="http://www.s2member.com/kb/security-badges/" target="_blank" rel="external">s2Member Security Badges</a> for further details. If you have existing s2Member log files, you will need to delete those files from the server before your s2Member Security Badge can be re-enabled. s2Member stores log files here: <code>'.esc_html(c_ws_plugin__s2member_utils_dirs::doc_root_path($GLOBALS['WS_PLUGIN__']['s2member']['c']['logs_dir'])).'</code>. See also: <a href="'.esc_attr(admin_url('/admin.php?page=ws-plugin--s2member-logs')).'">s2Member → Log Files (Debug) → Configuration</a> for further details.';
110 c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array('blog|network:plugins.php', 'blog|network:ws-plugin--s2member-start', 'blog|network:ws-plugin--s2member-mms-ops', 'blog|network:ws-plugin--s2member-gen-ops', 'blog|network:ws-plugin--s2member-res-ops'));
111 }
112 if($v && version_compare($v, '140128', '<=')) // This version introduces support for partial refunds.
113 {
114 if($GLOBALS['WS_PLUGIN__']['s2member']['o']['triggers_immediate_eot'] === 'refunds,reversals') // `refunds,reversals` => `refunds,partial_refunds,reversals`
115 c_ws_plugin__s2member_menu_pages::update_all_options(array('ws_plugin__s2member_triggers_immediate_eot' => 'refunds,partial_refunds,reversals'), TRUE, FALSE, FALSE, FALSE, FALSE);
116 }
117 $notice = '<strong>s2Member</strong> has been <strong>reactivated</strong>, with '.(($reactivation_reason === 'levels') ? '<code>'.esc_html($GLOBALS['WS_PLUGIN__']['s2member']['c']['levels']).'</code> Membership Levels' : 'the latest version').'.<br />';
118 $notice .= 'You now have version '.esc_html(WS_PLUGIN__S2MEMBER_VERSION).'. Your existing configuration remains.';
119
120 if(!is_multisite() || !c_ws_plugin__s2member_utils_conds::is_multisite_farm() || is_main_site()) // No Changelog on a Multisite Blog Farm.
121 $notice .= '<br />Have fun, <a href="'.esc_attr(c_ws_plugin__s2member_readmes::parse_readme_value('Changelog URI')).'" target="_blank">read the Changelog</a>, and make some money! :-)';
122
123 c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array('blog|network:plugins.php', 'blog|network:ws-plugin--s2member-start', 'blog|network:ws-plugin--s2member-mms-ops', 'blog|network:ws-plugin--s2member-gen-ops', 'blog|network:ws-plugin--s2member-res-ops'));
124 }
125 else // Otherwise (initial activation); we'll help the Site Owner out by giving them a link to the Getting Started section.
126 {
127 $notice = '<strong>Note:</strong> s2Member adds some new data columns to your list of Users/Members. If your list gets overcrowded, please use the <strong>Screen Options</strong> tab <em>(upper right-hand corner)</em>. With WordPress Screen Options, you can add/remove specific data columns; thereby making the most important data easier to read. For example, if you create Custom Registration/Profile Fields with s2Member, those Custom Fields will result in new data columns; which can cause your list of Users/Members to become nearly unreadable. So just use the Screen Options tab to clean things up.';
128 c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, 'blog:users.php', FALSE, FALSE, TRUE);
129
130 $notice = '<strong>s2Member v'.esc_html(WS_PLUGIN__S2MEMBER_VERSION).' has been activated. Nice work!</strong><br />';
131 $notice .= 'We suggest a review of the "Getting Started" page to familiarize yourself with s2Member terminology and basic configuration.<br />&#8627;&nbsp; Would you like to review now? &nbsp;&nbsp;&nbsp; <a href="'.esc_attr(admin_url('/admin.php?page=ws-plugin--s2member-start')).'"><strong>Yes (explain)</strong></a>';
132
133 c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array('blog|network:plugins.php', 'blog|network:ws-plugin--s2member-start', 'blog|network:ws-plugin--s2member-mms-ops', 'blog|network:ws-plugin--s2member-gen-ops', 'blog|network:ws-plugin--s2member-res-ops'));
134 }
135 if(is_multisite() && is_main_site()) // Network activation routines.
136 {
137 $wpdb->query("INSERT INTO `".$wpdb->usermeta."` (`user_id`, `meta_key`, `meta_value`) SELECT `ID`, 's2member_originating_blog', '".esc_sql($current_site->blog_id)."' FROM `".$wpdb->users."` WHERE `ID` NOT IN (SELECT `user_id` FROM `".$wpdb->usermeta."` WHERE `meta_key` = 's2member_originating_blog')");
138
139 $notice = '<strong>Multisite Network</strong> updated automatically by <strong>s2Member</strong> v'.esc_html(WS_PLUGIN__S2MEMBER_VERSION).'.<br />';
140 $notice .= 'You\'ll want to configure s2Member\'s Multisite options now.<br />';
141 $notice .= 'In the Dashboard for your Main Site, see:<br />';
142 $notice .= '<strong>s2Member → Multisite (Config)</strong>.';
143
144 c_ws_plugin__s2member_admin_notices::enqueue_admin_notice($notice, array('blog|network:plugins.php', 'blog|network:ws-plugin--s2member-start', 'blog|network:ws-plugin--s2member-mms-ops', 'blog|network:ws-plugin--s2member-gen-ops', 'blog|network:ws-plugin--s2member-res-ops'));
145
146 update_site_option('ws_plugin__s2member_options', (array)get_option('ws_plugin__s2member_options'));
147
148 update_option('ws_plugin__s2member_activated_mms_version', WS_PLUGIN__S2MEMBER_VERSION);
149 }
150 update_option('ws_plugin__s2member_activated_version', WS_PLUGIN__S2MEMBER_VERSION);
151
152 do_action('ws_plugin__s2member_after_activation', get_defined_vars());
153 }
154
155 /**
156 * Deactivation routines for s2Member.
157 *
158 * @package s2Member\Installation
159 * @since 3.5
160 */
161 public static function deactivate()
162 {
163 global $wpdb;
164 /** @var $wpdb wpdb */
165 global $current_site, $current_blog; // Multisite.
166
167 do_action('ws_plugin__s2member_before_deactivation', get_defined_vars());
168 do_action('ws_plugin__s2member_after_deactivation', get_defined_vars());
169 }
170
171 /**
172 * Uninstall routines for s2Member.
173 *
174 * @package s2Member\Installation
175 * @since 3.5
176 */
177 public static function uninstall()
178 {
179 global $wpdb;
180 /** @var $wpdb wpdb */
181 global $current_site, $current_blog; // Multisite.
182
183 do_action('ws_plugin__s2member_before_uninstall', get_defined_vars());
184
185 if($GLOBALS['WS_PLUGIN__']['s2member']['o']['run_uninstall_routines'])
186 {
187 c_ws_plugin__s2member_roles_caps::unlink_roles();
188
189 c_ws_plugin__s2member_files::remove_no_gzip_from_root_htaccess();
190
191 if(is_dir($files_dir = $GLOBALS['WS_PLUGIN__']['s2member']['c']['files_dir']))
192 {
193 if(file_exists($htaccess = $files_dir.'/.htaccess'))
194 if(is_writable($htaccess))
195 unlink($htaccess);
196
197 @rmdir($files_dir).@rmdir(c_ws_plugin__s2member_utils_dirs::strip_dir_app_data($files_dir));
198 }
199 if(is_dir($logs_dir = $GLOBALS['WS_PLUGIN__']['s2member']['c']['logs_dir']))
200 {
201 foreach(scandir($logs_dir) as $log_file)
202 if(is_file($log_file = $logs_dir.'/'.$log_file))
203 if(is_writable($log_file))
204 unlink($log_file);
205
206 @rmdir($logs_dir).@rmdir(c_ws_plugin__s2member_utils_dirs::strip_dir_app_data($logs_dir));
207 }
208 delete_option('ws_plugin__s2member_cache');
209 delete_option('ws_plugin__s2member_notices');
210 delete_option('ws_plugin__s2member_options');
211 delete_option('ws_plugin__s2member_configured');
212 delete_option('ws_plugin__s2member_activated_levels');
213 delete_option('ws_plugin__s2member_activated_version');
214 delete_option('ws_plugin__s2member_activated_mms_version');
215
216 if(is_multisite() && is_main_site() /* Site options? */)
217 delete_site_option('ws_plugin__s2member_options');
218
219 $wpdb->query("DELETE FROM `".$wpdb->postmeta."` WHERE `meta_key` LIKE '".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2m_'))."%'");
220 $wpdb->query("DELETE FROM `".$wpdb->postmeta."` WHERE `meta_key` LIKE '%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('_s2m_'))."%'");
221 $wpdb->query("DELETE FROM `".$wpdb->postmeta."` WHERE `meta_key` LIKE '%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2member_'))."%'");
222
223 $wpdb->query("DELETE FROM `".$wpdb->usermeta."` WHERE `meta_key` LIKE '".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2m_'))."%'");
224 $wpdb->query("DELETE FROM `".$wpdb->usermeta."` WHERE `meta_key` LIKE '%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('_s2m_'))."%'");
225 $wpdb->query("DELETE FROM `".$wpdb->usermeta."` WHERE `meta_key` LIKE '%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2member_'))."%'");
226
227 $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2m_'))."%'");
228 $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('_s2m_'))."%'");
229 $wpdb->query("DELETE FROM `".$wpdb->options."` WHERE `option_name` LIKE '%".esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2member_'))."%'");
230
231 do_action('ws_plugin__s2member_during_uninstall', get_defined_vars());
232 }
233 do_action('ws_plugin__s2member_after_uninstall', get_defined_vars());
234 }
235
236 /**
237 * Disallow automatic updates of s2Member w/ Pro is installed.
238 *
239 * @package s2Member\Installation
240 * @since 150717
241 *
242 * @attaches-to `auto_update_plugin` filter.
243 */
244 public static function auto_update_filter($update = NULL, $item = NULL)
245 {
246 if(is_object($item) && !empty($item->slug) && $item->slug === 's2member')
247 if(c_ws_plugin__s2member_utils_conds::pro_is_installed())
248 $update = FALSE; // Disallow.
249
250 return $update; // Filter through.
251 }
252 }
253 }
254