/wp-content/plugins/membership/membershipincludes/classes/membershipadmin.php

https://github.com/bfay/maniacal-kitten · PHP · 7679 lines · 6042 code · 1458 blank · 179 comment · 829 complexity · abcfed5a5d8add241782e0275b9eaee5 MD5 · raw file

  1. <?php
  2. if(!class_exists('membershipadmin')) {
  3. class membershipadmin {
  4. var $build = 14;
  5. var $db;
  6. //
  7. var $showposts = 25;
  8. var $showpages = 100;
  9. var $tables = array('membership_levels', 'membership_rules', 'subscriptions', 'subscriptions_levels', 'membership_relationships', 'membermeta', 'communications', 'urlgroups', 'ping_history', 'pings', 'coupons');
  10. var $membership_levels;
  11. var $membership_rules;
  12. var $membership_relationships;
  13. var $subscriptions;
  14. var $subscriptions_levels;
  15. var $membermeta;
  16. var $communications;
  17. var $urlgroups;
  18. var $ping_history;
  19. var $pings;
  20. var $coupons;
  21. // Class variable to hold a link to the tooltips class
  22. var $_tips;
  23. // The Wizard
  24. var $potter;
  25. // The tutorial
  26. var $tutorial;
  27. // Coupons
  28. var $_coupons;
  29. // For the coupons datepicker
  30. var $language;
  31. function __construct() {
  32. global $wpdb;
  33. $this->db =& $wpdb;
  34. foreach($this->tables as $table) {
  35. $this->$table = membership_db_prefix($this->db, $table);
  36. }
  37. // Instantiate the tooltips class and set the icon
  38. $this->_tips = new WpmuDev_HelpTooltips();
  39. $this->_tips->set_icon_url(membership_url('membershipincludes/images/information.png'));
  40. // Initiate the wizard class
  41. $this->potter = new M_Wizard();
  42. // Add administration actions
  43. add_action('init', array(&$this, 'initialise_plugin'), 1);
  44. // Add in admin area membership levels
  45. add_action('init', array(&$this, 'initialise_membership_protection'), 999);
  46. if( (function_exists('is_plugin_active_for_network') && is_plugin_active_for_network('membership/membershippremium.php')) && (defined('MEMBERSHIP_GLOBAL_TABLES') && MEMBERSHIP_GLOBAL_TABLES === true)) {
  47. add_action('network_admin_menu', array(&$this, 'add_admin_menu'));
  48. } else {
  49. add_action('admin_menu', array(&$this, 'add_admin_menu'));
  50. }
  51. add_action( 'plugins_loaded', array(&$this, 'load_textdomain'));
  52. // Header actions
  53. add_action('load-toplevel_page_membership', array(&$this, 'add_admin_header_membership'));
  54. add_action('load-membership_page_membershipmembers', array(&$this, 'add_admin_header_members'));
  55. add_action('load-membership_page_membershiplevels', array(&$this, 'add_admin_header_membershiplevels'));
  56. add_action('load-membership_page_membershipsubs', array(&$this, 'add_admin_header_membershipsubs'));
  57. add_action('load-membership_page_membershipcoupons', array(&$this, 'add_admin_header_membershipcoupons'));
  58. add_action('load-membership_page_membershipgateways', array(&$this, 'add_admin_header_membershipgateways'));
  59. add_action('load-membership_page_membershipoptions', array(&$this, 'add_admin_header_membershipoptions'));
  60. add_action('load-membership_page_membershipcommunication', array(&$this, 'add_admin_header_membershipcommunication'));
  61. add_action('load-membership_page_membershipurlgroups', array(&$this, 'add_admin_header_membershipurlgroups'));
  62. add_action('load-membership_page_membershippings', array(&$this, 'add_admin_header_membershippings'));
  63. add_action('load-users_page_membershipuser', array(&$this, 'add_admin_header_membershipuser'));
  64. add_filter('membership_level_sections', array(&$this, 'default_membership_sections'));
  65. // Media management additional fields
  66. add_filter('attachment_fields_to_edit', array(&$this, 'add_media_protection_settings'), 99, 2);
  67. add_filter('attachment_fields_to_save', array(&$this, 'save_media_protection_settings'), 99, 2);
  68. // rewrites
  69. add_action('generate_rewrite_rules', array(&$this, 'add_rewrites'));
  70. add_filter('query_vars', array(&$this, 'add_queryvars') );
  71. // profile field for feeds
  72. add_action('show_user_profile', array(&$this, 'add_profile_feed_key') );
  73. // Pings
  74. add_action('membership_subscription_form_after_levels', array(&$this, 'show_subscription_ping_information'));
  75. add_action('membership_subscription_add', array(&$this, 'update_subscription_ping_information'));
  76. add_action('membership_subscription_update', array(&$this, 'update_subscription_ping_information'));
  77. add_action('membership_level_form_after_rules', array(&$this, 'show_level_ping_information'));
  78. add_action('membership_level_add', array(&$this, 'update_level_ping_information'));
  79. add_action('membership_level_update', array(&$this, 'update_level_ping_information'));
  80. // Ajax calls have to go here because admin-ajax.php is an admin call even though we're calling it from the front end.
  81. add_action( 'wp_ajax_nopriv_buynow', array(&$this, 'popover_signup_form') );
  82. //login and register are no-priv only because, well they aren't logged in or registered
  83. add_action( 'wp_ajax_nopriv_register_user', array(&$this, 'popover_register_process') );
  84. add_action( 'wp_ajax_nopriv_login_user', array(&$this, 'popover_login_process') );
  85. // if logged in:
  86. add_action( 'wp_ajax_buynow', array(&$this, 'popover_sendpayment_form') );
  87. add_action( 'wp_ajax_extra_form', array(&$this, 'popover_extraform_process') );
  88. add_action( 'wp_ajax_register_user', array(&$this, 'popover_register_process') );
  89. add_action( 'wp_ajax_login_user', array(&$this, 'popover_login_process') );
  90. // Helper actions
  91. add_action( 'membership_activate_addon', array(&$this, 'activate_addon'), 10, 1 );
  92. add_action( 'membership_deactivate_addon', array(&$this, 'deactivate_addon'), 10, 1 );
  93. // Level shortcodes filters
  94. add_filter( 'membership_level_shortcodes', array(&$this, 'build_level_shortcode_list' ) );
  95. add_action( 'plugins_loaded', array(&$this, 'load_tutorial'), 11); //init tutorial after translation loaded
  96. // Add in the coupon class
  97. $this->_coupons = new M_Coupon();
  98. }
  99. function membershipadmin() {
  100. $this->__construct();
  101. }
  102. function load_textdomain() {
  103. $locale = apply_filters( 'membership_locale', get_locale() );
  104. $mofile = membership_dir( "membershipincludes/languages/membership-$locale.mo" );
  105. if ( file_exists( $mofile ) ) {
  106. load_textdomain( 'membership', $mofile );
  107. }
  108. //setup language code for jquery datepicker translation
  109. $temp_locales = explode('_', get_locale());
  110. $this->language = ($temp_locales[0]) ? $temp_locales[0] : 'en';
  111. }
  112. function load_tutorial() {
  113. // Add in pointer tutorial
  114. $this->tutorial = new M_Tutorial();
  115. $this->tutorial->serve();
  116. }
  117. function initialise_plugin() {
  118. global $user, $M_options;
  119. $installed = get_option('M_Installed', false);
  120. if(empty($user) || !method_exists($user, 'has_cap')) {
  121. $user = wp_get_current_user();
  122. }
  123. if($installed === false || $installed != $this->build) {
  124. include_once(membership_dir('membershipincludes/classes/upgrade.php') );
  125. M_Upgrade($installed);
  126. update_option('M_Installed', $this->build);
  127. // Add in our new capability
  128. if(!$user->has_cap('membershipadmin') && defined('MEMBERSHIP_SETACTIVATORAS_ADMIN') && MEMBERSHIP_SETACTIVATORAS_ADMIN == 'yes') {
  129. $user->add_cap('membershipadmin');
  130. }
  131. $this->create_defaults();
  132. }
  133. // Add in our new capability
  134. if($user->user_login == MEMBERSHIP_MASTER_ADMIN && !$user->has_cap('membershipadmin')) {
  135. $user->add_cap('membershipadmin');
  136. }
  137. if($user->has_cap('membershipadmin')) {
  138. // profile field for capabilities
  139. //add_action( 'edit_user_profile', array(&$this, 'add_membershipadmin_capability') );
  140. //add_action( 'edit_user_profile_update', array(&$this, 'update_membershipadmin_capability'));
  141. // If the user is a membershipadmin user then we can add in notices
  142. add_action('all_admin_notices', array(&$this, 'show_membership_status_notice'));
  143. }
  144. if(defined('MEMBERSHIP_GLOBAL_TABLES') && MEMBERSHIP_GLOBAL_TABLES === true) {
  145. if(function_exists('get_blog_option')) {
  146. $M_options = get_blog_option(MEMBERSHIP_GLOBAL_MAINSITE, 'membership_options', array());
  147. } else {
  148. $M_options = get_option('membership_options', array());
  149. }
  150. } else {
  151. $M_options = get_option('membership_options', array());
  152. }
  153. // Short codes
  154. if(!empty($M_options['membershipshortcodes'])) {
  155. foreach($M_options['membershipshortcodes'] as $key => $value) {
  156. if(!empty($value)) {
  157. add_shortcode(stripslashes(trim($value)), array(&$this, 'do_fake_shortcode') );
  158. }
  159. }
  160. }
  161. // Admin only Shortcodes setup
  162. if(!empty($M_options['membershipadminshortcodes'])) {
  163. foreach($M_options['membershipadminshortcodes'] as $key => $value) {
  164. if(!empty($value)) {
  165. add_shortcode(stripslashes(trim($value)), array(&$this, 'do_fake_shortcode') );
  166. }
  167. }
  168. }
  169. do_action('membership_register_shortcodes');
  170. add_action( 'wp_ajax_m_set_coupon', array(&$this, 'set_membership_coupon_cookie'));
  171. add_action( 'wp_ajax_nopriv_m_set_coupon', array(&$this, 'set_membership_coupon_cookie'));
  172. }
  173. function show_membership_status_notice() {
  174. global $user, $M_options;
  175. // Membership active check
  176. $membershipactive = M_get_membership_active();
  177. if($membershipactive == 'no') {
  178. echo '<div class="error fade"><p>' . sprintf(__("The Membership plugin is not enabled. To ensure your content is protected you should <a href='%s'>enable it</a>", 'membership'), wp_nonce_url("?page=membership&amp;action=activate", 'toggle-plugin')) . '</p></div>';
  179. }
  180. // Membership admin check
  181. if(empty($user) || !method_exists($user, 'has_cap')) {
  182. $user = wp_get_current_user();
  183. }
  184. if($user->has_cap('membershipadmin')) {
  185. // Show a notice to say that they are logged in as the membership admin user and protection isn't enabled on the front end
  186. echo '<div class="update-nag">' . __("You are logged in as a <strong>Membership Admin</strong> user, you will therefore see all protected content on this site.", 'membership') . '</div>';
  187. }
  188. }
  189. function add_admin_menu() {
  190. global $menu, $admin_page_hooks;
  191. if(current_user_can('membershipadmin')) {
  192. // Add the menu page
  193. add_menu_page(__('Membership','membership'), __('Membership','membership'), 'membershipadmin', 'membership', array(&$this,'handle_membership_panel'), membership_url('membershipincludes/images/members.png'));
  194. //echo $hook;
  195. // Fix WP translation hook issue
  196. if(isset($admin_page_hooks['membership'])) {
  197. $admin_page_hooks['membership'] = 'membership';
  198. }
  199. do_action('membership_add_menu_items_top');
  200. // Add the sub menu
  201. add_submenu_page('membership', __('Members','membership'), __('All Members','membership'), 'membershipadmin', "membershipmembers", array(&$this,'handle_members_panel'));
  202. do_action('membership_add_menu_items_after_members');
  203. add_submenu_page('membership', __('Membership Levels','membership'), __('Access Levels','membership'), 'membershipadmin', "membershiplevels", array(&$this,'handle_levels_panel'));
  204. do_action('membership_add_menu_items_after_levels');
  205. add_submenu_page('membership', __('Membership Subscriptions','membership'), __('Subscription Plans','membership'), 'membershipadmin', "membershipsubs", array(&$this,'handle_subs_panel'));
  206. do_action('membership_add_menu_items_after_subscriptions');
  207. add_submenu_page('membership', __('Membership Coupons','membership'), __('Coupons','membership'), 'membershipadmin', "membershipcoupons", array(&$this,'handle_coupons_panel'));
  208. do_action('membership_add_menu_items_after_coupons');
  209. //add_submenu_page('membership', __('Membership Purchases','membership'), __('Extra Purchases','membership'), 'membershipadmin', "membershippurchases", array(&$this,'handle_purchases_panel'));
  210. do_action('membership_add_menu_items_after_purchases');
  211. add_submenu_page('membership', __('Membership Communication','membership'), __('Communications','membership'), 'membershipadmin', "membershipcommunication", array(&$this,'handle_communication_panel'));
  212. do_action('membership_add_menu_items_after_communications');
  213. add_submenu_page('membership', __('Membership URL Groups','membership'), __('URL Groups','membership'), 'membershipadmin', "membershipurlgroups", array(&$this,'handle_urlgroups_panel'));
  214. do_action('membership_add_menu_items_after_urlgroups');
  215. add_submenu_page('membership', __('Membership Pings','membership'), __('Remote Pings','membership'), 'membershipadmin', "membershippings", array(&$this,'handle_pings_panel'));
  216. do_action('membership_add_menu_items_after_pings');
  217. add_submenu_page('membership', __('Membership Gateways','membership'), __('Payment Gateways','membership'), 'membershipadmin', "membershipgateways", array(&$this,'handle_gateways_panel'));
  218. do_action('membership_add_menu_items_after_gateways');
  219. add_submenu_page('membership', __('Membership Options','membership'), __('Options','membership'), 'membershipadmin', "membershipoptions", array(&$this,'handle_options_panel'));
  220. do_action('membership_add_menu_items_after_options');
  221. do_action('membership_add_menu_items_bottom');
  222. }
  223. }
  224. // Admin area protection
  225. function initialise_membership_protection() {
  226. global $user, $member, $M_options, $M_Rules, $wp_query, $wp_rewrite, $M_active;
  227. // Set up some common defaults
  228. static $initialised = false;
  229. if($initialised) {
  230. // ensure that this is only called once, so return if we've been here already.
  231. return;
  232. }
  233. $M_options = get_option('membership_options', array());
  234. // Check if the membership plugin is active
  235. $M_active = get_option('membership_active', 'no');
  236. if(empty($user) || !method_exists($user, 'has_cap')) {
  237. $user = wp_get_current_user();
  238. }
  239. if(!method_exists($user, 'has_cap') || $user->has_cap('membershipadmin') || $M_active == 'no') {
  240. // Admins can see everything
  241. return;
  242. }
  243. // Users
  244. $member = new M_Membership($user->ID);
  245. if($user->ID > 0 && $member->has_levels()) {
  246. // Load the levels for this member - and associated rules
  247. $member->load_admin_levels( true );
  248. } else {
  249. // need to grab the stranger settings
  250. if(isset($M_options['strangerlevel']) && $M_options['strangerlevel'] != 0) {
  251. $member->assign_admin_level($M_options['strangerlevel'], true );
  252. }
  253. }
  254. do_action('membership-admin-add-shortcodes');
  255. // Set the initialisation status
  256. $initialised = true;
  257. }
  258. // Add admin headers
  259. function add_admin_header_core() {
  260. // Add in help pages
  261. $screen = get_current_screen();
  262. $help = new M_Help( $screen );
  263. $help->attach();
  264. // Add in default style sheet with common styling elements
  265. wp_enqueue_style('defaultcss', membership_url('membershipincludes/css/default.css'), array(), $this->build);
  266. }
  267. function add_admin_header_membership() {
  268. // The dashboard - top level menu
  269. global $wp_version;
  270. // Load the core first
  271. $this->add_admin_header_core();
  272. wp_enqueue_script('dashjs', membership_url('membershipincludes/js/dashboard.js'), array( 'jquery' ), $this->build);
  273. if(version_compare( preg_replace('/-.*$/', '', $wp_version), "3.3", '<')) {
  274. wp_enqueue_style('dashcss', membership_url('membershipincludes/css/dashboard.css'), array('widgets'), $this->build);
  275. } else {
  276. wp_enqueue_style('dashcss', membership_url('membershipincludes/css/dashboard.css'), array(), $this->build);
  277. }
  278. // Add localisation for the wizard
  279. wp_localize_script('dashjs', 'membershipwizard', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ),
  280. 'membershiploading' => __('Loading...', 'membership'),
  281. 'membershipnextstep' => __('Next Step &raquo;','membership'),
  282. 'membershipgonewrong' => __('Something has gone wrong with the Wizard, please try clicking the button again.', 'membership'),
  283. 'membershiplevel' => __('Level', 'membership'),
  284. ));
  285. $this->handle_membership_dashboard_updates();
  286. }
  287. function add_admin_header_membershiplevels() {
  288. global $wp_version;
  289. $this->add_admin_header_core();
  290. wp_enqueue_script('levelsjs', membership_url('membershipincludes/js/levels.js'), array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable' ), $this->build);
  291. if(version_compare( preg_replace('/-.*$/', '', $wp_version), "3.3", '<')) {
  292. wp_enqueue_style('levelscss', membership_url('membershipincludes/css/levels.css'), array('widgets'), $this->build);
  293. } else {
  294. wp_enqueue_style('levelscss', membership_url('membershipincludes/css/levels.css'), array(), $this->build);
  295. }
  296. wp_localize_script( 'levelsjs', 'membership', array( 'deletelevel' => __('Are you sure you want to delete this level?','membership'),
  297. 'deactivatelevel' => __('Are you sure you want to deactivate this level?','membership'),
  298. 'movetopositive' => __('Moving to the Positive area will remove any Negative rules you have set - is that ok?','membership'),
  299. 'movetonegative' => __('Moving to the Negative area will remove any Positive rules you have set - is that ok?','membership')
  300. ) );
  301. $this->handle_levels_updates();
  302. }
  303. function add_admin_header_membershipsubs() {
  304. global $wp_version;
  305. // Run the core header
  306. $this->add_admin_header_core();
  307. // Queue scripts and localise
  308. wp_enqueue_script('subsjs', membership_url('membershipincludes/js/subscriptions.js'), array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable' ), $this->build);
  309. if(version_compare( preg_replace('/-.*$/', '', $wp_version), "3.3", '<')) {
  310. wp_enqueue_style('subscss', membership_url('membershipincludes/css/subscriptions.css'), array('widgets'), $this->build);
  311. } else {
  312. wp_enqueue_style('subscss', membership_url('membershipincludes/css/subscriptions.css'), array(), $this->build);
  313. }
  314. wp_localize_script( 'subsjs', 'membership', array( 'deletesub' => __('Are you sure you want to delete this subscription?','membership'), 'deactivatesub' => __('Are you sure you want to deactivate this subscription?','membership') ) );
  315. $this->handle_subscriptions_updates();
  316. }
  317. function add_admin_header_membershipcoupons() {
  318. global $wp_version;
  319. // Run the core header
  320. $this->add_admin_header_core();
  321. wp_enqueue_script( 'jquery-ui-datepicker' );
  322. wp_enqueue_script( 'jquery-ui-timepicker', membership_url('membershipincludes/js/datepicker/js/jquery.timepicker.min.js'), array('jquery', 'jquery-ui-core', 'jquery-ui-datepicker') , $this->build );
  323. //only load languages for datepicker if not english (or it will show Chinese!)
  324. if ($this->language != 'en')
  325. wp_enqueue_script( 'jquery-datepicker-i18n', membership_url( 'membershipincludes/js/datepicker/js/datepicker-i18n.min.js'), array('jquery', 'jquery-ui-core', 'jquery-ui-datepicker'), $this->build);
  326. wp_enqueue_style( 'jquery-datepicker-css', '//ajax.googleapis.com/ajax/libs/jqueryui/1.8.19/themes/base/jquery-ui.css', false, $this->build);
  327. // Queue scripts and localise
  328. wp_enqueue_script('couponsjs', membership_url('membershipincludes/js/coupons.js'), array(), $this->build);
  329. wp_enqueue_style('couponscss', membership_url('membershipincludes/css/coupons.css'), array(), $this->build);
  330. wp_localize_script( 'couponsjs', 'membership', array( 'deletecoupon' => __('Are you sure you want to delete this coupon?','membership'),
  331. 'setlangugae' => $this->language,
  332. 'start_of_week' => (get_option('start_of_week')=='0') ? 7 : get_option('start_of_week')
  333. ) );
  334. $this->handle_coupons_updates();
  335. }
  336. function add_admin_header_members() {
  337. global $wp_version;
  338. // Run the core header
  339. $this->add_admin_header_core();
  340. wp_enqueue_script('membersjs', membership_url('membershipincludes/js/members.js'), array(), $this->build);
  341. if(version_compare( preg_replace('/-.*$/', '', $wp_version), "3.3", '<')) {
  342. // Using the level css file for now - maybe switch to a members specific one later
  343. wp_enqueue_style('memberscss', membership_url('membershipincludes/css/levels.css'), array('widgets'), $this->build);
  344. } else {
  345. // Using the level css file for now - maybe switch to a members specific one later
  346. wp_enqueue_style('memberscss', membership_url('membershipincludes/css/levels.css'), array(), $this->build);
  347. }
  348. wp_localize_script( 'membersjs', 'membership', array( 'deactivatemember' => __('Are you sure you want to deactivate this member?','membership') ) );
  349. $this->handle_members_updates();
  350. }
  351. function add_admin_header_membershipgateways() {
  352. $this->add_admin_header_core();
  353. $this->handle_gateways_panel_updates();
  354. }
  355. function add_admin_header_membershipoptions() {
  356. $this->add_admin_header_core();
  357. wp_enqueue_style('optionscss', membership_url('membershipincludes/css/options.css'), array(), $this->build);
  358. $this->handle_options_panel_updates();
  359. }
  360. function add_admin_header_membershipuser() {
  361. $this->add_admin_header_core();
  362. wp_enqueue_style('optionscss', membership_url('membershipincludes/css/options.css'), array(), $this->build);
  363. }
  364. function add_admin_header_membershipcommunication() {
  365. // Run the core header
  366. $this->add_admin_header_core();
  367. wp_enqueue_script('commsjs', membership_url('membershipincludes/js/communication.js'), array(), $this->build);
  368. wp_localize_script( 'commsjs', 'membership', array( 'deletecomm' => __('Are you sure you want to delete this message?','membership'), 'deactivatecomm' => __('Are you sure you want to deactivate this message?','membership') ) );
  369. $this->handle_communication_updates();
  370. }
  371. function add_admin_header_membershipurlgroups() {
  372. // Run the core header
  373. $this->add_admin_header_core();
  374. wp_enqueue_script('groupsjs', membership_url('membershipincludes/js/urlgroup.js'), array(), $this->build);
  375. wp_localize_script( 'groupsjs', 'membership', array( 'deletegroup' => __('Are you sure you want to delete this url group?','membership') ) );
  376. $this->handle_urlgroups_updates();
  377. }
  378. function add_admin_header_membershippings() {
  379. // Run the core header
  380. $this->add_admin_header_core();
  381. wp_enqueue_script('pingsjs', membership_url('membershipincludes/js/ping.js'), array(), $this->build);
  382. wp_localize_script( 'pingsjs', 'membership', array( 'deleteping' => __('Are you sure you want to delete this ping and the associated history?','membership') ) );
  383. $this->handle_ping_updates();
  384. }
  385. // Panel handling functions
  386. function build_signup_stats() {
  387. $sql = $this->db->prepare( "SELECT YEAR(startdate) as year, MONTH(startdate)as month, DAY(startdate) as day, count(*) AS signedup FROM {$this->membership_relationships} WHERE startdate > DATE_SUB(CURDATE(), INTERVAL %d DAY) GROUP BY YEAR(startdate), MONTH(startdate), DAY(startdate) ORDER BY startdate DESC", 10 );
  388. $results = $this->db->get_results( $sql );
  389. if(!empty($results)) {
  390. $stats = array();
  391. $ticks = array();
  392. $data = array();
  393. foreach($results as $key => $res) {
  394. $stats[strtotime($res->year . "-" . $res->month . "-" . $res->day)] = (int) $res->signedup;
  395. }
  396. $startat = time();
  397. for($n = 0; $n < 11; $n++) {
  398. $switch = 10 - $n;
  399. $rdate = strtotime('-' . $switch . ' DAYS', $startat);
  400. $ticks[$n] = '"' . date('n', $rdate) . "/" . date('j', $rdate) . '"';
  401. if(isset($stats[strtotime(date("Y", $rdate) . "-" . date("n", $rdate) . "-" . date("j", $rdate))])) {
  402. $data[$n] = $stats[strtotime(date("Y", $rdate) . "-" . date("n", $rdate) . "-" . date("j", $rdate))];
  403. } else {
  404. $data[$n] = 0;
  405. }
  406. }
  407. $stats = $data;
  408. return compact('stats', 'ticks');
  409. } else {
  410. return false;
  411. }
  412. }
  413. function build_levels_stats() {
  414. $sql = "SELECT l.id, l.level_title, count(m.rel_id) as users FROM {$this->membership_levels} as l, {$this->membership_relationships} as m WHERE l.id = m.level_id GROUP BY l.id, l.level_title ORDER BY users DESC";
  415. $results = $this->db->get_results( $sql );
  416. if(!empty($results)) {
  417. $stats = array();
  418. $ticks = array();
  419. foreach($results as $key => $res) {
  420. $stats[] = (int) $res->users;
  421. $ticks[] = '"' . esc_html($res->level_title) . '"';
  422. }
  423. return compact('stats', 'ticks');
  424. } else {
  425. return false;
  426. }
  427. }
  428. function build_subs_stats() {
  429. $sql = "SELECT s.id, s.sub_name, count(m.rel_id) as users FROM {$this->subscriptions} as s, {$this->membership_relationships} as m WHERE s.id = m.sub_id GROUP BY s.id, s.sub_name ORDER BY users DESC";
  430. $results = $this->db->get_results( $sql );
  431. if(!empty($results)) {
  432. $stats = array();
  433. $ticks = array();
  434. foreach($results as $key => $res) {
  435. $stats[] = (int) $res->users;
  436. $ticks[] = '"' . esc_html($res->sub_name) . '"';
  437. }
  438. return compact('stats', 'ticks');
  439. } else {
  440. return false;
  441. }
  442. }
  443. function get_data($results) {
  444. $data = array();
  445. foreach( (array) $results as $key => $res) {
  446. $data[] = "[ " . $key . ", " . $res . " ]";
  447. }
  448. return "[ " . implode(", ", $data) . " ]";
  449. }
  450. function handle_membership_dashboard_updates() {
  451. global $page, $action;
  452. wp_reset_vars( array('action', 'page') );
  453. switch($action) {
  454. case 'activate': check_admin_referer('toggle-plugin');
  455. update_option('membership_active', 'yes');
  456. wp_safe_redirect( wp_get_referer() );
  457. break;
  458. case 'deactivate': check_admin_referer('toggle-plugin');
  459. update_option('membership_active', 'no');
  460. wp_safe_redirect( wp_get_referer() );
  461. break;
  462. default: do_action('membership_dashboard_' . $action);
  463. break;
  464. }
  465. wp_enqueue_script('flot_js', membership_url('membershipincludes/js/jquery.flot.min.js'), array('jquery'));
  466. wp_enqueue_script('mdash_js', membership_url('membershipincludes/js/dashboard.js'), array('jquery'));
  467. wp_localize_script( 'mdash_js', 'membership', array( 'signups' => __('Signups','membership'), 'members' => __('Members','membership') ) );
  468. add_action ('admin_head', array(&$this, 'dashboard_iehead'));
  469. add_action ('admin_head', array(&$this, 'dashboard_chartdata'));
  470. }
  471. function dashboard_chartdata() {
  472. $returned = $this->build_signup_stats();
  473. $levels = $this->build_levels_stats();
  474. $subs = $this->build_subs_stats();
  475. echo "\n" . '<script type="text/javascript">';
  476. echo "\n" . '/* <![CDATA[ */ ' . "\n";
  477. echo "var membershipdata = {\n";
  478. echo "chartonestats : " . $this->get_data($returned['stats']) . ",\n";
  479. echo "chartoneticks : " . $this->get_data($returned['ticks']) . ",\n";
  480. echo "charttwostats : " . $this->get_data($levels['stats']) . ",\n";
  481. echo "charttwoticks : " . $this->get_data($levels['ticks']) . ",\n";
  482. echo "chartthreestats : " . $this->get_data($subs['stats']) . ",\n";
  483. echo "chartthreeticks : " . $this->get_data($subs['ticks']) . "\n";
  484. echo "};\n";
  485. echo "\n" . '/* ]]> */ ';
  486. echo '</script>';
  487. }
  488. function dashboard_iehead() {
  489. echo '<!--[if IE]><script language="javascript" type="text/javascript" src="' . membership_url('membershipincludes/js/excanvas.min.js') . '"></script><![endif]-->';
  490. }
  491. function dashboard_members() {
  492. global $page, $action;
  493. $plugin = get_plugin_data(membership_dir('membershippremium.php'));
  494. $membershipactive = M_get_membership_active();
  495. echo __('Membership protection ','membership');
  496. echo __(' is ', 'membership');
  497. // Membership active toggle
  498. if($membershipactive == 'no') {
  499. echo '<strong>' . __('disabled', 'membership') . '</strong> <a id="enablemembership" href="' . wp_nonce_url("?page=" . $page. "&amp;action=activate", 'toggle-plugin') . '" title="' . __('Click here to enable the plugin','membership') . '">' . __('[Enable it]','membership') . '</a>';
  500. } else {
  501. echo '<strong>' . __('enabled', 'membership') . '</strong> <a id="enablemembership" href="' . wp_nonce_url("?page=" . $page. "&amp;action=deactivate", 'toggle-plugin') . '" title="' . __('Click here to enable the plugin','membership') . '">' . __('[Disable it]','membership') . '</a>';
  502. }
  503. echo '<br/><br/>';
  504. echo "<strong>" . __('Member breakdown', 'membership') . "</strong><br/>";
  505. $detail = $this->get_subscriptions_and_levels(array('sub_status' => 'active'));
  506. $subs = $this->get_subscriptions(array('sub_status' => 'active'));
  507. $levels = $this->get_membership_levels(array('level_id' => 'active'));
  508. echo "<table style='width: 100%;'>";
  509. echo "<tbody>";
  510. echo "<tr>";
  511. echo "<td style='width: 48%' valign='top'>";
  512. if($levels) {
  513. $levelcount = 0;
  514. echo "<table style='width: 100%;'>";
  515. echo "<tbody>";
  516. echo "<tr>";
  517. echo "<td colspan='2'><strong>" . __('Levels','membership') . "</strong></td>";
  518. echo "</tr>";
  519. foreach($levels as $key => $level) {
  520. echo "<tr>";
  521. echo "<td><a href='" . admin_url('admin.php?page=membershiplevels&action=edit&level_id=') . $level->id . "'>" . esc_html($level->level_title) . "</a></td>";
  522. // find out how many people are in this level
  523. $thiscount = $this->count_on_level( $level->id );
  524. echo "<td style='text-align: right;'>" . (int) $thiscount . "</td>";
  525. $levelcount += (int) $thiscount;
  526. echo "</tr>";
  527. }
  528. echo "</tbody>";
  529. echo "</table>";
  530. }
  531. echo "</td>";
  532. echo "<td style='width: 48%' valign='top'>";
  533. if($subs) {
  534. $subcount = 0;
  535. echo "<table style='width: 100%;'>";
  536. echo "<tbody>";
  537. echo "<tr>";
  538. echo "<td colspan='2'><strong>" . __('Subscriptions','membership') . "</strong></td>";
  539. echo "</tr>";
  540. foreach($subs as $key => $sub) {
  541. echo "<tr>";
  542. echo "<td><a href='" . admin_url('admin.php?page=membershipsubs&action=edit&sub_id=') . $sub->id . "'>" . $sub->sub_name . "</a></td>";
  543. // find out how many people are in this sub
  544. $thiscount = $this->count_on_sub( $sub->id );
  545. echo "<td style='text-align: right;'>" . (int) $thiscount . "</td>";
  546. $subcount += (int) $thiscount;
  547. echo "</tr>";
  548. }
  549. echo "</tbody>";
  550. echo "</table>";
  551. }
  552. echo "</td>";
  553. echo "</tr>";
  554. echo "</tbody>";
  555. echo "</table>";
  556. echo "<br/><strong>" . __('Member counts', 'membership') . "</strong><br/>";
  557. echo "<table style='width: 100%;'>";
  558. echo "<tbody>";
  559. echo "<tr>";
  560. echo "<td style='width: 48%' valign='top'>";
  561. echo "<table style='width: 100%;'>";
  562. echo "<tbody>";
  563. $usercount = $this->db->get_var( "SELECT count(*) FROM {$this->db->users} INNER JOIN {$this->db->usermeta} ON {$this->db->users}.ID = {$this->db->usermeta}.user_id WHERE {$this->db->usermeta}.meta_key = '{$this->db->prefix}capabilities'" );
  564. echo "<tr>";
  565. echo "<td>" . __('Total Members', 'membership') . "</td>";
  566. echo "<td style='text-align: right;'>" . $usercount . "</td>";
  567. echo "</tr>";
  568. $deactivecount = $this->db->get_var( $this->db->prepare("SELECT count(*) FROM {$this->db->usermeta} WHERE meta_key = %s AND meta_value = %s", $this->db->prefix . 'membership_active' , 'no') );
  569. echo "<tr>";
  570. echo "<td>" . __('Deactivated Members', 'membership') . "</td>";
  571. echo "<td style='text-align: right;'>" . $deactivecount . "</td>";
  572. echo "</tr>";
  573. echo "</tbody>";
  574. echo "</table>";
  575. echo "</td>";
  576. echo "<td style='width: 48%' valign='top'></td>";
  577. echo "</tr>";
  578. echo "</tbody>";
  579. echo "</table>";
  580. }
  581. function dashboard_statistics() {
  582. echo "<div id='memchartone'></div>";
  583. echo "<div id='memcharttwo'></div>";
  584. echo "<div id='memchartthree'></div>";
  585. do_action( 'membership_dashboard_statistics' );
  586. }
  587. function handle_membership_panel() {
  588. ?>
  589. <div class='wrap nosubsub'>
  590. <div class="icon32" id="icon-index"><br></div>
  591. <h2><?php _e('Membership dashboard','membership'); ?></h2>
  592. <?php
  593. $this->potter->conditional_show();
  594. ?>
  595. <div id="dashboard-widgets-wrap">
  596. <div class="metabox-holder" id="dashboard-widgets">
  597. <div style="width: 49%;" class="postbox-container">
  598. <div class="meta-box-sortables ui-sortable" id="normal-sortables">
  599. <div class="postbox " id="dashboard_right_now">
  600. <h3 class="hndle"><span><?php _e('Members','membership'); ?></span></h3>
  601. <div class="inside">
  602. <?php $this->dashboard_members(); ?>
  603. <br class="clear">
  604. </div>
  605. </div>
  606. <?php
  607. do_action( 'membership_dashboard_left' );
  608. ?>
  609. </div>
  610. </div>
  611. <div style="width: 49%;" class="postbox-container">
  612. <div class="meta-box-sortables ui-sortable" id="side-sortables">
  613. <?php
  614. do_action( 'membership_dashboard_right_top' );
  615. ?>
  616. <div class="postbox " id="dashboard_quick_press">
  617. <h3 class="hndle"><span><?php _e('Statistics','membership'); ?></span></h3>
  618. <div class="inside">
  619. <?php $this->dashboard_statistics(); ?>
  620. <br class="clear">
  621. </div>
  622. </div>
  623. <?php
  624. do_action( 'membership_dashboard_right' );
  625. ?>
  626. </div>
  627. </div>
  628. <div style="display: none; width: 49%;" class="postbox-container">
  629. <div class="meta-box-sortables ui-sortable" id="column3-sortables" style="">
  630. </div>
  631. </div>
  632. <div style="display: none; width: 49%;" class="postbox-container">
  633. <div class="meta-box-sortables ui-sortable" id="column4-sortables" style="">
  634. </div>
  635. </div>
  636. </div>
  637. <div class="clear"></div>
  638. </div>
  639. </div> <!-- wrap -->
  640. <?php
  641. }
  642. function handle_members_updates() {
  643. global $action, $page;
  644. wp_reset_vars( array('action', 'page') );
  645. if(isset($_GET['doaction']) || isset($_GET['doaction2'])) {
  646. if(addslashes($_GET['action']) == 'toggle' || addslashes($_GET['action2']) == 'toggle') {
  647. $action = 'bulk-toggle';
  648. }
  649. }
  650. switch(addslashes($action)) {
  651. case 'removeheader': $this->dismiss_user_help( $page );
  652. wp_safe_redirect( remove_query_arg( 'action' ) );
  653. break;
  654. case 'toggle': if(isset($_GET['member_id'])) {
  655. $user_id = (int) $_GET['member_id'];
  656. check_admin_referer('toggle-member_' . $user_id);
  657. $member = new M_Membership($user_id);
  658. if( $member->toggle_activation() ) {
  659. wp_safe_redirect( add_query_arg( 'msg', 7, wp_get_referer() ) );
  660. } else {
  661. wp_safe_redirect( add_query_arg( 'msg', 8, wp_get_referer() ) );
  662. }
  663. }
  664. break;
  665. case 'bulk-toggle':
  666. check_admin_referer('bulk-members');
  667. foreach($_GET['users'] AS $value) {
  668. if(is_numeric($value)) {
  669. $user_id = (int) $value;
  670. $member = new M_Membership($user_id);
  671. $member->toggle_activation();
  672. }
  673. }
  674. wp_safe_redirect( add_query_arg( 'msg', 7, wp_get_referer() ) );
  675. break;
  676. case 'bulkaddlevel-level-complete':
  677. case 'addlevel-level-complete':
  678. check_admin_referer($action);
  679. $members_id = $_POST['member_id'];
  680. $members = explode(',', $members_id);
  681. if($members) {
  682. foreach($members as $member_id) {
  683. $member = new M_Membership($member_id);
  684. $tolevel_id = (int) $_POST['tolevel_id'];
  685. if($tolevel_id) {
  686. $member->add_level($tolevel_id);
  687. }
  688. }
  689. }
  690. $this->update_levelcounts();
  691. wp_safe_redirect( add_query_arg( 'msg', 3, wp_get_original_referer() ) );
  692. break;
  693. case 'bulkdroplevel-level-complete':
  694. case 'droplevel-level-complete':
  695. check_admin_referer($action);
  696. $members_id = $_POST['member_id'];
  697. $members = explode(',', $members_id);
  698. if($members) {
  699. foreach($members as $member_id) {
  700. $member = new M_Membership($member_id);
  701. $fromlevel_id = (int) $_POST['fromlevel_id'];
  702. if($fromlevel_id) {
  703. $member->drop_level($fromlevel_id);
  704. }
  705. }
  706. }
  707. $this->update_levelcounts();
  708. wp_safe_redirect( add_query_arg( 'msg', 3, wp_get_original_referer() ) );
  709. break;
  710. case 'bulkmovelevel-level-complete':
  711. case 'movelevel-level-complete':
  712. check_admin_referer($action);
  713. $members_id = $_POST['member_id'];
  714. $members = explode(',', $members_id);
  715. if($members) {
  716. foreach($members as $member_id) {
  717. $member = new M_Membership($member_id);
  718. $fromlevel_id = (int) $_POST['fromlevel_id'];
  719. $tolevel_id = (int) $_POST['tolevel_id'];
  720. if($fromlevel_id && $tolevel_id) {
  721. $member->move_level($fromlevel_id, $tolevel_id);
  722. }
  723. }
  724. }
  725. $this->update_levelcounts();
  726. wp_safe_redirect( add_query_arg( 'msg', 3, wp_get_original_referer() ) );
  727. break;
  728. case 'bulkaddsub-sub-complete':
  729. case 'addsub-sub-complete':
  730. check_admin_referer($action);
  731. $members_id = $_POST['member_id'];
  732. $members = explode(',', $members_id);
  733. if($members) {
  734. foreach($members as $member_id) {
  735. $member = new M_Membership($member_id);
  736. $tosub_id = $_POST['tosub_id'];
  737. if($tosub_id) {
  738. $subs = explode('-',$tosub_id);
  739. if(count($subs) == 3) {
  740. $member->add_subscription($subs[0], $subs[1], $subs[2]);
  741. }
  742. }
  743. }
  744. }
  745. $this->update_levelcounts();
  746. $this->update_subcounts();
  747. wp_safe_redirect( add_query_arg( 'msg', 3, wp_get_original_referer() ) );
  748. break;
  749. case 'bulkdropsub-sub-complete':
  750. case 'dropsub-sub-complete':
  751. check_admin_referer($action);
  752. $members_id = $_POST['member_id'];
  753. $members = explode(',', $members_id);
  754. if($members) {
  755. foreach($members as $member_id) {
  756. $member = new M_Membership($member_id);
  757. $fromsub_id = (int) $_POST['fromsub_id'];
  758. if($fromsub_id) {
  759. $member->drop_subscription($fromsub_id);
  760. }
  761. }
  762. }
  763. $this->update_levelcounts();
  764. $this->update_subcounts();
  765. wp_safe_redirect( add_query_arg( 'msg', 3, wp_get_original_referer() ) );
  766. break;
  767. case 'bulkmovesub-sub-complete':
  768. case 'movesub-sub-complete':
  769. check_admin_referer($action);
  770. $members_id = $_POST['member_id'];
  771. $members = explode(',', $members_id);
  772. if($members) {
  773. foreach($members as $member_id) {
  774. $member = new M_Membership($member_id);
  775. $fromsub_id = (int) $_POST['fromsub_id'];
  776. $tosub_id = $_POST['tosub_id'];
  777. if($fromsub_id && $tosub_id) {
  778. $subs = explode('-',$tosub_id);
  779. if(count($subs) == 3) {
  780. $member->move_subscription($fromsub_id, $subs[0], $subs[1], $subs[2]);
  781. }
  782. }
  783. }
  784. }
  785. $this->update_levelcounts();
  786. $this->update_subcounts();
  787. wp_safe_redirect( add_query_arg( 'msg', 3, wp_get_original_referer() ) );
  788. break;
  789. case 'bulkmovegateway-gateway-complete':
  790. case 'movegateway-gateway-complete':
  791. check_admin_referer($action);
  792. $members_id = $_POST['member_id'];
  793. $members = explode(',', $members_id);
  794. if($members) {
  795. foreach($members as $member_id) {
  796. $member = new M_Membership($member_id);
  797. $fromgateway = $_POST['fromgateway'];
  798. $togateway = $_POST['togateway'];
  799. if(!empty($fromgateway) && !empty($togateway)) {
  800. $relationships = $member->get_relationships();
  801. foreach($relationships as $rel) {
  802. if($rel->usinggateway == $fromgateway) {
  803. $member->update_relationship_gateway( $rel->rel_id, $fromgateway, $togateway );
  804. }
  805. }
  806. }
  807. }
  808. }
  809. wp_safe_redirect( add_query_arg( 'msg', 3, wp_get_original_referer() ) );
  810. break;
  811. }
  812. }
  813. function handle_edit_member() {
  814. global $action, $page;
  815. wp_reset_vars( array('action', 'page') );
  816. }
  817. function handle_member_gateway_op( $operation = 'move', $member_id = false ) {
  818. global $action, $page, $action2, $M_Gateways;
  819. wp_reset_vars( array('action', 'page', 'action2') );
  820. if(empty($action) && !empty($action2)) $action = $action2;
  821. $gateways = apply_filters('M_gateways_list', array());
  822. $active = get_option('membership_activated_gateways', array());
  823. if(isset($_GET['fromgateway']) && !empty($_GET['fromgateway'])) {
  824. $fromgateway = stripslashes($_GET['fromgateway']);
  825. } else {
  826. $fromgateway = '';
  827. }
  828. switch($operation) {
  829. case 'move': $title = __('Move subscription to another gateway','membership');
  830. $formdescription = __('A subscription gateway handles the payment and renewal forms displayed for a subscription. Changing this should not be undertaken lightly, it can seriously mess up the subscriptions of your members.','membership') . "<br/><br/>";
  831. $html = "<h3>" . __('Gateway to move from for this / these member(s)','membership') . "</h3>";
  832. $html .= "<div class='level-details'>";
  833. $html .= "<select name='fromgateway' id='fromgateway' class='wide'>\n";
  834. $html .= "<option value='0'>" . __('Select the gateway to move from.','membership') . "</option>\n";
  835. $html .= "<option value='admin'>" . esc_html('admin' . " - " . "admin default gateway") . "</option>\n";
  836. if($gateways) {
  837. foreach($gateways as $key => $gateway) {
  838. if(in_array($key, $active)) {
  839. $html .= "<option value='" . esc_attr($key) . "'";
  840. if( $fromgateway == $key ) {
  841. $html .= " selected='selected'";
  842. }
  843. $html .= ">" . esc_html($key . " - " . $gateway) . "</option>\n";
  844. }
  845. }
  846. }
  847. $html .= "</select>\n";
  848. $html .= "</div>";
  849. $html .= "<h3>" . __('Gateway to move to for this / these member(s)','membership') . "</h3>";
  850. $html .= "<div class='level-details'>";
  851. $html .= "<select name='togateway' id='togateway' class='wide'>\n";
  852. $html .= "<option value='0'>" . __('Select the gateway to move to.','membership') . "</option>\n";
  853. $html .= "<option value='admin'>" . esc_html('admin' . " - " . "admin default gateway") . "</option>\n";
  854. reset($gateways);
  855. if($gateways) {
  856. foreach($gateways as $key => $gateway) {
  857. if(in_array($key, $active)) {
  858. $html .= "<option value='" . esc_attr($key) . "'>" . esc_html($key . " - " . $gateway) . "</option>\n";
  859. }
  860. }
  861. }
  862. $html .= "</select>\n";
  863. $html .= "</div>";
  864. $button = "Move";
  865. break;
  866. }
  867. ?>
  868. <div class='wrap nosubsub'>
  869. <div class="icon32" id="icon-users"><br></div>
  870. <h2><?php echo $title; ?></h2>
  871. <form action='admin.php?page=<?php echo $page; ?>' method='post'>
  872. <div class='level-liquid-left'>
  873. <div id='level-left'>
  874. <div id='edit-level' class='level-holder-wrap'>
  875. <div class='sidebar-name no-movecursor'>
  876. <h3><?php echo esc_html($title); ?></h3>
  877. </div>
  878. <div class='level-holder'>
  879. <br />
  880. <p class='description'><?php echo $formdescription; ?></p>
  881. <?php
  882. echo $html;
  883. ?>
  884. <div class='buttons'>
  885. <?php
  886. wp_original_referer_field(true, 'previous'); wp_nonce_field($action . '-gateway-complete');
  887. ?>
  888. <a href='?page=<?php echo $page; ?>' class='cancellink' title='Cancel add'><?php _e('Cancel', 'membership'); ?></a>
  889. <input type='submit' value='<?php _e($button, 'membership'); ?>' class='button-primary' />
  890. <input type='hidden' name='action' value='<?php esc_attr_e($action . '-gateway-complete'); ?>' />
  891. <?php
  892. if(is_array($member_id)) {
  893. ?>
  894. <input type='hidden' name='member_id' value='<?php esc_attr_e(implode(',',$member_id)); ?>' />
  895. <?php
  896. } else {
  897. ?>
  898. <input type='hidden' name='member_id' value='<?php esc_attr_e($member_id); ?>' />
  899. <?php
  900. }
  901. ?>
  902. </div>
  903. </div>
  904. </div>
  905. </div>
  906. </div> <!-- level-liquid-left -->
  907. </form>
  908. </div> <!-- wrap -->
  909. <?php
  910. }
  911. function handle_member_level_op($operation = 'add', $member_id = false) {
  912. global $action, $page, $action2;
  913. wp_reset_vars( array('action', 'page', 'action2') );
  914. if(empty($action) && !empty($action2)) $action = $action2;
  915. if(isset($_GET['fromlevel']) && !empty($_GET['fromlevel'])) {
  916. $fromlevel = $_GET['fromlevel'];
  917. } else {
  918. $fromlevel = '';
  919. }
  920. switch($operation) {
  921. case 'add': $title = __('Add member to a level','membership');
  922. $formdescription = __('A membership level controls the amount of access to the sites content this member will have.','membership') . "<br/><br/>";
  923. $formdescription .= __('By adding a membership level, you may actually be removing existing access to content.','membership');
  924. $html = "<h3>" . __('Level to add for this / these member(s)','membership') . "</h3>";
  925. $html .= "<div class='level-details'>";
  926. $html .= "<select name='tolevel_id' id='tolevel_id' class='wide'>\n";
  927. $html .= "<option value='0'>" . __('Select the level to add.','membership') . "</option>\n";
  928. $levels = $this->get_membership_levels(array('level_id' => 'active'));
  929. if($levels) {
  930. foreach($levels as $key => $level) {
  931. $html .= "<option value='" . esc_attr($level->id) . "'";
  932. $html .= ">" . esc_html($level->level_title) . "</option>\n";
  933. }
  934. }
  935. $html .= "</select>\n";
  936. $html .= "</div>";
  937. $button = "Add";
  938. break;
  939. case 'move': $title = __('Move member to another level','membership');
  940. $formdescription = __('A membership level controls the amount of access to the sites content this member will have.','membership') . "<br/><br/>";
  941. $html = "<h3>" . __('Level to move from for this / these member(s)','membership') . "</h3>";
  942. $html .= "<div class='level-details'>";
  943. $html .= "<select name='fromlevel_id' id='fromlevel_id' class='wide'>\n";
  944. $html .= "<option value='0'>" . __('Select the level to move from.','membership') . "</option>\n";
  945. $levels = $this->get_membership_levels(array('level_id' => 'active'));
  946. if($levels) {
  947. foreach($levels as $key => $level) {
  948. $html .= "<option value='" . esc_attr($level->id) . "'";
  949. if($fromlevel == $level->id) $html .= " selected='selected'";
  950. $html .= ">" . esc_html($level->level_title) . "</option>\n";
  951. }
  952. }
  953. $html .= "</select>\n";
  954. $html .= "</div>";
  955. $html .= "<h3>" . __('Level to move to for this / these member(s)','membership') . "</h3>";
  956. $html .= "<div class='level-details'>";
  957. $html .= "<select name='tolevel_id' id='tolevel_id' class='wide'>\n";
  958. $html .= "<option value='0'>" . __('Select the level to move to.','membership') . "</option>\n";
  959. reset($levels);
  960. if($levels) {
  961. foreach($levels as $key => $level) {
  962. $html .= "<option value='" . esc_attr($level->id) . "'";
  963. $html .= ">" . esc_html($level->level_title) . "</option>\n";
  964. }
  965. }
  966. $html .= "</select>\n";
  967. $html .= "</div>";
  968. $button = "Move";
  969. break;
  970. case 'drop': $title = __('Drop member from level','membership');
  971. $formdescription = __('A membership level controls the amount of access to the sites content this member will have.','membership') . "<br/><br/>";
  972. $formdescription .= __('By removing a membership level, you may actually be increasing existing access to content.','membership');
  973. $html = "<h3>" . __('Level to drop for this / these member(s)','membership') . "</h3>";
  974. $html .= "<div class='level-details'>";
  975. $html .= "<select name='fromlevel_id' id='fromlevel_id' class='wide'>\n";
  976. $html .= "<option value=''>" . __('Select the level to remove.','membership') . "</option>\n";
  977. $levels = $this->get_membership_levels(array('level_id' => 'active'));
  978. if($levels) {
  979. foreach($levels as $key => $level) {
  980. $html .= "<option value='" . esc_attr($level->id) . "'";
  981. if($fromlevel == $level->id) $html .= " selected='selected'";
  982. $html .= ">" . esc_html($level->level_title) . "</option>\n";
  983. }
  984. }
  985. $html .= "</select>\n";
  986. $html .= "</div>";
  987. $button = "Drop";
  988. break;
  989. }
  990. ?>
  991. <div class='wrap nosubsub'>
  992. <div class="icon32" id="icon-users"><br></div>
  993. <h2><?php echo $title; ?></h2>
  994. <form action='admin.php?page=<?php echo $page; ?>' method='post'>
  995. <div class='level-liquid-left'>
  996. <div id='level-left'>
  997. <div id='edit-level' class='level-holder-wrap'>
  998. <div class='sidebar-name no-movecursor'>
  999. <h3><?php echo esc_html($title); ?></h3>
  1000. </div>
  1001. <div class='level-holder'>
  1002. <br />
  1003. <p class='description'><?php echo $formdescription; ?></p>
  1004. <?php
  1005. echo $html;
  1006. ?>
  1007. <div class='buttons'>
  1008. <?php
  1009. wp_original_referer_field(true, 'previous'); wp_nonce_field($action . '-level-complete');
  1010. ?>
  1011. <a href='?page=<?php echo $page; ?>' class='cancellink' title='Cancel add'><?php _e('Cancel', 'membership'); ?></a>
  1012. <input type='submit' value='<?php _e($button, 'membership'); ?>' class='button-primary' />
  1013. <input type='hidden' name='action' value='<?php esc_attr_e($action . '-level-complete'); ?>' />
  1014. <?php
  1015. if(is_array($member_id)) {
  1016. ?>
  1017. <input type='hidden' name='member_id' value='<?php esc_attr_e(implode(',',$member_id)); ?>' />
  1018. <?php
  1019. } else {
  1020. ?>
  1021. <input type='hidden' name='member_id' value='<?php esc_attr_e($member_id); ?>' />
  1022. <?php
  1023. }
  1024. ?>
  1025. </div>
  1026. </div>
  1027. </div>
  1028. </div>
  1029. </div> <!-- level-liquid-left -->
  1030. </form>
  1031. </div> <!-- wrap -->
  1032. <?php
  1033. }
  1034. function handle_member_subscription_op($operation = 'add', $member_id = false) {
  1035. global $action, $page, $action2;
  1036. wp_reset_vars( array('action', 'page', 'action2') );
  1037. if(empty($action) && !empty($action2)) $action = $action2;
  1038. if(isset($_GET['fromsub']) && !empty($_GET['fromsub'])) {
  1039. $fromsub = $_GET['fromsub'];
  1040. } else {
  1041. $fromsub = '';
  1042. }
  1043. switch($operation) {
  1044. case 'add': $title = __('Add member to a subscription','membership');
  1045. $formdescription = __('A subscription controls the levels a site member has access to / passes through.','membership') . "<br/><br/>";
  1046. $formdescription .= __('Depending on your payment gateway, adding a subscription here may not set up a payment subscription.','membership');
  1047. $html = "<h3>" . __('Subscription and level to add for this / these member(s)','membership') . "</h3>";
  1048. $html .= "<div class='level-details'>";
  1049. $html .= "<select name='tosub_id' id='tosub_id' class='wide'>\n";
  1050. $html .= "<option value='0'>" . __('Select the level to add.','membership') . "</option>\n";
  1051. $subs = $this->get_subscriptions_and_levels( array('sub_status' => 'active') );
  1052. if($subs) {
  1053. $sub_id = false;
  1054. foreach($subs as $key => $sub) {
  1055. if($sub_id != $sub->sub_id) {
  1056. $sub_id = $sub->sub_id;
  1057. $html .= "<optgroup label='";
  1058. $html .= $sub->sub_name;
  1059. $html .= "'>";
  1060. }
  1061. $html .= "<option value='" . esc_attr($sub->sub_id) . "-" . esc_attr($sub->level_id) . "-" . esc_attr($sub->level_order) . "'";
  1062. $html .= ">" . $sub->level_order . " : " . esc_html($sub->sub_name . " - " . $sub->level_title) . "</option>\n";
  1063. }
  1064. }
  1065. $html .= "</select>\n";
  1066. $html .= "</div>";
  1067. $button = "Add";
  1068. break;
  1069. case 'move': $title = __('Move member to another subscription level','membership');
  1070. $formdescription = __('A subscription controls the levels a site member has access to / passes through.','membership') . "<br/><br/>";
  1071. $formdescription .= __('Depending on your payment gateway, moving a subscription here may not alter a members existing payment subscription.','membership');
  1072. $html = "<h3>" . __('Subscription to move from for this / these member(s)','membership') . "</h3>";
  1073. $html .= "<div class='level-details'>";
  1074. $html .= "<select name='fromsub_id' id='fromsub_id' class='wide'>\n";
  1075. $html .= "<option value='0'>" . __('Select the subscription to move from.','membership') . "</option>\n";
  1076. $subs = $this->get_subscriptions( array('sub_status' => 'active'));
  1077. if($subs) {
  1078. foreach($subs as $key => $sub) {
  1079. $html .= "<option value='" . esc_attr($sub->id) . "'";
  1080. if($fromsub == $sub->id) $html .= " selected='selected'";
  1081. $html .= ">" . esc_html($sub->sub_name) . "</option>\n";
  1082. }
  1083. }
  1084. $html .= "</select>\n";
  1085. $html .= "</div>";
  1086. $html .= "<h3>" . __('Subscription and Level to move to for this / these member(s)','membership') . "</h3>";
  1087. $html .= "<div class='level-details'>";
  1088. $html .= "<select name='tosub_id' id='tosub_id' class='wide'>\n";
  1089. $html .= "<option value='0'>" . __('Select the level to move to.','membership') . "</option>\n";
  1090. $subs = $this->get_subscriptions_and_levels( array('sub_status' => 'active') );
  1091. if($subs) {
  1092. $sub_id = false;
  1093. foreach($subs as $key => $sub) {
  1094. if($sub_id != $sub->sub_id) {
  1095. $sub_id = $sub->sub_id;
  1096. $html .= "<optgroup label='";
  1097. $html .= $sub->sub_name;
  1098. $html .= "'>";
  1099. }
  1100. $html .= "<option value='" . esc_attr($sub->sub_id) . "-" . esc_attr($sub->level_id) . "-" . esc_attr($sub->level_order) . "'>" . $sub->level_order . " : " . esc_html($sub->sub_name . " - " . $sub->level_title) . "</option>\n";
  1101. }
  1102. }
  1103. $html .= "</select>\n";
  1104. $html .= "</div>";
  1105. $button = "Move";
  1106. break;
  1107. case 'drop': $title = __('Drop member from subscription','membership');
  1108. $formdescription = __('A subscription controls the levels a site member has access to / passes through.','membership') . "<br/><br/>";
  1109. $formdescription .= __('Depending on the payment gateway, removing a subscription will not automatically cancel a payment subscription.','membership');
  1110. $html = "<h3>" . __('Subscription to drop for this / these member(s)','membership') . "</h3>";
  1111. $html .= "<div class='level-details'>";
  1112. $html .= "<select name='fromsub_id' id='fromsub_id' class='wide'>\n";
  1113. $html .= "<option value=''>" . __('Select the subscription to remove.','membership') . "</option>\n";
  1114. $subs = $this->get_subscriptions( array('sub_status' => 'active'));
  1115. if($subs) {
  1116. foreach($subs as $key => $sub) {
  1117. $html .= "<option value='" . esc_attr($sub->id) . "'";
  1118. if($fromsub == $sub->id) $html .= " selected='selected'";
  1119. $html .= ">" . esc_html($sub->sub_name) . "</option>\n";
  1120. }
  1121. }
  1122. $html .= "</select>\n";
  1123. $html .= "</div>";
  1124. $button = "Drop";
  1125. break;
  1126. }
  1127. ?>
  1128. <div class='wrap nosubsub'>
  1129. <div class="icon32" id="icon-users"><br></div>
  1130. <h2><?php echo $title; ?></h2>
  1131. <form action='admin.php?page=<?php echo $page; ?>' method='post'>
  1132. <div class='level-liquid-left'>
  1133. <div id='level-left'>
  1134. <div id='edit-level' class='level-holder-wrap'>
  1135. <div class='sidebar-name no-movecursor'>
  1136. <h3><?php echo esc_html($title); ?></h3>
  1137. </div>
  1138. <div class='level-holder'>
  1139. <br />
  1140. <p class='description'><?php echo $formdescription; ?></p>
  1141. <?php
  1142. echo $html;
  1143. ?>
  1144. <div class='buttons'>
  1145. <?php
  1146. wp_original_referer_field(true, 'previous'); wp_nonce_field($action . '-sub-complete');
  1147. ?>
  1148. <a href='?page=<?php echo $page; ?>' class='cancellink' title='Cancel add'><?php _e('Cancel', 'membership'); ?></a>
  1149. <input type='submit' value='<?php _e($button, 'membership'); ?>' class='button-primary' />
  1150. <input type='hidden' name='action' value='<?php esc_attr_e($action . '-sub-complete'); ?>' />
  1151. <?php
  1152. if(is_array($member_id)) {
  1153. ?>
  1154. <input type='hidden' name='member_id' value='<?php esc_attr_e(implode(',',$member_id)); ?>' />
  1155. <?php
  1156. } else {
  1157. ?>
  1158. <input type='hidden' name='member_id' value='<?php esc_attr_e($member_id); ?>' />
  1159. <?php
  1160. }
  1161. ?>
  1162. </div>
  1163. </div>
  1164. </div>
  1165. </div>
  1166. </div> <!-- level-liquid-left -->
  1167. </form>
  1168. </div> <!-- wrap -->
  1169. <?php
  1170. }
  1171. function handle_members_panel() {
  1172. global $action, $page;
  1173. wp_reset_vars( array('action', 'page') );
  1174. require_once('class.membersearch.php');
  1175. // bulk actions
  1176. if(isset($_GET['doaction'])) {
  1177. $action = $_GET['action'];
  1178. } elseif(isset($_GET['doaction2'])) {
  1179. $action = $_GET['action2'];
  1180. }
  1181. switch(addslashes($action)) {
  1182. case 'addlevel': if(isset($_GET['member_id'])) {
  1183. $member_id = (int) $_GET['member_id'];
  1184. $this->handle_member_level_op('add', $member_id);
  1185. return;
  1186. }
  1187. break;
  1188. case 'movelevel': if(isset($_GET['member_id'])) {
  1189. $member_id = (int) $_GET['member_id'];
  1190. check_admin_referer('movelevel-member-' . $member_id);
  1191. $this->handle_member_level_op('move', $member_id);
  1192. return;
  1193. }
  1194. break;
  1195. case 'droplevel': if(isset($_GET['member_id'])) {
  1196. $member_id = (int) $_GET['member_id'];
  1197. check_admin_referer('droplevel-member-' . $member_id);
  1198. $this->handle_member_level_op('drop', $member_id);
  1199. return;
  1200. }
  1201. break;
  1202. case 'bulkaddlevel':
  1203. if(isset($_GET['users'])) {
  1204. check_admin_referer('bulk-members');
  1205. $this->handle_member_level_op('add', $_GET['users']);
  1206. return;
  1207. }
  1208. break;
  1209. case 'bulkmovelevel':
  1210. if(isset($_GET['users'])) {
  1211. check_admin_referer('bulk-members');
  1212. $this->handle_member_level_op('move', $_GET['users']);
  1213. return;
  1214. }
  1215. break;
  1216. case 'bulkdroplevel':
  1217. if(isset($_GET['users'])) {
  1218. check_admin_referer('bulk-members');
  1219. $this->handle_member_level_op('drop', $_GET['users']);
  1220. return;
  1221. }
  1222. break;
  1223. case 'addsub': if(isset($_GET['member_id'])) {
  1224. $member_id = (int) $_GET['member_id'];
  1225. $this->handle_member_subscription_op('add', $member_id);
  1226. return;
  1227. }
  1228. break;
  1229. case 'movesub': if(isset($_GET['member_id'])) {
  1230. $member_id = (int) $_GET['member_id'];
  1231. check_admin_referer('movesub-member-' . $member_id);
  1232. $this->handle_member_subscription_op('move', $member_id);
  1233. return;
  1234. }
  1235. break;
  1236. case 'dropsub': if(isset($_GET['member_id'])) {
  1237. $member_id = (int) $_GET['member_id'];
  1238. check_admin_referer('dropsub-member-' . $member_id);
  1239. $this->handle_member_subscription_op('drop', $member_id);
  1240. return;
  1241. }
  1242. break;
  1243. case 'bulkaddsub': if(isset($_GET['users'])) {
  1244. check_admin_referer('bulk-members');
  1245. $this->handle_member_subscription_op('add', $_GET['users']);
  1246. return;
  1247. }
  1248. break;
  1249. case 'bulkmovesub':
  1250. if(isset($_GET['users'])) {
  1251. check_admin_referer('bulk-members');
  1252. $this->handle_member_subscription_op('move', $_GET['users']);
  1253. return;
  1254. }
  1255. break;
  1256. case 'bulkdropsub':
  1257. if(isset($_GET['users'])) {
  1258. check_admin_referer('bulk-members');
  1259. $this->handle_member_subscription_op('drop', $_GET['users']);
  1260. return;
  1261. }
  1262. break;
  1263. case 'bulkmovegateway':
  1264. if(isset($_GET['users'])) {
  1265. check_admin_referer('bulk-members');
  1266. $this->handle_member_gateway_op('move', $_GET['users']);
  1267. return;
  1268. }
  1269. break;
  1270. case 'movegateway':
  1271. if(isset($_GET['member_id'])) {
  1272. $member_id = (int) $_GET['member_id'];
  1273. check_admin_referer('movegateway-member-' . $member_id);
  1274. $this->handle_member_gateway_op('move', $member_id);
  1275. return;
  1276. }
  1277. break;
  1278. case 'edit': if(isset($_GET['level_id'])) {
  1279. $level_id = (int) $_GET['level_id'];
  1280. $this->handle_level_edit_form($level_id);
  1281. return; // So we don't see the rest of this page
  1282. }
  1283. break;
  1284. }
  1285. $filter = array();
  1286. if(isset($_GET['s'])) {
  1287. $s = stripslashes($_GET['s']);
  1288. $filter['s'] = $s;
  1289. } else {
  1290. $s = '';
  1291. }
  1292. $sub_id = null; $level_id = null;
  1293. if(isset($_GET['doactionsub'])) {
  1294. if(addslashes($_GET['sub_op']) != '') {
  1295. $sub_id = addslashes($_GET['sub_op']);
  1296. }
  1297. }
  1298. if(isset($_GET['doactionsub2'])) {
  1299. if(addslashes($_GET['sub_op2']) != '') {
  1300. $sub_id = addslashes($_GET['sub_op2']);
  1301. }
  1302. }
  1303. if(isset($_GET['doactionlevel'])) {
  1304. if(addslashes($_GET['level_op']) != '') {
  1305. $level_id = addslashes($_GET['level_op']);
  1306. }
  1307. }
  1308. if(isset($_GET['doactionlevel2'])) {
  1309. if(addslashes($_GET['level_op2']) != '') {
  1310. $level_id = addslashes($_GET['level_op2']);
  1311. }
  1312. }
  1313. if(isset($_GET['doactionactive'])) {
  1314. if(addslashes($_GET['active_op']) != '') {
  1315. $active_op = addslashes($_GET['active_op']);
  1316. }
  1317. }
  1318. if(isset($_GET['doactionactive2'])) {
  1319. if(addslashes($_GET['active_op2']) != '') {
  1320. $active_op = addslashes($_GET['active_op2']);
  1321. }
  1322. }
  1323. $usersearch = isset($_GET['s']) ? $_GET['s'] : null;
  1324. $userspage = isset($_GET['userspage']) ? $_GET['userspage'] : null;
  1325. $role = null;
  1326. if(empty($active_op)) $active_op = '';
  1327. // Query the users
  1328. $wp_user_search = new M_Member_Search($usersearch, $userspage, $sub_id, $level_id, $active_op);
  1329. $messages = array();
  1330. $messages[1] = __('Member added.','membership');
  1331. $messages[2] = __('Member deleted.','membership');
  1332. $messages[3] = __('Member updated.','membership');
  1333. $messages[4] = __('Member not added.','membership');
  1334. $messages[5] = __('Member not updated.','membership');
  1335. $messages[6] = __('Member not deleted.','membership');
  1336. $messages[7] = __('Member activation toggled.','membership');
  1337. $messages[8] = __('Member activation not toggled.','membership');
  1338. $messages[9] = __('Members updated.','membership');
  1339. ?>
  1340. <div class='wrap nosubsub'>
  1341. <div class="icon32" id="icon-users"><br></div>
  1342. <h2><?php _e('Edit Members','membership'); ?></h2>
  1343. <?php
  1344. if ( isset($_GET['msg']) ) {
  1345. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  1346. $_SERVER['REQUEST_URI'] = remove_query_arg(array('msg'), $_SERVER['REQUEST_URI']);
  1347. }
  1348. if($this->show_user_help( $page )) {
  1349. ?>
  1350. <div class='screenhelpheader'>
  1351. <a href="admin.php?page=<?php echo $page; ?>&amp;action=removeheader" class="welcome-panel-close"><?php _e('Dismiss','membership'); ?></a>
  1352. <?php
  1353. ob_start();
  1354. include_once(membership_dir('membershipincludes/help/header.members.php'));
  1355. echo ob_get_clean();
  1356. ?>
  1357. </div>
  1358. <?php
  1359. }
  1360. ?>
  1361. <form method="get" action="?page=<?php echo esc_attr($page); ?>" class="search-form">
  1362. <p class="search-box">
  1363. <input type='hidden' name='page' value='<?php echo esc_attr($page); ?>' />
  1364. <label for="membership-search-input" class="screen-reader-text"><?php _e('Search Members','membership'); ?>:</label>
  1365. <input type="text" value="<?php echo esc_attr($s); ?>" name="s" id="membership-search-input">
  1366. <input type="submit" class="button" value="<?php _e('Search Members','membership'); ?>">
  1367. </p>
  1368. </form>
  1369. <br class='clear' />
  1370. <form method="get" action="?page=<?php echo esc_attr($page); ?>" id="members-filter">
  1371. <input type='hidden' name='page' value='<?php echo esc_attr($page); ?>' />
  1372. <div class="tablenav">
  1373. <?php if ( $wp_user_search->results_are_paged() ) : ?>
  1374. <div class="tablenav-pages"><?php $wp_user_search->page_links(); ?></div>
  1375. <?php endif; ?>
  1376. <div class="alignleft actions">
  1377. <select name="action">
  1378. <option selected="selected" value=""><?php _e('Bulk Actions','membership'); ?></option>
  1379. <option value="toggle"><?php _e('Toggle activation','membership'); ?></option>
  1380. <optgroup label="<?php _e('Subscriptions','membership'); ?>">
  1381. <option value="bulkaddsub"><?php _e('Add subscription','membership'); ?></option>
  1382. <option value="bulkmovesub"><?php _e('Move subscription','membership'); ?></option>
  1383. <option value="bulkdropsub"><?php _e('Drop subscription','membership'); ?></option>
  1384. </optgroup>
  1385. <optgroup label="<?php _e('Levels','membership'); ?>">
  1386. <option value="bulkaddlevel"><?php _e('Add level','membership'); ?></option>
  1387. <option value="bulkmovelevel"><?php _e('Move level','membership'); ?></option>
  1388. <option value="bulkdroplevel"><?php _e('Drop level','membership'); ?></option>
  1389. </optgroup>
  1390. <optgroup label="<?php _e('Gateways','membership'); ?>">
  1391. <option value="bulkmovegateway"><?php _e('Move gateway','membership'); ?></option>
  1392. </optgroup>
  1393. </select>
  1394. <input type="submit" class="button-secondary action" id="doaction" name="doaction" value="<?php _e('Apply','membership'); ?>" />
  1395. <select name="sub_op" style='float:none;'>
  1396. <option value=""><?php _e('Filter by subscription','membership'); ?></option>
  1397. <?php
  1398. $subs = $this->get_subscriptions();
  1399. if($subs) {
  1400. foreach($subs as $key => $sub) {
  1401. ?>
  1402. <option value="<?php echo $sub->id; ?>" <?php if(isset($_GET['sub_op']) && $_GET['sub_op'] == $sub->id) echo 'selected="selected"'; ?>><?php echo esc_html($sub->sub_name); ?></option>
  1403. <?php
  1404. }
  1405. }
  1406. ?>
  1407. </select>
  1408. <input type="submit" class="button-secondary action" id="doactionsub" name="doactionsub" value="<?php _e('Filter','membership'); ?>">
  1409. <select name="level_op" style='float:none;'>
  1410. <option value=""><?php _e('Filter by level','membership'); ?></option>
  1411. <?php
  1412. $levels = $this->get_membership_levels();
  1413. if($levels) {
  1414. foreach($levels as $key => $level) {
  1415. ?>
  1416. <option value="<?php echo $level->id; ?>" <?php if(isset($_GET['level_op']) && $_GET['level_op'] == $level->id) echo 'selected="selected"'; ?>><?php echo esc_html($level->level_title); ?></option>
  1417. <?php
  1418. }
  1419. }
  1420. ?>
  1421. </select>
  1422. <input type="submit" class="button-secondary action" id="doactionlevel" name="doactionlevel" value="<?php _e('Filter','membership'); ?>">
  1423. <select name="active_op" style='float:none;'>
  1424. <option value=""><?php _e('Filter by status','membership'); ?></option>
  1425. <option value="yes" <?php if(isset($_GET['active_op']) && $_GET['active_op'] == 'yes') echo 'selected="selected"'; ?>><?php _e('Active','membership'); ?></option>
  1426. <option value="no" <?php if(isset($_GET['active_op']) && $_GET['active_op'] == 'no') echo 'selected="selected"'; ?>><?php _e('Inactive','membership'); ?></option>
  1427. </select>
  1428. <input type="submit" class="button-secondary action" id="doactionactive" name="doactionactive" value="<?php _e('Filter','membership'); ?>">
  1429. </div>
  1430. <div class="alignright actions">
  1431. <!-- <input type="button" class="button-secondary addnewlevelbutton" value="<?php _e('Add New','membership'); ?>" name="addnewlevel"> -->
  1432. </div>
  1433. <br class="clear">
  1434. </div>
  1435. <?php if ( is_wp_error( $wp_user_search->search_errors ) ) : ?>
  1436. <div class="error">
  1437. <ul>
  1438. <?php
  1439. foreach ( $wp_user_search->search_errors->get_error_messages() as $message )
  1440. echo "<li>$message</li>";
  1441. ?>
  1442. </ul>
  1443. </div>
  1444. <?php endif; ?>
  1445. <?php if ( $wp_user_search->is_search() ) : ?>
  1446. <p><a href="?page=<?php echo $page; ?>"><?php _e('&larr; Back to All Users','membership'); ?></a></p>
  1447. <?php endif; ?>
  1448. <div class="clear"></div>
  1449. <?php
  1450. wp_nonce_field('bulk-members');
  1451. $columns = array( "username" => __('Username','membership'),
  1452. "name" => __('Name','membership'),
  1453. "email" => __('E-mail','membership'),
  1454. "active" => __('Active','membership'),
  1455. "sub" => __('Subscription','membership'),
  1456. "level" => __('Membership Level','membership'),
  1457. "expires" => __('Level Expires', 'membership'),
  1458. "gateway" => __('Gateway', 'membership')
  1459. );
  1460. $columns = apply_filters('members_columns', $columns);
  1461. //$levels = $this->get_membership_levels($filter);
  1462. ?>
  1463. <table cellspacing="0" class="widefat fixed">
  1464. <thead>
  1465. <tr>
  1466. <th style="" class="manage-column column-cb check-column" id="cb" scope="col"><input type="checkbox"></th>
  1467. <?php
  1468. foreach($columns as $key => $col) {
  1469. ?>
  1470. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  1471. <?php
  1472. }
  1473. ?>
  1474. </tr>
  1475. </thead>
  1476. <tfoot>
  1477. <tr>
  1478. <th style="" class="manage-column column-cb check-column" scope="col"><input type="checkbox"></th>
  1479. <?php
  1480. reset($columns);
  1481. foreach($columns as $key => $col) {
  1482. ?>
  1483. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  1484. <?php
  1485. }
  1486. ?>
  1487. </tr>
  1488. </tfoot>
  1489. <tbody>
  1490. <?php
  1491. $style = '';
  1492. foreach ( $wp_user_search->get_results() as $userid ) {
  1493. $user_object = new M_Membership($userid);
  1494. $roles = $user_object->roles;
  1495. $role = array_shift($roles);
  1496. $style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"';
  1497. ?>
  1498. <tr id='user-<?php echo $user_object->ID; ?>' <?php echo $style; ?>>
  1499. <th scope='row' class='check-column'>
  1500. <input type='checkbox' name='users[]' id='user_<?php echo $user_object->ID; ?>' class='$role' value='<?php echo $user_object->ID; ?>' />
  1501. </th>
  1502. <td <?php echo $style; ?>>
  1503. <strong><a href='<?php echo admin_url('user-edit.php?user_id=' . $user_object->ID); ?>' title='User ID: <?php echo $user_object->ID; ?>'><?php echo $user_object->user_login; ?></a></strong>
  1504. <?php
  1505. $actions = array();
  1506. //$actions['id'] = "<strong>" . __('ID : ', 'membership') . $user_object->ID . "</strong>";
  1507. $actions['edit'] = "<span class='edit'><a href='" . admin_url('user-edit.php?user_id=' . $user_object->ID) . "'>" . __('Edit', 'membership') . "</a></span>";
  1508. if($user_object->active_member()) {
  1509. $actions['activate'] = "<span class='edit deactivate'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=toggle&amp;member_id=" . $user_object->ID . "", 'toggle-member_' . $user_object->ID) . "'>" . __('Deactivate', 'membership') . "</a></span>";
  1510. } else {
  1511. $actions['activate'] = "<span class='edit activate'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=toggle&amp;member_id=" . $user_object->ID . "", 'toggle-member_' . $user_object->ID) . "'>" . __('Activate', 'membership') . "</a></span>";
  1512. }
  1513. //$actions['history'] = "<span class='edit'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=history&amp;member_id=" . $user_object->ID . "", 'history-member_' . $user_object->ID) . "'>" . __('History', 'membership') . "</a></span>";
  1514. ?>
  1515. <div class="row-actions"><?php echo implode(" | ", $actions); ?></div>
  1516. </td>
  1517. <td <?php echo $style; ?>><?php echo $user_object->first_name . " " . $user_object->last_name; ?></td>
  1518. <td <?php echo $style; ?>><a href='mailto:<?php echo $user_object->user_email; ?>' title='<?php echo sprintf( __('e-mail: %s','membership' ), $user_object->user_email ); ?>'><?php echo $user_object->user_email; ?></a></td>
  1519. <td <?php echo $style; ?>>
  1520. <?php if($user_object->active_member()) {
  1521. echo "<span class='membershipactivestatus'>" . __('Active', 'membership') . "</span>";
  1522. } else {
  1523. echo "<span class='membershipinactivestatus'>" . __('Inactive', 'membership') . "</span>";
  1524. }
  1525. ?>
  1526. </td>
  1527. <td <?php echo $style; ?>>
  1528. <?php
  1529. $subs = $user_object->get_subscription_ids();
  1530. if(!empty($subs)) {
  1531. $rows = array();
  1532. foreach((array) $subs as $key) {
  1533. $sub = new M_Subscription ( $key );
  1534. if(!empty($sub)) {
  1535. $rows[] = $sub->sub_name();
  1536. }
  1537. }
  1538. echo implode(", ", $rows);
  1539. }
  1540. $actions = array();
  1541. if(!$user_object->has_cap('membershipadmin')) {
  1542. $actions['add'] = "<span class='edit'><a href='?page={$page}&amp;action=addsub&amp;member_id={$user_object->ID}'>" . __('Add', 'membership') . "</a></span>";
  1543. }
  1544. if(!empty($subs)) {
  1545. if(count($subs) == 1) {
  1546. $actions['move'] = "<span class='edit'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=movesub&amp;member_id=" . $user_object->ID . "&amp;fromsub=" . $subs[0], 'movesub-member-' . $user_object->ID) . "'>" . __('Move', 'membership') . "</a></span>";
  1547. $actions['drop'] = "<span class='edit delete'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=dropsub&amp;member_id=" . $user_object->ID . "&amp;fromsub=" . $subs[0], 'dropsub-member-' . $user_object->ID) . "'>" . __('Drop', 'membership') . "</a></span>";
  1548. } else {
  1549. $actions['move'] = "<span class='edit'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=movesub&amp;member_id=" . $user_object->ID . "", 'movesub-member-' . $user_object->ID) . "'>" . __('Move', 'membership') . "</a></span>";
  1550. $actions['drop'] = "<span class='edit delete'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=dropsub&amp;member_id=" . $user_object->ID . "", 'dropsub-member-' . $user_object->ID) . "'>" . __('Drop', 'membership') . "</a></span>";
  1551. }
  1552. }
  1553. ?>
  1554. <div class="row-actions"><?php echo implode(" | ", $actions); ?></div>
  1555. </td>
  1556. <td <?php echo $style; ?>>
  1557. <?php
  1558. $levels = $user_object->get_level_ids();
  1559. if(!empty($levels)) {
  1560. $rows = array();
  1561. foreach((array) $levels as $key => $value) {
  1562. $level = new M_Level ( $value->level_id );
  1563. if(!empty($level)) {
  1564. if((int) $value->sub_id != 0) {
  1565. $rows[] = "<strong>" . $level->level_title() . "</strong>";
  1566. } else {
  1567. $rows[] = $level->level_title();
  1568. }
  1569. }
  1570. }
  1571. echo implode(", ", $rows);
  1572. }
  1573. $actions = array();
  1574. if(!$user_object->has_cap('membershipadmin')) {
  1575. $actions['add'] = "<span class='edit'><a href='?page={$page}&amp;action=addlevel&amp;member_id={$user_object->ID}'>" . __('Add', 'membership') . "</a></span>";
  1576. }
  1577. if(!empty($levels)) {
  1578. if(count($levels) == 1) {
  1579. $actions['move'] = "<span class='edit'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=movelevel&amp;member_id=" . $user_object->ID . "&amp;fromlevel=" . $levels[0]->level_id, 'movelevel-member-' . $user_object->ID) . "'>" . __('Move', 'membership') . "</a></span>";
  1580. $actions['drop'] = "<span class='edit delete'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=droplevel&amp;member_id=" . $user_object->ID . "&amp;fromlevel=" . $levels[0]->level_id, 'droplevel-member-' . $user_object->ID) . "'>" . __('Drop', 'membership') . "</a></span>";
  1581. } else {
  1582. $actions['move'] = "<span class='edit'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=movelevel&amp;member_id=" . $user_object->ID . "", 'movelevel-member-' . $user_object->ID) . "'>" . __('Move', 'membership') . "</a></span>";
  1583. $actions['drop'] = "<span class='edit delete'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=droplevel&amp;member_id=" . $user_object->ID . "", 'droplevel-member-' . $user_object->ID) . "'>" . __('Drop', 'membership') . "</a></span>";
  1584. }
  1585. }
  1586. ?>
  1587. <div class="row-actions"><?php echo implode(" | ", $actions); ?></div>
  1588. </td>
  1589. <td <?php echo $style; ?>>
  1590. <?php
  1591. $subs = $user_object->get_relationships();
  1592. if($subs) {
  1593. $exps = array();
  1594. foreach($subs as $sub) {
  1595. $exps[] = date("Y-m-d H:i", mysql2date("U", $sub->expirydate));
  1596. }
  1597. echo implode(", ", $exps);
  1598. }
  1599. ?>
  1600. </td>
  1601. <td <?php echo $style; ?>>
  1602. <?php
  1603. $subs = $user_object->get_relationships();
  1604. //print_r($subs);
  1605. if($subs) {
  1606. $gates = array();
  1607. foreach($subs as $sub) {
  1608. $gates[] = $sub->usinggateway;
  1609. }
  1610. echo implode(", ", $gates);
  1611. if($user_object->has_cap('membershipadmin')) {
  1612. $actions = array();
  1613. } else {
  1614. $actions = array();
  1615. if(count($gates) == 1) {
  1616. $actions['move'] = "<span class='edit'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=movegateway&amp;member_id=" . $user_object->ID . "&amp;fromgateway=" . $gates[0], 'movegateway-member-' . $user_object->ID) . "'>" . __('Move', 'membership') . "</a></span>";
  1617. } else {
  1618. $actions['move'] = "<span class='edit'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=movegateway&amp;member_id=" . $user_object->ID . "", 'movegateway-member-' . $user_object->ID) . "'>" . __('Move', 'membership') . "</a></span>";
  1619. }
  1620. }
  1621. ?>
  1622. <div class="row-actions"><?php echo implode(" | ", $actions); ?></div>
  1623. <?php
  1624. }
  1625. ?>
  1626. </td>
  1627. </tr>
  1628. <?php
  1629. }
  1630. ?>
  1631. </tbody>
  1632. </table>
  1633. <div class="tablenav">
  1634. <div class="alignleft actions">
  1635. <select name="action2">
  1636. <option selected="selected" value=""><?php _e('Bulk Actions','membership'); ?></option>
  1637. <option value="toggle"><?php _e('Toggle activation','membership'); ?></option>
  1638. <optgroup label="<?php _e('Subscriptions','membership'); ?>">
  1639. <option value="bulkaddsub"><?php _e('Add subscription','membership'); ?></option>
  1640. <option value="bulkmovesub"><?php _e('Move subscription','membership'); ?></option>
  1641. <option value="bulkdropsub"><?php _e('Drop subscription','membership'); ?></option>
  1642. </optgroup>
  1643. <optgroup label="<?php _e('Levels','membership'); ?>">
  1644. <option value="bulkaddlevel"><?php _e('Add level','membership'); ?></option>
  1645. <option value="bulkmovelevel"><?php _e('Move level','membership'); ?></option>
  1646. <option value="bulkdroplevel"><?php _e('Drop level','membership'); ?></option>
  1647. </optgroup>
  1648. <optgroup label="<?php _e('Gateways','membership'); ?>">
  1649. <option value="bulkmovegateway"><?php _e('Move gateway','membership'); ?></option>
  1650. </optgroup>
  1651. </select>
  1652. <input type="submit" class="button-secondary action" id="doaction2" name="doaction2" value="Apply">
  1653. <select name="sub_op2">
  1654. <option value=""><?php _e('Filter by subscription','membership'); ?></option>
  1655. <?php
  1656. $subs = $this->get_subscriptions();
  1657. if($subs) {
  1658. foreach($subs as $key => $sub) {
  1659. ?>
  1660. <option value="<?php echo $sub->id; ?>" <?php if(isset($_GET['sub_op2']) && $_GET['sub_op2'] == $sub->id) echo 'selected="selected"'; ?>><?php echo esc_html($sub->sub_name); ?></option>
  1661. <?php
  1662. }
  1663. }
  1664. ?>
  1665. </select>
  1666. <input type="submit" class="button-secondary action" id="doactionsub2" name="doactionsub2" value="<?php _e('Filter','membership'); ?>">
  1667. <select name="level_op2">
  1668. <option value=""><?php _e('Filter by level','membership'); ?></option>
  1669. <?php
  1670. $levels = $this->get_membership_levels();
  1671. if($levels) {
  1672. foreach($levels as $key => $level) {
  1673. ?>
  1674. <option value="<?php echo $level->id; ?>" <?php if(isset($_GET['level_op2']) && $_GET['level_op2'] == $level->id) echo 'selected="selected"'; ?>><?php echo esc_html($level->level_title); ?></option>
  1675. <?php
  1676. }
  1677. }
  1678. ?>
  1679. </select>
  1680. <input type="submit" class="button-secondary action" id="doactionlevel2" name="doactionlevel2" value="<?php _e('Filter','membership'); ?>">
  1681. <select name="active_op2">
  1682. <option value=""><?php _e('Filter by status','membership'); ?></option>
  1683. <option value="yes" <?php if(isset($_GET['active_op2']) && $_GET['active_op2'] == 'yes') echo 'selected="selected"'; ?>><?php _e('Active','membership'); ?></option>
  1684. <option value="no" <?php if(isset($_GET['active_op2']) && $_GET['active_op2'] == 'no') echo 'selected="selected"'; ?>><?php _e('Inactive','membership'); ?></option>
  1685. </select>
  1686. <input type="submit" class="button-secondary action" id="doactionactive2" name="doactionactive2" value="<?php _e('Filter','membership'); ?>">
  1687. </div>
  1688. <div class="alignright actions">
  1689. </div>
  1690. <br class="clear">
  1691. </div>
  1692. </form>
  1693. </div> <!-- wrap -->
  1694. <?php
  1695. }
  1696. function handle_options_panel_updates() {
  1697. global $action, $page, $wp_rewrite;
  1698. wp_reset_vars( array('action', 'page') );
  1699. if($action == 'updateoptions') {
  1700. check_admin_referer('update-membership-options');
  1701. if(isset($_GET['tab'])) {
  1702. $tab = $_GET['tab'];
  1703. } else {
  1704. $tab = 'general';
  1705. }
  1706. if(defined('MEMBERSHIP_GLOBAL_TABLES') && MEMBERSHIP_GLOBAL_TABLES === true) {
  1707. if(function_exists('get_blog_option')) {
  1708. if(function_exists('switch_to_blog')) {
  1709. switch_to_blog(MEMBERSHIP_GLOBAL_MAINSITE);
  1710. }
  1711. $M_options = get_blog_option(MEMBERSHIP_GLOBAL_MAINSITE, 'membership_options', array());
  1712. } else {
  1713. $M_options = get_option('membership_options', array());
  1714. }
  1715. } else {
  1716. $M_options = get_option('membership_options', array());
  1717. }
  1718. switch($tab) {
  1719. case 'general': $M_options['strangerlevel'] = (isset($_POST['strangerlevel'])) ? (int) $_POST['strangerlevel'] : '';
  1720. $M_options['freeusersubscription'] = (isset($_POST['freeusersubscription'])) ? (int) $_POST['freeusersubscription'] : '';
  1721. $M_options['enableincompletesignups'] = (isset($_POST['enableincompletesignups'])) ? $_POST['enableincompletesignups'] : '';
  1722. break;
  1723. case 'pages': $M_options['nocontent_page'] = (isset($_POST['nocontent_page'])) ? $_POST['nocontent_page'] : '';
  1724. $M_options['account_page'] = (isset($_POST['account_page'])) ? $_POST['account_page'] : '';
  1725. $M_options['registration_page'] = (isset($_POST['registration_page'])) ? $_POST['registration_page'] : '';
  1726. $M_options['registrationcompleted_page'] = (isset($_POST['registrationcompleted_page'])) ? $_POST['registrationcompleted_page'] : '';
  1727. $M_options['subscriptions_page'] = (isset($_POST['subscriptions_page'])) ? $_POST['subscriptions_page'] : '';
  1728. $M_options['formtype'] = (isset($_POST['formtype'])) ? $_POST['formtype'] : '';
  1729. break;
  1730. case 'posts': $M_options['membershipshortcodes'] = (isset($_POST['membershipshortcodes'])) ? explode("\n", $_POST['membershipshortcodes']) : array();
  1731. $M_options['membershipadminshortcodes'] = (isset($_POST['membershipadminshortcodes'])) ? explode("\n", $_POST['membershipadminshortcodes']) : array();
  1732. $M_options['shortcodemessage'] = (isset($_POST['shortcodemessage'])) ? $_POST['shortcodemessage'] : '';
  1733. $M_options['moretagdefault'] = (isset($_POST['moretagdefault'])) ? $_POST['moretagdefault'] : '';
  1734. $M_options['moretagmessage'] = (isset($_POST['moretagmessage'])) ? $_POST['moretagmessage'] : '';
  1735. break;
  1736. case 'downloads': $M_options['original_url'] = (isset($_POST['original_url'])) ? $_POST['original_url'] : '';
  1737. $M_options['masked_url'] = (isset($_POST['masked_url'])) ? $_POST['masked_url'] : '';
  1738. $M_options['membershipdownloadgroups'] = (isset($_POST['membershipdownloadgroups'])) ? explode("\n", $_POST['membershipdownloadgroups']) : array();
  1739. $M_options['protection_type'] = (isset($_POST['protection_type'])) ? $_POST['protection_type'] : '';
  1740. // Refresh the rewrite rules in case they've switched to hybrid from an earlier version
  1741. flush_rewrite_rules();
  1742. break;
  1743. case 'users': $wp_user_search = new WP_User_Query( array( 'role' => 'administrator' ) );
  1744. $admins = $wp_user_search->get_results();
  1745. $user_id = get_current_user_id();
  1746. foreach($admins as $admin) {
  1747. if($user_id == $admin->ID) {
  1748. continue;
  1749. } else {
  1750. if(in_array( $admin->ID, (array) $_POST['admincheck'])) {
  1751. $user = new WP_User( $admin->ID );
  1752. if(!$user->has_cap('membershipadmin')) {
  1753. $user->add_cap('membershipadmin');
  1754. }
  1755. } else {
  1756. $user = new WP_User( $admin->ID );
  1757. if($user->has_cap('membershipadmin')) {
  1758. $user->remove_cap('membershipadmin');
  1759. }
  1760. }
  1761. }
  1762. }
  1763. break;
  1764. case 'extras': $M_options['paymentcurrency'] = (isset($_POST['paymentcurrency'])) ? $_POST['paymentcurrency'] : '';
  1765. $M_options['upgradeperiod'] = (isset($_POST['upgradeperiod'])) ? $_POST['upgradeperiod'] : '';
  1766. $M_options['renewalperiod'] = (isset($_POST['renewalperiod'])) ? $_POST['renewalperiod'] : '';
  1767. $M_options['show_coupons_form'] = (isset($_POST['show_coupons_form'])) ? $_POST['show_coupons_form'] : '';
  1768. if(isset($_POST['membershipwizard']) && $_POST['membershipwizard'] == 'yes') {
  1769. if(defined('MEMBERSHIP_GLOBAL_TABLES') && MEMBERSHIP_GLOBAL_TABLES === true) {
  1770. if(function_exists('update_blog_option')) {
  1771. update_blog_option(MEMBERSHIP_GLOBAL_MAINSITE, 'membership_wizard_visible', 'yes');
  1772. } else {
  1773. update_option('membership_wizard_visible', 'yes');
  1774. }
  1775. } else {
  1776. update_option('membership_wizard_visible', 'yes');
  1777. }
  1778. }
  1779. break;
  1780. default:
  1781. break;
  1782. }
  1783. // included an action here so that it is processed for all tabs
  1784. do_action('membership_option_menu_process_' . $tab);
  1785. // For future upgrades
  1786. $M_options['registration_tos'] = (isset($_POST['registration_tos'])) ? $_POST['registration_tos'] : '';
  1787. if(defined('MEMBERSHIP_GLOBAL_TABLES') && MEMBERSHIP_GLOBAL_TABLES === true) {
  1788. if(function_exists('update_blog_option')) {
  1789. update_blog_option(MEMBERSHIP_GLOBAL_MAINSITE, 'membership_options', $M_options);
  1790. } else {
  1791. update_option('membership_options', $M_options);
  1792. }
  1793. } else {
  1794. update_option('membership_options', $M_options);
  1795. }
  1796. do_action( 'membership_options_page_process' );
  1797. // Always flush the rewrite rules
  1798. $wp_rewrite->flush_rules();
  1799. wp_safe_redirect( add_query_arg('msg', 1, wp_get_referer()) );
  1800. } elseif( !empty($action) ) {
  1801. if(defined('MEMBERSHIP_GLOBAL_TABLES') && MEMBERSHIP_GLOBAL_TABLES === true) {
  1802. if(function_exists('get_blog_option')) {
  1803. if(function_exists('switch_to_blog')) {
  1804. switch_to_blog(MEMBERSHIP_GLOBAL_MAINSITE);
  1805. }
  1806. $M_options = get_blog_option(MEMBERSHIP_GLOBAL_MAINSITE, 'membership_options', array());
  1807. } else {
  1808. $M_options = get_option('membership_options', array());
  1809. }
  1810. } else {
  1811. $M_options = get_option('membership_options', array());
  1812. }
  1813. switch($action) {
  1814. case 'createregistrationpage': check_admin_referer('create-registrationpage');
  1815. $pagedetails = array('post_title' => __('Register', 'membership'), 'post_name' => 'register', 'post_status' => 'publish', 'post_type' => 'page', 'post_content' => '');
  1816. $id = wp_insert_post( $pagedetails );
  1817. $M_options['registration_page'] = $id;
  1818. break;
  1819. case 'createaccountpage': check_admin_referer('create-accountpage');
  1820. $pagedetails = array('post_title' => __('Account', 'membership'), 'post_name' => 'account', 'post_status' => 'publish', 'post_type' => 'page', 'post_content' => '');
  1821. $id = wp_insert_post( $pagedetails );
  1822. $M_options['account_page'] = $id;
  1823. break;
  1824. case 'createsubscriptionspage': check_admin_referer('create-subscriptionspage');
  1825. $pagedetails = array('post_title' => __('Subscriptions', 'membership'), 'post_name' => 'subscriptions', 'post_status' => 'publish', 'post_type' => 'page', 'post_content' => '');
  1826. $id = wp_insert_post( $pagedetails );
  1827. $M_options['subscriptions_page'] = $id;
  1828. break;
  1829. case 'createnoaccesspage': check_admin_referer('create-noaccesspage');
  1830. $content = '<p>' . __('The content you are trying to access is only available to members. Sorry.','membership') . '</p>';
  1831. $pagedetails = array('post_title' => __('Protected Content', 'membership'), 'post_name' => 'protected', 'post_status' => 'publish', 'post_type' => 'page', 'post_content' => $content);
  1832. $id = wp_insert_post( $pagedetails );
  1833. $M_options['nocontent_page'] = $id;
  1834. break;
  1835. case 'createregistrationcompletedpage':
  1836. check_admin_referer('create-registrationcompletedpage');
  1837. $content = '<p>' . __('Thank you for subscribing. We hope you enjoy the content.','membership') . '</p>';
  1838. $pagedetails = array('post_title' => __('Welcome', 'membership'), 'post_name' => 'welcome', 'post_status' => 'publish', 'post_type' => 'page', 'post_content' => $content);
  1839. $id = wp_insert_post( $pagedetails );
  1840. $M_options['registrationcompleted_page'] = $id;
  1841. break;
  1842. }
  1843. if(defined('MEMBERSHIP_GLOBAL_TABLES') && MEMBERSHIP_GLOBAL_TABLES === true) {
  1844. if(function_exists('update_blog_option')) {
  1845. update_blog_option(MEMBERSHIP_GLOBAL_MAINSITE, 'membership_options', $M_options);
  1846. } else {
  1847. update_option('membership_options', $M_options);
  1848. }
  1849. } else {
  1850. update_option('membership_options', $M_options);
  1851. }
  1852. do_action( 'membership_options_pagecreation_process' );
  1853. wp_safe_redirect( add_query_arg('msg', 2, wp_get_referer()) );
  1854. }
  1855. }
  1856. function show_general_options() {
  1857. global $action, $page, $M_options;
  1858. $messages = array();
  1859. $messages[1] = __('Your options have been updated.','membership');
  1860. ?>
  1861. <div class="icon32" id="icon-options-general"><br></div>
  1862. <h2><?php _e('General Options','membership'); ?></h2>
  1863. <?php
  1864. if ( isset($_GET['msg']) ) {
  1865. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  1866. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  1867. }
  1868. ?>
  1869. <div id="poststuff" class="metabox-holder m-settings">
  1870. <form action='' method='post'>
  1871. <input type='hidden' name='page' value='<?php echo $page; ?>' />
  1872. <input type='hidden' name='action' value='updateoptions' />
  1873. <?php
  1874. wp_nonce_field('update-membership-options');
  1875. ?>
  1876. <div class="postbox">
  1877. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Stranger settings','membership'); ?></span></h3>
  1878. <div class="inside">
  1879. <p class='description'><?php _e('A &quot;stranger&quot; is a visitor to your website who is either not logged in, or does not have an active membership or subscription to your website.','membership'); ?></p>
  1880. <table class="form-table">
  1881. <tbody>
  1882. <tr valign="top">
  1883. <th scope="row"><?php _e('Use membership level','membership'); ?></th>
  1884. <td>
  1885. <select name='strangerlevel' id='strangerlevel'>
  1886. <option value="0"><?php _e('None - No access to content','membership'); ?></option>
  1887. <?php
  1888. $levels = $this->get_membership_levels();
  1889. if($levels) {
  1890. foreach($levels as $key => $level) {
  1891. ?>
  1892. <option value="<?php echo $level->id; ?>" <?php if(isset($M_options['strangerlevel']) && $M_options['strangerlevel'] == $level->id) echo "selected='selected'"; ?>><?php echo esc_html($level->level_title); ?></option>
  1893. <?php
  1894. }
  1895. }
  1896. ?>
  1897. </select>
  1898. </td>
  1899. </tr>
  1900. </tbody>
  1901. </table>
  1902. <p class='description'><?php _e('If the above is set to &quot;None&quot; then you can pick the page you want strangers directed to below in the &quot;Membership Pages&quot; options.','membership'); ?></p>
  1903. </div>
  1904. </div>
  1905. <div class="postbox">
  1906. <h3 class="hndle" style='cursor:auto;'><span><?php _e('User registration','membership'); ?></span></h3>
  1907. <div class="inside">
  1908. <p class='description'><?php _e('If you have free user registration enabled on your site, select the subscription they will be assigned to initially.','membership'); ?></p>
  1909. <p class='description'><?php _e('If you are using a paid subscription model - it is probably best to set this to &quot;none&quot;.','membership'); ?></p>
  1910. <table class="form-table">
  1911. <tbody>
  1912. <tr valign="top">
  1913. <th scope="row"><?php _e('Use subscription','membership'); ?></th>
  1914. <td>
  1915. <select name='freeusersubscription' id='freeusersubscription'>
  1916. <option value="0"><?php _e('None','membership'); ?></option>
  1917. <?php
  1918. $subs = $this->get_subscriptions( array('sub_status' => 'active'));
  1919. if($subs) {
  1920. foreach($subs as $key => $sub) {
  1921. ?>
  1922. <option value="<?php echo $sub->id; ?>" <?php if(isset($M_options['freeusersubscription']) && $M_options['freeusersubscription'] == $sub->id) echo "selected='selected'"; ?>><?php echo esc_html($sub->sub_name); ?></option>
  1923. <?php
  1924. }
  1925. }
  1926. ?>
  1927. </select>
  1928. </td>
  1929. </tr>
  1930. </tbody>
  1931. </table>
  1932. <?php
  1933. /*
  1934. <p class='description'><?php _e('The default setting for the membership plugin is to disable user accounts that do not complete their subscription signup.','membership'); ?></p>
  1935. <p class='description'><?php _e('If you want to change this, then use the option below.','membership'); ?></p>
  1936. <table class="form-table">
  1937. <tbody>
  1938. <tr valign="top">
  1939. <th scope="row"><?php _e('Enable incomplete signup accounts','membership'); ?>
  1940. </em>
  1941. </th>
  1942. <td>
  1943. <?php
  1944. if(!isset($M_options['enableincompletesignups'])) {
  1945. $M_options['enableincompletesignups'] = 'no';
  1946. }
  1947. ?>
  1948. <input type='checkbox' name='enableincompletesignups' id='enableincompletesignups' value='yes' <?php checked('yes', $M_options['enableincompletesignups']); ?> />
  1949. </td>
  1950. </tr>
  1951. </tbody>
  1952. </table>
  1953. */
  1954. ?>
  1955. </div>
  1956. </div>
  1957. <?php
  1958. do_action( 'membership_generaloptions_page' );
  1959. ?>
  1960. <p class="submit">
  1961. <input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e('Save Changes','membership'); ?>" />
  1962. </p>
  1963. </form>
  1964. </div>
  1965. <?php
  1966. }
  1967. function show_page_options() {
  1968. global $action, $page, $M_options;
  1969. $messages = array();
  1970. $messages[1] = __('Your options have been updated.','membership');
  1971. $messages[2] = __('Your page has been created.','membership');
  1972. ?>
  1973. <div class="icon32" id="icon-options-general"><br></div>
  1974. <h2><?php _e('Membership Page Options','membership'); ?></h2>
  1975. <?php
  1976. if ( isset($_GET['msg']) ) {
  1977. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  1978. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  1979. }
  1980. ?>
  1981. <div id="poststuff" class="metabox-holder m-settings">
  1982. <form action='' method='post'>
  1983. <input type='hidden' name='page' value='<?php echo $page; ?>' />
  1984. <input type='hidden' name='action' value='updateoptions' />
  1985. <?php
  1986. wp_nonce_field('update-membership-options');
  1987. ?>
  1988. <div class="postbox">
  1989. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Registration page','membership'); ?></span></h3>
  1990. <div class="inside">
  1991. <p class='description'><?php _e('This is the page a new user will be redirected to when they want to register on your site.','membership'); ?></p>
  1992. <p class='description'><?php _e('You can include an introduction on the page, for more advanced content around the registration form then you <strong>should</strong> include the [subscriptionform] shortcode in some location on that page. Alternatively leave the page blank for the standard Membership subscription forms.','membership'); ?></p>
  1993. <table class="form-table">
  1994. <tbody>
  1995. <tr valign="top">
  1996. <th scope="row"><?php _e('Registration page','membership'); ?>
  1997. <?php echo $this->_tips->add_tip( __('Select a page to use for the registration form. If you do not have one already, then click on <strong>Create Page</strong> to make one.','membership') ); ?>
  1998. </th>
  1999. <td>
  2000. <?php
  2001. if(!isset($M_options['registration_page'])) {
  2002. $M_options['registration_page'] = '';
  2003. }
  2004. $pages = wp_dropdown_pages(array('post_type' => 'page', 'selected' => $M_options['registration_page'], 'name' => 'registration_page', 'show_option_none' => __('None', 'membership'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
  2005. echo $pages;
  2006. ?>
  2007. &nbsp;<a href='<?php echo wp_nonce_url("admin.php?page=" . $page. "&amp;tab=pages&amp;action=createregistrationpage", 'create-registrationpage'); ?>' class='button-primary' title='<?php _e('Create a default page for the registration page and assign it here.', 'membership'); ?>'><?php _e('Create page', 'membership'); ?></a>
  2008. <?php if(!empty($M_options['registration_page'])) { ?>
  2009. <br/>
  2010. <a href='<?php echo get_permalink($M_options['registration_page']); ?>'><?php _e('view page','membership'); ?></a> | <a href='<?php echo admin_url('post.php?post=' . $M_options['registration_page'] . '&action=edit'); ?>'><?php _e('edit page','membership'); ?></a>
  2011. <?php } ?>
  2012. </td>
  2013. </tr>
  2014. </tbody>
  2015. </table>
  2016. <p class='description'><?php _e('There are two forms of registration form available, select the one you would like to use on your site below.','membership'); ?></p>
  2017. <table class="form-table">
  2018. <tbody>
  2019. <tr valign="top">
  2020. <th scope="row"><?php _e('Form type','membership'); ?>
  2021. <?php echo $this->_tips->add_tip( __('Choose between the original multi-page or Pop up registration methods.','membership') ); ?>
  2022. </th>
  2023. <td>
  2024. <select name='formtype' id='formtype'>
  2025. <option value="original" <?php if(isset($M_options['formtype']) && $M_options['formtype'] == 'original') echo "selected='selected'"; ?>><?php _e('Original membership form','membership'); ?></option>
  2026. <option value="new" <?php if(isset($M_options['formtype']) && $M_options['formtype'] == 'new') echo "selected='selected'"; ?>><?php _e('Popup registration form','membership'); ?></option>
  2027. </select>
  2028. </td>
  2029. </tr>
  2030. </tbody>
  2031. </table>
  2032. </div>
  2033. </div>
  2034. <div class="postbox">
  2035. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Registration completed page','membership'); ?></span></h3>
  2036. <div class="inside">
  2037. <p class='description'><?php _e('When a user has signed up for membership and completed any payments required, they will be redirected to this page.','membership'); ?></p>
  2038. <p class='description'><?php _e('You should include a welcome message on this page and some details on what to do next.','membership'); ?></p>
  2039. <table class="form-table">
  2040. <tbody>
  2041. <tr valign="top">
  2042. <th scope="row"><?php _e('Registration completed page','membership'); ?>
  2043. <?php echo $this->_tips->add_tip( __('Select a page to use for the Registration completed page. If you do not have one already, then click on <strong>Create Page</strong> to make one.','membership') ); ?>
  2044. </th>
  2045. <td>
  2046. <?php
  2047. if(!isset($M_options['registrationcompleted_page'])) {
  2048. $M_options['registrationcompleted_page'] = '';
  2049. }
  2050. $pages = wp_dropdown_pages(array('post_type' => 'page', 'selected' => $M_options['registrationcompleted_page'], 'name' => 'registrationcompleted_page', 'show_option_none' => __('Select a page', 'membership'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
  2051. echo $pages;
  2052. ?>
  2053. &nbsp;<a href='<?php echo wp_nonce_url("admin.php?page=" . $page. "&amp;tab=pages&amp;action=createregistrationcompletedpage", 'create-registrationcompletedpage'); ?>' class='button-primary' title='<?php _e('Create a default page for the registration completed page and assign it here.', 'membership'); ?>'><?php _e('Create page', 'membership'); ?></a>
  2054. <?php if(!empty($M_options['registrationcompleted_page'])) { ?>
  2055. <br/>
  2056. <a href='<?php echo get_permalink($M_options['registrationcompleted_page']); ?>'><?php _e('view page','membership'); ?></a> | <a href='<?php echo admin_url('post.php?post=' . $M_options['registrationcompleted_page'] . '&action=edit'); ?>'><?php _e('edit page','membership'); ?></a>
  2057. <?php } ?>
  2058. </td>
  2059. </tr>
  2060. </tbody>
  2061. </table>
  2062. </div>
  2063. </div>
  2064. <div class="postbox">
  2065. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Account page','membership'); ?></span></h3>
  2066. <div class="inside">
  2067. <p class='description'><?php _e('This is the page a user will be redirected to when they want to view their account or make a payment on their account.','membership'); ?></p>
  2068. <p class='description'><?php _e('It can be left blank to use the standard Membership interface, otherwise it can contain any content you want but <strong>should</strong> contain the [accountform] shortcode in some location.','membership'); ?></p>
  2069. <table class="form-table">
  2070. <tbody>
  2071. <tr valign="top">
  2072. <th scope="row"><?php _e('Account page','membership'); ?>
  2073. <?php echo $this->_tips->add_tip( __('Select a page to use for the account form. If you do not have one already, then click on <strong>Create Page</strong> to make one.','membership') ); ?>
  2074. </th>
  2075. <td>
  2076. <?php
  2077. if(!isset($M_options['account_page'])) {
  2078. $M_options['account_page'] = '';
  2079. }
  2080. $pages = wp_dropdown_pages(array('post_type' => 'page', 'selected' => $M_options['account_page'], 'name' => 'account_page', 'show_option_none' => __('Select a page', 'membership'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
  2081. echo $pages;
  2082. ?>
  2083. &nbsp;<a href='<?php echo wp_nonce_url("admin.php?page=" . $page. "&amp;tab=pages&amp;action=createaccountpage", 'create-accountpage'); ?>' class='button-primary' title='<?php _e('Create a default page for the account page and assign it here.', 'membership'); ?>'><?php _e('Create page', 'membership'); ?></a>
  2084. <?php if(!empty($M_options['account_page'])) { ?>
  2085. <br/>
  2086. <a href='<?php echo get_permalink($M_options['account_page']); ?>'><?php _e('view page','membership'); ?></a> | <a href='<?php echo admin_url('post.php?post=' . $M_options['account_page'] . '&action=edit'); ?>'><?php _e('edit page','membership'); ?></a>
  2087. <?php } ?>
  2088. </td>
  2089. </tr>
  2090. </tbody>
  2091. </table>
  2092. </div>
  2093. </div>
  2094. <div class="postbox">
  2095. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Subscriptions page','membership'); ?></span></h3>
  2096. <div class="inside">
  2097. <p class='description'><?php _e('This is the page a user will be redirected to when they want to view their subscription details and upgrade / renew them.','membership'); ?></p>
  2098. <p class='description'><?php _e('It can be left blank to use the standard Membership interface, otherwise it can contain any content you want but <strong>should</strong> contain the [renewform] shortcode in some location.','membership'); ?></p>
  2099. <table class="form-table">
  2100. <tbody>
  2101. <tr valign="top">
  2102. <th scope="row"><?php _e('Subscriptions page','membership'); ?>
  2103. <?php echo $this->_tips->add_tip( __('Select a page to use for the upgrade form. If you do not have one already, then click on <strong>Create Page</strong> to make one.','membership') ); ?>
  2104. </th>
  2105. <td>
  2106. <?php
  2107. if(!isset($M_options['subscriptions_page'])) {
  2108. $M_options['subscriptions_page'] = '';
  2109. }
  2110. $pages = wp_dropdown_pages(array('post_type' => 'page', 'selected' => $M_options['subscriptions_page'], 'name' => 'subscriptions_page', 'show_option_none' => __('Select a page', 'membership'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
  2111. echo $pages;
  2112. ?>
  2113. &nbsp;<a href='<?php echo wp_nonce_url("admin.php?page=" . $page. "&amp;tab=pages&amp;action=createsubscriptionspage", 'create-subscriptionspage'); ?>' class='button-primary' title='<?php _e('Create a default page for the upgrade / renewal page and assign it here.', 'membership'); ?>'><?php _e('Create page', 'membership'); ?></a>
  2114. <?php if(!empty($M_options['subscriptions_page'])) { ?>
  2115. <br/>
  2116. <a href='<?php echo get_permalink($M_options['subscriptions_page']); ?>'><?php _e('view page','membership'); ?></a> | <a href='<?php echo admin_url('post.php?post=' . $M_options['subscriptions_page'] . '&action=edit'); ?>'><?php _e('edit page','membership'); ?></a>
  2117. <?php } ?>
  2118. </td>
  2119. </tr>
  2120. </tbody>
  2121. </table>
  2122. </div>
  2123. </div>
  2124. <div class="postbox">
  2125. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Protected content page','membership'); ?></span></h3>
  2126. <div class="inside">
  2127. <p class='description'><?php _e('If a post / page / content is not available to a user, this is the page that they user will be directed to.','membership'); ?></p>
  2128. <p class='description'><?php _e('This page will only be displayed if the user has tried to access the post / page / content directly or via a link.','membership'); ?></p>
  2129. <table class="form-table">
  2130. <tbody>
  2131. <tr valign="top">
  2132. <th scope="row"><?php _e('Protected content page','membership'); ?>
  2133. <?php echo $this->_tips->add_tip( __('Select a page to use for the Protected Content message. If you do not have one already, then click on <strong>Create Page</strong> to make one.','membership') ); ?>
  2134. </th>
  2135. <td>
  2136. <?php
  2137. if(!isset($M_options['nocontent_page'])) {
  2138. $M_options['nocontent_page'] = '';
  2139. }
  2140. $pages = wp_dropdown_pages(array('post_type' => 'page', 'selected' => $M_options['nocontent_page'], 'name' => 'nocontent_page', 'show_option_none' => __('Select a page', 'membership'), 'sort_column'=> 'menu_order, post_title', 'echo' => 0));
  2141. echo $pages;
  2142. ?>
  2143. &nbsp;<a href='<?php echo wp_nonce_url("admin.php?page=" . $page. "&amp;tab=pages&amp;action=createnoaccesspage", 'create-noaccesspage'); ?>' class='button-primary' title='<?php _e('Create a default page for the protected content page and assign it here.', 'membership'); ?>'><?php _e('Create page', 'membership'); ?></a>
  2144. <?php if(!empty($M_options['nocontent_page'])) { ?>
  2145. <br/>
  2146. <a href='<?php echo get_permalink($M_options['nocontent_page']); ?>'><?php _e('view page','membership'); ?></a> | <a href='<?php echo admin_url('post.php?post=' . $M_options['nocontent_page'] . '&action=edit'); ?>'><?php _e('edit page','membership'); ?></a>
  2147. <?php } ?>
  2148. </td>
  2149. </tr>
  2150. </tbody>
  2151. </table>
  2152. </div>
  2153. </div>
  2154. <?php
  2155. do_action( 'membership_pageoptions_page' );
  2156. ?>
  2157. <p class="submit">
  2158. <input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e('Save Changes','membership'); ?>" />
  2159. </p>
  2160. </form>
  2161. </div>
  2162. <?php
  2163. }
  2164. function show_downloads_options() {
  2165. global $action, $page, $M_options;
  2166. $messages = array();
  2167. $messages[1] = __('Your options have been updated.','membership');
  2168. ?>
  2169. <div class="icon32" id="icon-options-general"><br></div>
  2170. <h2><?php _e('Download / Media Options','membership'); ?></h2>
  2171. <?php
  2172. if ( isset($_GET['msg']) ) {
  2173. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  2174. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  2175. }
  2176. ?>
  2177. <div id="poststuff" class="metabox-holder m-settings">
  2178. <form action='' method='post'>
  2179. <input type='hidden' name='page' value='<?php echo $page; ?>' />
  2180. <input type='hidden' name='action' value='updateoptions' />
  2181. <?php
  2182. wp_nonce_field('update-membership-options');
  2183. ?>
  2184. <div class="postbox">
  2185. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Downloads / Media protection','membership'); ?></span></h3>
  2186. <div class="inside">
  2187. <p class='description'><?php _e('Downloads and media files can be protected by remapping their perceived location.','membership'); ?></p>
  2188. <p class='description'><?php _e('Note: If a user determines a files actual location on your server, there is very little we can do to prevent its download, so please be careful about giving out URLs.','membership'); ?></p>
  2189. <table class="form-table">
  2190. <tbody>
  2191. <tr valign="top">
  2192. <th scope="row"><?php _e('Protection method','membership'); ?>
  2193. <?php echo $this->_tips->add_tip( __('The method of protection can be changed depending on your needs. Membership offers three methods, <strong>Basic</strong> masks your media directory but leaves any filenames the same, <strong>Complete</strong> masks the media directory and changes the image filename as well and <strong>Hybrid</strong> is for use if you are using a host or server that has a problem with the system (such as some installs of nginx).','membership') ); ?>
  2194. </th>
  2195. <td>
  2196. <?php if( empty($M_options['protection_type']) ) $M_options['protection_type'] = 'basic'; ?>
  2197. <input type='radio' name='protection_type' value='basic' <?php checked($M_options['protection_type'], 'basic'); ?> />&nbsp;&nbsp;<?php echo __('Basic protection','membership'); ?><br/>
  2198. <input type='radio' name='protection_type' value='complete' <?php checked($M_options['protection_type'], 'complete'); ?>/>&nbsp;&nbsp;<?php echo __('Complete protection','membership'); ?><br/>
  2199. <input type='radio' name='protection_type' value='hybrid' <?php checked($M_options['protection_type'], 'hybrid'); ?>/>&nbsp;&nbsp;<?php echo __('Hybrid protection','membership'); ?><br/>
  2200. </td>
  2201. </tr>
  2202. <tr valign="top">
  2203. <th scope="row"><?php _e('Your uploads location','membership'); ?>
  2204. <?php echo $this->_tips->add_tip( __('This is where membership thinks you have your images stored, if this is not correct then download protection may not work correctly.','membership') ); ?>
  2205. </th>
  2206. <td>
  2207. <?php echo membership_upload_url(); ?>
  2208. </td>
  2209. </tr>
  2210. <tr valign="top">
  2211. <th scope="row"><?php _e('Masked download URL','membership'); ?>
  2212. <?php echo $this->_tips->add_tip( __('This is the URL that the user will see. You can change the end part to something unique.','membership') ); ?>
  2213. </th>
  2214. <td>
  2215. <?php
  2216. if(!isset($M_options['masked_url'])) {
  2217. $M_options['masked_url'] = '';
  2218. }
  2219. esc_html_e(trailingslashit(get_option('home'))); ?>&nbsp;<input type='text' name='masked_url' id='masked_url' value='<?php esc_attr_e($M_options['masked_url']);
  2220. ?>' />&nbsp;/
  2221. </td>
  2222. </tr>
  2223. <tr valign="top">
  2224. <th scope="row"><?php _e('Protected groups','membership'); ?>
  2225. <?php echo $this->_tips->add_tip( __('Place each download group name on a new line, removing used groups will leave content visible to all users/members.','membership') ); ?>
  2226. </th>
  2227. <td>
  2228. <textarea name='membershipdownloadgroups' id='membershipdownloadgroups' rows='10' cols='40'><?php
  2229. if(!empty($M_options['membershipdownloadgroups'])) {
  2230. foreach($M_options['membershipdownloadgroups'] as $key => $value) {
  2231. if(!empty($value)) {
  2232. esc_html_e(stripslashes($value)) . "\n";
  2233. }
  2234. }
  2235. }
  2236. ?></textarea>
  2237. </td>
  2238. </tr>
  2239. </tbody>
  2240. </table>
  2241. </div>
  2242. </div>
  2243. <?php
  2244. do_action( 'membership_downloadsoptions_page' );
  2245. ?>
  2246. <p class="submit">
  2247. <input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e('Save Changes','membership'); ?>" />
  2248. </p>
  2249. </form>
  2250. </div>
  2251. <?php
  2252. }
  2253. function show_posts_options() {
  2254. global $action, $page, $M_options;
  2255. $messages = array();
  2256. $messages[1] = __('Your options have been updated.','membership');
  2257. ?>
  2258. <div class="icon32" id="icon-options-general"><br></div>
  2259. <h2><?php _e('Content Protection Options','membership'); ?></h2>
  2260. <?php
  2261. if ( isset($_GET['msg']) ) {
  2262. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  2263. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  2264. }
  2265. ?>
  2266. <div id="poststuff" class="metabox-holder m-settings">
  2267. <form action='' method='post'>
  2268. <input type='hidden' name='page' value='<?php echo $page; ?>' />
  2269. <input type='hidden' name='action' value='updateoptions' />
  2270. <?php
  2271. wp_nonce_field('update-membership-options');
  2272. ?>
  2273. <div class="postbox">
  2274. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Shortcode protected content','membership'); ?></span></h3>
  2275. <div class="inside">
  2276. <p class='description'><?php _e('You can protect parts of a post or pages content by enclosing it in WordPress shortcodes.','membership'); ?></p>
  2277. <p class='description'><?php _e("Each level you create has it's own shortcode. The shortcodes that are available to use are shown below.",'membership'); ?></p>
  2278. <table class="form-table">
  2279. <tbody>
  2280. <?php if(!empty($M_options['membershipshortcodes'])) { ?>
  2281. <tr valign="top">
  2282. <th scope="row"><?php _e('Available Shortcodes','membership'); ?>
  2283. <?php echo $this->_tips->add_tip( __('Each shortcode can be used to wrap protected content such as [shortcode] Protected content [/shortcode]','membership') ); ?>
  2284. </th>
  2285. <td>
  2286. <?php
  2287. $written = false;
  2288. if(!empty($M_options['membershipshortcodes'])) {
  2289. ?>
  2290. <input name='membershipshortcodes' type='hidden' value='<?php
  2291. foreach($M_options['membershipshortcodes'] as $key => $value) {
  2292. if(!empty($value)) {
  2293. $written = true;
  2294. echo esc_html(stripslashes($value)) . "\n";
  2295. }
  2296. }
  2297. ?>' />
  2298. <?php
  2299. if($written == true) {
  2300. foreach($M_options['membershipshortcodes'] as $key => $value) {
  2301. if(!empty($value)) {
  2302. echo "[" . esc_html(stripslashes($value)) . "]<br/>";
  2303. }
  2304. }
  2305. }
  2306. // Bring in the level based shortcodes to the list here
  2307. $shortcodes = apply_filters('membership_level_shortcodes', array() );
  2308. if(!empty($shortcodes)) {
  2309. foreach($shortcodes as $key => $value) {
  2310. if(!empty($value)) {
  2311. $written = true;
  2312. echo "[" . esc_html(stripslashes($value)) . "]<br/>";
  2313. }
  2314. }
  2315. }
  2316. }
  2317. if($written == false) {
  2318. echo __('No shortcodes available.','membership');
  2319. }
  2320. ?>
  2321. </td>
  2322. </tr>
  2323. <?php } ?>
  2324. <tr valign="top">
  2325. <th scope="row"><?php _e('Protected content message','membership'); ?>
  2326. <?php echo $this->_tips->add_tip( __("This is the message that is displayed when the content protected by the shortcode can't be shown. Leave blank for no message. HTML allowed.",'membership') ); ?>
  2327. </th>
  2328. <td>
  2329. <?php
  2330. $args = array("textarea_name" => "shortcodemessage");
  2331. if(!isset($M_options['shortcodemessage'])) {
  2332. $M_options['shortcodemessage'] = '';
  2333. }
  2334. wp_editor( stripslashes($M_options['shortcodemessage']), "shortcodemessage", $args );
  2335. /*
  2336. ?>
  2337. <textarea name='shortcodemessage' id='shortcodemessage' rows='10' cols='80'><?php esc_html_e(stripslashes($M_options['shortcodemessage'])); ?></textarea>
  2338. <?php
  2339. */
  2340. ?>
  2341. </td>
  2342. </tr>
  2343. </tbody>
  2344. </table>
  2345. </div>
  2346. </div>
  2347. <div class="postbox">
  2348. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Admin only shortcodes','membership'); ?></span></h3>
  2349. <div class="inside">
  2350. <p class='description'><?php _e('Sometimes plugins create custom shortcodes but only register them in the public part of your site. This means that the Membership plugin admin interface will not be able to show them in the Shortcode rule.','membership'); ?></p>
  2351. <p class='description'><?php _e('If you find that a shortcode you want to protect is missing from the shortcode rule, then you can add it here.','membership'); ?></p>
  2352. <table class="form-table">
  2353. <tbody>
  2354. <tr valign="top">
  2355. <th scope="row"><?php _e('Admin Only Shortcodes','membership'); ?>
  2356. <?php echo $this->_tips->add_tip( __("Place each shortcode text (without the square brackets) on a new line, removing used shortcodes could leave content visible to all users/members.",'membership') ); ?>
  2357. </th>
  2358. <td>
  2359. <textarea name='membershipadminshortcodes' id='membershipadminshortcodes' rows='10' cols='40'><?php
  2360. if(!empty($M_options['membershipadminshortcodes'])) {
  2361. foreach($M_options['membershipadminshortcodes'] as $key => $value) {
  2362. if(!empty($value)) {
  2363. esc_html_e(stripslashes($value)) . "\n";
  2364. }
  2365. }
  2366. }
  2367. ?></textarea>
  2368. </td>
  2369. </tr>
  2370. </tbody>
  2371. </table>
  2372. </div>
  2373. </div>
  2374. <div class="postbox">
  2375. <h3 class="hndle" style='cursor:auto;'><span><?php _e('More tag default','membership'); ?></span></h3>
  2376. <div class="inside">
  2377. <p class='description'><?php _e('Content placed after the More tag in a post or page can be protected by setting the visibility below. This setting can be overridden within each individual level.','membership'); ?></p>
  2378. <table class="form-table">
  2379. <tbody>
  2380. <tr valign="top">
  2381. <th scope="row"><?php _e('Show content after the More tag','membership'); ?></th>
  2382. <td>
  2383. <select name='moretagdefault' id='moretagdefault'>
  2384. <option value="yes" <?php if(isset($M_options['moretagdefault']) && $M_options['moretagdefault'] == 'yes') echo "selected='selected'"; ?>><?php _e('Yes - More tag content is visible','membership'); ?></option>
  2385. <option value="no" <?php if(isset($M_options['moretagdefault']) && $M_options['moretagdefault'] == 'no') echo "selected='selected'"; ?>><?php _e('No - More tag content not visible','membership'); ?></option>
  2386. </select>
  2387. </td>
  2388. </tr>
  2389. <tr valign="top">
  2390. <th scope="row"><?php _e('No access message','membership'); ?>
  2391. <?php echo $this->_tips->add_tip( __("This is the message that is displayed when the content protected by the moretag can't be shown. Leave blank for no message. HTML allowed.",'membership') ); ?>
  2392. </th>
  2393. <td>
  2394. <?php
  2395. $args = array("textarea_name" => "moretagmessage");
  2396. if(!isset($M_options['moretagmessage'])) {
  2397. $M_options['moretagmessage'] = '';
  2398. }
  2399. wp_editor( stripslashes($M_options['moretagmessage']), "moretagmessage", $args );
  2400. /*
  2401. ?>
  2402. <textarea name='moretagmessage' id='moretagmessage' rows='5' cols='40'><?php esc_html_e(stripslashes($M_options['moretagmessage'])); ?></textarea>
  2403. <?php
  2404. */
  2405. ?>
  2406. </td>
  2407. </tr>
  2408. </tbody>
  2409. </table>
  2410. </div>
  2411. </div>
  2412. <?php
  2413. do_action( 'membership_postoptions_page' );
  2414. ?>
  2415. <p class="submit">
  2416. <input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e('Save Changes','membership'); ?>" />
  2417. </p>
  2418. </form>
  2419. </div>
  2420. <?php
  2421. }
  2422. function show_extras_options() {
  2423. global $action, $page, $M_options;
  2424. $messages = array();
  2425. $messages[1] = __('Your options have been updated.','membership');
  2426. ?>
  2427. <div class="icon32" id="icon-options-general"><br></div>
  2428. <h2><?php _e('Extra Options','membership'); ?></h2>
  2429. <?php
  2430. if ( isset($_GET['msg']) ) {
  2431. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  2432. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  2433. }
  2434. ?>
  2435. <div id="poststuff" class="metabox-holder m-settings">
  2436. <form action='' method='post'>
  2437. <input type='hidden' name='page' value='<?php echo $page; ?>' />
  2438. <input type='hidden' name='action' value='updateoptions' />
  2439. <?php
  2440. wp_nonce_field('update-membership-options');
  2441. ?>
  2442. <div class="postbox">
  2443. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Payments currency','membership'); ?></span></h3>
  2444. <div class="inside">
  2445. <p class='description'><?php _e('This is the currency that will be used across all gateways. Note: Some gateways have a limited number of currencies available.','membership'); ?></p>
  2446. <table class="form-table">
  2447. <tbody>
  2448. <tr valign="top">
  2449. <th scope="row"><?php _e('Payment currencys','membership'); ?></th>
  2450. <td>
  2451. <select name="paymentcurrency">
  2452. <?php
  2453. $currency = $M_options['paymentcurrency'];
  2454. $sel_currency = empty($currency) ? 'USD' : $currency;
  2455. $currencies = array(
  2456. 'AUD' => __('AUD - Australian Dollar','membership'),
  2457. 'BRL' => __('BRL - Brazilian Real','membership'),
  2458. 'CAD' => __('CAD - Canadian Dollar','membership'),
  2459. 'CHF' => __('CHF - Swiss Franc','membership'),
  2460. 'CZK' => __('CZK - Czech Koruna','membership'),
  2461. 'DKK' => __('DKK - Danish Krone','membership'),
  2462. 'EUR' => __('EUR - Euro','membership'),
  2463. 'GBP' => __('GBP - Pound Sterling','membership'),
  2464. 'HKD' => __('HKD - Hong Kong Dollar','membership'),
  2465. 'HUF' => __('HUF - Hungarian Forint','membership'),
  2466. 'ILS' => __('ILS - Israeli Shekel','membership'),
  2467. 'JPY' => __('JPY - Japanese Yen','membership'),
  2468. 'MYR' => __('MYR - Malaysian Ringgits','membership'),
  2469. 'MXN' => __('MXN - Mexican Peso','membership'),
  2470. 'NOK' => __('NOK - Norwegian Krone','membership'),
  2471. 'NZD' => __('NZD - New Zealand Dollar','membership'),
  2472. 'PHP' => __('PHP - Philippine Pesos','membership'),
  2473. 'PLN' => __('PLN - Polish Zloty','membership'),
  2474. 'SEK' => __('SEK - Swedish Krona','membership'),
  2475. 'SGD' => __('SGD - Singapore Dollar','membership'),
  2476. 'TWD' => __('TWD - Taiwan New Dollars','membership'),
  2477. 'THB' => __('THB - Thai Baht','membership'),
  2478. 'USD' => __('USD - U.S. Dollar','membership'),
  2479. 'ZAR' => __('ZAR - South African Rand')
  2480. );
  2481. $currencies = apply_filters('membership_available_currencies', $currencies);
  2482. foreach ($currencies as $key => $value) {
  2483. echo '<option value="' . esc_attr($key) . '"';
  2484. if($key == $sel_currency) echo 'selected="selected"';
  2485. echo '>' . esc_html($value) . '</option>' . "\n";
  2486. }
  2487. ?>
  2488. </select>
  2489. </td>
  2490. </tr>
  2491. </tbody>
  2492. </table>
  2493. </div>
  2494. </div>
  2495. <div class="postbox">
  2496. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Membership renewal','membership'); ?></span></h3>
  2497. <div class="inside">
  2498. <p class='description'><?php _e('If you are using single payment gateways, then you should set the number of days before expiry that the renewal form is displayed on the Account page.','membership'); ?></p>
  2499. <table class="form-table">
  2500. <tbody>
  2501. <tr valign="top">
  2502. <th scope="row"><?php _e('Renewal period limit','membership'); ?></th>
  2503. <td>
  2504. <select name="renewalperiod">
  2505. <?php
  2506. $renewalperiod = $M_options['renewalperiod'];
  2507. for($n=1; $n <= 365; $n++) {
  2508. echo '<option value="' . esc_attr($n) . '"';
  2509. if($n == $renewalperiod) echo 'selected="selected"';
  2510. echo '>' . esc_html($n) . '</option>' . "\n";
  2511. }
  2512. ?>
  2513. </select>&nbsp;<?php _e('day(s)','membership'); ?>
  2514. </td>
  2515. </tr>
  2516. </tbody>
  2517. </table>
  2518. </div>
  2519. </div>
  2520. <div class="postbox">
  2521. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Membership upgrades','membership'); ?></span></h3>
  2522. <div class="inside">
  2523. <p class='description'><?php _e('You should limit the amount of time allowed between membership upgrades in order to prevent members abusing the upgrade process.','membership'); ?></p>
  2524. <table class="form-table">
  2525. <tbody>
  2526. <tr valign="top">
  2527. <th scope="row"><?php _e('Upgrades period limit','membership'); ?></th>
  2528. <td>
  2529. <select name="upgradeperiod">
  2530. <?php
  2531. $upgradeperiod = $M_options['upgradeperiod'];
  2532. // Set a default of 1 day, but allow the selection of 0 days
  2533. if(empty($upgradeperiod) && $upgradeperiod != 0) {
  2534. $upgradeperiod = 1;
  2535. }
  2536. for($n=0; $n <= 365; $n++) {
  2537. echo '<option value="' . esc_attr($n) . '"';
  2538. if($n == $upgradeperiod) echo 'selected="selected"';
  2539. echo '>' . esc_html($n) . '</option>' . "\n";
  2540. }
  2541. ?>
  2542. </select>&nbsp;<?php _e('day(s)','membership'); ?>
  2543. </td>
  2544. </tr>
  2545. </tbody>
  2546. </table>
  2547. </div>
  2548. </div>
  2549. <div class="postbox">
  2550. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Membership wizard','membership'); ?></span></h3>
  2551. <div class="inside">
  2552. <p class='description'><?php _e('If you accidentally dismissed the membership wizard and would like to show it again, then check the box below.','membership'); ?></p>
  2553. <table class="form-table">
  2554. <tbody>
  2555. <tr valign="top">
  2556. <th scope="row"><?php _e('Show membership wizard','membership'); ?></th>
  2557. <td>
  2558. <?php
  2559. if(defined('MEMBERSHIP_GLOBAL_TABLES') && MEMBERSHIP_GLOBAL_TABLES === true) {
  2560. if(function_exists('get_blog_option')) {
  2561. if(function_exists('switch_to_blog')) {
  2562. switch_to_blog(MEMBERSHIP_GLOBAL_MAINSITE);
  2563. }
  2564. $wizard_visible = get_blog_option(MEMBERSHIP_GLOBAL_MAINSITE, 'membership_wizard_visible', 'yes');
  2565. if(function_exists('restore_current_blog')) {
  2566. restore_current_blog();
  2567. }
  2568. } else {
  2569. $wizard_visible = get_option('membership_wizard_visible', 'yes');
  2570. }
  2571. } else {
  2572. $wizard_visible = get_option('membership_wizard_visible', 'yes');
  2573. }
  2574. ?>
  2575. <input type='checkbox' name='membershipwizard' value='yes' <?php if($wizard_visible == 'yes') echo "checked='checked'"; ?>/>
  2576. </td>
  2577. </tr>
  2578. </tbody>
  2579. </table>
  2580. </div>
  2581. </div>
  2582. <div class="postbox">
  2583. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Coupons','membership'); ?></span></h3>
  2584. <div class="inside">
  2585. <p class='description'><?php _e('If you want to enable Coupons on your site then check the box below.','membership'); ?></p>
  2586. <table class="form-table">
  2587. <tbody>
  2588. <tr valign="top">
  2589. <th scope="row"><?php _e('Show coupon form','membership'); ?></th>
  2590. <td>
  2591. <?php
  2592. $coupon_visible = (isset($M_options['show_coupons_form'])) ? $M_options['show_coupons_form'] : 'yes';
  2593. ?>
  2594. <input type='checkbox' name='show_coupons_form' value='yes' <?php if($coupon_visible == 'yes') echo "checked='checked'"; ?>/>
  2595. </td>
  2596. </tr>
  2597. </tbody>
  2598. </table>
  2599. </div>
  2600. </div>
  2601. <?php
  2602. do_action( 'membership_extrasoptions_page' );
  2603. ?>
  2604. <p class="submit">
  2605. <input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e('Save Changes','membership'); ?>" />
  2606. </p>
  2607. </form>
  2608. </div>
  2609. <?php
  2610. }
  2611. function show_users_options() {
  2612. global $action, $page, $M_options;
  2613. $messages = array();
  2614. $messages[1] = __('Membership admins have been updated.','membership');
  2615. ?>
  2616. <div class="icon32" id="icon-options-general"><br></div>
  2617. <h2><?php _e('Membership Admin Users','membership'); ?></h2>
  2618. <?php
  2619. if ( isset($_GET['msg']) ) {
  2620. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  2621. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  2622. }
  2623. ?>
  2624. <div id="poststuff" class="metabox-holder m-settings">
  2625. <form action='' method='post'>
  2626. <input type='hidden' name='page' value='<?php echo $page; ?>' />
  2627. <input type='hidden' name='action' value='updateoptions' />
  2628. <?php
  2629. wp_nonce_field('update-membership-options');
  2630. ?>
  2631. <div class="postbox">
  2632. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Membership Admin Users','membership'); ?></span></h3>
  2633. <div class="inside">
  2634. <p class='description'><?php _e('You can add or remove the ability for specific admin user accounts to manage the Membership plugin by checking or unchecking the boxes next to the relevant username.','membership'); ?></p>
  2635. <?php
  2636. $columns = array( "name" => __('User Login','membership')
  2637. );
  2638. $columns = apply_filters('membership_adminuserscolumns', $columns);
  2639. $wp_user_search = new WP_User_Query( array( 'role' => 'administrator' ) );
  2640. $admins = $wp_user_search->get_results();
  2641. ?>
  2642. <table cellspacing="0" class="widefat fixed">
  2643. <thead>
  2644. <tr>
  2645. <th style="" class="manage-column column-cb check-column" id="cb" scope="col"><input type="checkbox"></th>
  2646. <?php
  2647. foreach($columns as $key => $col) {
  2648. ?>
  2649. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  2650. <?php
  2651. }
  2652. ?>
  2653. </tr>
  2654. </thead>
  2655. <tfoot>
  2656. <tr>
  2657. <th style="" class="manage-column column-cb check-column" scope="col"><input type="checkbox"></th>
  2658. <?php
  2659. reset($columns);
  2660. foreach($columns as $key => $col) {
  2661. ?>
  2662. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  2663. <?php
  2664. }
  2665. ?>
  2666. </tr>
  2667. </tfoot>
  2668. <tbody>
  2669. <?php
  2670. if(!empty($admins)) {
  2671. $user_id = get_current_user_id();
  2672. foreach($admins as $key => $admin) {
  2673. ?>
  2674. <tr valign="middle" class="alternate" id="admin-<?php echo $admin->ID; ?>">
  2675. <th class="check-column" scope="row">
  2676. <?php if($user_id != $admin->ID) {
  2677. $user = new WP_User( $admin->ID );
  2678. if($user->has_cap('membershipadmin')) {
  2679. ?>
  2680. <input type="checkbox" value="<?php echo esc_attr($admin->ID); ?>" name="admincheck[]" checked='checked'>
  2681. <?php
  2682. } else {
  2683. ?>
  2684. <input type="checkbox" value="<?php echo esc_attr($admin->ID); ?>" name="admincheck[]" >
  2685. <?php
  2686. }
  2687. } ?>
  2688. </th>
  2689. <td class="column-name">
  2690. <strong><?php echo esc_html(stripslashes($admin->user_login)); ?></strong><br/>
  2691. <?php
  2692. if($user_id == $admin->ID) {
  2693. _e('You can not remove your own permissions to manage the membership system whilst logged in.', 'membership');
  2694. }
  2695. ?>
  2696. </td>
  2697. </tr>
  2698. <?php
  2699. }
  2700. } else {
  2701. $columncount = count($columns) + 1;
  2702. ?>
  2703. <tr valign="middle" class="alternate" >
  2704. <td colspan="<?php echo $columncount; ?>" scope="row"><?php _e('There are no Admin users - something may have gone wrong.','membership'); ?></td>
  2705. </tr>
  2706. <?php
  2707. }
  2708. ?>
  2709. </tbody>
  2710. </table>
  2711. </div>
  2712. </div>
  2713. <?php
  2714. do_action( 'membership_adminusersoptions_page' );
  2715. ?>
  2716. <p class="submit">
  2717. <input type="submit" name="Submit" class="button-primary" value="<?php esc_attr_e('Save Changes','membership'); ?>" />
  2718. </p>
  2719. </form>
  2720. </div>
  2721. <?php
  2722. }
  2723. function handle_options_panel() {
  2724. global $action, $page, $M_options;
  2725. wp_reset_vars( array('action', 'page') );
  2726. if(defined('MEMBERSHIP_GLOBAL_TABLES') && MEMBERSHIP_GLOBAL_TABLES === true) {
  2727. if(function_exists('get_blog_option')) {
  2728. if(function_exists('switch_to_blog')) {
  2729. switch_to_blog(MEMBERSHIP_GLOBAL_MAINSITE);
  2730. }
  2731. $M_options = get_blog_option(MEMBERSHIP_GLOBAL_MAINSITE, 'membership_options', array());
  2732. } else {
  2733. $M_options = get_option('membership_options', array());
  2734. }
  2735. } else {
  2736. $M_options = get_option('membership_options', array());
  2737. }
  2738. $tab = (isset($_GET['tab'])) ? $_GET['tab'] : '';
  2739. if(empty($tab)) {
  2740. $tab = 'general';
  2741. }
  2742. ?>
  2743. <div class='wrap nosubsub'>
  2744. <?php
  2745. $menus = array();
  2746. $menus['general'] = __('General', 'membership');
  2747. $menus['pages'] = __('Membership Pages', 'membership');
  2748. $menus['posts'] = __('Content Protection', 'membership');
  2749. $menus['downloads'] = __('Downloads / Media', 'membership');
  2750. $menus['users'] = __('Membership Admins','membership');
  2751. $menus['extras'] = __('Extras', 'membership');
  2752. $menus = apply_filters('membership_options_menus', $menus);
  2753. ?>
  2754. <?php
  2755. if ( current_user_can('manage_options') && !get_option('permalink_structure') ) {
  2756. echo '<div class="error"><p>'.__('You must enable Pretty Permalinks for Membership to function correctly - <a href="options-permalink.php">Enable now &raquo;</a>', 'membership').'</p></div>';
  2757. }
  2758. ?>
  2759. <h3 class="nav-tab-wrapper">
  2760. <?php
  2761. foreach($menus as $key => $menu) {
  2762. ?>
  2763. <a class="nav-tab<?php if($tab == $key) echo ' nav-tab-active'; ?>" href="admin.php?page=<?php echo $page; ?>&amp;tab=<?php echo $key; ?>"><?php echo $menu; ?></a>
  2764. <?php
  2765. }
  2766. ?>
  2767. </h3>
  2768. <?php
  2769. switch($tab) {
  2770. case 'general': $this->show_general_options();
  2771. break;
  2772. case 'pages': $this->show_page_options();
  2773. break;
  2774. case 'posts': $this->show_posts_options();
  2775. break;
  2776. case 'downloads': $this->show_downloads_options();
  2777. break;
  2778. case 'extras': $this->show_extras_options();
  2779. break;
  2780. case 'users': $this->show_users_options();
  2781. break;
  2782. default: do_action('membership_option_menu_' . $tab);
  2783. break;
  2784. }
  2785. if(defined('MEMBERSHIP_GLOBAL_TABLES') && MEMBERSHIP_GLOBAL_TABLES === true) {
  2786. if(function_exists('restore_current_blog')) {
  2787. restore_current_blog();
  2788. }
  2789. }
  2790. ?>
  2791. </div> <!-- wrap -->
  2792. <?php
  2793. }
  2794. function default_membership_sections($sections) {
  2795. $sections['main'] = array( "title" => __('Main rules','membership') );
  2796. $sections['content'] = array( "title" => __('Content rules','membership') );
  2797. return $sections;
  2798. }
  2799. function handle_level_edit_form($level_id = false, $clone = false) {
  2800. global $page, $M_Rules, $M_SectionRules;
  2801. if($level_id && !$clone) {
  2802. $mlevel = new M_Level( $level_id );
  2803. $level = $mlevel->get();
  2804. } else {
  2805. if($clone) {
  2806. $mlevel = new M_Level( $level_id );
  2807. $level = $mlevel->get();
  2808. $level->level_title .= __(' clone','membership');
  2809. } else {
  2810. $level = new stdclass;
  2811. $level->level_title = __('new level','membership');
  2812. }
  2813. $level->id = time() * -1;
  2814. }
  2815. // Get the relevant parts
  2816. if(isset($mlevel)) {
  2817. $positives = $mlevel->get_rules('positive');
  2818. $negatives = $mlevel->get_rules('negative');
  2819. }
  2820. // Re-arrange the rules
  2821. $rules = array(); $p = array(); $n = array();
  2822. if(!empty($positives)) {
  2823. foreach($positives as $positive) {
  2824. $rules[$positive->rule_area] = maybe_unserialize($positive->rule_value);
  2825. $p[$positive->rule_area] = maybe_unserialize($positive->rule_value);
  2826. }
  2827. }
  2828. if(!empty($negatives)) {
  2829. foreach($negatives as $negative) {
  2830. $rules[$negative->rule_area] = maybe_unserialize($negative->rule_value);
  2831. $n[$negative->rule_area] = maybe_unserialize($negative->rule_value);
  2832. }
  2833. }
  2834. // Check which tab we should open the edit form with
  2835. if(!empty($p) && !empty($n)) {
  2836. // We have content in both areas - so start with advanced open
  2837. $advancedtab = 'activetab';
  2838. $negativetab = '';
  2839. $positivetab = '';
  2840. $advancedcontent = 'activecontent';
  2841. $negativecontent = 'activecontent';
  2842. $positivecontent = 'activecontent';
  2843. } else {
  2844. if(!empty($n)) {
  2845. // We have content in the negative area - so start with that
  2846. $advancedtab = '';
  2847. $negativetab = 'activetab';
  2848. $positivetab = '';
  2849. $advancedcontent = 'inactivecontent';
  2850. $negativecontent = 'activecontent';
  2851. $positivecontent = 'inactivecontent';
  2852. } else {
  2853. // Default to the positive area
  2854. $advancedtab = '';
  2855. $negativetab = '';
  2856. $positivetab = 'activetab';
  2857. $advancedcontent = 'inactivecontent';
  2858. $negativecontent = 'inactivecontent';
  2859. $positivecontent = 'activecontent';
  2860. }
  2861. }
  2862. ?>
  2863. <div class='wrap nosubsub'>
  2864. <div class="icon32" id="icon-link-manager"><br></div>
  2865. <h2><?php echo __('Edit ','membership') . " - " . esc_html($level->level_title); ?></h2>
  2866. <?php
  2867. if ( isset($usemsg) ) {
  2868. echo '<div id="message" class="updated fade"><p>' . $messages[$usemsg] . '</p></div>';
  2869. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  2870. }
  2871. ?>
  2872. <div class='level-liquid-left'>
  2873. <div id='level-left'>
  2874. <form action='?page=<?php echo $page; ?>' name='leveledit' method='post'>
  2875. <input type='hidden' name='level_id' id='level_id' value='<?php echo $level->id; ?>' />
  2876. <input type='hidden' name='ontab' id='ontab' value='positive' />
  2877. <input type='hidden' name='beingdragged' id='beingdragged' value='' />
  2878. <input type='hidden' name='in-positive-rules' id='in-positive-rules' value=',<?php echo implode(',', array_keys($p)); ?>' />
  2879. <input type='hidden' name='in-negative-rules' id='in-negative-rules' value=',<?php echo implode(',', array_keys($n)); ?>' />
  2880. <input type='hidden' name='postive-rules-order' id='postive-rules-order' value='' />
  2881. <input type='hidden' name='negative-rules-order' id='negative-rules-order' value='' />
  2882. <div id='edit-level' class='level-holder-wrap'>
  2883. <div class='sidebar-name no-movecursor'>
  2884. <h3><?php echo esc_html($level->level_title); ?></h3>
  2885. </div>
  2886. <div class='level-holder'>
  2887. <div class='level-details'>
  2888. <label for='level_title'><?php _e('Level title','membership'); ?></label><?php //echo $this->_tips->add_tip( __('This is the title used throughout the system to identify this level.','membership') ); ?><br/>
  2889. <input class='wide' type='text' name='level_title' id='level_title' value='<?php echo esc_attr($level->level_title); ?>' />
  2890. <br/><br/>
  2891. <label for='level_shortcode'><?php _e('Level shortcode','membership'); ?></label><?php echo $this->_tips->add_tip( __('The shortcode for this level is based on the title (above). It can be used to wrap content that you only want to be seen by members on this level e.g. [levelshortcode] protected content [/levelshortcode]','membership') ); ?>
  2892. <?php if($level->id > 0) {
  2893. echo "[" . M_normalize_shortcode($level->level_title) . "]";
  2894. } else {
  2895. _e('Save your level to create the shortcode', 'membership');
  2896. } ?>
  2897. </div>
  2898. <?php do_action('membership_level_form_before_rules', $level->id); ?>
  2899. <ul class='leveltabs'>
  2900. <li class='positivetab <?php echo $positivetab; ?>'><div class='downarrow'></div><a href='#positive'><div><?php _e('Positive Rules', 'membership'); ?></div></a></li>
  2901. <li class='negativetab <?php echo $negativetab; ?>'><div class='downarrow'></div><a href='#negative'><div><?php _e('Negative Rules', 'membership'); ?></div></a></li>
  2902. <li class='advancedtab <?php echo $advancedtab; ?>'><div class='downarrow'></div><a href='#advanced'><div><?php _e('Advanced (both)', 'membership'); ?></div></a></li>
  2903. </ul>
  2904. <div class='advancedtabwarning <?php echo $advancedcontent; ?>'>
  2905. <?php _e('<strong>Warning:</strong> using both positive and negative rules on the same level can cause conflicts and unpredictable behaviour.','membership'); ?>
  2906. </div>
  2907. <div class='positivecontent <?php echo $positivecontent; ?>'>
  2908. <h3 class='positive positivetitle <?php echo $advancedcontent; ?>'><?php _e('Positive rules','membership'); ?></h3>
  2909. <p class='description'><?php _e('These are the areas / elements that a member of this level can access.','membership'); ?></p>
  2910. <div id='positive-rules' class='level-droppable-rules levels-sortable'>
  2911. <?php _e('Drop here','membership'); ?>
  2912. </div>
  2913. <div id='positive-rules-holder'>
  2914. <?php do_action('membership_level_form_before_positive_rules', $level->id); ?>
  2915. <?php
  2916. if(!empty($p)) {
  2917. foreach($p as $key => $value) {
  2918. if(isset($M_Rules[$key])) {
  2919. $rule = new $M_Rules[$key]();
  2920. $rule->admin_main($value);
  2921. }
  2922. }
  2923. }
  2924. ?>
  2925. <?php do_action('membership_level_form_after_positive_rules', $level->id); ?>
  2926. </div>
  2927. </div>
  2928. <div class='negativecontent <?php echo $negativecontent; ?>'>
  2929. <h3 class='negative negativetitle <?php echo $advancedcontent; ?>'><?php _e('Negative rules','membership'); ?></h3>
  2930. <p class='description'><?php _e('These are the areas / elements that a member of this level doesn\'t have access to.','membership'); ?></p>
  2931. <div id='negative-rules' class='level-droppable-rules levels-sortable'>
  2932. <?php _e('Drop here','membership'); ?>
  2933. </div>
  2934. <div id='negative-rules-holder'>
  2935. <?php do_action('membership_level_form_before_negative_rules', $level->id); ?>
  2936. <?php
  2937. if(!empty($n)) {
  2938. foreach($n as $key => $value) {
  2939. if(isset($M_Rules[$key])) {
  2940. $rule = new $M_Rules[$key]();
  2941. $rule->admin_main($value);
  2942. }
  2943. }
  2944. }
  2945. ?>
  2946. <?php do_action('membership_level_form_after_negative_rules', $level->id); ?>
  2947. </div>
  2948. </div>
  2949. <div class='advancedcontent <?php echo $advancedcontent; ?>'>
  2950. <h3><?php _e('Custom shortcode protected content message','membership'); ?></h3>
  2951. <p class='description'><?php _e('If you want a protected content message to be displayed for this level then you can enter it here.','membership'); ?></p>
  2952. <?php
  2953. $args = array("textarea_name" => "level_protectedcontent", "textarea_rows" => 20);
  2954. if(!empty($mlevel)) {
  2955. $level_protectedcontent = $mlevel->get_meta( 'level_protectedcontent' );
  2956. }
  2957. if(empty($level_protectedcontent)) {
  2958. $level_protectedcontent = '';
  2959. }
  2960. wp_editor( stripslashes($level_protectedcontent), "level_protectedcontent", $args );
  2961. ?>
  2962. </div>
  2963. <div class='advancedcontent <?php echo $advancedcontent; ?>'>
  2964. <?php do_action('membership_level_form_after_rules', $level->id); ?>
  2965. </div>
  2966. <div class='buttons'>
  2967. <?php
  2968. if($level->id > 0) {
  2969. wp_original_referer_field(true, 'previous'); wp_nonce_field('update-' . $level->id);
  2970. ?>
  2971. <a href='?page=<?php echo $page; ?>' class='cancellink' title='Cancel edit'><?php _e('Cancel', 'membership'); ?></a>
  2972. <input type='submit' value='<?php _e('Update', 'membership'); ?>' class='button-primary' />
  2973. <input type='hidden' name='action' value='updated' />
  2974. <?php
  2975. } else {
  2976. wp_original_referer_field(true, 'previous'); wp_nonce_field('add-' . $level->id);
  2977. ?>
  2978. <a href='?page=<?php echo $page; ?>' class='cancellink' title='Cancel add'><?php _e('Cancel', 'membership'); ?></a>
  2979. <input type='submit' value='<?php _e('Add', 'membership'); ?>' class='button-primary' />
  2980. <input type='hidden' name='action' value='added' />
  2981. <?php
  2982. }
  2983. ?>
  2984. </div>
  2985. </div>
  2986. </div>
  2987. </form>
  2988. </div>
  2989. <div id='hiden-actions'>
  2990. <?php
  2991. $sections = apply_filters('membership_level_sections', array());
  2992. foreach($sections as $key => $section) {
  2993. if(isset($M_SectionRules[$key])) {
  2994. foreach($M_SectionRules[$key] as $mrule => $mclass) {
  2995. $rule = new $mclass();
  2996. if(!array_key_exists($mrule, $rules)) {
  2997. $rule->admin_main(false);
  2998. }
  2999. }
  3000. }
  3001. }
  3002. ?>
  3003. </div> <!-- hidden-actions -->
  3004. </div> <!-- level-liquid-left -->
  3005. <div class='level-liquid-right'>
  3006. <div class="level-holder-wrap">
  3007. <?php
  3008. do_action( 'membership_sidebar_top_level' );
  3009. do_action( 'membership_sidebar_top', 'level' );
  3010. $sections = apply_filters('membership_level_sections', array());
  3011. foreach($sections as $key => $section) {
  3012. ?>
  3013. <div class="sidebar-name no-movecursor">
  3014. <h3><?php echo $section['title']; ?></h3>
  3015. </div>
  3016. <div class="section-holder" id="sidebar-<?php echo $key; ?>" style="min-height: 98px;">
  3017. <ul class='levels level-levels-draggable'>
  3018. <?php
  3019. if(isset($M_SectionRules[$key])) {
  3020. foreach($M_SectionRules[$key] as $mrule => $mclass) {
  3021. $rule = new $mclass();
  3022. if(!array_key_exists($mrule, $rules)) {
  3023. $rule->admin_sidebar(false);
  3024. } else {
  3025. $rule->admin_sidebar(true);
  3026. }
  3027. }
  3028. }
  3029. ?>
  3030. </ul>
  3031. </div>
  3032. <?php
  3033. }
  3034. ?>
  3035. </div> <!-- level-holder-wrap -->
  3036. </div> <!-- level-liquid-left -->
  3037. </div> <!-- wrap -->
  3038. <?php
  3039. }
  3040. function handle_levels_updates() {
  3041. global $action, $page;
  3042. wp_reset_vars( array('action', 'page') );
  3043. if(isset($_GET['doaction']) || isset($_GET['doaction2'])) {
  3044. if(addslashes($_GET['action']) == 'delete' || addslashes($_GET['action2']) == 'delete') {
  3045. $action = 'bulk-delete';
  3046. }
  3047. if(addslashes($_GET['action']) == 'toggle' || addslashes($_GET['action2']) == 'toggle') {
  3048. $action = 'bulk-toggle';
  3049. }
  3050. }
  3051. switch(addslashes($action)) {
  3052. case 'removeheader': $this->dismiss_user_help( $page );
  3053. wp_safe_redirect( remove_query_arg( 'action' ) );
  3054. break;
  3055. case 'added': $id = (int) $_POST['level_id'];
  3056. check_admin_referer('add-' . $id);
  3057. if($id) {
  3058. $level = new M_Level($id);
  3059. if($level->add()) {
  3060. // Add in the meta information
  3061. if(!empty($_POST['level_protectedcontent'])) {
  3062. $level->update_meta( 'level_protectedcontent', $_POST['level_protectedcontent'] );
  3063. }
  3064. // redirect
  3065. wp_safe_redirect( add_query_arg( 'msg', 1, 'admin.php?page=' . $page ) );
  3066. } else {
  3067. wp_safe_redirect( add_query_arg( 'msg', 4, 'admin.php?page=' . $page ) );
  3068. }
  3069. } else {
  3070. wp_safe_redirect( add_query_arg( 'msg', 4, 'admin.php?page=' . $page ) );
  3071. }
  3072. break;
  3073. case 'updated': $id = (int) $_POST['level_id'];
  3074. check_admin_referer('update-' . $id);
  3075. if($id) {
  3076. $level = new M_Level($id);
  3077. if($level->update()) {
  3078. // update the meta information
  3079. if(!empty($_POST['level_protectedcontent'])) {
  3080. $level->update_meta( 'level_protectedcontent', $_POST['level_protectedcontent'] );
  3081. } else {
  3082. $level->delete_meta( 'level_protectedcontent' );
  3083. }
  3084. // redirect
  3085. wp_safe_redirect( add_query_arg( 'msg', 3, 'admin.php?page=' . $page ) );
  3086. } else {
  3087. wp_safe_redirect( add_query_arg( 'msg', 5, 'admin.php?page=' . $page ) );
  3088. }
  3089. } else {
  3090. wp_safe_redirect( add_query_arg( 'msg', 5, 'admin.php?page=' . $page ) );
  3091. }
  3092. break;
  3093. case 'delete': if(isset($_GET['level_id'])) {
  3094. $level_id = (int) $_GET['level_id'];
  3095. check_admin_referer('delete-level_' . $level_id);
  3096. $level = new M_Level($level_id);
  3097. if($level->delete($level_id)) {
  3098. // delete the meta information
  3099. $level->delete_meta( 'level_protectedcontent' );
  3100. // redirect
  3101. wp_safe_redirect( add_query_arg( 'msg', 2, wp_get_referer() ) );
  3102. } else {
  3103. wp_safe_redirect( add_query_arg( 'msg', 6, wp_get_referer() ) );
  3104. }
  3105. }
  3106. break;
  3107. case 'toggle': if(isset($_GET['level_id'])) {
  3108. $level_id = (int) $_GET['level_id'];
  3109. check_admin_referer('toggle-level_' . $level_id);
  3110. $level = new M_Level($level_id);
  3111. if( $level->toggleactivation() ) {
  3112. wp_safe_redirect( add_query_arg( 'msg', 7, wp_get_referer() ) );
  3113. } else {
  3114. wp_safe_redirect( add_query_arg( 'msg', 8, wp_get_referer() ) );
  3115. }
  3116. }
  3117. break;
  3118. case 'bulk-delete':
  3119. check_admin_referer('bulk-levels');
  3120. foreach($_GET['levelcheck'] AS $value) {
  3121. if(is_numeric($value)) {
  3122. $level_id = (int) $value;
  3123. $level = new M_Level($level_id);
  3124. $level->delete();
  3125. }
  3126. }
  3127. wp_safe_redirect( add_query_arg( 'msg', 2, wp_get_referer() ) );
  3128. break;
  3129. case 'bulk-toggle':
  3130. check_admin_referer('bulk-levels');
  3131. foreach($_GET['levelcheck'] AS $value) {
  3132. if(is_numeric($value)) {
  3133. $level_id = (int) $value;
  3134. $level = new M_Level($level_id);
  3135. $level->toggleactivation();
  3136. }
  3137. }
  3138. wp_safe_redirect( add_query_arg( 'msg', 7, wp_get_referer() ) );
  3139. break;
  3140. }
  3141. }
  3142. function handle_levels_panel() {
  3143. global $action, $page;
  3144. switch(addslashes($action)) {
  3145. case 'edit': if(isset($_GET['level_id'])) {
  3146. $level_id = (int) $_GET['level_id'];
  3147. $this->handle_level_edit_form($level_id);
  3148. return; // So we don't see the rest of this page
  3149. }
  3150. break;
  3151. case 'clone': if(isset($_GET['clone_id'])) {
  3152. $level_id = (int) $_GET['clone_id'];
  3153. $this->handle_level_edit_form($level_id, true);
  3154. return; // So we don't see the rest of this page
  3155. }
  3156. break;
  3157. }
  3158. $filter = array();
  3159. if(isset($_GET['s'])) {
  3160. $s = stripslashes($_GET['s']);
  3161. $filter['s'] = $s;
  3162. } else {
  3163. $s = '';
  3164. }
  3165. if(isset($_GET['level_id'])) {
  3166. $filter['level_id'] = stripslashes($_GET['level_id']);
  3167. }
  3168. if(isset($_GET['order_by'])) {
  3169. $filter['order_by'] = stripslashes($_GET['order_by']);
  3170. }
  3171. $messages = array();
  3172. $messages[1] = __('Membership Level added.', 'membership');
  3173. $messages[2] = __('Membership Level deleted.', 'membership');
  3174. $messages[3] = __('Membership Level updated.', 'membership');
  3175. $messages[4] = __('Membership Level not added.', 'membership');
  3176. $messages[5] = __('Membership Level not updated.', 'membership');
  3177. $messages[6] = __('Membership Level not deleted.', 'membership');
  3178. $messages[7] = __('Membership Level activation toggled.', 'membership');
  3179. $messages[8] = __('Membership Level activation not toggled.', 'membership');
  3180. $messages[9] = __('Membership Levels updated.', 'membership');
  3181. ?>
  3182. <div class='wrap nosubsub'>
  3183. <div class="icon32" id="icon-link-manager"><br></div>
  3184. <h2><?php _e('Access Levels','membership'); ?><a class="add-new-h2" href="admin.php?page=<?php echo $page; ?>&amp;action=edit&amp;level_id="><?php _e('Add New','membership'); ?></a></h2>
  3185. <?php
  3186. if ( isset($_GET['msg']) ) {
  3187. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  3188. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  3189. }
  3190. if($this->show_user_help( $page )) {
  3191. ?>
  3192. <div class='screenhelpheader'>
  3193. <a href="admin.php?page=<?php echo $page; ?>&amp;action=removeheader" class="welcome-panel-close"><?php _e('Dismiss','membership'); ?></a>
  3194. <?php
  3195. ob_start();
  3196. include_once(membership_dir('membershipincludes/help/header.levels.php'));
  3197. echo ob_get_clean();
  3198. ?>
  3199. </div>
  3200. <?php
  3201. }
  3202. ?>
  3203. <form method="get" action="?page=<?php echo esc_attr($page); ?>" class="search-form">
  3204. <p class="search-box">
  3205. <input type='hidden' name='page' value='<?php echo esc_attr($page); ?>' />
  3206. <label for="membership-search-input" class="screen-reader-text"><?php _e('Search Levels','membership'); ?>:</label>
  3207. <input type="text" value="<?php echo esc_attr($s); ?>" name="s" id="membership-search-input">
  3208. <input type="submit" class="button" value="<?php _e('Search Levels','membership'); ?>">
  3209. </p>
  3210. </form>
  3211. <br class='clear' />
  3212. <form method="get" action="?page=<?php echo esc_attr($page); ?>" id="posts-filter">
  3213. <input type='hidden' name='page' value='<?php echo esc_attr($page); ?>' />
  3214. <div class="tablenav">
  3215. <div class="alignleft actions">
  3216. <select name="action">
  3217. <option selected="selected" value=""><?php _e('Bulk Actions', 'membership'); ?></option>
  3218. <option value="delete"><?php _e('Delete', 'membership'); ?></option>
  3219. <option value="toggle"><?php _e('Toggle activation', 'membership'); ?></option>
  3220. </select>
  3221. <input type="submit" class="button-secondary action" id="doaction" name="doaction" value="<?php _e('Apply', 'membership'); ?>">
  3222. <select name="level_id">
  3223. <option <?php if(isset($_GET['level_id']) && addslashes($_GET['level_id']) == 'all') echo "selected='selected'"; ?> value="all"><?php _e('View all Levels','membership'); ?></option>
  3224. <option <?php if(isset($_GET['level_id']) && addslashes($_GET['level_id']) == 'active') echo "selected='selected'"; ?> value="active"><?php _e('View active Levels','membership'); ?></option>
  3225. <option <?php if(isset($_GET['level_id']) && addslashes($_GET['level_id']) == 'inactive') echo "selected='selected'"; ?> value="inactive"><?php _e('View inactive Levels','membership'); ?></option>
  3226. </select>
  3227. <select name="order_by">
  3228. <option <?php if(isset($_GET['order_by']) && addslashes($_GET['order_by']) == 'order_id') echo "selected='selected'"; ?> value="order_id"><?php _e('Order by Level ID','membership'); ?></option>
  3229. <option <?php if(isset($_GET['order_by']) && addslashes($_GET['order_by']) == 'order_name') echo "selected='selected'"; ?> value="order_name"><?php _e('Order by Level Name','membership'); ?></option>
  3230. </select>
  3231. <input type="submit" class="button-secondary" value="<?php _e('Filter'); ?>" id="post-query-submit">
  3232. </div>
  3233. <div class="alignright actions">
  3234. </div>
  3235. <br class="clear">
  3236. </div>
  3237. <div class="clear"></div>
  3238. <?php
  3239. wp_original_referer_field(true, 'previous'); wp_nonce_field('bulk-levels');
  3240. $columns = array( "name" => __('Level Name','membership'),
  3241. "active" => __('Active','membership'),
  3242. "users" => __('Users','membership'),
  3243. "shortcode" => __('Shortcode', 'membership') . $this->_tips->add_tip( __('The shortcode for this level is based on the title. It can be used to wrap content that you only want to be seen by members on this level e.g. [levelshortcode] protected content [/levelshortcode], use the [not-levelshortcode] shortcodes to wrap content that should be visible to people not on a particular level.','membership') )
  3244. );
  3245. $columns = apply_filters('membership_levelcolumns', $columns);
  3246. $levels = $this->get_membership_levels($filter);
  3247. ?>
  3248. <table cellspacing="0" class="widefat fixed">
  3249. <thead>
  3250. <tr>
  3251. <th style="" class="manage-column column-cb check-column" id="cb" scope="col"><input type="checkbox"></th>
  3252. <?php
  3253. foreach($columns as $key => $col) {
  3254. ?>
  3255. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  3256. <?php
  3257. }
  3258. ?>
  3259. </tr>
  3260. </thead>
  3261. <tfoot>
  3262. <tr>
  3263. <th style="" class="manage-column column-cb check-column" scope="col"><input type="checkbox"></th>
  3264. <?php
  3265. reset($columns);
  3266. foreach($columns as $key => $col) {
  3267. ?>
  3268. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  3269. <?php
  3270. }
  3271. ?>
  3272. </tr>
  3273. </tfoot>
  3274. <tbody>
  3275. <?php
  3276. if($levels) {
  3277. foreach($levels as $key => $level) {
  3278. ?>
  3279. <tr valign="middle" class="alternate" id="level-<?php echo $level->id; ?>">
  3280. <th class="check-column" scope="row"><input type="checkbox" value="<?php echo $level->id; ?>" name="levelcheck[]"></th>
  3281. <td class="column-name">
  3282. <strong><a title="<?php _e('Level ID:', 'membership'); ?> <?php echo esc_attr($level->id); ?>" href="?page=<?php echo $page; ?>&amp;action=edit&amp;level_id=<?php echo $level->id; ?>" class="row-title"><?php echo esc_html($level->level_title); ?></a></strong>
  3283. <?php
  3284. $actions = array();
  3285. //$actions['id'] = "<strong>" . __('ID : ', 'membership') . $level->id . "</strong>";
  3286. $actions['edit'] = "<span class='edit'><a href='?page=" . $page . "&amp;action=edit&amp;level_id=" . $level->id . "'>" . __('Edit', 'membership') . "</a></span>";
  3287. if($level->level_active == 0) {
  3288. $actions['toggle'] = "<span class='edit activate'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=toggle&amp;level_id=" . $level->id . "", 'toggle-level_' . $level->id) . "'>" . __('Activate', 'membership') . "</a></span>";
  3289. } else {
  3290. $actions['toggle'] = "<span class='edit deactivate'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=toggle&amp;level_id=" . $level->id . "", 'toggle-level_' . $level->id) . "'>" . __('Deactivate', 'membership') . "</a></span>";
  3291. }
  3292. $actions['clone'] = "<span class='edit'><a href='?page=" . $page . "&amp;action=clone&amp;clone_id=" . $level->id . "'>" . __('Clone', 'membership') . "</a></span>";
  3293. $actions['delete'] = "<span class='delete'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=delete&amp;level_id=" . $level->id . "", 'delete-level_' . $level->id) . "'>" . __('Delete', 'membership') . "</a></span>";
  3294. ?>
  3295. <br><div class="row-actions"><?php echo implode(" | ", $actions); ?></div>
  3296. </td>
  3297. <td class="column-active">
  3298. <?php
  3299. switch($level->level_active) {
  3300. case 0: echo "<span class='membershipinactivestatus'>" . __('Inactive', 'membership') . "</span>";
  3301. break;
  3302. case 1: echo "<span class='membershipactivestatus'>" . __('Active', 'membership') . "</span>";
  3303. break;
  3304. }
  3305. ?>
  3306. </td>
  3307. <td class="column-users">
  3308. <strong>
  3309. <?php echo $this->count_on_level( $level->id ); ?>
  3310. </strong>
  3311. </td>
  3312. <td class="column-shortcode">
  3313. <?php echo "[" . M_normalize_shortcode($level->level_title) . "]"; ?><br/>
  3314. <?php echo "[not-" . M_normalize_shortcode($level->level_title) . "]"; ?>
  3315. </td>
  3316. </tr>
  3317. <?php
  3318. }
  3319. } else {
  3320. $columncount = count($columns) + 1;
  3321. ?>
  3322. <tr valign="middle" class="alternate" >
  3323. <td colspan="<?php echo $columncount; ?>" scope="row"><?php _e('No Membership levels where found, click above to add one.','membership'); ?></td>
  3324. </tr>
  3325. <?php
  3326. }
  3327. ?>
  3328. </tbody>
  3329. </table>
  3330. <div class="tablenav">
  3331. <div class="alignleft actions">
  3332. <select name="action2">
  3333. <option selected="selected" value=""><?php _e('Bulk Actions', 'membership'); ?></option>
  3334. <option value="delete"><?php _e('Delete', 'membership'); ?></option>
  3335. <option value="toggle"><?php _e('Toggle activation', 'membership'); ?></option>
  3336. </select>
  3337. <input type="submit" class="button-secondary action" id="doaction2" name="doaction2" value="<?php _e('Apply', 'membership'); ?>">
  3338. </div>
  3339. <div class="alignright actions">
  3340. </div>
  3341. <br class="clear">
  3342. </div>
  3343. </form>
  3344. </div> <!-- wrap -->
  3345. <?php
  3346. }
  3347. function handle_sub_edit_form($sub_id = false, $clone = false) {
  3348. global $page;
  3349. $msub = new M_Subscription( $sub_id );
  3350. if($sub_id && !$clone) {
  3351. $sub = $msub->get();
  3352. } else {
  3353. if($clone) {
  3354. $sub = $msub->get();
  3355. $sub->sub_name .= __(' clone','membership');
  3356. } else {
  3357. $sub = new stdclass;
  3358. $sub->sub_name = __('new subscription','membership');
  3359. }
  3360. $sub->id = time() * -1;
  3361. }
  3362. // Get the relevant parts
  3363. if(isset($msub)) {
  3364. $levels = $msub->get_levels();
  3365. }
  3366. ?>
  3367. <div class='wrap nosubsub'>
  3368. <div class="icon32" id="icon-link-manager"><br></div>
  3369. <?php
  3370. if($sub->id < 0) {
  3371. ?>
  3372. <h2><?php echo __('Add ','membership') . " - " . esc_html($sub->sub_name); ?></h2>
  3373. <?php
  3374. } else {
  3375. ?>
  3376. <h2><?php echo __('Edit ','membership') . " - " . esc_html(stripslashes($sub->sub_name)); ?></h2>
  3377. <?php
  3378. }
  3379. ?>
  3380. <?php
  3381. if ( isset($usemsg) ) {
  3382. echo '<div id="message" class="updated fade"><p>' . $messages[$usemsg] . '</p></div>';
  3383. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  3384. }
  3385. ?>
  3386. <div class='sub-liquid-left'>
  3387. <div id='sub-left'>
  3388. <form action='?page=<?php echo $page; ?>' name='subedit' method='post'>
  3389. <input type='hidden' name='sub_id' id='sub_id' value='<?php echo $sub->id; ?>' />
  3390. <div id='edit-sub' class='sub-holder-wrap'>
  3391. <div class='sidebar-name no-movecursor'>
  3392. <h3><?php echo esc_html(stripslashes($sub->sub_name)); ?></h3>
  3393. </div>
  3394. <div class='sub-holder'>
  3395. <div class='sub-details'>
  3396. <label for='sub_name'><?php _e('Subscription name','membership'); ?></label>
  3397. <input class='wide' type='text' name='sub_name' id='sub_name' value='<?php echo esc_attr(stripslashes($sub->sub_name)); ?>' />
  3398. <br/><br/>
  3399. <label for='sub_name'><?php _e('Subscription description','membership'); ?></label>
  3400. <?php
  3401. $args = array("textarea_name" => "sub_description", "textarea_rows" => 5);
  3402. if(!isset($sub->sub_description)) {
  3403. $sub->sub_description = '';
  3404. }
  3405. wp_editor( stripslashes($sub->sub_description), "sub_description", $args );
  3406. ?>
  3407. <br/>
  3408. <?php
  3409. if(!isset($sub->sub_pricetext)) {
  3410. $sub->sub_pricetext = '';
  3411. }
  3412. ?>
  3413. <label for='sub_pricetext'><?php _e('Subscription price text','membership'); ?><?php echo $this->_tips->add_tip( __('The text you want to show as the price on the subscription form. E.G. Only $25 per month.','membership') ); ?></label>
  3414. <input class='wide' type='text' name='sub_pricetext' id='sub_pricetext' value='<?php echo esc_attr(stripslashes($sub->sub_pricetext)); ?>' />
  3415. <?php do_action('membership_subscription_form_after_details', $sub->id); ?>
  3416. </div>
  3417. <?php do_action('membership_subscription_form_before_levels', $sub->id); ?>
  3418. <h3><?php _e('Membership levels','membership'); ?></h3>
  3419. <p class='description'><?php _e('These are the levels that are part of this subscription and the order a user will travel through them. Any levels highlighted in red will never be reached due to the settings of previous levels.','membership'); ?></p>
  3420. <div id='membership-levels-start'>
  3421. <div id="main-start" class="sub-operation" style="display: block;">
  3422. <h2 class="sidebar-name"><?php _e('Starting Point','membership'); ?></h2>
  3423. <div class="inner-operation">
  3424. <p class='description'><?php _e('A new signup for this subscription will start here and immediately pass to the next membership level listed below.','membership'); ?></p>
  3425. </div>
  3426. </div>
  3427. </div>
  3428. <ul id='membership-levels-holder'>
  3429. <?php do_action('membership_subscription_form_before_level_list', $sub->id); ?>
  3430. <?php
  3431. $msub->sub_details();
  3432. ?>
  3433. <?php do_action('membership_subscription_form_after_level_list', $sub->id); ?>
  3434. </ul>
  3435. <div id='membership-levels' class='droppable-levels levels-sortable'>
  3436. <?php _e('Drop here','membership'); ?>
  3437. </div>
  3438. <?php
  3439. // Hidden fields
  3440. ?>
  3441. <input type='hidden' name='beingdragged' id='beingdragged' value='' />
  3442. <input type='hidden' name='level-order' id='level-order' value=',<?php echo implode(',', $msub->levelorder); ?>' />
  3443. <?php do_action('membership_subscription_form_after_levels', $sub->id); ?>
  3444. <div class='buttons'>
  3445. <?php
  3446. if($sub->id > 0) {
  3447. wp_original_referer_field(true, 'previous'); wp_nonce_field('update-' . $sub->id);
  3448. ?>
  3449. <a href='?page=<?php echo $page; ?>' class='cancellink' title='Cancel edit'><?php _e('Cancel', 'membership'); ?></a>
  3450. <input type='submit' value='<?php _e('Update', 'membership'); ?>' class='button-primary' />
  3451. <input type='hidden' name='action' value='updated' />
  3452. <?php
  3453. } else {
  3454. wp_original_referer_field(true, 'previous'); wp_nonce_field('add-' . $sub->id);
  3455. ?>
  3456. <a href='?page=<?php echo $page; ?>' class='cancellink' title='Cancel add'><?php _e('Cancel', 'membership'); ?></a>
  3457. <input type='submit' value='<?php _e('Add', 'membership'); ?>' class='button-primary' />
  3458. <input type='hidden' name='action' value='added' />
  3459. <?php
  3460. }
  3461. ?>
  3462. </div>
  3463. </div>
  3464. </div>
  3465. </form>
  3466. </div>
  3467. <div id='hiden-actions'>
  3468. <div id='template-holder'>
  3469. <?php
  3470. $msub->sub_template();
  3471. ?>
  3472. </div>
  3473. </div> <!-- hidden-actions -->
  3474. </div> <!-- sub-liquid-left -->
  3475. <div class='sub-liquid-right'>
  3476. <div class="sub-holder-wrap">
  3477. <?php
  3478. do_action( 'membership_sidebar_top_subscription' );
  3479. do_action( 'membership_sidebar_top', 'subscription' );
  3480. ?>
  3481. <div class="sidebar-name no-movecursor">
  3482. <h3><?php _e('Membership levels','membership'); ?></h3>
  3483. </div>
  3484. <div class="level-holder" id="sidebar-levels" style="min-height: 98px;">
  3485. <ul class='subs subs-draggable'>
  3486. <?php
  3487. $levels = $this->get_membership_levels();
  3488. foreach( (array) $levels as $key => $level) {
  3489. ?>
  3490. <li class='level-draggable' id='level-<?php echo $level->id; ?>'>
  3491. <div class='action action-draggable'>
  3492. <div class='action-top closed'>
  3493. <a href="#available-actions" class="action-button hide-if-no-js"></a>
  3494. <?php echo esc_html($level->level_title); ?>
  3495. </div>
  3496. <div class='action-body closed'>
  3497. <p>
  3498. <a href='#addtosubscription' class='action-to-subscription' title="<?php _e('Add this level to the bottom of the membership levels list.','membership'); ?>"><?php _e('Add to Subscription','membership'); ?></a>
  3499. </p>
  3500. </div>
  3501. </div>
  3502. </li>
  3503. <?php
  3504. }
  3505. ?>
  3506. </ul>
  3507. </div>
  3508. </div> <!-- sub-holder-wrap -->
  3509. </div> <!-- sub-liquid-right -->
  3510. </div> <!-- wrap -->
  3511. <?php
  3512. }
  3513. function handle_subscriptions_updates() {
  3514. global $action, $page;
  3515. wp_reset_vars( array('action', 'page') );
  3516. if(isset($_GET['doaction']) || isset($_GET['doaction2'])) {
  3517. if(addslashes($_GET['action']) == 'delete' || addslashes($_GET['action2']) == 'delete') {
  3518. $action = 'bulk-delete';
  3519. }
  3520. if(addslashes($_GET['action']) == 'toggle' || addslashes($_GET['action2']) == 'toggle') {
  3521. $action = 'bulk-toggle';
  3522. }
  3523. if(addslashes($_GET['action']) == 'togglepublic' || addslashes($_GET['action2']) == 'togglepublic') {
  3524. $action = 'bulk-togglepublic';
  3525. }
  3526. }
  3527. switch(addslashes($action)) {
  3528. case 'removeheader': $this->dismiss_user_help( $page );
  3529. wp_safe_redirect( remove_query_arg( 'action' ) );
  3530. break;
  3531. case 'added': $id = (int) $_POST['sub_id'];
  3532. check_admin_referer('add-' . $id);
  3533. if($id) {
  3534. $sub = new M_Subscription( $id );
  3535. if($sub->add()) {
  3536. wp_safe_redirect( add_query_arg( 'msg', 1, 'admin.php?page=' . $page ) );
  3537. } else {
  3538. wp_safe_redirect( add_query_arg( 'msg', 4, 'admin.php?page=' . $page ) );
  3539. }
  3540. } else {
  3541. wp_safe_redirect( add_query_arg( 'msg', 4, 'admin.php?page=' . $page ) );
  3542. }
  3543. break;
  3544. case 'updated': $id = (int) $_POST['sub_id'];
  3545. check_admin_referer('update-' . $id);
  3546. if($id) {
  3547. $sub = new M_Subscription( $id );
  3548. if($sub->update()) {
  3549. wp_safe_redirect( add_query_arg( 'msg', 3, 'admin.php?page=' . $page ) );
  3550. } else {
  3551. wp_safe_redirect( add_query_arg( 'msg', 5, 'admin.php?page=' . $page ) );
  3552. }
  3553. } else {
  3554. wp_safe_redirect( add_query_arg( 'msg', 5, 'admin.php?page=' . $page ) );
  3555. }
  3556. break;
  3557. case 'delete': if(isset($_GET['sub_id'])) {
  3558. $sub_id = (int) $_GET['sub_id'];
  3559. check_admin_referer('delete-sub_' . $sub_id);
  3560. $sub = new M_Subscription( $sub_id );
  3561. if($sub->delete()) {
  3562. wp_safe_redirect( add_query_arg( 'msg', 2, wp_get_referer() ) );
  3563. } else {
  3564. wp_safe_redirect( add_query_arg( 'msg', 6, wp_get_referer() ) );
  3565. }
  3566. }
  3567. break;
  3568. case 'togglemakepublic':
  3569. if(isset($_GET['sub_id'])) {
  3570. $sub_id = (int) $_GET['sub_id'];
  3571. check_admin_referer('togglemakepublic-sub_' . $sub_id);
  3572. $sub = new M_Subscription( $sub_id );
  3573. $sub->toggleactivation();
  3574. if($sub->togglepublic()) {
  3575. wp_safe_redirect( add_query_arg( 'msg', 7, wp_get_referer() ) );
  3576. } else {
  3577. wp_safe_redirect( add_query_arg( 'msg', 8, wp_get_referer() ) );
  3578. }
  3579. }
  3580. break;
  3581. case 'toggle': if(isset($_GET['sub_id'])) {
  3582. $sub_id = (int) $_GET['sub_id'];
  3583. check_admin_referer('toggle-sub_' . $sub_id);
  3584. $sub = new M_Subscription( $sub_id );
  3585. if($sub->toggleactivation()) {
  3586. wp_safe_redirect( add_query_arg( 'msg', 7, wp_get_referer() ) );
  3587. } else {
  3588. wp_safe_redirect( add_query_arg( 'msg', 8, wp_get_referer() ) );
  3589. }
  3590. }
  3591. break;
  3592. case 'togglepublic':
  3593. if(isset($_GET['sub_id'])) {
  3594. $sub_id = (int) $_GET['sub_id'];
  3595. check_admin_referer('toggle-pubsub_' . $sub_id);
  3596. $sub = new M_Subscription( $sub_id );
  3597. if($sub->togglepublic()) {
  3598. wp_safe_redirect( add_query_arg( 'msg', 9, wp_get_referer() ) );
  3599. } else {
  3600. wp_safe_redirect( add_query_arg( 'msg', 5, wp_get_referer() ) );
  3601. }
  3602. }
  3603. break;
  3604. case 'bulk-delete':
  3605. check_admin_referer('bulk-subscriptions');
  3606. foreach($_GET['subcheck'] AS $value) {
  3607. if(is_numeric($value)) {
  3608. $sub_id = (int) $value;
  3609. $sub = new M_Subscription( $sub_id );
  3610. $sub->delete();
  3611. }
  3612. }
  3613. wp_safe_redirect( add_query_arg( 'msg', 2, wp_get_referer() ) );
  3614. break;
  3615. case 'bulk-toggle':
  3616. check_admin_referer('bulk-subscriptions');
  3617. foreach($_GET['subcheck'] AS $value) {
  3618. if(is_numeric($value)) {
  3619. $sub_id = (int) $value;
  3620. $sub = new M_Subscription( $sub_id );
  3621. $sub->toggleactivation();
  3622. }
  3623. }
  3624. wp_safe_redirect( add_query_arg( 'msg', 7, wp_get_referer() ) );
  3625. break;
  3626. case 'bulk-togglepublic':
  3627. check_admin_referer('bulk-subscriptions');
  3628. foreach($_GET['subcheck'] AS $value) {
  3629. if(is_numeric($value)) {
  3630. $sub_id = (int) $value;
  3631. $sub = new M_Subscription( $sub_id );
  3632. $sub->togglepublic();
  3633. }
  3634. }
  3635. wp_safe_redirect( add_query_arg( 'msg', 9, wp_get_referer() ) );
  3636. break;
  3637. }
  3638. }
  3639. function handle_subs_panel() {
  3640. // Subscriptions panel
  3641. global $action, $page;
  3642. $filter = array();
  3643. if($action == 'edit') {
  3644. if(isset($_GET['sub_id'])) {
  3645. $sub_id = (int) $_GET['sub_id'];
  3646. $this->handle_sub_edit_form($sub_id);
  3647. return; // So we don't see the rest of this page
  3648. }
  3649. }
  3650. if(isset($_GET['s'])) {
  3651. $s = stripslashes($_GET['s']);
  3652. $filter['s'] = $s;
  3653. } else {
  3654. $s = '';
  3655. }
  3656. if(isset($_GET['sub_status'])) {
  3657. $filter['sub_status'] = stripslashes($_GET['sub_status']);
  3658. }
  3659. if(isset($_GET['order_by'])) {
  3660. $filter['order_by'] = stripslashes($_GET['order_by']);
  3661. }
  3662. $messages = array();
  3663. $messages[1] = __('Subscription added.', 'membership');
  3664. $messages[2] = __('Subscription deleted.', 'membership');
  3665. $messages[3] = __('Subscription updated.', 'membership');
  3666. $messages[4] = __('Subscription not added.', 'membership');
  3667. $messages[5] = __('Subscription not updated.', 'membership');
  3668. $messages[6] = __('Subscription not deleted.', 'membership');
  3669. $messages[7] = __('Subscription activation toggled.', 'membership');
  3670. $messages[8] = __('Subscription activation not toggled.', 'membership');
  3671. $messages[9] = __('Subscriptions updated.', 'membership');
  3672. ?>
  3673. <div class='wrap nosubsub'>
  3674. <div class="icon32" id="icon-link-manager"><br></div>
  3675. <h2><?php _e('Subscription Plans','membership'); ?><a class="add-new-h2" href="admin.php?page=<?php echo $page; ?>&amp;action=edit&amp;sub_id="><?php _e('Add New','membership'); ?></a></h2>
  3676. <?php
  3677. if ( isset($_GET['msg']) ) {
  3678. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  3679. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  3680. }
  3681. if($this->show_user_help( $page )) {
  3682. ?>
  3683. <div class='screenhelpheader'>
  3684. <a href="admin.php?page=<?php echo $page; ?>&amp;action=removeheader" class="welcome-panel-close"><?php _e('Dismiss','membership'); ?></a>
  3685. <?php
  3686. ob_start();
  3687. include_once(membership_dir('membershipincludes/help/header.subscriptions.php'));
  3688. echo ob_get_clean();
  3689. ?>
  3690. </div>
  3691. <?php
  3692. }
  3693. ?>
  3694. <form method="get" action="?page=<?php echo esc_attr($page); ?>" class="search-form">
  3695. <p class="search-box">
  3696. <input type='hidden' name='page' value='<?php echo esc_attr($page); ?>' />
  3697. <label for="subscription-search-input" class="screen-reader-text"><?php _e('Search Memberships','membership'); ?>:</label>
  3698. <input type="text" value="<?php echo esc_attr($s); ?>" name="s" id="subscription-search-input">
  3699. <input type="submit" class="button" value="<?php _e('Search Subscriptions','membership'); ?>">
  3700. </p>
  3701. </form>
  3702. <br class='clear' />
  3703. <form method="get" action="?page=<?php echo esc_attr($page); ?>" id="posts-filter">
  3704. <input type='hidden' name='page' value='<?php echo esc_attr($page); ?>' />
  3705. <div class="tablenav">
  3706. <div class="alignleft actions">
  3707. <select name="action">
  3708. <option selected="selected" value=""><?php _e('Bulk Actions', 'membership'); ?></option>
  3709. <option value="delete"><?php _e('Delete', 'membership'); ?></option>
  3710. <option value="toggle"><?php _e('Toggle activation', 'membership'); ?></option>
  3711. <option value="togglepublic"><?php _e('Toggle public status', 'membership'); ?></option>
  3712. </select>
  3713. <input type="submit" class="button-secondary action" id="doaction" name="doaction" value="<?php _e('Apply'); ?>">
  3714. <select name="sub_status">
  3715. <option <?php if(isset($_GET['sub_status']) && addslashes($_GET['sub_id']) == 'all') echo "selected='selected'"; ?> value="all"><?php _e('View all subscriptions','membership'); ?></option>
  3716. <option <?php if(isset($_GET['sub_status']) && addslashes($_GET['sub_id']) == 'active') echo "selected='selected'"; ?> value="active"><?php _e('View active subscriptions','membership'); ?></option>
  3717. <option <?php if(isset($_GET['sub_status']) && addslashes($_GET['sub_id']) == 'inactive') echo "selected='selected'"; ?> value="inactive"><?php _e('View inactive subscriptions','membership'); ?></option>
  3718. <option <?php if(isset($_GET['sub_status']) && addslashes($_GET['sub_id']) == 'public') echo "selected='selected'"; ?> value="public"><?php _e('View public subscriptions','membership'); ?></option>
  3719. <option <?php if(isset($_GET['sub_status']) && addslashes($_GET['sub_id']) == 'private') echo "selected='selected'"; ?> value="private"><?php _e('View private subscriptions','membership'); ?></option>
  3720. </select>
  3721. <select name="order_by">
  3722. <option <?php if(isset($_GET['order_by']) && addslashes($_GET['order_by']) == 'order_id') echo "selected='selected'"; ?> value="order_id"><?php _e('Order by subscription ID','membership'); ?></option>
  3723. <option <?php if(isset($_GET['order_by']) && addslashes($_GET['order_by']) == 'order_name') echo "selected='selected'"; ?> value="order_name"><?php _e('Order by subscription name','membership'); ?></option>
  3724. </select>
  3725. <input type="submit" class="button-secondary" value="<?php _e('Filter', 'membership'); ?>" id="post-query-submit">
  3726. </div>
  3727. <div class="alignright actions">
  3728. </div>
  3729. <br class="clear">
  3730. </div>
  3731. <div class="clear"></div>
  3732. <?php
  3733. wp_original_referer_field(true, 'previous'); wp_nonce_field('bulk-subscriptions');
  3734. $columns = array( "name" => __('Subscription Name','membership'),
  3735. "active" => __('Active','membership'),
  3736. "public" => __('Public','membership'),
  3737. "users" => __('Users','membership')
  3738. );
  3739. $columns = apply_filters('subscription_columns', $columns);
  3740. $subs = $this->get_subscriptions($filter);
  3741. ?>
  3742. <table cellspacing="0" class="widefat fixed">
  3743. <thead>
  3744. <tr>
  3745. <th style="" class="manage-column column-cb check-column" id="cb" scope="col"><input type="checkbox"></th>
  3746. <?php
  3747. foreach($columns as $key => $col) {
  3748. ?>
  3749. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  3750. <?php
  3751. }
  3752. ?>
  3753. </tr>
  3754. </thead>
  3755. <tfoot>
  3756. <tr>
  3757. <th style="" class="manage-column column-cb check-column" scope="col"><input type="checkbox"></th>
  3758. <?php
  3759. reset($columns);
  3760. foreach($columns as $key => $col) {
  3761. ?>
  3762. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  3763. <?php
  3764. }
  3765. ?>
  3766. </tr>
  3767. </tfoot>
  3768. <tbody>
  3769. <?php
  3770. if($subs) {
  3771. foreach($subs as $key => $sub) {
  3772. ?>
  3773. <tr valign="middle" class="alternate" id="sub-<?php echo $sub->id; ?>">
  3774. <th class="check-column" scope="row"><input type="checkbox" value="<?php echo $sub->id; ?>" name="subcheck[]"></th>
  3775. <td class="column-name">
  3776. <strong><a title="<?php _e('Subscription ID:', 'membership'); ?> <?php echo esc_attr($sub->id); ?>" href="?page=<?php echo $page; ?>&amp;action=edit&amp;sub_id=<?php echo $sub->id; ?>" class="row-title"><?php echo esc_html(stripslashes($sub->sub_name)); ?></a></strong>
  3777. <?php
  3778. $actions = array();
  3779. //$actions['id'] = "<strong>" . __('ID : ', 'membership') . $sub->id . "</strong>";
  3780. $actions['edit'] = "<span class='edit'><a href='?page=" . $page . "&amp;action=edit&amp;sub_id=" . $sub->id . "'>" . __('Edit', 'membership') . "</a></span>";
  3781. if($sub->sub_active == 0 && $sub->sub_public == 0) {
  3782. $actions['toggle'] = "<span class='edit activate'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=togglemakepublic&amp;sub_id=" . $sub->id . "", 'togglemakepublic-sub_' . $sub->id) . "'>" . __('Activate and Make Public', 'membership') . "</a></span>";
  3783. } else {
  3784. if($sub->sub_active == 0) {
  3785. $actions['toggle'] = "<span class='edit activate'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=toggle&amp;sub_id=" . $sub->id . "", 'toggle-sub_' . $sub->id) . "'>" . __('Activate', 'membership') . "</a></span>";
  3786. } else {
  3787. $actions['toggle'] = "<span class='edit deactivate'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=toggle&amp;sub_id=" . $sub->id . "", 'toggle-sub_' . $sub->id) . "'>" . __('Deactivate', 'membership') . "</a></span>";
  3788. }
  3789. if($sub->sub_public == 0) {
  3790. $actions['public'] = "<span class='edit makeprivate'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=togglepublic&amp;sub_id=" . $sub->id . "", 'toggle-pubsub_' . $sub->id) . "'>" . __('Make public', 'membership') . "</a></span>";
  3791. } else {
  3792. $actions['public'] = "<span class='edit makepublic'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=togglepublic&amp;sub_id=" . $sub->id . "", 'toggle-pubsub_' . $sub->id) . "'>" . __('Make private', 'membership') . "</a></span>";
  3793. }
  3794. }
  3795. $actions['delete'] = "<span class='delete'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=delete&amp;sub_id=" . $sub->id . "", 'delete-sub_' . $sub->id) . "'>" . __('Delete', 'membership') . "</a></span>";
  3796. ?>
  3797. <br><div class="row-actions"><?php echo implode(" | ", $actions); ?></div>
  3798. </td>
  3799. <td class="column-active">
  3800. <?php
  3801. switch($sub->sub_active) {
  3802. case 0: echo "<span class='membershipinactivestatus'>" . __('Inactive', 'membership') . "</span>";
  3803. break;
  3804. case 1: echo "<span class='membershipactivestatus'>" . __('Active', 'membership') . "</span>";
  3805. break;
  3806. }
  3807. ?>
  3808. </td>
  3809. <td class="column-public">
  3810. <?php
  3811. switch($sub->sub_public) {
  3812. case 0: echo __('Private', 'membership');
  3813. break;
  3814. case 1: echo "<strong>" . __('Public', 'membership') . "</strong>";
  3815. break;
  3816. }
  3817. ?>
  3818. </td>
  3819. <td class="column-users">
  3820. <strong>
  3821. <?php echo $this->count_on_sub( $sub->id ); ?>
  3822. </strong>
  3823. </td>
  3824. </tr>
  3825. <?php
  3826. }
  3827. } else {
  3828. $columncount = count($columns) + 1;
  3829. ?>
  3830. <tr valign="middle" class="alternate" >
  3831. <td colspan="<?php echo $columncount; ?>" scope="row"><?php _e('No Subscriptions where found, click above to add one.','membership'); ?></td>
  3832. </tr>
  3833. <?php
  3834. }
  3835. ?>
  3836. </tbody>
  3837. </table>
  3838. <div class="tablenav">
  3839. <div class="alignleft actions">
  3840. <select name="action2">
  3841. <option selected="selected" value=""><?php _e('Bulk Actions', 'membership'); ?></option>
  3842. <option value="delete"><?php _e('Delete', 'membership'); ?></option>
  3843. <option value="toggle"><?php _e('Toggle activation', 'membership'); ?></option>
  3844. </select>
  3845. <input type="submit" class="button-secondary action" id="doaction2" name="doaction2" value="<?php _e('Apply', 'membership'); ?>">
  3846. </div>
  3847. <div class="alignright actions">
  3848. </div>
  3849. <br class="clear">
  3850. </div>
  3851. </form>
  3852. </div> <!-- wrap -->
  3853. <?php
  3854. }
  3855. function handle_communication_updates() {
  3856. global $action, $page;
  3857. wp_reset_vars( array('action', 'page') );
  3858. if(isset($_GET['doaction']) || isset($_GET['doaction2'])) {
  3859. if(addslashes($_GET['action']) == 'delete' || addslashes($_GET['action2']) == 'delete') {
  3860. $action = 'bulk-delete';
  3861. }
  3862. if(addslashes($_GET['action']) == 'toggle' || addslashes($_GET['action2']) == 'toggle') {
  3863. $action = 'bulk-toggle';
  3864. }
  3865. }
  3866. switch(addslashes($action)) {
  3867. case 'removeheader': $this->dismiss_user_help( $page );
  3868. wp_safe_redirect( remove_query_arg( 'action' ) );
  3869. break;
  3870. case 'added': check_admin_referer('add-comm');
  3871. $comm = new M_Communication( false );
  3872. if($comm->add()) {
  3873. wp_safe_redirect( add_query_arg( 'msg', 8, 'admin.php?page=' . $page ) );
  3874. } else {
  3875. wp_safe_redirect( add_query_arg( 'msg', 9, 'admin.php?page=' . $page ) );
  3876. }
  3877. break;
  3878. case 'updated': $id = (int) $_POST['ID'];
  3879. check_admin_referer('update-comm_' . $id);
  3880. if($id) {
  3881. $comm = new M_Communication( $id );
  3882. if($comm->update()) {
  3883. wp_safe_redirect( add_query_arg( 'msg', 1, 'admin.php?page=' . $page ) );
  3884. } else {
  3885. wp_safe_redirect( add_query_arg( 'msg', 2, 'admin.php?page=' . $page ) );
  3886. }
  3887. } else {
  3888. wp_safe_redirect( add_query_arg( 'msg', 2, 'admin.php?page=' . $page ) );
  3889. }
  3890. break;
  3891. case 'delete': if(isset($_GET['comm'])) {
  3892. $id = (int) $_GET['comm'];
  3893. check_admin_referer('delete-comm_' . $id);
  3894. $comm = new M_Communication( $id );
  3895. if($comm->delete()) {
  3896. wp_safe_redirect( add_query_arg( 'msg', 10, wp_get_referer() ) );
  3897. } else {
  3898. wp_safe_redirect( add_query_arg( 'msg', 11, wp_get_referer() ) );
  3899. }
  3900. }
  3901. break;
  3902. case 'deactivate':
  3903. if(isset($_GET['comm'])) {
  3904. $id = (int) $_GET['comm'];
  3905. check_admin_referer('toggle-comm_' . $id);
  3906. $comm = new M_Communication( $id );
  3907. if($comm->toggle()) {
  3908. wp_safe_redirect( add_query_arg( 'msg', 5, wp_get_referer() ) );
  3909. } else {
  3910. wp_safe_redirect( add_query_arg( 'msg', 6, wp_get_referer() ) );
  3911. }
  3912. }
  3913. break;
  3914. case 'activate':
  3915. if(isset($_GET['comm'])) {
  3916. $id = (int) $_GET['comm'];
  3917. check_admin_referer('toggle-comm_' . $id);
  3918. $comm = new M_Communication( $id );
  3919. if($comm->toggle()) {
  3920. wp_safe_redirect( add_query_arg( 'msg', 3, wp_get_referer() ) );
  3921. } else {
  3922. wp_safe_redirect( add_query_arg( 'msg', 4, wp_get_referer() ) );
  3923. }
  3924. }
  3925. break;
  3926. case 'bulk-delete':
  3927. check_admin_referer('bulk-comms');
  3928. foreach($_GET['commcheck'] AS $value) {
  3929. if(is_numeric($value)) {
  3930. $id = (int) $value;
  3931. $comm = new M_Communication( $id );
  3932. $comm->delete();
  3933. }
  3934. }
  3935. wp_safe_redirect( add_query_arg( 'msg', 10, wp_get_referer() ) );
  3936. break;
  3937. case 'bulk-toggle':
  3938. check_admin_referer('bulk-comms');
  3939. foreach($_GET['commcheck'] AS $value) {
  3940. if(is_numeric($value)) {
  3941. $id = (int) $value;
  3942. $comm = new M_Communication( $id );
  3943. $comm->toggle();
  3944. }
  3945. }
  3946. wp_safe_redirect( add_query_arg( 'msg', 7, wp_get_referer() ) );
  3947. break;
  3948. }
  3949. }
  3950. function show_communication_edit( $comm_id ) {
  3951. global $page;
  3952. if( $comm_id === false ) {
  3953. $addcomm =& new M_Communication( 0 );
  3954. echo "<div class='wrap'>";
  3955. echo "<h2>" . __('Add Message','membership') . "</h2>";
  3956. echo '<div id="poststuff" class="metabox-holder">';
  3957. ?>
  3958. <div class="postbox">
  3959. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Add message','membership'); ?></span></h3>
  3960. <div class="inside">
  3961. <?php
  3962. echo '<form method="post" action="?page=' . $page . '">';
  3963. echo '<input type="hidden" name="ID" value="" />';
  3964. echo "<input type='hidden' name='action' value='added' />";
  3965. wp_nonce_field('add-comm');
  3966. $addcomm->addform();
  3967. echo '<p class="submit">';
  3968. echo '<input class="button-primary alignright" type="submit" name="go" value="' . __('Add message', 'membership') . '" /></p>';
  3969. echo '</form>';
  3970. echo '<br/>';
  3971. ?>
  3972. </div>
  3973. </div>
  3974. <?php
  3975. echo "</div>";
  3976. echo "</div>";
  3977. } else {
  3978. $editcomm =& new M_Communication( (int) $comm_id );
  3979. echo "<div class='wrap'>";
  3980. echo "<h2>" . __('Edit Message','membership') . "</h2>";
  3981. echo '<div id="poststuff" class="metabox-holder">';
  3982. ?>
  3983. <div class="postbox">
  3984. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Edit message','membership'); ?></span></h3>
  3985. <div class="inside">
  3986. <?php
  3987. echo '<form method="post" action="?page=' . $page . '">';
  3988. echo '<input type="hidden" name="ID" value="' . $comm_id . '" />';
  3989. echo "<input type='hidden' name='action' value='updated' />";
  3990. wp_nonce_field('update-comm_' . $comm_id);
  3991. $editcomm->editform();
  3992. echo '<p class="submit">';
  3993. echo '<input class="button-primary alignright" type="submit" name="go" value="' . __('Update message', 'membership') . '" /></p>';
  3994. echo '</form>';
  3995. echo '<br/>';
  3996. ?>
  3997. </div>
  3998. </div>
  3999. <?php
  4000. echo "</div>";
  4001. echo "</div>";
  4002. }
  4003. }
  4004. function handle_communication_panel() {
  4005. global $action, $page;
  4006. wp_reset_vars( array('action', 'page') );
  4007. switch(addslashes($action)) {
  4008. case 'edit': if(!empty($_GET['comm'])) {
  4009. // Make a communication
  4010. $this->show_communication_edit( $_GET['comm'] );
  4011. } else {
  4012. // Add a communication
  4013. $this->show_communication_edit( false );
  4014. }
  4015. return; // so we don't show the list below
  4016. break;
  4017. }
  4018. $messages = array();
  4019. $messages[1] = __('Message updated.','membership');
  4020. $messages[2] = __('Message not updated.','membership');
  4021. $messages[3] = __('Message activated.','membership');
  4022. $messages[4] = __('Message not activated.','membership');
  4023. $messages[5] = __('Message deactivated.','membership');
  4024. $messages[6] = __('Message not deactivated.','membership');
  4025. $messages[7] = __('Message activation toggled.','membership');
  4026. $messages[8] = __('Message added.','membership');
  4027. $messages[9] = __('Message not added.','membership');
  4028. $messages[10] = __('Message deleted.','membership');
  4029. $messages[11] = __('Message not deleted.','membership');
  4030. ?>
  4031. <div class='wrap'>
  4032. <div class="icon32" id="icon-edit-comments"><br></div>
  4033. <h2><?php _e('Edit Communication','membership'); ?><a class="add-new-h2" href="admin.php?page=<?php echo $page; ?>&amp;action=edit&amp;comm="><?php _e('Add New','membership'); ?></a></h2>
  4034. <?php
  4035. if ( isset($_GET['msg']) ) {
  4036. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  4037. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  4038. }
  4039. if(isset($_GET['comm_id'])) {
  4040. $comm_id = $_GET['comm_id'];
  4041. } else {
  4042. $comm_id = 'all';
  4043. }
  4044. $comms = $this->get_communications( $comm_id );
  4045. $comms = apply_filters('M_communications_list', $comms);
  4046. if($this->show_user_help( $page )) {
  4047. ?>
  4048. <div class='screenhelpheader'>
  4049. <a href="admin.php?page=<?php echo $page; ?>&amp;action=removeheader" class="welcome-panel-close"><?php _e('Dismiss','membership'); ?></a>
  4050. <?php
  4051. ob_start();
  4052. include_once(membership_dir('membershipincludes/help/header.communications.php'));
  4053. echo ob_get_clean();
  4054. ?>
  4055. </div>
  4056. <?php
  4057. }
  4058. ?>
  4059. <form method="get" action="?page=<?php echo esc_attr($page); ?>" id="posts-filter">
  4060. <input type='hidden' name='page' value='<?php echo esc_attr($page); ?>' />
  4061. <div class="tablenav">
  4062. <div class="alignleft actions">
  4063. <select name="action">
  4064. <option selected="selected" value=""><?php _e('Bulk Actions','membership'); ?></option>
  4065. <option value="delete"><?php _e('Delete','membership'); ?></option>
  4066. <option value="toggle"><?php _e('Toggle activation','membership'); ?></option>
  4067. </select>
  4068. <input type="submit" class="button-secondary action" id="doaction" name="doaction" value="<?php _e('Apply'); ?>">
  4069. <select name="comm_id">
  4070. <option <?php if(isset($_GET['comm_id']) && addslashes($_GET['comm_id']) == 'all') echo "selected='selected'"; ?> value="all"><?php _e('View all Messages','membership'); ?></option>
  4071. <option <?php if(isset($_GET['comm_id']) && addslashes($_GET['comm_id']) == 'active') echo "selected='selected'"; ?> value="active"><?php _e('View active Messages','membership'); ?></option>
  4072. <option <?php if(isset($_GET['comm_id']) && addslashes($_GET['comm_id']) == 'inactive') echo "selected='selected'"; ?> value="inactive"><?php _e('View inactive Messages','membership'); ?></option>
  4073. </select>
  4074. <input type="submit" class="button-secondary" value="<?php _e('Filter','membership'); ?>" id="post-query-submit">
  4075. </div>
  4076. <div class="alignright actions">
  4077. </div>
  4078. <br class="clear">
  4079. </div>
  4080. <div class="clear"></div>
  4081. <?php
  4082. wp_original_referer_field(true, 'previous'); wp_nonce_field('bulk-comms');
  4083. $columns = array( "name" => __('Message Subject','membership'),
  4084. "active" => __('Active','membership'),
  4085. "transactions" => __('Pre-expiry period','membership')
  4086. );
  4087. $columns = apply_filters('membership_communicationcolumns', $columns);
  4088. ?>
  4089. <table cellspacing="0" class="widefat fixed">
  4090. <thead>
  4091. <tr>
  4092. <th style="" class="manage-column column-cb check-column" id="cb" scope="col"><input type="checkbox"></th>
  4093. <?php
  4094. foreach($columns as $key => $col) {
  4095. ?>
  4096. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  4097. <?php
  4098. }
  4099. ?>
  4100. </tr>
  4101. </thead>
  4102. <tfoot>
  4103. <tr>
  4104. <th style="" class="manage-column column-cb check-column" scope="col"><input type="checkbox"></th>
  4105. <?php
  4106. reset($columns);
  4107. foreach($columns as $key => $col) {
  4108. ?>
  4109. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  4110. <?php
  4111. }
  4112. ?>
  4113. </tr>
  4114. </tfoot>
  4115. <tbody>
  4116. <?php
  4117. if($comms) {
  4118. foreach($comms as $key => $comm) {
  4119. ?>
  4120. <tr valign="middle" class="alternate" id="comm-<?php echo $comm->id; ?>">
  4121. <th class="check-column" scope="row"><input type="checkbox" value="<?php echo esc_attr($comm->id); ?>" name="commcheck[]"></th>
  4122. <td class="column-name">
  4123. <strong><a title="<?php _e('Edit','membership'); ?> <?php echo esc_attr(stripslashes($comm->subject)); ?>" href="?page=<?php echo $page; ?>&amp;action=edit&amp;comm=<?php echo $comm->id; ?>" class="row-title"><?php echo esc_html(stripslashes($comm->subject)); ?></a></strong>
  4124. <?php
  4125. $actions = array();
  4126. $actions['edit'] = "<span class='edit'><a href='?page=" . $page . "&amp;action=edit&amp;comm=" . $comm->id . "'>" . __('Edit', 'membership') . "</a></span>";
  4127. if($comm->active == 1) {
  4128. $actions['toggle'] = "<span class='edit deactivate'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=deactivate&amp;comm=" . $comm->id . "", 'toggle-comm_' . $comm->id) . "'>" . __('Deactivate', 'membership') . "</a></span>";
  4129. } else {
  4130. $actions['toggle'] = "<span class='edit activate'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=activate&amp;comm=" . $comm->id . "", 'toggle-comm_' . $comm->id) . "'>" . __('Activate', 'membership') . "</a></span>";
  4131. }
  4132. $actions['delete'] = "<span class='delete'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=delete&amp;comm=" . $comm->id . "", 'delete-comm_' . $comm->id) . "'>" . __('Delete', 'membership') . "</a></span>";
  4133. ?>
  4134. <br><div class="row-actions"><?php echo implode(" | ", $actions); ?></div>
  4135. </td>
  4136. <td class="column-active">
  4137. <?php
  4138. if($comm->active == 1) {
  4139. echo "<span class='membershipactivestatus'>" . __('Active', 'membership') . "</span>";
  4140. } else {
  4141. echo "<span class='membershipinactivestatus'>" . __('Inactive', 'membership') . "</span>";
  4142. }
  4143. ?>
  4144. </td>
  4145. <td class="column-transactions">
  4146. <?php
  4147. if($comm->periodstamp == 0) {
  4148. echo __("Signup message",'membership');
  4149. } else {
  4150. // Show pre or post
  4151. if($comm->periodprepost == 'pre') {
  4152. echo "-&nbsp;";
  4153. } else {
  4154. echo "+&nbsp;";
  4155. }
  4156. // Show period
  4157. echo $comm->periodunit . "&nbsp;";
  4158. // Show unit
  4159. switch($comm->periodtype) {
  4160. case 'n': echo __("Minute(s)",'membership');
  4161. break;
  4162. case 'h': echo __("Hour(s)",'membership');
  4163. break;
  4164. case 'd': echo __("Day(s)",'membership');
  4165. break;
  4166. case 'w': echo __("Week(s)",'membership');
  4167. break;
  4168. case 'm': echo __("Month(s)",'membership');
  4169. break;
  4170. case 'y': echo __("Year(s)",'membership');
  4171. break;
  4172. }
  4173. }
  4174. ?>
  4175. </td>
  4176. </tr>
  4177. <?php
  4178. }
  4179. } else {
  4180. $columncount = count($columns) + 1;
  4181. ?>
  4182. <tr valign="middle" class="alternate" >
  4183. <td colspan="<?php echo $columncount; ?>" scope="row"><?php _e('No communication messages have been set up.','membership'); ?></td>
  4184. </tr>
  4185. <?php
  4186. }
  4187. ?>
  4188. </tbody>
  4189. </table>
  4190. <div class="tablenav">
  4191. <div class="alignleft actions">
  4192. <select name="action2">
  4193. <option selected="selected" value=""><?php _e('Bulk Actions','membership'); ?></option>
  4194. <option value="delete"><?php _e('Delete','membership'); ?></option>
  4195. <option value="toggle"><?php _e('Toggle activation','membership'); ?></option>
  4196. </select>
  4197. <input type="submit" class="button-secondary action" id="doaction2" name="doaction2" value="<?php _e('Apply','membership'); ?>">
  4198. </div>
  4199. <div class="alignright actions">
  4200. </div>
  4201. <br class="clear">
  4202. </div>
  4203. </form>
  4204. </div> <!-- wrap -->
  4205. <?php
  4206. }
  4207. function get_communications( $type = 'all') {
  4208. switch($type) {
  4209. case 'active': $sql = "SELECT * FROM {$this->communications} WHERE active = 1 ORDER BY periodstamp ASC";
  4210. break;
  4211. case 'inactive': $sql = "SELECT * FROM {$this->communications} WHERE active = 0 ORDER BY periodstamp ASC";
  4212. break;
  4213. case 'all':
  4214. default: $sql = "SELECT * FROM {$this->communications} ORDER BY periodstamp ASC";
  4215. break;
  4216. }
  4217. $results = $this->db->get_results( $sql );
  4218. if(!empty($results)) {
  4219. return $results;
  4220. } else {
  4221. return false;
  4222. }
  4223. }
  4224. function handle_urlgroups_updates() {
  4225. global $action, $page;
  4226. wp_reset_vars( array('action', 'page') );
  4227. if(isset($_GET['doaction']) || isset($_GET['doaction2'])) {
  4228. if(addslashes($_GET['action']) == 'delete' || addslashes($_GET['action2']) == 'delete') {
  4229. $action = 'bulk-delete';
  4230. }
  4231. }
  4232. switch(addslashes($action)) {
  4233. case 'removeheader': $this->dismiss_user_help( $page );
  4234. wp_safe_redirect( remove_query_arg( 'action' ) );
  4235. break;
  4236. case 'added': check_admin_referer('add-group');
  4237. $group =& new M_Urlgroup( 0 );
  4238. if($group->add()) {
  4239. wp_safe_redirect( add_query_arg( 'msg', 3, 'admin.php?page=' . $page ) );
  4240. } else {
  4241. wp_safe_redirect( add_query_arg( 'msg', 4, 'admin.php?page=' . $page ) );
  4242. }
  4243. break;
  4244. case 'updated': $id = (int) $_POST['ID'];
  4245. check_admin_referer('update-group-' . $id);
  4246. if($id) {
  4247. $group =& new M_Urlgroup( $id );
  4248. if($group->update()) {
  4249. wp_safe_redirect( add_query_arg( 'msg', 1, 'admin.php?page=' . $page ) );
  4250. } else {
  4251. wp_safe_redirect( add_query_arg( 'msg', 2, 'admin.php?page=' . $page ) );
  4252. }
  4253. } else {
  4254. wp_safe_redirect( add_query_arg( 'msg', 2, 'admin.php?page=' . $page ) );
  4255. }
  4256. break;
  4257. case 'delete': if(isset($_GET['group'])) {
  4258. $id = (int) $_GET['group'];
  4259. check_admin_referer('delete-group_' . $id);
  4260. $group =& new M_Urlgroup( $id );
  4261. if($group->delete()) {
  4262. wp_safe_redirect( add_query_arg( 'msg', 5, wp_get_referer() ) );
  4263. } else {
  4264. wp_safe_redirect( add_query_arg( 'msg', 6, wp_get_referer() ) );
  4265. }
  4266. }
  4267. break;
  4268. case 'bulk-delete':
  4269. check_admin_referer('bulk-groups');
  4270. foreach($_GET['groupcheck'] AS $value) {
  4271. if(is_numeric($value)) {
  4272. $id = (int) $value;
  4273. $group =& new M_Urlgroup( $id );
  4274. $group->delete();
  4275. }
  4276. }
  4277. wp_safe_redirect( add_query_arg( 'msg', 7, wp_get_referer() ) );
  4278. break;
  4279. }
  4280. }
  4281. function get_urlgroups() {
  4282. $sql = $this->db->prepare( "SELECT * FROM {$this->urlgroups} WHERE groupname NOT LIKE (%s) ORDER BY id ASC", '\_%' );
  4283. $results = $this->db->get_results( $sql );
  4284. if(!empty($results)) {
  4285. return $results;
  4286. } else {
  4287. return false;
  4288. }
  4289. }
  4290. function show_urlgroup_edit( $group_id ) {
  4291. global $page;
  4292. if( $group_id === false ) {
  4293. $add =& new M_Urlgroup( 0 );
  4294. echo "<div class='wrap'>";
  4295. echo "<h2>" . __('Add URL group','membership') . "</h2>";
  4296. echo '<div id="poststuff" class="metabox-holder">';
  4297. ?>
  4298. <div class="postbox">
  4299. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Add URL group','membership'); ?></span></h3>
  4300. <div class="inside">
  4301. <?php
  4302. echo '<form method="post" action="?page=' . $page . '">';
  4303. echo '<input type="hidden" name="ID" value="" />';
  4304. echo "<input type='hidden' name='action' value='added' />";
  4305. wp_nonce_field('add-group');
  4306. $add->addform();
  4307. echo '<p class="submit">';
  4308. echo '<input class="button-primary alignright" type="submit" name="go" value="' . __('Add group', 'membership') . '" /></p>';
  4309. echo '</form>';
  4310. echo '<br/>';
  4311. ?>
  4312. </div>
  4313. </div>
  4314. <?php
  4315. echo "</div>";
  4316. echo "</div>";
  4317. } else {
  4318. $edit =& new M_Urlgroup( (int) $group_id );
  4319. echo "<div class='wrap'>";
  4320. echo "<h2>" . __('Edit URL group','membership') . "</h2>";
  4321. echo '<div id="poststuff" class="metabox-holder">';
  4322. ?>
  4323. <div class="postbox">
  4324. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Edit URL group','membership'); ?></span></h3>
  4325. <div class="inside">
  4326. <?php
  4327. echo '<form method="post" action="?page=' . $page . '">';
  4328. echo '<input type="hidden" name="ID" value="' . $group_id . '" />';
  4329. echo "<input type='hidden' name='action' value='updated' />";
  4330. wp_nonce_field('update-group-' . $group_id);
  4331. $edit->editform();
  4332. echo '<p class="submit">';
  4333. echo '<input class="button-primary alignright" type="submit" name="go" value="' . __('Update group', 'membership') . '" /></p>';
  4334. echo '</form>';
  4335. echo '<br/>';
  4336. ?>
  4337. </div>
  4338. </div>
  4339. <?php
  4340. echo "</div>";
  4341. echo "</div>";
  4342. }
  4343. }
  4344. function handle_urlgroups_panel() {
  4345. global $action, $page;
  4346. wp_reset_vars( array('action', 'page') );
  4347. switch(addslashes($action)) {
  4348. case 'edit': if(!empty($_GET['group'])) {
  4349. // Make a communication
  4350. $this->show_urlgroup_edit( $_GET['group'] );
  4351. } else {
  4352. $this->show_urlgroup_edit( false );
  4353. }
  4354. return; // so we don't show the list below
  4355. break;
  4356. }
  4357. $messages = array();
  4358. $messages[1] = __('Group updated.','membership');
  4359. $messages[2] = __('Group not updated.','membership');
  4360. $messages[3] = __('Group added.','membership');
  4361. $messages[4] = __('Group not added.','membership');
  4362. $messages[5] = __('Group deleted.','membership');
  4363. $messages[6] = __('Group not deleted.','membership');
  4364. $messages[7] = __('Groups deleted.','membership');
  4365. ?>
  4366. <div class='wrap'>
  4367. <div class="icon32" id="icon-edit-pages"><br></div>
  4368. <h2><?php _e('Edit URL Groups','membership'); ?><a class="add-new-h2" href="admin.php?page=<?php echo $page; ?>&amp;action=edit&amp;group="><?php _e('Add New','membership'); ?></a></h2>
  4369. <?php
  4370. if ( isset($_GET['msg']) ) {
  4371. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  4372. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  4373. }
  4374. $groups = $this->get_urlgroups();
  4375. $groups = apply_filters('M_urlgroups_list', $groups);
  4376. if($this->show_user_help( $page )) {
  4377. ?>
  4378. <div class='screenhelpheader'>
  4379. <a href="admin.php?page=<?php echo $page; ?>&amp;action=removeheader" class="welcome-panel-close"><?php _e('Dismiss','membership'); ?></a>
  4380. <?php
  4381. ob_start();
  4382. include_once(membership_dir('membershipincludes/help/header.urlgroups.php'));
  4383. echo ob_get_clean();
  4384. ?>
  4385. </div>
  4386. <?php
  4387. }
  4388. ?>
  4389. <form method="get" action="?page=<?php echo esc_attr($page); ?>" id="posts-filter">
  4390. <input type='hidden' name='page' value='<?php echo esc_attr($page); ?>' />
  4391. <div class="tablenav">
  4392. <div class="alignleft actions">
  4393. <select name="action">
  4394. <option selected="selected" value=""><?php _e('Bulk Actions','membership'); ?></option>
  4395. <option value="delete"><?php _e('Delete','membership'); ?></option>
  4396. </select>
  4397. <input type="submit" class="button-secondary action" id="doaction" name="doaction" value="<?php _e('Apply','membership'); ?>">
  4398. </div>
  4399. <div class="alignright actions">
  4400. </div>
  4401. <br class="clear">
  4402. </div>
  4403. <div class="clear"></div>
  4404. <?php
  4405. wp_original_referer_field(true, 'previous'); wp_nonce_field('bulk-groups');
  4406. $columns = array( "name" => __('Group Name','membership')
  4407. );
  4408. $columns = apply_filters('membership_groupscolumns', $columns);
  4409. ?>
  4410. <table cellspacing="0" class="widefat fixed">
  4411. <thead>
  4412. <tr>
  4413. <th style="" class="manage-column column-cb check-column" id="cb" scope="col"><input type="checkbox"></th>
  4414. <?php
  4415. foreach($columns as $key => $col) {
  4416. ?>
  4417. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  4418. <?php
  4419. }
  4420. ?>
  4421. </tr>
  4422. </thead>
  4423. <tfoot>
  4424. <tr>
  4425. <th style="" class="manage-column column-cb check-column" scope="col"><input type="checkbox"></th>
  4426. <?php
  4427. reset($columns);
  4428. foreach($columns as $key => $col) {
  4429. ?>
  4430. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  4431. <?php
  4432. }
  4433. ?>
  4434. </tr>
  4435. </tfoot>
  4436. <tbody>
  4437. <?php
  4438. if(!empty($groups)) {
  4439. foreach($groups as $key => $group) {
  4440. ?>
  4441. <tr valign="middle" class="alternate" id="group-<?php echo $group->id; ?>">
  4442. <th class="check-column" scope="row"><input type="checkbox" value="<?php echo esc_attr($group->id); ?>" name="groupcheck[]"></th>
  4443. <td class="column-name">
  4444. <strong><a title="<?php _e('Edit','membership'); ?> <?php echo esc_attr(stripslashes($group->groupname)); ?>" href="?page=<?php echo $page; ?>&amp;action=edit&amp;group=<?php echo $group->id; ?>" class="row-title"><?php echo esc_html(stripslashes($group->groupname)); ?></a></strong>
  4445. <?php
  4446. $actions = array();
  4447. $actions['edit'] = "<span class='edit'><a href='?page=" . $page . "&amp;action=edit&amp;group=" . $group->id . "'>" . __('Edit','membership') . "</a></span>";
  4448. $actions['delete'] = "<span class='delete'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=delete&amp;group=" . $group->id . "", 'delete-group_' . $group->id) . "'>" . __('Delete', 'membership') . "</a></span>";
  4449. ?>
  4450. <br><div class="row-actions"><?php echo implode(" | ", $actions); ?></div>
  4451. </td>
  4452. </tr>
  4453. <?php
  4454. }
  4455. } else {
  4456. $columncount = count($columns) + 1;
  4457. ?>
  4458. <tr valign="middle" class="alternate" >
  4459. <td colspan="<?php echo $columncount; ?>" scope="row"><?php _e('No URL groups have been set up.','membership'); ?></td>
  4460. </tr>
  4461. <?php
  4462. }
  4463. ?>
  4464. </tbody>
  4465. </table>
  4466. <div class="tablenav">
  4467. <div class="alignleft actions">
  4468. <select name="action2">
  4469. <option selected="selected" value=""><?php _e('Bulk Actions','membership'); ?></option>
  4470. <option value="delete"><?php _e('Delete','membership'); ?></option>
  4471. </select>
  4472. <input type="submit" class="button-secondary action" id="doaction2" name="doaction2" value="<?php _e('Apply','membership'); ?>">
  4473. </div>
  4474. <div class="alignright actions">
  4475. </div>
  4476. <br class="clear">
  4477. </div>
  4478. </form>
  4479. </div> <!-- wrap -->
  4480. <?php
  4481. }
  4482. function handle_ping_updates() {
  4483. global $action, $page;
  4484. wp_reset_vars( array('action', 'page') );
  4485. if(isset($_GET['doaction']) || isset($_GET['doaction2'])) {
  4486. if(addslashes($_GET['action']) == 'delete' || addslashes($_GET['action2']) == 'delete') {
  4487. $action = 'bulk-delete';
  4488. }
  4489. }
  4490. switch(addslashes($action)) {
  4491. case 'removeheader': $this->dismiss_user_help( $page );
  4492. wp_safe_redirect( remove_query_arg( 'action' ) );
  4493. break;
  4494. case 'added': check_admin_referer('add-ping');
  4495. $ping =& new M_Ping( 0 );
  4496. if($ping->add()) {
  4497. wp_safe_redirect( add_query_arg( 'msg', 3, 'admin.php?page=' . $page ) );
  4498. } else {
  4499. wp_safe_redirect( add_query_arg( 'msg', 4, 'admin.php?page=' . $page ) );
  4500. }
  4501. break;
  4502. case 'updated': $id = (int) $_POST['ID'];
  4503. check_admin_referer('update-ping-' . $id);
  4504. if($id) {
  4505. $ping =& new M_Ping( $id );
  4506. if($ping->update()) {
  4507. wp_safe_redirect( add_query_arg( 'msg', 1, 'admin.php?page=' . $page ) );
  4508. } else {
  4509. wp_safe_redirect( add_query_arg( 'msg', 2, 'admin.php?page=' . $page ) );
  4510. }
  4511. } else {
  4512. wp_safe_redirect( add_query_arg( 'msg', 2, 'admin.php?page=' . $page ) );
  4513. }
  4514. break;
  4515. case 'delete': if(isset($_GET['ping'])) {
  4516. $id = (int) $_GET['ping'];
  4517. check_admin_referer('delete-ping_' . $id);
  4518. $ping =& new M_Ping( $id );
  4519. if($ping->delete()) {
  4520. wp_safe_redirect( add_query_arg( 'msg', 5, wp_get_referer() ) );
  4521. } else {
  4522. wp_safe_redirect( add_query_arg( 'msg', 6, wp_get_referer() ) );
  4523. }
  4524. }
  4525. break;
  4526. case 'bulk-delete':
  4527. check_admin_referer('bulk-pings');
  4528. foreach($_GET['pingcheck'] AS $value) {
  4529. if(is_numeric($value)) {
  4530. $id = (int) $value;
  4531. $ping =& new M_Ping( $id );
  4532. $ping->delete();
  4533. }
  4534. }
  4535. wp_safe_redirect( add_query_arg( 'msg', 7, wp_get_referer() ) );
  4536. break;
  4537. case 'history':
  4538. if(isset($_GET['history']) && isset($_GET['resend'])) {
  4539. $history = (int) $_GET['history'];
  4540. switch($_GET['resend']) {
  4541. case 'new': $ping = new M_Ping( false );
  4542. $ping->resend_historic_ping( $history, true );
  4543. wp_safe_redirect( add_query_arg( 'msg', 1, wp_get_referer() ) );
  4544. break;
  4545. case 'over': $ping = new M_Ping( false );
  4546. $ping->resend_historic_ping( $history, false );
  4547. wp_safe_redirect( add_query_arg( 'msg', 1, wp_get_referer() ) );
  4548. break;
  4549. }
  4550. }
  4551. break;
  4552. }
  4553. }
  4554. function show_ping_edit( $ping_id ) {
  4555. global $page;
  4556. if( $ping_id === false ) {
  4557. $add =& new M_Ping( 0 );
  4558. echo "<div class='wrap'>";
  4559. echo "<h2>" . __('Add Ping details','membership') . "</h2>";
  4560. echo '<div id="poststuff" class="metabox-holder">';
  4561. ?>
  4562. <div class="postbox">
  4563. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Add ping details','membership'); ?></span></h3>
  4564. <div class="inside">
  4565. <?php
  4566. echo '<form method="post" action="?page=' . $page . '">';
  4567. echo '<input type="hidden" name="ID" value="" />';
  4568. echo "<input type='hidden' name='action' value='added' />";
  4569. wp_nonce_field('add-ping');
  4570. $add->addform();
  4571. echo '<p class="submit">';
  4572. echo '<input class="button-primary alignright" type="submit" name="go" value="' . __('Add ping details', 'membership') . '" /></p>';
  4573. echo '</form>';
  4574. echo '<br/>';
  4575. ?>
  4576. </div>
  4577. </div>
  4578. <?php
  4579. echo "</div>";
  4580. echo "</div>";
  4581. } else {
  4582. $edit =& new M_Ping( (int) $ping_id );
  4583. echo "<div class='wrap'>";
  4584. echo "<h2>" . __('Edit Ping details','membership') . "</h2>";
  4585. echo '<div id="poststuff" class="metabox-holder">';
  4586. ?>
  4587. <div class="postbox">
  4588. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Edit ping details','membership'); ?></span></h3>
  4589. <div class="inside">
  4590. <?php
  4591. echo '<form method="post" action="?page=' . $page . '">';
  4592. echo '<input type="hidden" name="ID" value="' . $ping_id . '" />';
  4593. echo "<input type='hidden' name='action' value='updated' />";
  4594. wp_nonce_field('update-ping-' . $ping_id);
  4595. $edit->editform();
  4596. echo '<p class="submit">';
  4597. echo '<input class="button-primary alignright" type="submit" name="go" value="' . __('Update ping details', 'membership') . '" /></p>';
  4598. echo '</form>';
  4599. echo '<br/>';
  4600. ?>
  4601. </div>
  4602. </div>
  4603. <?php
  4604. echo "</div>";
  4605. echo "</div>";
  4606. }
  4607. }
  4608. function get_pings() {
  4609. $sql = "SELECT * FROM {$this->pings} ORDER BY id ASC";
  4610. $results = $this->db->get_results( $sql );
  4611. if(!empty($results)) {
  4612. return $results;
  4613. } else {
  4614. return false;
  4615. }
  4616. }
  4617. function handle_ping_history_panel( $ping_id ) {
  4618. global $action, $page;
  4619. wp_reset_vars( array('action', 'page') );
  4620. $messages = array();
  4621. $messages[1] = __('Ping resent.','membership');
  4622. $messages[2] = __('Ping not resent.','membership');
  4623. ?>
  4624. <div class='wrap'>
  4625. <div class="icon32" id="icon-link-manager"><br></div>
  4626. <h2><?php _e('Pings History','membership'); ?></h2>
  4627. <?php
  4628. if ( isset($_GET['msg']) ) {
  4629. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  4630. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  4631. }
  4632. $ping = new M_Ping( $ping_id );
  4633. $history = $ping->get_history();
  4634. $columns = array( "name" => __('Ping Name','membership'),
  4635. "url" => __('URL','membership'),
  4636. "status" => __('Status', 'membership'),
  4637. "date" => __('Date', 'membership')
  4638. );
  4639. $columns = apply_filters('membership_pingscolumns', $columns);
  4640. ?>
  4641. <table cellspacing="0" class="widefat fixed">
  4642. <thead>
  4643. <tr>
  4644. <?php
  4645. foreach($columns as $key => $col) {
  4646. ?>
  4647. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  4648. <?php
  4649. }
  4650. ?>
  4651. </tr>
  4652. </thead>
  4653. <tfoot>
  4654. <tr>
  4655. <?php
  4656. reset($columns);
  4657. foreach($columns as $key => $col) {
  4658. ?>
  4659. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  4660. <?php
  4661. }
  4662. ?>
  4663. </tr>
  4664. </tfoot>
  4665. <tbody>
  4666. <?php
  4667. if(!empty($history)) {
  4668. foreach($history as $key => $h) {
  4669. ?>
  4670. <tr valign="middle" class="alternate" id="history-<?php echo $h->id; ?>">
  4671. <td class="column-name">
  4672. <strong><?php echo esc_html(stripslashes($ping->ping_name() )); ?></strong>
  4673. <?php
  4674. $actions = array();
  4675. $actions['resendnew'] = "<span class='edit'><a href='" . wp_nonce_url("?page=" . $page . "&amp;action=history&amp;resend=new&amp;history=" . $h->id, 'membership_resend_ping_' . $h->id ) . "'>" . __('Resend as new ping','membership') . "</a></span>";
  4676. $actions['resendover'] = "<span class='edit'><a href='" . wp_nonce_url("?page=" . $page . "&amp;action=history&amp;resend=over&amp;history=" . $h->id, 'membership_resend_ping_' . $h->id ) . "'>" . __('Resend and overwrite','membership') . "</a></span>";
  4677. ?>
  4678. <br><div class="row-actions"><?php echo implode(" | ", $actions); ?></div>
  4679. </td>
  4680. <td class="column-name">
  4681. <?php
  4682. echo $ping->ping_url();
  4683. ?>
  4684. </td>
  4685. <td class="column-name">
  4686. <?php
  4687. // Status
  4688. $status = unserialize($h->ping_return);
  4689. if(is_wp_error($status)) {
  4690. // WP error
  4691. echo "<span style='color: red;'>" . implode("<br/>", $status->get_error_messages() ) . "</span>";
  4692. } else {
  4693. if(!empty($status['response'])) {
  4694. if($status['response']['code'] == '200') {
  4695. echo "<span style='color: green;'>" . $status['response']['code'] . " - " . $status['response']['message'] . "</span>";
  4696. } else {
  4697. echo "<span style='color: red;'>" . $status['response']['code'] . " - " . $status['response']['message'] . "</span>";
  4698. }
  4699. }
  4700. }
  4701. //echo $ping->ping_url();
  4702. ?>
  4703. </td>
  4704. <td class="column-name">
  4705. <?php
  4706. echo mysql2date( "Y-m-j H:i:s", $h->ping_sent );
  4707. ?>
  4708. </td>
  4709. </tr>
  4710. <?php
  4711. }
  4712. } else {
  4713. $columncount = count($columns);
  4714. ?>
  4715. <tr valign="middle" class="alternate" >
  4716. <td colspan="<?php echo $columncount; ?>" scope="row"><?php _e('No History available for this ping.','membership'); ?></td>
  4717. </tr>
  4718. <?php
  4719. }
  4720. ?>
  4721. </tbody>
  4722. </table>
  4723. </div> <!-- wrap -->
  4724. <?php
  4725. }
  4726. function handle_pings_panel() {
  4727. global $action, $page;
  4728. wp_reset_vars( array('action', 'page') );
  4729. switch(addslashes($action)) {
  4730. case 'edit': if(!empty($_GET['ping'])) {
  4731. // Make a communication
  4732. $this->show_ping_edit( (int) $_GET['ping'] );
  4733. } else {
  4734. $this->show_ping_edit( false );
  4735. }
  4736. return; // so we don't show the list below
  4737. break;
  4738. case 'history':
  4739. if(!empty($_GET['ping'])) {
  4740. $this->handle_ping_history_panel( (int) $_GET['ping'] );
  4741. }
  4742. return;
  4743. break;
  4744. }
  4745. $messages = array();
  4746. $messages[1] = __('Ping details updated.','membership');
  4747. $messages[2] = __('Ping details not updated.','membership');
  4748. $messages[3] = __('Ping details added.','membership');
  4749. $messages[4] = __('Ping details not added.','membership');
  4750. $messages[5] = __('Ping details deleted.','membership');
  4751. $messages[6] = __('Ping details not deleted.','membership');
  4752. $messages[7] = __('Ping details deleted.','membership');
  4753. ?>
  4754. <div class='wrap'>
  4755. <div class="icon32" id="icon-link-manager"><br></div>
  4756. <h2><?php _e('Edit Pings','membership'); ?><a class="add-new-h2" href="admin.php?page=<?php echo $page; ?>&amp;action=edit&amp;ping="><?php _e('Add New','membership'); ?></a></h2>
  4757. <?php
  4758. if ( isset($_GET['msg']) ) {
  4759. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  4760. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  4761. }
  4762. $pings = $this->get_pings();
  4763. $pings = apply_filters('M_pings_list', $pings);
  4764. if($this->show_user_help( $page )) {
  4765. ?>
  4766. <div class='screenhelpheader'>
  4767. <a href="admin.php?page=<?php echo $page; ?>&amp;action=removeheader" class="welcome-panel-close"><?php _e('Dismiss','membership'); ?></a>
  4768. <?php
  4769. ob_start();
  4770. include_once(membership_dir('membershipincludes/help/header.pings.php'));
  4771. echo ob_get_clean();
  4772. ?>
  4773. </div>
  4774. <?php
  4775. }
  4776. ?>
  4777. <form method="get" action="?page=<?php echo esc_attr($page); ?>" id="posts-filter">
  4778. <input type='hidden' name='page' value='<?php echo esc_attr($page); ?>' />
  4779. <div class="tablenav">
  4780. <div class="alignleft actions">
  4781. <select name="action">
  4782. <option selected="selected" value=""><?php _e('Bulk Actions','membership'); ?></option>
  4783. <option value="delete"><?php _e('Delete','membership'); ?></option>
  4784. </select>
  4785. <input type="submit" class="button-secondary action" id="doaction" name="doaction" value="<?php _e('Apply','membership'); ?>">
  4786. </div>
  4787. <div class="alignright actions">
  4788. </div>
  4789. <br class="clear">
  4790. </div>
  4791. <div class="clear"></div>
  4792. <?php
  4793. wp_original_referer_field(true, 'previous'); wp_nonce_field('bulk-pings');
  4794. $columns = array( "name" => __('Ping Name','membership')
  4795. );
  4796. $columns = apply_filters('membership_pingscolumns', $columns);
  4797. ?>
  4798. <table cellspacing="0" class="widefat fixed">
  4799. <thead>
  4800. <tr>
  4801. <th style="" class="manage-column column-cb check-column" id="cb" scope="col"><input type="checkbox"></th>
  4802. <?php
  4803. foreach($columns as $key => $col) {
  4804. ?>
  4805. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  4806. <?php
  4807. }
  4808. ?>
  4809. </tr>
  4810. </thead>
  4811. <tfoot>
  4812. <tr>
  4813. <th style="" class="manage-column column-cb check-column" scope="col"><input type="checkbox"></th>
  4814. <?php
  4815. reset($columns);
  4816. foreach($columns as $key => $col) {
  4817. ?>
  4818. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  4819. <?php
  4820. }
  4821. ?>
  4822. </tr>
  4823. </tfoot>
  4824. <tbody>
  4825. <?php
  4826. if(!empty($pings)) {
  4827. foreach($pings as $key => $ping) {
  4828. ?>
  4829. <tr valign="middle" class="alternate" id="ping-<?php echo $ping->id; ?>">
  4830. <th class="check-column" scope="row"><input type="checkbox" value="<?php echo esc_attr($ping->id); ?>" name="pingcheck[]"></th>
  4831. <td class="column-name">
  4832. <strong><a title="<?php _e('Edit','membership'); ?> <?php echo esc_attr(stripslashes($ping->pingname)); ?>" href="?page=<?php echo $page; ?>&amp;action=edit&amp;ping=<?php echo $ping->id; ?>" class="row-title"><?php echo esc_html(stripslashes($ping->pingname)); ?></a></strong>
  4833. <?php
  4834. $actions = array();
  4835. $actions['edit'] = "<span class='edit'><a href='?page=" . $page . "&amp;action=edit&amp;ping=" . $ping->id . "'>" . __('Edit','membership') . "</a></span>";
  4836. $actions['trans'] = "<span class='edit'><a href='?page=" . $page . "&amp;action=history&amp;ping=" . $ping->id . "'>" . __('History','membership') . "</a></span>";
  4837. $actions['delete'] = "<span class='delete'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=delete&amp;ping=" . $ping->id . "", 'delete-ping_' . $ping->id) . "'>" . __('Delete', 'membership') . "</a></span>";
  4838. ?>
  4839. <br><div class="row-actions"><?php echo implode(" | ", $actions); ?></div>
  4840. </td>
  4841. </tr>
  4842. <?php
  4843. }
  4844. } else {
  4845. $columncount = count($columns) + 1;
  4846. ?>
  4847. <tr valign="middle" class="alternate" >
  4848. <td colspan="<?php echo $columncount; ?>" scope="row"><?php _e('No Pings have been set up.','membership'); ?></td>
  4849. </tr>
  4850. <?php
  4851. }
  4852. ?>
  4853. </tbody>
  4854. </table>
  4855. <div class="tablenav">
  4856. <div class="alignleft actions">
  4857. <select name="action2">
  4858. <option selected="selected" value=""><?php _e('Bulk Actions','membership'); ?></option>
  4859. <option value="delete"><?php _e('Delete','membership'); ?></option>
  4860. </select>
  4861. <input type="submit" class="button-secondary action" id="doaction2" name="doaction2" value="<?php _e('Apply','membership'); ?>">
  4862. </div>
  4863. <div class="alignright actions">
  4864. </div>
  4865. <br class="clear">
  4866. </div>
  4867. </form>
  4868. </div> <!-- wrap -->
  4869. <?php
  4870. }
  4871. function handle_profile_member_page() {
  4872. ?>
  4873. <div class='wrap'>
  4874. <div class="icon32" id="icon-users"><br></div>
  4875. <h2><?php _e('Membership details','membership'); ?></h2>
  4876. <?php
  4877. if ( isset($_GET['msg']) ) {
  4878. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  4879. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  4880. }
  4881. if(!current_user_is_member()) {
  4882. // Not a member so show the message and signup forms
  4883. ?>
  4884. <div class='nonmembermessage'>
  4885. <h3><?php _e('Not called yet','membership'); ?></h3>
  4886. <?php _e('Not called yet','membership'); ?>
  4887. </div>
  4888. <div class='signups'>
  4889. <h3><?php _e('Select a subscription','membership'); ?></h3>
  4890. <p>
  4891. <?php _e('Please select a subscription from the options below.','membership'); ?>
  4892. </p>
  4893. <?php
  4894. do_action( 'membership_subscription_form_before_subscriptions', $user_id );
  4895. $subs = $this->get_subscriptions();
  4896. do_action( 'membership_subscription_form_before_paid_subscriptions', $user_id );
  4897. foreach((array) $subs as $key => $sub) {
  4898. $subscription = new M_Subscription($sub->id);
  4899. ?>
  4900. <div class="subscription">
  4901. <div class="description">
  4902. <h3><?php echo $subscription->sub_name(); ?></h3>
  4903. <p><?php echo $subscription->sub_description(); ?></p>
  4904. </div>
  4905. <?php
  4906. $pricing = $subscription->get_pricingarray();
  4907. if($pricing) {
  4908. ?>
  4909. <div class='priceforms'>
  4910. <?php do_action('membership_purchase_button', $subscription, $pricing, $user_id); ?>
  4911. </div>
  4912. <?php
  4913. }
  4914. ?>
  4915. </div>
  4916. <?php
  4917. }
  4918. do_action( 'membership_subscription_form_after_paid_subscriptions', $user_id );
  4919. do_action( 'membership_subscription_form_after_subscriptions', $user_id );
  4920. ?>
  4921. </div>
  4922. <?php
  4923. } else {
  4924. if(current_user_has_subscription()) {
  4925. // User has a subscription already. Display the details - and an action to enable upgrading / not upgrading to take place.
  4926. ?>
  4927. <div class='nonmembermessage'>
  4928. <h3><?php _e('Not called yet','membership'); ?></h3>
  4929. <?php _e('Not called yet','membership'); ?>
  4930. </div>
  4931. <?php
  4932. }
  4933. }
  4934. ?>
  4935. </div> <!-- wrap -->
  4936. <?php
  4937. }
  4938. // Media extension options
  4939. /*
  4940. add_filter('attachment_fields_to_edit', array(&$this, 'add_media_protection_settings'), 99, 2);
  4941. add_filter('attachment_fields_to_save', array(&$this, 'save_media_protection_settings'), 99, 2);
  4942. */
  4943. function add_media_protection_settings($fields, $post) {
  4944. global $M_options;
  4945. $protected = get_post_meta($post->ID, '_membership_protected_content_group', true);
  4946. if(empty($protected)) {
  4947. $protected = 'no';
  4948. }
  4949. $html = "<select name='attachments[" . $post->ID . "][protected-content]'>";
  4950. $html .= "<option value='no'";
  4951. $html .= ">" . __('None', 'membership') . "</option>";
  4952. if(!empty($M_options['membershipdownloadgroups'])) {
  4953. foreach($M_options['membershipdownloadgroups'] as $key => $value) {
  4954. if(!empty($value)) {
  4955. $html .= "<option value='" . esc_attr(trim(stripslashes($value))) . "'";
  4956. if($protected == esc_attr(trim(stripslashes($value)))) {
  4957. $html .= " selected='selected'";
  4958. }
  4959. $html .= ">" . esc_html(trim(stripslashes($value))) . "</option>";
  4960. }
  4961. }
  4962. }
  4963. $html .= "</select>";
  4964. $fields['media-protected-content'] = array(
  4965. 'label' => __('Protected content group', 'membership'),
  4966. 'input' => 'html',
  4967. 'html' => $html,
  4968. 'helps' => __('Is this an item you may want to restrict access to?', 'membership')
  4969. );
  4970. return $fields;
  4971. }
  4972. function save_media_protection_settings($post, $attachment) {
  4973. $key = "protected-content";
  4974. if ( empty( $attachment[$key] ) || addslashes( $attachment[$key] ) == 'no') {
  4975. delete_post_meta($post['ID'], '_membership_protected_content_group'); // delete any residual metadata from a free-form field (as inserted below)
  4976. } else // free-form text was entered, insert postmeta with credit
  4977. update_post_meta($post['ID'], '_membership_protected_content_group', $attachment['protected-content']); // insert 'media-credit' metadata field for image with free-form text
  4978. return $post;
  4979. }
  4980. // Fake shortcode function for administration area - public class has the proper processing function
  4981. function do_fake_shortcode($atts, $content = null, $code = "") {
  4982. global $M_options;
  4983. return $M_options['shortcodemessage'];
  4984. }
  4985. // Database actions
  4986. function update_levelcounts() {
  4987. $sql = $this->db->prepare( "SELECT level_id, count(*) AS number FROM {$this->membership_relationships} WHERE level_id != %d GROUP BY level_id", 0 );
  4988. $this->db->query( $this->db->prepare( "UPDATE {$this->membership_levels} SET level_count = %d", 0) );
  4989. $levels = $this->db->get_results($sql);
  4990. if($levels) {
  4991. foreach($levels as $key => $level) {
  4992. $this->db->update( $this->membership_levels, array('level_count' => $level->number), array('id' => $level->level_id) );
  4993. }
  4994. }
  4995. }
  4996. function update_subcounts() {
  4997. $sql = $this->db->prepare( "SELECT sub_id, count(*) AS number FROM {$this->membership_relationships} WHERE sub_id != %d GROUP BY sub_id", 0 );
  4998. $this->db->query( $this->db->prepare( "UPDATE {$this->subscriptions} SET sub_count = %d", 0) );
  4999. $subs = $this->db->get_results($sql);
  5000. if($subs) {
  5001. foreach($subs as $key => $sub) {
  5002. $this->db->update( $this->subscriptions, array('sub_count' => $sub->number), array('id' => $sub->sub_id) );
  5003. }
  5004. }
  5005. }
  5006. function get_membership_levels($filter = false) {
  5007. if($filter) {
  5008. $where = array();
  5009. $orderby = array();
  5010. if(isset($filter['s'])) {
  5011. $where[] = "level_title LIKE '%" . mysql_real_escape_string($filter['s']) . "%'";
  5012. }
  5013. if(isset($filter['level_id'])) {
  5014. switch($filter['level_id']) {
  5015. case 'active': $where[] = "level_active = 1";
  5016. break;
  5017. case 'inactive': $where[] = "level_active = 0";
  5018. break;
  5019. }
  5020. }
  5021. if(isset($filter['order_by'])) {
  5022. switch($filter['order_by']) {
  5023. case 'order_id': $orderby[] = 'id ASC';
  5024. break;
  5025. case 'order_name': $orderby[] = 'level_title ASC';
  5026. break;
  5027. }
  5028. }
  5029. }
  5030. $sql = "SELECT * FROM {$this->membership_levels}";
  5031. if(!empty($where)) {
  5032. $sql .= " WHERE " . implode(' AND ', $where);
  5033. }
  5034. if(!empty($orderby)) {
  5035. $sql .= " ORDER BY " . implode(', ', $orderby);
  5036. }
  5037. return $this->db->get_results($sql);
  5038. }
  5039. //subscriptions
  5040. function get_public_subscriptions() {
  5041. $where = array();
  5042. $orderby = array();
  5043. $where[] = "sub_public = 1";
  5044. $where[] = "sub_active = 1";
  5045. $orderby[] = 'id ASC';
  5046. $sql = "SELECT * FROM {$this->subscriptions}";
  5047. if(!empty($where)) {
  5048. $sql .= " WHERE " . implode(' AND ', $where);
  5049. }
  5050. if(!empty($orderby)) {
  5051. $sql .= " ORDER BY " . implode(', ', $orderby);
  5052. }
  5053. return $this->db->get_results($sql);
  5054. }
  5055. function get_subscriptions($filter = false) {
  5056. if($filter) {
  5057. $where = array();
  5058. $orderby = array();
  5059. if(isset($filter['s'])) {
  5060. $where[] = "sub_name LIKE '%" . mysql_real_escape_string($filter['s']) . "%'";
  5061. }
  5062. if(isset($filter['sub_status'])) {
  5063. switch($filter['sub_status']) {
  5064. case 'active': $where[] = "sub_active = 1";
  5065. break;
  5066. case 'inactive': $where[] = "sub_active = 0";
  5067. break;
  5068. case 'public': $where[] = "sub_public = 1";
  5069. break;
  5070. case 'private': $where[] = "sub_public = 0";
  5071. break;
  5072. }
  5073. }
  5074. if(isset($filter['order_by'])) {
  5075. switch($filter['order_by']) {
  5076. case 'order_id': $orderby[] = 'id ASC';
  5077. break;
  5078. case 'order_name': $orderby[] = 'sub_name ASC';
  5079. break;
  5080. }
  5081. }
  5082. }
  5083. $sql = "SELECT * FROM {$this->subscriptions}";
  5084. if(!empty($where)) {
  5085. $sql .= " WHERE " . implode(' AND ', $where);
  5086. }
  5087. if(!empty($orderby)) {
  5088. $sql .= " ORDER BY " . implode(', ', $orderby);
  5089. }
  5090. return $this->db->get_results($sql);
  5091. }
  5092. function get_subscriptions_and_levels($filter = false) {
  5093. if($filter) {
  5094. $where = array();
  5095. $orderby = array();
  5096. if(isset($filter['s'])) {
  5097. $where[] = "sub_name LIKE '%" . mysql_real_escape_string($filter['s']) . "%'";
  5098. }
  5099. if(isset($filter['sub_status'])) {
  5100. switch($filter['sub_status']) {
  5101. case 'active': $where[] = "sub_active = 1";
  5102. break;
  5103. case 'inactive': $where[] = "sub_active = 0";
  5104. break;
  5105. case 'public': $where[] = "sub_public = 1";
  5106. break;
  5107. case 'private': $where[] = "sub_public = 0";
  5108. break;
  5109. }
  5110. }
  5111. }
  5112. $sql = "SELECT s.id as sub_id, ml.id as level_id, s.*, ml.*, sl.level_order FROM {$this->subscriptions} AS s, {$this->subscriptions_levels} AS sl, {$this->membership_levels} AS ml";
  5113. if(!empty($where)) {
  5114. $sql .= " WHERE " . implode(' AND ', $where);
  5115. }
  5116. $sql .= " AND s.id = sl.sub_id AND sl.level_id = ml.id ORDER BY s.id ASC, sl.level_order ASC ";
  5117. return $this->db->get_results($sql);
  5118. }
  5119. function count_on_level( $level_id ) {
  5120. $sql = $this->db->prepare( "SELECT count(*) as levelcount FROM {$this->membership_relationships} WHERE level_id = %d AND user_id > 0", $level_id );
  5121. return $this->db->get_var( $sql );
  5122. }
  5123. function count_on_sub( $sub_id ) {
  5124. $sql = $this->db->prepare( "SELECT count(*) as levelcount FROM {$this->membership_relationships} WHERE sub_id = %d AND user_id > 0", $sub_id );
  5125. return $this->db->get_var( $sql );
  5126. }
  5127. // Rewrites
  5128. function add_rewrites($wp_rewrite) {
  5129. global $M_options;
  5130. // This function adds in the api rewrite rules
  5131. // Note the addition of the namespace variable so that we know these are vent based
  5132. // calls
  5133. $new_rules = array();
  5134. if(!empty($M_options['masked_url'])) {
  5135. $new_rules[trailingslashit($M_options['masked_url']) . '(.+)'] = 'index.php?protectedfile=' . $wp_rewrite->preg_index(1);
  5136. }
  5137. $new_rules['paymentreturn/(.+)'] = 'index.php?paymentgateway=' . $wp_rewrite->preg_index(1);
  5138. $new_rules = apply_filters('M_rewrite_rules', $new_rules);
  5139. $wp_rewrite->rules = array_merge($new_rules, $wp_rewrite->rules);
  5140. return $wp_rewrite;
  5141. }
  5142. function add_queryvars($vars) {
  5143. if(!in_array('feedkey',$vars)) $vars[] = 'feedkey';
  5144. if(!in_array('protectedfile',$vars)) $vars[] = 'protectedfile';
  5145. if(!in_array('paymentgateway',$vars)) $vars[] = 'paymentgateway';
  5146. return $vars;
  5147. }
  5148. // Profile
  5149. function add_profile_feed_key($profileuser) {
  5150. $id = $profileuser->ID;
  5151. $member = new M_Membership($id);
  5152. if($member->is_member()) {
  5153. $key = get_user_meta($id, '_membership_key');
  5154. if(empty($key)) {
  5155. $key = md5($id . $profileuser->user_pass . time());
  5156. update_user_meta($id, '_membership_key', $key);
  5157. }
  5158. ?>
  5159. <h3><?php _e('Membership key','membership'); ?></h3>
  5160. <table class="form-table">
  5161. <tr>
  5162. <th><label for="description"><?php _e('Membership key','membership'); ?></label></th>
  5163. <td><?php esc_html_e($key); ?>
  5164. <br />
  5165. <span class="description"><?php _e('This key is used to give you access the the members RSS feed, keep it safe and secret.','membership'); ?></span></td>
  5166. </tr>
  5167. </table>
  5168. <?php
  5169. }
  5170. }
  5171. function update_membershipadmin_capability($user_id) {
  5172. $user = new WP_User( $user_id );
  5173. if(!empty($_POST['membershipadmin']) && $_POST['membershipadmin'] == 'yes') {
  5174. $user->add_cap('membershipadmin');
  5175. } else {
  5176. $user->remove_cap('membershipadmin');
  5177. }
  5178. }
  5179. function add_membershipadmin_capability($profileuser) {
  5180. $id = $profileuser->ID;
  5181. ?>
  5182. <h3><?php _e('Membership Administration','membership'); ?></h3>
  5183. <table class="form-table">
  5184. <tr>
  5185. <th><label for="description"><?php _e('Membership Administration','membership'); ?></label></th>
  5186. <td>
  5187. <input type='checkbox' name='membershipadmin' value='yes' <?php if($profileuser->has_cap('membershipadmin')) echo "checked='checked'"; ?>/>
  5188. &nbsp;
  5189. <span class="description"><?php _e('This user has access to administer the Membership system.','membership'); ?></span></td>
  5190. </tr>
  5191. </table>
  5192. <?php
  5193. }
  5194. /* Ping interface */
  5195. function update_subscription_ping_information( $sub_id ) {
  5196. $subscription =& new M_Subscription( $sub_id );
  5197. $subscription->update_meta( 'joining_ping', $_POST['joiningping'] );
  5198. $subscription->update_meta( 'leaving_ping', $_POST['leavingping'] );
  5199. }
  5200. function show_subscription_ping_information( $sub_id ) {
  5201. // Get all the pings
  5202. $pings = $this->get_pings();
  5203. // Get the currentlt set ping for each level
  5204. $subscription =& new M_Subscription( $sub_id );
  5205. $joinping = $subscription->get_meta( 'joining_ping', '' );
  5206. $leaveping = $subscription->get_meta( 'leaving_ping', '' );
  5207. ?>
  5208. <h3><?php _e('Subscription Pings','membership'); ?></h3>
  5209. <p class='description'><?php _e('If you want any pings to be sent when a member joins and/or leaves this subscription then set them below.','membership'); ?></p>
  5210. <div class='sub-details'>
  5211. <label for='joiningping'><?php _e('Joining Ping','membership'); ?></label>
  5212. <select name='joiningping'>
  5213. <option value='' <?php selected($joinping,''); ?>><?php _e('None', 'membership'); ?></option>
  5214. <?php
  5215. if(!empty($pings)) {
  5216. foreach($pings as $ping) {
  5217. ?>
  5218. <option value='<?php echo $ping->id; ?>' <?php selected($joinping, $ping->id); ?>><?php echo stripslashes($ping->pingname); ?></option>
  5219. <?php
  5220. }
  5221. }
  5222. ?>
  5223. </select><br/>
  5224. <label for='leavingping'><?php _e('Leaving Ping','membership'); ?></label>
  5225. <select name='leavingping'>
  5226. <option value='' <?php selected($leaveping,''); ?>><?php _e('None', 'membership'); ?></option>
  5227. <?php
  5228. if(!empty($pings)) {
  5229. foreach($pings as $ping) {
  5230. ?>
  5231. <option value='<?php echo $ping->id; ?>' <?php selected($leaveping, $ping->id); ?>><?php echo stripslashes($ping->pingname); ?></option>
  5232. <?php
  5233. }
  5234. }
  5235. ?>
  5236. </select>
  5237. </div>
  5238. <?php
  5239. }
  5240. function update_level_ping_information( $level_id ) {
  5241. $level =& new M_Level( $level_id );
  5242. $level->update_meta( 'joining_ping', $_POST['joiningping'] );
  5243. $level->update_meta( 'leaving_ping', $_POST['leavingping'] );
  5244. }
  5245. function show_level_ping_information( $level_id ) {
  5246. // Get all the pings
  5247. $pings = $this->get_pings();
  5248. // Get the currentlt set ping for each level
  5249. $level =& new M_Level( $level_id );
  5250. $joinping = $level->get_meta( 'joining_ping', '' );
  5251. $leaveping = $level->get_meta( 'leaving_ping', '' );
  5252. ?>
  5253. <h3><?php _e('Level Pings','membership'); ?></h3>
  5254. <p class='description'><?php _e('If you want any pings to be sent when a member joins and/or leaves this level then set them below.','membership'); ?></p>
  5255. <div class='level-details'>
  5256. <label for='joiningping'><?php _e('Joining Ping','membership'); ?></label>
  5257. <select name='joiningping'>
  5258. <option value='' <?php selected($joinping,''); ?>><?php _e('None', 'membership'); ?></option>
  5259. <?php
  5260. if(!empty($pings)) {
  5261. foreach($pings as $ping) {
  5262. ?>
  5263. <option value='<?php echo $ping->id; ?>' <?php selected($joinping, $ping->id); ?>><?php echo stripslashes($ping->pingname); ?></option>
  5264. <?php
  5265. }
  5266. }
  5267. ?>
  5268. </select><br/>
  5269. <label for='leavingping'><?php _e('Leaving Ping','membership'); ?></label>
  5270. <select name='leavingping'>
  5271. <option value='' <?php selected($leaveping,''); ?>><?php _e('None', 'membership'); ?></option>
  5272. <?php
  5273. if(!empty($pings)) {
  5274. foreach($pings as $ping) {
  5275. ?>
  5276. <option value='<?php echo $ping->id; ?>' <?php selected($leaveping, $ping->id); ?>><?php echo stripslashes($ping->pingname); ?></option>
  5277. <?php
  5278. }
  5279. }
  5280. ?>
  5281. </select>
  5282. </div>
  5283. <?php
  5284. }
  5285. function handle_gateways_panel_updates() {
  5286. global $action, $page, $M_Gateways;
  5287. wp_reset_vars( array('action', 'page') );
  5288. if(isset($_GET['doaction']) || isset($_GET['doaction2'])) {
  5289. if(addslashes($_GET['action']) == 'toggle' || addslashes($_GET['action2']) == 'toggle') {
  5290. $action = 'bulk-toggle';
  5291. }
  5292. }
  5293. $active = get_option('membership_activated_gateways', array());
  5294. switch(addslashes($action)) {
  5295. case 'deactivate': $key = addslashes($_GET['gateway']);
  5296. if(!empty($key)) {
  5297. check_admin_referer('toggle-gateway-' . $key);
  5298. $found = array_search($key, $active);
  5299. if($found !== false) {
  5300. unset($active[$found]);
  5301. update_option('membership_activated_gateways', array_unique($active));
  5302. wp_safe_redirect( add_query_arg( 'msg', 5, wp_get_referer() ) );
  5303. } else {
  5304. wp_safe_redirect( add_query_arg( 'msg', 6, wp_get_referer() ) );
  5305. }
  5306. }
  5307. break;
  5308. case 'activate': $key = addslashes($_GET['gateway']);
  5309. if(!empty($key)) {
  5310. check_admin_referer('toggle-gateway-' . $key);
  5311. if(!in_array($key, $active)) {
  5312. $active[] = $key;
  5313. update_option('membership_activated_gateways', array_unique($active));
  5314. wp_safe_redirect( add_query_arg( 'msg', 3, wp_get_referer() ) );
  5315. } else {
  5316. wp_safe_redirect( add_query_arg( 'msg', 4, wp_get_referer() ) );
  5317. }
  5318. }
  5319. break;
  5320. case 'bulk-toggle':
  5321. check_admin_referer('bulk-gateways');
  5322. foreach($_GET['gatewaycheck'] AS $key) {
  5323. $found = array_search($key, $active);
  5324. if($found !== false) {
  5325. unset($active[$found]);
  5326. } else {
  5327. $active[] = $key;
  5328. }
  5329. }
  5330. update_option('membership_activated_gateways', array_unique($active));
  5331. wp_safe_redirect( add_query_arg( 'msg', 7, wp_get_referer() ) );
  5332. break;
  5333. case 'updated': $gateway = addslashes($_POST['gateway']);
  5334. check_admin_referer('updated-' . $gateway);
  5335. if($M_Gateways[$gateway]->update()) {
  5336. wp_safe_redirect( add_query_arg( 'msg', 1, 'admin.php?page=' . $page ) );
  5337. } else {
  5338. wp_safe_redirect( add_query_arg( 'msg', 2, 'admin.php?page=' . $page ) );
  5339. }
  5340. break;
  5341. }
  5342. }
  5343. function handle_gateways_panel() {
  5344. global $action, $page, $M_Gateways;
  5345. wp_reset_vars( array('action', 'page') );
  5346. switch(addslashes($action)) {
  5347. case 'edit': if(isset($M_Gateways[addslashes($_GET['gateway'])])) {
  5348. $M_Gateways[addslashes($_GET['gateway'])]->settings();
  5349. }
  5350. return; // so we don't show the list below
  5351. break;
  5352. case 'transactions':
  5353. if(isset($M_Gateways[addslashes($_GET['gateway'])])) {
  5354. $M_Gateways[addslashes($_GET['gateway'])]->transactions();
  5355. }
  5356. return; // so we don't show the list below
  5357. break;
  5358. }
  5359. $messages = array();
  5360. $messages[1] = __('Gateway updated.', 'membership');
  5361. $messages[2] = __('Gateway not updated.', 'membership');
  5362. $messages[3] = __('Gateway activated.', 'membership');
  5363. $messages[4] = __('Gateway not activated.', 'membership');
  5364. $messages[5] = __('Gateway deactivated.', 'membership');
  5365. $messages[6] = __('Gateway not deactivated.', 'membership');
  5366. $messages[7] = __('Gateway activation toggled.', 'membership');
  5367. ?>
  5368. <div class='wrap'>
  5369. <div class="icon32" id="icon-plugins"><br></div>
  5370. <h2><?php _e('Edit Gateways','membership'); ?></h2>
  5371. <?php
  5372. if ( isset($_GET['msg']) ) {
  5373. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  5374. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  5375. }
  5376. if($this->show_user_help( $page )) {
  5377. ?>
  5378. <div class='screenhelpheader'>
  5379. <a href="admin.php?page=<?php echo $page; ?>&amp;action=removeheader" class="welcome-panel-close"><?php _e('Dismiss','membership'); ?></a>
  5380. <?php
  5381. ob_start();
  5382. include_once(membership_dir('membershipincludes/help/header.gateways.php'));
  5383. echo ob_get_clean();
  5384. ?>
  5385. </div>
  5386. <?php
  5387. }
  5388. ?>
  5389. <form method="get" action="?page=<?php echo esc_attr($page); ?>" id="posts-filter">
  5390. <input type='hidden' name='page' value='<?php echo esc_attr($page); ?>' />
  5391. <div class="tablenav">
  5392. <div class="alignleft actions">
  5393. <select name="action">
  5394. <option selected="selected" value=""><?php _e('Bulk Actions', 'membership'); ?></option>
  5395. <option value="toggle"><?php _e('Toggle activation', 'membership'); ?></option>
  5396. </select>
  5397. <input type="submit" class="button-secondary action" id="doaction" name="doaction" value="<?php _e('Apply', 'membership'); ?>">
  5398. </div>
  5399. <div class="alignright actions"></div>
  5400. <br class="clear">
  5401. </div>
  5402. <div class="clear"></div>
  5403. <?php
  5404. wp_original_referer_field(true, 'previous'); wp_nonce_field('bulk-gateways');
  5405. $columns = array( "name" => __('Gateway Name', 'membership'),
  5406. "active" => __('Active','membership')
  5407. );
  5408. $columns = apply_filters('membership_gatewaycolumns', $columns);
  5409. $gateways = get_membership_gateways();
  5410. $active = get_option('membership_activated_gateways', array());
  5411. ?>
  5412. <table cellspacing="0" class="widefat fixed">
  5413. <thead>
  5414. <tr>
  5415. <th style="" class="manage-column column-cb check-column" id="cb" scope="col"><input type="checkbox"></th>
  5416. <?php
  5417. foreach($columns as $key => $col) {
  5418. ?>
  5419. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  5420. <?php
  5421. }
  5422. ?>
  5423. </tr>
  5424. </thead>
  5425. <tfoot>
  5426. <tr>
  5427. <th style="" class="manage-column column-cb check-column" scope="col"><input type="checkbox"></th>
  5428. <?php
  5429. reset($columns);
  5430. foreach($columns as $key => $col) {
  5431. ?>
  5432. <th style="" class="manage-column column-<?php echo $key; ?>" id="<?php echo $key; ?>" scope="col"><?php echo $col; ?></th>
  5433. <?php
  5434. }
  5435. ?>
  5436. </tr>
  5437. </tfoot>
  5438. <tbody>
  5439. <?php
  5440. if($gateways) {
  5441. foreach($gateways as $key => $gateway) {
  5442. $default_headers = array(
  5443. 'Name' => 'Addon Name',
  5444. 'Author' => 'Author',
  5445. 'Description' => 'Description',
  5446. 'AuthorURI' => 'Author URI',
  5447. 'gateway_id' => 'Gateway ID'
  5448. );
  5449. $gateway_data = get_file_data( membership_dir('membershipincludes/gateways/' . $gateway), $default_headers, 'plugin' );
  5450. if(empty($gateway_data['Name'])) {
  5451. continue;
  5452. }
  5453. ?>
  5454. <tr valign="middle" class="alternate" id="gateway-<?php echo $gateway_data['gateway_id']; ?>">
  5455. <th class="check-column" scope="row"><input type="checkbox" value="<?php echo esc_attr($gateway_data['gateway_id']); ?>" name="gatewaycheck[]"></th>
  5456. <td class="column-name">
  5457. <strong><?php echo esc_html($gateway_data['Name']) ?></strong>
  5458. <?php if(!empty($gateway_data['Description'])) {
  5459. ?><br/><?php echo esc_html($gateway_data['Description']);
  5460. }
  5461. $actions = array();
  5462. if(in_array($gateway_data['gateway_id'], $active)) {
  5463. $actions['edit'] = "<span class='edit'><a href='?page=" . $page . "&amp;action=edit&amp;gateway=" . $gateway_data['gateway_id'] . "'>" . __('Settings', 'membership') . "</a></span>";
  5464. $actions['transactions'] = "<span class='edit'><a href='?page=" . $page . "&amp;action=transactions&amp;gateway=" . $gateway_data['gateway_id'] . "'>" . __('View transactions','membership') . "</a></span>";
  5465. $actions['toggle'] = "<span class='edit deactivate'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=deactivate&amp;gateway=" . $gateway_data['gateway_id'] . "", 'toggle-gateway-' . $gateway_data['gateway_id']) . "'>" . __('Deactivate', 'membership') . "</a></span>";
  5466. } else {
  5467. $actions['toggle'] = "<span class='edit activate'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=activate&amp;gateway=" . $gateway_data['gateway_id'] . "", 'toggle-gateway-' . $gateway_data['gateway_id']) . "'>" . __('Activate', 'membership') . "</a></span>";
  5468. }
  5469. ?>
  5470. <br><div class="row-actions"><?php echo implode(" | ", $actions); ?></div>
  5471. </td>
  5472. <td class="column-active">
  5473. <?php
  5474. if(in_array($gateway_data['gateway_id'], $active)) {
  5475. echo "<span class='membershipactivestatus'>" . __('Active', 'membership') . "</span>";
  5476. } else {
  5477. echo "<span class='membershipinactivestatus'>" . __('Inactive', 'membership') . "</span>";
  5478. }
  5479. ?>
  5480. </td>
  5481. </tr>
  5482. <?php
  5483. }
  5484. } else {
  5485. $columncount = count($columns) + 1;
  5486. ?>
  5487. <tr valign="middle" class="alternate" >
  5488. <td colspan="<?php echo $columncount; ?>" scope="row"><?php _e('No Gateways where found for this install.','membership'); ?></td>
  5489. </tr>
  5490. <?php
  5491. }
  5492. ?>
  5493. </tbody>
  5494. </table>
  5495. <div class="tablenav">
  5496. <div class="alignleft actions">
  5497. <select name="action2">
  5498. <option selected="selected" value=""><?php _e('Bulk Actions'); ?></option>
  5499. <option value="toggle"><?php _e('Toggle activation'); ?></option>
  5500. </select>
  5501. <input type="submit" class="button-secondary action" id="doaction2" name="doaction2" value="<?php _e('Apply','membership'); ?>">
  5502. </div>
  5503. <div class="alignright actions"></div>
  5504. <br class="clear">
  5505. </div>
  5506. </form>
  5507. </div> <!-- wrap -->
  5508. <?php
  5509. }
  5510. function get_coupons( $filter = false ) {
  5511. global $blog_id;
  5512. $sql = "SELECT * FROM {$this->coupons}";
  5513. if(!is_network_admin()) {
  5514. // We are on a single site admin interface
  5515. $sql .= $this->db->prepare( " WHERE site_id = %d", $blog_id );
  5516. }
  5517. return $this->db->get_results( $sql );
  5518. }
  5519. function handle_coupons_updates() {
  5520. global $action, $page;
  5521. wp_reset_vars( array('action', 'page') );
  5522. if(isset($_GET['doaction']) || isset($_GET['doaction2'])) {
  5523. if( (isset($_GET['action']) && addslashes($_GET['action']) == 'delete') || ( isset($_GET['action2']) && addslashes($_GET['action2']) == 'delete') ) {
  5524. $action = 'bulk-delete';
  5525. }
  5526. }
  5527. switch(addslashes($action)) {
  5528. case 'removeheader': $this->dismiss_user_help( $page );
  5529. wp_safe_redirect( remove_query_arg( 'action' ) );
  5530. break;
  5531. case 'added': $id = (int) $_POST['ID'];
  5532. check_admin_referer('add-coupon');
  5533. if(!$id) {
  5534. $coupon = new M_Coupon( $id );
  5535. $errors = $coupon->add( $_POST );
  5536. if($errors !== true) {
  5537. wp_safe_redirect( add_query_arg( 'msg', 1, 'admin.php?page=' . $page ) );
  5538. } else {
  5539. //
  5540. //wp_safe_redirect( add_query_arg( 'msg', 4, 'admin.php?page=' . $page ) );
  5541. }
  5542. } else {
  5543. wp_safe_redirect( add_query_arg( 'msg', 4, 'admin.php?page=' . $page ) );
  5544. }
  5545. break;
  5546. case 'updated': $id = (int) $_POST['ID'];
  5547. check_admin_referer('update-coupon_' . $id);
  5548. if($id) {
  5549. $coupon = new M_Coupon( $id );
  5550. $errors = $coupon->update( $_POST );
  5551. if($errors !== true) {
  5552. wp_safe_redirect( add_query_arg( 'msg', 3, 'admin.php?page=' . $page ) );
  5553. } else {
  5554. wp_safe_redirect( add_query_arg( 'msg', 5, 'admin.php?page=' . $page ) );
  5555. }
  5556. } else {
  5557. wp_safe_redirect( add_query_arg( 'msg', 5, 'admin.php?page=' . $page ) );
  5558. }
  5559. break;
  5560. case 'delete': if(isset($_GET['coupon_id'])) {
  5561. $coupon_id = (int) $_GET['coupon_id'];
  5562. check_admin_referer('delete-coupon_' . $coupon_id);
  5563. $coupon = new M_Coupon( $coupon_id );
  5564. if($coupon->delete()) {
  5565. wp_safe_redirect( add_query_arg( 'msg', 5, wp_get_referer() ) );
  5566. } else {
  5567. wp_safe_redirect( add_query_arg( 'msg', 6, wp_get_referer() ) );
  5568. }
  5569. }
  5570. break;
  5571. case 'bulk-delete':
  5572. check_admin_referer('bulk-coupon-actions');
  5573. foreach($_GET['coupons_checks'] as $value) {
  5574. if(is_numeric($value)) {
  5575. $coupon_id = (int) $value;
  5576. $coupon = new M_Coupon( $coupon_id );
  5577. $coupon->delete($coupon_id);
  5578. }
  5579. }
  5580. wp_safe_redirect( add_query_arg( 'msg', 7, wp_get_referer() ) );
  5581. exit;
  5582. break;
  5583. }
  5584. }
  5585. function handle_coupon_edit_form( $coupon_id = false ) {
  5586. global $page;
  5587. if( $coupon_id === false ) {
  5588. $coupon =& new M_Coupon( 0, $this->_tips );
  5589. echo "<div class='wrap'>";
  5590. echo "<h2>" . __('Add Coupon','membership') . "</h2>";
  5591. echo '<div id="poststuff" class="metabox-holder">';
  5592. ?>
  5593. <div class="postbox">
  5594. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Add Coupon','membership'); ?></span></h3>
  5595. <div class="inside">
  5596. <?php
  5597. echo '<form method="post" action="?page=' . $page . '&amp;action=edit&amp;coupon=">';
  5598. echo '<input type="hidden" name="ID" value="" />';
  5599. echo "<input type='hidden' name='action' value='added' />";
  5600. wp_nonce_field('add-coupon');
  5601. $coupon->addform();
  5602. echo "<div class='buttons'>";
  5603. echo '<input class="button-primary alignright" type="submit" name="go" value="' . __('Add coupon', 'membership') . '" />';
  5604. echo "<a href='?page=" . $page . "' class='cancellink alignright' title='Cancel edit'>" . __('Cancel', 'membership') . "</a>";
  5605. echo '</div>';
  5606. echo '</form>';
  5607. echo '<br/>';
  5608. ?>
  5609. </div>
  5610. </div>
  5611. <?php
  5612. echo "</div>";
  5613. echo "</div>";
  5614. } else {
  5615. $coupon =& new M_Coupon( (int) $coupon_id, $this->_tips );
  5616. echo "<div class='wrap'>";
  5617. echo "<h2>" . __('Edit Coupon','membership') . "</h2>";
  5618. echo '<div id="poststuff" class="metabox-holder">';
  5619. ?>
  5620. <div class="postbox">
  5621. <h3 class="hndle" style='cursor:auto;'><span><?php _e('Edit Coupon','membership'); ?></span></h3>
  5622. <div class="inside">
  5623. <?php
  5624. echo '<form method="post" action="?page=' . $page . '&amp;action=edit&amp;coupon=' . $coupon_id . '">';
  5625. echo '<input type="hidden" name="ID" value="' . $coupon_id . '" />';
  5626. echo "<input type='hidden' name='action' value='updated' />";
  5627. wp_nonce_field('update-coupon_' . $coupon_id);
  5628. $coupon->editform();
  5629. echo "<div class='buttons'>";
  5630. echo '<input class="button-primary alignright" type="submit" name="go" value="' . __('Update coupon', 'membership') . '" />';
  5631. echo "<a href='?page=" . $page . "' class='cancellink alignright' title='Cancel edit'>" . __('Cancel', 'membership') . "</a>";
  5632. echo '</div>';
  5633. echo '</form>';
  5634. echo '<br/>';
  5635. ?>
  5636. </div>
  5637. </div>
  5638. <?php
  5639. echo "</div>";
  5640. echo "</div>";
  5641. }
  5642. }
  5643. function handle_coupons_panel() {
  5644. global $action, $page, $M_options;
  5645. wp_reset_vars( array('action', 'page') );
  5646. switch(addslashes($action)) {
  5647. case 'edit': if(isset($_GET['coupon_id'])) {
  5648. $this->handle_coupon_edit_form( (int) $_GET['coupon_id'] );
  5649. } else {
  5650. $this->handle_coupon_edit_form();
  5651. }
  5652. return; // so we don't show the list below
  5653. break;
  5654. }
  5655. $messages = array();
  5656. $messages[1] = __('Coupon added.', 'membership');
  5657. $messages[2] = __('Coupon not added.', 'membership');
  5658. $messages[3] = __('Coupon updated.', 'membership');
  5659. $messages[4] = __('Coupon not updated.', 'membership');
  5660. $messages[5] = __('Coupon deleted.', 'membership');
  5661. $messages[6] = __('Coupon not deleted.', 'membership');
  5662. $messages[7] = __('Coupons deleted.', 'membership');
  5663. ?>
  5664. <div class='wrap'>
  5665. <div class="icon32" id="icon-link-manager"><br></div>
  5666. <h2><?php _e('Edit Coupons','membership'); ?><a class="add-new-h2" href="admin.php?page=<?php echo $page; ?>&amp;action=edit&amp;coupon="><?php _e('Add New','membership'); ?></a></h2>
  5667. <?php
  5668. if ( isset($_GET['msg']) ) {
  5669. echo '<div id="message" class="updated fade"><p>' . $messages[(int) $_GET['msg']] . '</p></div>';
  5670. $_SERVER['REQUEST_URI'] = remove_query_arg(array('message'), $_SERVER['REQUEST_URI']);
  5671. }
  5672. if($this->show_user_help( $page )) {
  5673. ?>
  5674. <div class='screenhelpheader'>
  5675. <a href="admin.php?page=<?php echo $page; ?>&amp;action=removeheader" class="welcome-panel-close"><?php _e('Dismiss','membership'); ?></a>
  5676. <?php
  5677. ob_start();
  5678. include_once(membership_dir('membershipincludes/help/header.coupons.php'));
  5679. echo ob_get_clean();
  5680. ?>
  5681. </div>
  5682. <?php
  5683. }
  5684. $coupons = $this->get_coupons();
  5685. $posts_columns = array(
  5686. 'code' => __('Coupon Code', 'membership'),
  5687. 'discount' => __('Discount', 'membership'),
  5688. 'start' => __('Start Date', 'membership'),
  5689. 'end' => __('Expire Date', 'membership'),
  5690. 'sub' => __('Subscription', 'membership'),
  5691. 'used' => __('Used', 'membership'),
  5692. 'remaining' => __('Remaining Uses', 'membership')
  5693. );
  5694. ?>
  5695. <form method="get" action="?page=<?php echo esc_attr($page); ?>">
  5696. <input type="hidden" name="page" value="<?php echo esc_attr($page); ?>" />
  5697. <?php wp_nonce_field('bulk-coupon-actions'); ?>
  5698. <div class="tablenav">
  5699. <div class="alignleft actions">
  5700. <select name="action">
  5701. <option selected="selected" value=""><?php _e('Bulk Actions','membership'); ?></option>
  5702. <option value="bulk-delete"><?php _e('Delete Coupon','membership'); ?></option>
  5703. </select>
  5704. <input type="submit" class="button-secondary action" id="doaction" name="doaction" value="<?php _e('Apply','membership'); ?>">
  5705. </div>
  5706. </div>
  5707. <table width="100%" cellpadding="3" cellspacing="3" class="widefat fixed">
  5708. <thead>
  5709. <tr>
  5710. <th scope="col" class="check-column"><input type="checkbox" /></th>
  5711. <?php foreach($posts_columns as $column_id => $column_display_name) {
  5712. $col_url = $column_display_name;
  5713. ?>
  5714. <th scope="col"><?php echo $col_url ?></th>
  5715. <?php } ?>
  5716. </tr>
  5717. </thead>
  5718. <tfoot>
  5719. <tr>
  5720. <th scope="col" class="check-column"><input type="checkbox" /></th>
  5721. <?php foreach($posts_columns as $column_id => $column_display_name) {
  5722. $col_url = $column_display_name;
  5723. ?>
  5724. <th scope="col"><?php echo $col_url ?></th>
  5725. <?php } ?>
  5726. </tr>
  5727. </tfoot>
  5728. <tbody id="the-list">
  5729. <?php
  5730. if ( !empty($coupons) ) {
  5731. $bgcolor = isset($class) ? $class : '';
  5732. foreach ($coupons as $key => $coupon) {
  5733. $class = (isset($class) && 'alternate' == $class) ? '' : 'alternate';
  5734. //assign classes based on coupon availability
  5735. //$class = ($this->check_coupon($coupon_code)) ? $class . ' coupon-active' : $class . ' coupon-inactive';
  5736. echo '<tr class="' . $class . ' blog-row" style="vertical-align: top;"><th scope="row" class="check-column" valign="top"><input type="checkbox" name="coupons_checks[]"" value="' . $coupon->id . '" /></th>';
  5737. foreach( $posts_columns as $column_name => $column_display_name ) {
  5738. switch($column_name) {
  5739. case 'code': ?>
  5740. <td scope="row">
  5741. <?php
  5742. echo $coupon->couponcode;
  5743. $actions = array();
  5744. //$actions['id'] = "<strong>" . __('ID : ', 'membership') . $level->id . "</strong>";
  5745. $actions['edit'] = "<span class='edit'><a href='?page=" . $page . "&amp;action=edit&amp;coupon_id=" . $coupon->id . "'>" . __('Edit', 'membership') . "</a></span>";
  5746. $actions['delete'] = "<span class='delete'><a href='" . wp_nonce_url("?page=" . $page. "&amp;action=delete&amp;coupon_id=" . $coupon->id . "", 'delete-coupon_' . $coupon->id) . "'>" . __('Delete', 'membership') . "</a></span>";
  5747. ?>
  5748. <br><div class="row-actions"><?php echo implode(" | ", $actions); ?></div>
  5749. </td>
  5750. <?php
  5751. break;
  5752. case 'discount': ?>
  5753. <td scope="row">
  5754. <?php
  5755. if ($coupon->discount_type == 'pct') {
  5756. echo $coupon->discount . '%';
  5757. } else if ($coupon->discount_type == 'amt') {
  5758. echo $coupon->discount_currency . ' ' . number_format_i18n($coupon->discount, 2);
  5759. }
  5760. ?>
  5761. </td>
  5762. <?php
  5763. break;
  5764. case 'start': ?>
  5765. <td scope="row">
  5766. <?php echo mysql2date( get_option('date_format'), $coupon->coupon_startdate ); ?>
  5767. </td>
  5768. <?php
  5769. break;
  5770. case 'end': ?>
  5771. <td scope="row">
  5772. <?php if (!empty($coupon->coupon_enddate)) {
  5773. echo mysql2date( get_option('date_format'), $coupon->coupon_enddate );
  5774. } else {
  5775. _e('No End', 'membership');
  5776. }
  5777. ?>
  5778. </td>
  5779. <?php
  5780. break;
  5781. case 'sub': ?>
  5782. <td scope="row">
  5783. <?php
  5784. if( $coupon->coupon_sub_id != 0 ) {
  5785. $sub = new M_Subscription( $coupon->coupon_sub_id );
  5786. echo $sub->sub_name();
  5787. } else {
  5788. _e('Any Subscription', 'membership');
  5789. }
  5790. ?>
  5791. </td>
  5792. <?php
  5793. break;
  5794. case 'used': ?>
  5795. <td scope="row">
  5796. <?php echo number_format_i18n($coupon->coupon_used); ?>
  5797. </td>
  5798. <?php
  5799. break;
  5800. case 'remaining': ?>
  5801. <td scope="row">
  5802. <?php
  5803. if ( $coupon->coupon_uses > 0 ) {
  5804. echo number_format_i18n(intval($coupon->coupon_uses) - intval($coupon->coupon_used));
  5805. } else {
  5806. _e('Unlimited', 'membership');
  5807. }
  5808. ?>
  5809. </td>
  5810. <?php
  5811. break;
  5812. }
  5813. }
  5814. ?>
  5815. </tr>
  5816. <?php
  5817. }
  5818. } else { ?>
  5819. <tr>
  5820. <td colspan="8"><?php _e('No coupons yet.', 'membership') ?></td>
  5821. </tr>
  5822. <?php
  5823. } // end if coupons
  5824. ?>
  5825. </tbody>
  5826. </table>
  5827. </form>
  5828. <?php
  5829. }
  5830. function activate_addon( $addon ) {
  5831. $active = get_option('membership_activated_addons', array());
  5832. if(!in_array($addon, $active)) {
  5833. $active[] = $addon;
  5834. update_option('membership_activated_addons', array_unique($active));
  5835. }
  5836. }
  5837. function deactivate_addon( $addon ) {
  5838. $active = get_option('membership_activated_addons', array());
  5839. $found = array_search($addon, $active);
  5840. if($found !== false) {
  5841. unset($active[$found]);
  5842. update_option('membership_activated_addons', array_unique($active));
  5843. }
  5844. }
  5845. // The popover registration functions added to the bottom of this class until a new more suitable home can be found
  5846. function popover_signup_form() {
  5847. $content = '';
  5848. $content = apply_filters('membership_popover_signup_form_before_content', $content );
  5849. ob_start();
  5850. if( defined('MEMBERSHIP_POPOVER_SIGNUP_FORM') && file_exists( MEMBERSHIP_POPOVER_SIGNUP_FORM ) ) {
  5851. include_once( MEMBERSHIP_POPOVER_SIGNUP_FORM );
  5852. } elseif(file_exists( apply_filters('membership_override_popover_signup_form', membership_dir('membershipincludes/includes/popover_signup.form.php')) ) ) {
  5853. include_once( apply_filters('membership_override_popover_signup_form', membership_dir('membershipincludes/includes/popover_signup.form.php')) );
  5854. }
  5855. $content .= ob_get_contents();
  5856. ob_end_clean();
  5857. $content = apply_filters('membership_popover_signup_form_after_content', $content );
  5858. echo $content;
  5859. die();
  5860. }
  5861. function popover_register_process() {
  5862. global $M_options;
  5863. //include_once(ABSPATH . WPINC . '/registration.php');
  5864. $error = new WP_Error();
  5865. if(!wp_verify_nonce( $_POST['nonce'], 'membership_register')) {
  5866. $error->add('invalid', __('Invalid form submission.','membership'));
  5867. }
  5868. if(username_exists(sanitize_user($_POST['user_login']))) {
  5869. $error->add('usernameexists', __('That username is already taken, sorry.','membership'));
  5870. }
  5871. if(email_exists($_POST['email'])) {
  5872. $error->add('emailexists', __('That email address is already taken, sorry.','membership'));
  5873. }
  5874. $error = apply_filters( 'membership_subscription_form_before_registration_process', $error );
  5875. if(is_wp_error($error)) {
  5876. $anyerrors = $error->get_error_messages();
  5877. } else {
  5878. $anyerrors = array();
  5879. }
  5880. if( empty($anyerrors) ) {
  5881. // Pre - error reporting check for final add user
  5882. $user_id = wp_create_user( sanitize_user($_POST['user_login']), $_POST['password'], $_POST['email'] );
  5883. if(is_wp_error($user_id) && method_exists($user_id, 'get_error_message')) {
  5884. $error->add('userid', $user_id->get_error_message());
  5885. } else {
  5886. $member = new M_Membership( $user_id );
  5887. if(defined('MEMBERSHIP_DEACTIVATE_USER_ON_REGISTRATION') && MEMBERSHIP_DEACTIVATE_USER_ON_REGISTRATION == true) {
  5888. $member->deactivate();
  5889. } else {
  5890. $creds = array(
  5891. 'user_login' => $_POST['user_login'],
  5892. 'user_password' => $_POST['password'],
  5893. 'remember' => true
  5894. );
  5895. $is_ssl = (isset($_SERVER['https']) && strtolower($_SERVER['https']) == 'on' ? true : false);
  5896. $user = wp_signon( $creds, $is_ssl );
  5897. if ( is_wp_error($user) && method_exists($user, 'get_error_message') ) {
  5898. $error->add('userlogin', $user->get_error_message());
  5899. } else {
  5900. // Set the current user up
  5901. wp_set_current_user( $user_id );
  5902. }
  5903. }
  5904. if( has_action('membership_susbcription_form_registration_notification') ) {
  5905. do_action('membership_susbcription_form_registration_notification', $user_id, $_POST['password']);
  5906. } else {
  5907. wp_new_user_notification($user_id, $_POST['password']);
  5908. }
  5909. do_action( 'membership_subscription_form_registration_process', $error, $user_id );
  5910. }
  5911. } else {
  5912. do_action( 'membership_subscription_form_registration_process', $error, 0 );
  5913. }
  5914. $anyerrors = $error->get_error_code();
  5915. if(is_wp_error($error) && !empty($anyerrors)) {
  5916. // we have an error - output
  5917. $messages = $error->get_error_messages();
  5918. //sendback error
  5919. echo json_encode( array('errormsg' => $messages[0]) );
  5920. } else {
  5921. // everything seems fine (so far), so we have our queued user so let's
  5922. // move to picking a subscription - so send back the form.
  5923. echo $this->popover_sendpayment_form( $user_id );
  5924. }
  5925. exit;
  5926. }
  5927. function popover_login_process() {
  5928. $error = new WP_Error();
  5929. if(!wp_verify_nonce( $_POST['nonce'], 'membership_login')) {
  5930. $error->add('invalid', __('Invalid form submission.','membership'));
  5931. }
  5932. $userbylogin = get_user_by( 'login', $_POST['user_login'] );
  5933. if(!empty($userbylogin)) {
  5934. $user = wp_authenticate( $userbylogin->user_login, $_POST['password'] );
  5935. if(is_wp_error($user)) {
  5936. $error->add('userlogin', $user->get_error_message());
  5937. } else {
  5938. wp_set_auth_cookie($user->ID);
  5939. // Set the current user up
  5940. wp_set_current_user( $user->ID );
  5941. }
  5942. } else {
  5943. $error->add('userlogin', __('User not found.','membership') );
  5944. }
  5945. $anyerrors = $error->get_error_code();
  5946. if(is_wp_error($error) && !empty($anyerrors)) {
  5947. // we have an error - output
  5948. $messages = $error->get_error_messages();
  5949. //sendback error
  5950. echo json_encode( array('errormsg' => $messages[0]) );
  5951. } else {
  5952. // everything seems fine (so far), so we have our queued user so let's
  5953. // move to picking a subscription - so send back the form.
  5954. echo $this->popover_sendpayment_form($user->ID);
  5955. }
  5956. exit;
  5957. }
  5958. function popover_extraform_process() {
  5959. echo $this->popover_extra_payment_form();
  5960. exit;
  5961. }
  5962. function popover_sendpayment_form( $user_id = false ) {
  5963. $content = '';
  5964. $content = apply_filters('membership_popover_sendpayment_form_before_content', $content );
  5965. ob_start();
  5966. if( defined('MEMBERSHIP_POPOVER_SENDPAYMENT_FORM') && file_exists( MEMBERSHIP_POPOVER_SENDPAYMENT_FORM ) ) {
  5967. include_once( MEMBERSHIP_POPOVER_SENDPAYMENT_FORM );
  5968. } elseif(file_exists( apply_filters('membership_override_popover_sendpayment_form', membership_dir('membershipincludes/includes/popover_payment.form.php')) ) ) {
  5969. include_once( apply_filters('membership_override_popover_sendpayment_form', membership_dir('membershipincludes/includes/popover_payment.form.php')) );
  5970. }
  5971. $content .= ob_get_contents();
  5972. ob_end_clean();
  5973. $content = apply_filters('membership_popover_sendpayment_form_after_content', $content );
  5974. echo $content;
  5975. exit;
  5976. }
  5977. function popover_extra_payment_form( $user_id = false ) {
  5978. $content = '';
  5979. $content = apply_filters('membership_popover_extraform_before_content', $content );
  5980. ob_start();
  5981. if( defined('MEMBERSHIP_POPOVER_SENDPAYMENT_FORM') && file_exists( MEMBERSHIP_POPOVER_SENDPAYMENT_FORM ) ) {
  5982. include_once( MEMBERSHIP_POPOVER_SENDPAYMENT_FORM );
  5983. } elseif(file_exists( apply_filters('membership_override_popover_sendpayment_form', membership_dir('membershipincludes/includes/popover_payment.form.php')) ) ) {
  5984. include_once( apply_filters('membership_override_popover_sendpayment_form', membership_dir('membershipincludes/includes/popover_payment.form.php')) );
  5985. }
  5986. $content .= ob_get_contents();
  5987. ob_end_clean();
  5988. $content = apply_filters('membership_popover_extraform_after_content', $content );
  5989. echo $content;
  5990. exit;
  5991. }
  5992. function create_defaults() {
  5993. // Function to create some defaults if they are not set
  5994. if(defined('MEMBERSHIP_GLOBAL_TABLES') && MEMBERSHIP_GLOBAL_TABLES === true) {
  5995. if(function_exists('get_blog_option')) {
  5996. if(function_exists('switch_to_blog')) {
  5997. switch_to_blog(MEMBERSHIP_GLOBAL_MAINSITE);
  5998. }
  5999. $M_options = get_blog_option(MEMBERSHIP_GLOBAL_MAINSITE, 'membership_options', array());
  6000. } else {
  6001. $M_options = get_option('membership_options', array());
  6002. }
  6003. } else {
  6004. $M_options = get_option('membership_options', array());
  6005. }
  6006. // Make registration and associated pages
  6007. if(empty($M_options['registration_page'])) {
  6008. // Check if the buddypress registration page is created or not
  6009. if(defined('BP_VERSION') && version_compare( preg_replace('/-.*$/', '', BP_VERSION), "1.5", '>=')) {
  6010. // Get the BP pages
  6011. $bppages = get_option('bp-pages', array());
  6012. }
  6013. $pagedetails = array('post_title' => __('Register', 'membership'), 'post_name' => 'register', 'post_status' => 'publish', 'post_type' => 'page', 'post_content' => '');
  6014. $id = wp_insert_post( $pagedetails );
  6015. $M_options['registration_page'] = $id;
  6016. $pagedetails = array('post_title' => __('Account', 'membership'), 'post_name' => 'account', 'post_status' => 'publish', 'post_type' => 'page', 'post_content' => '');
  6017. $id = wp_insert_post( $pagedetails );
  6018. $M_options['account_page'] = $id;
  6019. $content = '<p>' . __('The content you are trying to access is only available to members. Sorry.','membership') . '</p>';
  6020. $pagedetails = array('post_title' => __('Protected Content', 'membership'), 'post_name' => 'protected', 'post_status' => 'publish', 'post_type' => 'page', 'post_content' => $content);
  6021. $id = wp_insert_post( $pagedetails );
  6022. $M_options['nocontent_page'] = $id;
  6023. }
  6024. // Create relevant admin side shortcodes
  6025. if(empty($M_options['membershipadminshortcodes'])) {
  6026. if(!is_array($M_options['membershipadminshortcodes'])) {
  6027. $M_options['membershipadminshortcodes'] = array();
  6028. }
  6029. if(class_exists('RGForms')) {
  6030. // Gravity Forms exists
  6031. $M_options['membershipadminshortcodes'][] = 'gravityform';
  6032. }
  6033. if(defined('WPCF7_VERSION')) {
  6034. // Contact Form 7 exists
  6035. $M_options['membershipadminshortcodes'][] = 'contact-form';
  6036. }
  6037. if(defined('WPAUDIO_URL')) {
  6038. // WPAudio exists
  6039. $M_options['membershipadminshortcodes'][] = 'wpaudio';
  6040. }
  6041. }
  6042. // Create a default download group
  6043. if(empty($M_options['membershipdownloadgroups'])) {
  6044. if(!is_array($M_options['membershipdownloadgroups'])) {
  6045. $M_options['membershipdownloadgroups'] = array();
  6046. }
  6047. $M_options['membershipdownloadgroups'][] = __('default', 'membership');
  6048. }
  6049. // Create a hashed downloads url
  6050. if(empty($M_options['masked_url'])) {
  6051. $M_options['masked_url'] = __('downloads', 'membership');
  6052. }
  6053. // Update the options
  6054. if(defined('MEMBERSHIP_GLOBAL_TABLES') && MEMBERSHIP_GLOBAL_TABLES === true) {
  6055. if(function_exists('update_blog_option')) {
  6056. update_blog_option(MEMBERSHIP_GLOBAL_MAINSITE, 'membership_options', $M_options);
  6057. } else {
  6058. update_option('membership_options', $M_options);
  6059. }
  6060. } else {
  6061. update_option('membership_options', $M_options);
  6062. }
  6063. }
  6064. // Functions to determine whether to show user help on this screen and to disable it if not
  6065. function show_user_help( $page ) {
  6066. $user_id = get_current_user_id();
  6067. $helpscreens = get_user_meta($user_id, 'membership_show_help_headers', true);
  6068. if(!is_array($helpscreens)) {
  6069. $helpscreens = array();
  6070. }
  6071. if(!isset($helpscreens[$page])) {
  6072. return true;
  6073. } else {
  6074. return false;
  6075. }
  6076. }
  6077. function dismiss_user_help( $page ) {
  6078. $user_id = get_current_user_id();
  6079. $helpscreens = get_user_meta($user_id, 'membership_show_help_headers', true);
  6080. if(!is_array($helpscreens)) {
  6081. $helpscreens = array();
  6082. }
  6083. if(!isset($helpscreens[$page])) {
  6084. $helpscreens[$page] = 'no';
  6085. }
  6086. update_user_meta( $user_id, 'membership_show_help_headers', $helpscreens );
  6087. }
  6088. // Level shortcodes function
  6089. function build_level_shortcode_list( $shortcodes = array() ) {
  6090. if(!is_array($shortcodes)) {
  6091. $shortcodes = array();
  6092. }
  6093. $levels = $this->get_membership_levels();
  6094. if(!empty($levels)) {
  6095. foreach($levels as $level) {
  6096. $shortcodes[] = M_normalize_shortcode($level->level_title);
  6097. }
  6098. }
  6099. return $shortcodes;
  6100. }
  6101. function start_membership_session() {
  6102. if (session_id() == "")
  6103. session_start();
  6104. }
  6105. function set_membership_coupon_cookie() {
  6106. if(!defined('DOING_AJAX') || DOING_AJAX == FALSE )
  6107. die('NOT DOING AJAX?');
  6108. $this->start_membership_session();
  6109. if(isset($_POST['coupon_code'])) {
  6110. $_SESSION['m_coupon_code'] = esc_attr($_POST['coupon_code']);
  6111. include membership_dir('membershipincludes/includes/coupon.form.php');
  6112. die();
  6113. } else {
  6114. die(0);
  6115. }
  6116. }
  6117. }
  6118. }
  6119. ?>