class.swpm-membership-levels.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <?php
  2. if (!class_exists('WP_List_Table')){
  3. require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
  4. }
  5. class SwpmMembershipLevels extends WP_List_Table {
  6. function __construct() {
  7. parent::__construct(array(
  8. 'singular' => SwpmUtils::_('Membership Level'),
  9. 'plural' => SwpmUtils::_('Membership Levels'),
  10. 'ajax' => false
  11. ));
  12. }
  13. function get_columns() {
  14. return array(
  15. 'cb' => '<input type="checkbox" />'
  16. , 'id' => SwpmUtils::_('ID')
  17. , 'alias' => SwpmUtils::_('Membership Level')
  18. , 'role' => SwpmUtils::_('Role')
  19. , 'valid_for' => SwpmUtils::_('Access Valid For/Until')
  20. );
  21. }
  22. function get_sortable_columns() {
  23. return array(
  24. 'id' => array('id', true),
  25. 'alias' => array('alias', true)
  26. );
  27. }
  28. function get_bulk_actions() {
  29. $actions = array(
  30. 'bulk_delete' => SwpmUtils::_('Delete')
  31. );
  32. return $actions;
  33. }
  34. function column_default($item, $column_name) {
  35. if ($column_name == 'valid_for') {
  36. if ($item['subscription_duration_type'] == SwpmMembershipLevel::NO_EXPIRY) {
  37. return 'No Expiry';
  38. }
  39. if ($item['subscription_duration_type'] == SwpmMembershipLevel::FIXED_DATE) {
  40. $formatted_date = SwpmUtils::get_formatted_date_according_to_wp_settings($item['subscription_period']);
  41. return $formatted_date;
  42. }
  43. if ($item['subscription_duration_type'] == SwpmMembershipLevel::DAYS) {
  44. return $item['subscription_period'] . " Day(s)";
  45. }
  46. if ($item['subscription_duration_type'] == SwpmMembershipLevel::WEEKS) {
  47. return $item['subscription_period'] . " Week(s)";
  48. }
  49. if ($item['subscription_duration_type'] == SwpmMembershipLevel::MONTHS) {
  50. return $item['subscription_period'] . " Month(s)";
  51. }
  52. if ($item['subscription_duration_type'] == SwpmMembershipLevel::YEARS) {
  53. return $item['subscription_period'] . " Year(s)";
  54. }
  55. }
  56. if ($column_name == 'role') {
  57. return ucfirst($item['role']);
  58. }
  59. return stripslashes($item[$column_name]);
  60. }
  61. function column_id($item) {
  62. $delete_swpmlevel_nonce = wp_create_nonce( 'nonce_delete_swpmlevel_admin_end' );
  63. $actions = array(
  64. 'edit' => sprintf('<a href="admin.php?page=simple_wp_membership_levels&level_action=edit&id=%s">Edit</a>', $item['id']),
  65. 'delete' => sprintf('<a href="admin.php?page=simple_wp_membership_levels&level_action=delete&id=%s&delete_swpmlevel_nonce=%s" onclick="return confirm(\'Are you sure you want to delete this entry?\')">Delete</a>', $item['id'],$delete_swpmlevel_nonce),
  66. );
  67. return $item['id'] . $this->row_actions($actions);
  68. }
  69. function column_cb($item) {
  70. return sprintf(
  71. '<input type="checkbox" name="ids[]" value="%s" />', $item['id']
  72. );
  73. }
  74. function prepare_items() {
  75. global $wpdb;
  76. $this->process_bulk_action();
  77. $query = "SELECT * FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id !=1 ";
  78. if (isset($_POST['s'])){
  79. $search_keyword = sanitize_text_field($_POST['s']);
  80. $search_keyword = esc_attr ($search_keyword);
  81. $query .= " AND alias LIKE '%" . $search_keyword . "%' ";
  82. }
  83. //Read and sanitize the sort inputs.
  84. $orderby = !empty($_GET["orderby"]) ? esc_sql($_GET["orderby"]) : 'id';
  85. $order = !empty($_GET["order"]) ? esc_sql($_GET["order"]) : 'DESC';
  86. $sortable_columns = $this->get_sortable_columns();
  87. $orderby = SwpmUtils::sanitize_value_by_array($orderby, $sortable_columns);
  88. $order = SwpmUtils::sanitize_value_by_array($order, array('DESC' => '1', 'ASC' => '1'));
  89. if (!empty($orderby) && !empty($order)) {
  90. $query.=' ORDER BY ' . $orderby . ' ' . $order;
  91. }
  92. $totalitems = $wpdb->query($query); //Return the total number of affected rows
  93. $perpage = 50;
  94. $paged = !empty($_GET["paged"]) ? sanitize_text_field($_GET["paged"]) : '';
  95. if (empty($paged) || !is_numeric($paged) || $paged <= 0) {
  96. $paged = 1;
  97. }
  98. $totalpages = ceil($totalitems / $perpage);
  99. if (!empty($paged) && !empty($perpage)) {
  100. $offset = ($paged - 1) * $perpage;
  101. $query.=' LIMIT ' . (int) $offset . ',' . (int) $perpage;
  102. }
  103. $this->set_pagination_args(array(
  104. "total_items" => $totalitems,
  105. "total_pages" => $totalpages,
  106. "per_page" => $perpage,
  107. ));
  108. $columns = $this->get_columns();
  109. $hidden = array();
  110. $sortable = $this->get_sortable_columns();
  111. $this->_column_headers = array($columns, $hidden, $sortable);
  112. $this->items = $wpdb->get_results($query, ARRAY_A);
  113. }
  114. function no_items() {
  115. SwpmUtils::e('No membership levels found.');
  116. }
  117. function process_form_request() {
  118. if (isset($_REQUEST['id'])) {
  119. //This is a level edit action
  120. $record_id = sanitize_text_field($_REQUEST['id']);
  121. if(!is_numeric($record_id)){
  122. wp_die('Error! ID must be numeric.');
  123. }
  124. return $this->edit($record_id);
  125. }
  126. //Level add action
  127. return $this->add();
  128. }
  129. function add() {
  130. //Level add interface
  131. include_once(SIMPLE_WP_MEMBERSHIP_PATH . 'views/admin_add_level.php');
  132. return false;
  133. }
  134. function edit($id) {
  135. global $wpdb;
  136. $query = $wpdb->prepare("SELECT * FROM {$wpdb->prefix}swpm_membership_tbl WHERE id = %d", absint($id));
  137. $membership = $wpdb->get_row($query, ARRAY_A);
  138. extract($membership, EXTR_SKIP);
  139. $email_activation = get_option('swpm_email_activation_lvl_'.$id);
  140. include_once(SIMPLE_WP_MEMBERSHIP_PATH . 'views/admin_edit_level.php');
  141. return false;
  142. }
  143. function process_bulk_action() {
  144. //Detect when a bulk action is being triggered...
  145. global $wpdb;
  146. if ('bulk_delete' === $this->current_action()) {
  147. $records_to_delete = array_map( 'sanitize_text_field', $_REQUEST['ids'] );
  148. if (empty($records_to_delete)) {
  149. echo '<div id="message" class="updated fade"><p>Error! You need to select multiple records to perform a bulk action!</p></div>';
  150. return;
  151. }
  152. foreach ($records_to_delete as $record_id) {
  153. if( !is_numeric( $record_id )){
  154. wp_die('Error! ID must be numeric.');
  155. }
  156. $query = $wpdb->prepare("DELETE FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id = %d", $record_id);
  157. $wpdb->query($query);
  158. }
  159. echo '<div id="message" class="updated fade"><p>Selected records deleted successfully!</p></div>';
  160. }
  161. }
  162. function delete_level() {
  163. global $wpdb;
  164. if (isset($_REQUEST['id'])) {
  165. //Check we are on the admin end and user has management permission
  166. SwpmMiscUtils::check_user_permission_and_is_admin('membership level delete');
  167. //Check nonce
  168. if ( !isset($_REQUEST['delete_swpmlevel_nonce']) || !wp_verify_nonce($_REQUEST['delete_swpmlevel_nonce'], 'nonce_delete_swpmlevel_admin_end' )){
  169. //Nonce check failed.
  170. wp_die(SwpmUtils::_("Error! Nonce verification failed for membership level delete from admin end."));
  171. }
  172. $id = sanitize_text_field($_REQUEST['id']);
  173. $id = absint($id);
  174. $query = $wpdb->prepare("DELETE FROM " . $wpdb->prefix . "swpm_membership_tbl WHERE id = %d", $id);
  175. $wpdb->query($query);
  176. echo '<div id="message" class="updated fade"><p>Selected record deleted successfully!</p></div>';
  177. }
  178. }
  179. function show_levels() {
  180. ?>
  181. <div class="swpm-margin-top-10"></div>
  182. <form method="post">
  183. <p class="search-box">
  184. <label class="screen-reader-text" for="search_id-search-input">
  185. search:</label>
  186. <input id="search_id-search-input" type="text" name="s" value="" />
  187. <input id="search-submit" class="button" type="submit" name="" value="<?php echo SwpmUtils::_('Search')?>" />
  188. </p>
  189. </form>
  190. <?php $this->prepare_items(); ?>
  191. <form method="post">
  192. <?php $this->display(); ?>
  193. </form>
  194. <p>
  195. <a href="admin.php?page=simple_wp_membership_levels&level_action=add" class="button-primary"><?php SwpmUtils::e('Add New') ?></a>
  196. </p>
  197. <?php
  198. }
  199. function manage() {
  200. include_once(SIMPLE_WP_MEMBERSHIP_PATH . 'views/admin_membership_manage.php');
  201. }
  202. function manage_categroy() {
  203. $selected = "category_list";
  204. include_once('class.swpm-category-list.php');
  205. $category_list = new SwpmCategoryList();
  206. include_once(SIMPLE_WP_MEMBERSHIP_PATH . 'views/admin_category_list.php');
  207. }
  208. function manage_post() {
  209. $selected = "post_list";
  210. include_once('class.swpm-post-list.php');
  211. $post_list = new SwpmPostList();
  212. include_once(SIMPLE_WP_MEMBERSHIP_PATH . 'views/admin_post_list.php');
  213. }
  214. function handle_main_membership_level_admin_menu(){
  215. do_action( 'swpm_membership_level_menu_start' );
  216. //Check current_user_can() or die.
  217. SwpmMiscUtils::check_user_permission_and_is_admin('Main Membership Level Admin Menu');
  218. $level_action = filter_input(INPUT_GET, 'level_action');
  219. $action = $level_action;
  220. $selected= $action;
  221. ?>
  222. <div class="wrap swpm-admin-menu-wrap"><!-- start wrap -->
  223. <!-- page title -->
  224. <h1><?php echo SwpmUtils::_('Simple WP Membership::Membership Levels') ?></h1>
  225. <!-- start nav menu tabs -->
  226. <h2 class="nav-tab-wrapper">
  227. <a class="nav-tab <?php echo ($selected == "") ? 'nav-tab-active' : ''; ?>" href="admin.php?page=simple_wp_membership_levels"><?php echo SwpmUtils::_('Membership Levels') ?></a>
  228. <a class="nav-tab <?php echo ($selected == "add") ? 'nav-tab-active' : ''; ?>" href="admin.php?page=simple_wp_membership_levels&level_action=add"><?php echo SwpmUtils::_('Add Level') ?></a>
  229. <a class="nav-tab <?php echo ($selected == "manage") ? 'nav-tab-active' : ''; ?>" href="admin.php?page=simple_wp_membership_levels&level_action=manage"><?php echo SwpmUtils::_('Manage Content Protection') ?></a>
  230. <a class="nav-tab <?php echo ($selected == "category_list") ? 'nav-tab-active' : ''; ?>" href="admin.php?page=simple_wp_membership_levels&level_action=category_list"><?php echo SwpmUtils::_('Category Protection') ?></a>
  231. <a class="nav-tab <?php echo ($selected == "post_list") ? 'nav-tab-active' : ''; ?>" href="admin.php?page=simple_wp_membership_levels&level_action=post_list"><?php echo SwpmUtils::_('Post and Page Protection') ?></a>
  232. <?php
  233. //Trigger hooks that allows an extension to add extra nav tabs in the membership levels menu.
  234. do_action ('swpm_membership_levels_menu_nav_tabs', $selected);
  235. $menu_tabs = apply_filters('swpm_membership_levels_additional_menu_tabs_array', array());
  236. foreach ($menu_tabs as $level_action => $title){
  237. ?>
  238. <a class="nav-tab <?php echo ($selected == $member_action) ? 'nav-tab-active' : ''; ?>" href="admin.php?page=simple_wp_membership_levels&level_action=<?php echo $level_action; ?>" ><?php SwpmUtils::e($title); ?></a>
  239. <?php
  240. }
  241. ?>
  242. </h2>
  243. <!-- end nav menu tabs -->
  244. <?php
  245. do_action( 'swpm_membership_level_menu_after_nav_tabs' );
  246. //Trigger hook so anyone listening for this particular action can handle the output.
  247. do_action( 'swpm_membership_level_menu_body_' . $action );
  248. //Allows an addon to completely override the body section of the membership level admin menu for a given action.
  249. $output = apply_filters('swpm_membership_level_menu_body_override', '', $action);
  250. if (!empty($output)) {
  251. //An addon has overriden the body of this page for the given action. So no need to do anything in core.
  252. echo $output;
  253. echo '</div>';//<!-- end of wrap -->
  254. return;
  255. }
  256. //Switch case for the various different actions handled by the core plugin.
  257. switch ($action) {
  258. case 'add':
  259. case 'edit':
  260. $this->process_form_request();
  261. break;
  262. case 'manage':
  263. $this->manage();
  264. break;
  265. case 'category_list':
  266. $this->manage_categroy();
  267. break;
  268. case 'post_list':
  269. $this->manage_post();
  270. break;
  271. case 'delete':
  272. $this->delete_level();
  273. default:
  274. $this->show_levels();
  275. break;
  276. }
  277. echo '</div>';//<!-- end of wrap -->
  278. }
  279. }