esc_html__('Snippet', 'header-footer-code-manager'), 'plural' => esc_html__('Snippets', 'header-footer-code-manager'), 'ajax' => false, ) ); } /** * Retrieve snippets data from the database * * @param int $per_page * @param int $page_number * * @return mixed */ public static function get_snippets( $per_page = 20, $page_number = 1, $customvar = 'all' ) { global $wpdb; $table_name = "{$wpdb->prefix}hfcm_scripts"; $page_number = absint($page_number); $per_page = absint($per_page); $customvar = sanitize_text_field($customvar); $orderby = 'script_id'; $order = 'ASC'; if (!empty($_GET['orderby']) ) { $orderby = sanitize_sql_orderby($_GET['orderby']); if (empty($orderby) || !in_array($orderby, array( 'script_id', 'name', 'location' )) ) { $orderby = 'script_id'; } } if (!empty($_GET['order']) ) { $order = strtolower(sanitize_sql_orderby($_GET['order'])); if (empty($order) || !in_array($order, array( 'desc', 'asc' )) ) { $order = 'ASC'; } } $sql = "SELECT * FROM `{$table_name}` WHERE 1"; $placeholder_args = array(); if (in_array($customvar, array( 'inactive', 'active' )) ) { $sql .= " AND status = '%s'"; $placeholder_args[] = $customvar; } if (!empty($_POST['snippet_type']) ) { $snippet_type = addslashes(sanitize_text_field($_POST['snippet_type'])); if (in_array($snippet_type, array( 'html', 'css', 'js' )) ) { $sql .= " AND snippet_type = %s"; $placeholder_args[] = $snippet_type; } } if (!empty($_POST['s']) ) { $search_query = addslashes(sanitize_text_field($_POST['s'])); $sql .= " AND name LIKE %s"; $placeholder_args[] = '%'.$search_query.'%'; } $sql .= ' ORDER BY %s %s LIMIT %d OFFSET %d'; $placeholder_args[] = $orderby; $placeholder_args[] = $order; $placeholder_args[] = $per_page; $placeholder_args[] = ($page_number - 1) * $per_page; if (!empty($placeholder_args) ) { $sql = $wpdb->prepare($sql, $placeholder_args); } $result = $wpdb->get_results( $sql, 'ARRAY_A' ); return $result; } /** * Delete a snipppet record. * * @param int $id snippet ID */ public static function delete_snippet( $id ) { $id = (int) $id; if (empty($id) ) { return; } global $wpdb; $table_name = "{$wpdb->prefix}hfcm_scripts"; $wpdb->delete( $table_name, array( 'script_id' => $id ), array( '%d' ) ); } /** * Activate a snipppet record. * * @param int $id snippet ID */ public static function activate_snippet( $id ) { $id = (int) $id; if (empty($id) ) { return; } global $wpdb; $table_name = "{$wpdb->prefix}hfcm_scripts"; $wpdb->update( $table_name, array( 'status' => 'active', ), array( 'script_id' => $id ), array( '%s' ), array( '%d' ) ); } /** * Deactivate a snipppet record. * * @param int $id snippet ID */ public static function deactivate_snippet( $id ) { $id = (int) $id; if (empty($id) ) { return; } global $wpdb; $table_name = "{$wpdb->prefix}hfcm_scripts"; $wpdb->update( $table_name, array( 'status' => 'inactive', ), array( 'script_id' => $id ), array( '%s' ), array( '%d' ) ); } /** * Returns the count of records in the database. * * @return null|string */ public static function record_count( $customvar = 'all' ) { global $wpdb; $table_name = "{$wpdb->prefix}hfcm_scripts"; $sql = "SELECT COUNT(*) FROM `{$table_name}`"; $placeholder_args = []; $customvar = sanitize_text_field($customvar); if (in_array($customvar, array( 'inactive', 'active' )) ) { $sql .= " WHERE status = %s"; $placeholder_args[] = $customvar; } if(!empty($placeholder_args)) { $sql = $wpdb->prepare($sql, $placeholder_args); } return $wpdb->get_var($sql); } /** * Text displayed when no snippet data is available */ public function no_items() { esc_html_e('No Snippets available.', 'header-footer-code-manager'); } /** * Render a column when no column specific method exist. * * @param array $item * @param string $column_name * * @return mixed */ public function column_default( $item, $column_name ) { switch ( $column_name ) { case 'name': return esc_html($item[ $column_name ]); case 'display_on': $nnr_hfcm_display_array = array( 'All' => esc_html__('Site Wide', 'header-footer-code-manager'), 's_posts' => esc_html__('Specific Posts', 'header-footer-code-manager'), 's_pages' => esc_html__('Specific Pages', 'header-footer-code-manager'), 's_categories' => esc_html__('Specific Categories', 'header-footer-code-manager'), 's_custom_posts' => esc_html__('Specific Custom Post Types', 'header-footer-code-manager'), 's_tags' => esc_html__('Specific Tags', 'header-footer-code-manager'), 's_is_home' => esc_html__('Home Page', 'header-footer-code-manager'), 's_is_search' => esc_html__('Search Page', 'header-footer-code-manager'), 's_is_archive' => esc_html__('Archive Page', 'header-footer-code-manager'), 'latest_posts' => esc_html__('Latest Posts', 'header-footer-code-manager'), 'manual' => esc_html__('Shortcode Only', 'header-footer-code-manager'), ); if ('s_posts' === $item[ $column_name ] ) { $empty = 1; $s_posts = json_decode($item['s_posts']); foreach ( $s_posts as $id ) { $id = absint($id); if ('publish' === get_post_status($id) ) { $empty = 0; break; } } if ($empty ) { return '' . esc_html__('No post selected', 'header-footer-code-manager') . ''; } } return esc_html($nnr_hfcm_display_array[ $item[ $column_name ] ]); case 'location': if (!$item[ $column_name ] ) { return esc_html__('N/A', 'header-footer-code-manager'); } $nnr_hfcm_locations = array( 'header' => esc_html__('Header', 'header-footer-code-manager'), 'before_content' => esc_html__('Before Content', 'header-footer-code-manager'), 'after_content' => esc_html__('After Content', 'header-footer-code-manager'), 'footer' => esc_html__('Footer', 'header-footer-code-manager'), ); return esc_html($nnr_hfcm_locations[ $item[ $column_name ] ]); case 'device_type': if ('both' === $item[ $column_name ] ) { return esc_html__('Show on All Devices', 'header-footer-code-manager'); } elseif ('mobile' === $item[ $column_name ] ) { return esc_html__('Only Mobile Devices', 'header-footer-code-manager'); } elseif ('desktop' === $item[ $column_name ] ) { return esc_html__('Only Desktop', 'header-footer-code-manager'); } else { return esc_html($item[ $column_name ]); } case 'snippet_type': $snippet_types = array( 'html' => esc_html__('HTML', 'header-footer-code-manager'), 'css' => esc_html__('CSS', 'header-footer-code-manager'), 'js' => esc_html__('Javascript', 'header-footer-code-manager') ); return esc_html($snippet_types[ $item[ $column_name ] ]); case 'status': if ('inactive' === $item[ $column_name ] ) { return '
'; } elseif ('active' === $item[ $column_name ] ) { return '
'; } else { return esc_html($item[ $column_name ]); } case 'script_id': return esc_html($item[ $column_name ]); case 'shortcode': return '[hfcm id="' . absint($item['script_id']) . '"]'; default: return print_r($item, true); // Show the whole array for troubleshooting purposes } } /** * Render the bulk edit checkbox * * @param array $item * * @return string */ function column_cb( $item ) { return sprintf( '', $item['script_id'] ); } /** * Method for name column * * @param array $item an array of DB data * * @return string */ function column_name( $item ) { $delete_nonce = wp_create_nonce('hfcm_delete_snippet'); $edit_nonce = wp_create_nonce('hfcm_edit_snippet'); $title = '' . esc_html($item['name']) . ''; $nnr_current_screen = get_current_screen(); if (!empty($nnr_current_screen->parent_base) ) { $page = $nnr_current_screen->parent_base; } else { $page = sanitize_text_field($_GET['page']); } $actions = array( 'edit' => sprintf('' . esc_html__('Edit', 'header-footer-code-manager') . '', esc_attr('hfcm-update'), 'edit', absint($item['script_id']), $edit_nonce), 'copy' => sprintf('' . esc_html__('Copy Shortcode', 'header-footer-code-manager') . '', absint($item['script_id']), absint($item['script_id'])), 'delete' => sprintf('' . esc_html__('Delete', 'header-footer-code-manager') . '', $page, 'delete', absint($item['script_id']), $delete_nonce), ); return $title . $this->row_actions($actions); } /** * Associative array of columns * * @return array */ function get_columns() { $columns = array( 'cb' => '', 'script_id' => esc_html__('ID', 'header-footer-code-manager'), 'status' => esc_html__('Status', 'header-footer-code-manager'), 'name' => esc_html__('Snippet Name', 'header-footer-code-manager'), 'display_on' => esc_html__('Display On', 'header-footer-code-manager'), 'location' => esc_html__('Location', 'header-footer-code-manager'), 'snippet_type' => esc_html__('Snippet Type', 'header-footer-code-manager'), 'device_type' => esc_html__('Devices', 'header-footer-code-manager'), 'shortcode' => esc_html__('Shortcode', 'header-footer-code-manager'), ); return $columns; } /** * Columns to make sortable. * * @return array */ public function get_sortable_columns() { return array( 'name' => array( 'name', true ), 'location' => array( 'location', true ), 'script_id' => array( 'script_id', false ), ); } /** * Returns an associative array containing the bulk action * * @return array */ public function get_bulk_actions() { return array( 'bulk-activate' => esc_html__('Activate', 'header-footer-code-manager'), 'bulk-deactivate' => esc_html__('Deactivate', 'header-footer-code-manager'), 'bulk-delete' => esc_html__('Remove', 'header-footer-code-manager'), ); } /** * Add filters and extra actions above and below the table * * @param string $which Are the actions displayed on the table top or bottom */ public function extra_tablenav( $which ) { if ('top' === $which ) { $query = isset($_POST['snippet_type']) ? sanitize_text_field($_POST['snippet_type']) : ''; $snippet_type = array( 'html' => esc_html__('HTML', 'header-footer-code-manager'), 'css' => esc_html__('CSS', 'header-footer-code-manager'), 'js' => esc_html__('Javascript', 'header-footer-code-manager') ); echo '
'; echo ''; submit_button(__('Filter', 'header-footer-code-manager'), 'button', 'filter_action', false); echo '
'; } echo '
'; echo '
'; } /** * Handles data query and filter, sorting, and pagination. */ public function prepare_items() { $columns = $this->get_columns(); $hidden = array(); $sortable = $this->get_sortable_columns(); // Retrieve $customvar for use in query to get items. $customvar = 'all'; if (!empty($_GET['customvar']) ) { $customvar = sanitize_text_field($_GET['customvar']); if (empty($customvar) || !in_array($customvar, [ 'inactive', 'active', 'all' ]) ) { $customvar = 'all'; } } $this->_column_headers = array( $columns, $hidden, $sortable ); /** * Process bulk action */ $this->process_bulk_action(); $this->views(); $per_page = $this->get_items_per_page('snippets_per_page', 20); $current_page = $this->get_pagenum(); $total_items = self::record_count(); $this->set_pagination_args( array( 'total_items' => $total_items, 'per_page' => $per_page, ) ); $this->items = self::get_snippets($per_page, $current_page, $customvar); } public function get_views() { $views = array(); $current = 'all'; if (!empty($_GET['customvar']) ) { $current = sanitize_text_field($_GET['customvar']); } //All link $class = 'all' === $current ? 'current' : ''; $all_url = remove_query_arg('customvar'); $views['all'] = '' . esc_html__('All', 'header-footer-code-manager') . ' (' . esc_html__($this->record_count()) . ')'; //Foo link $foo_url = add_query_arg('customvar', 'active'); $class = ('active' === $current ? 'current' : ''); $views['active'] = '' . esc_html__('Active', 'header-footer-code-manager') . ' (' . esc_html__($this->record_count('active')) . ')'; //Bar link $bar_url = add_query_arg('customvar', 'inactive'); $class = ('inactive' === $current ? 'current' : ''); $views['inactive'] = '' . esc_html__('Inactive', 'header-footer-code-manager') . ' (' . esc_html__($this->record_count('inactive')) . ')'; return $views; } public function process_bulk_action() { //Detect when a bulk action is being triggered... if ('delete' === $this->current_action() ) { // In our file that handles the request, verify the nonce. $nonce = sanitize_text_field($_REQUEST['_wpnonce']); if (!wp_verify_nonce($nonce, 'hfcm_delete_snippet') ) { die('Go get a life script kiddies'); } else { if (!empty($_GET['snippet']) ) { $snippet_id = absint($_GET['snippet']); if (!empty($snippet_id) ) { self::delete_snippet($snippet_id); } } NNR_HFCM::hfcm_redirect(admin_url('admin.php?page=hfcm-list')); return; } } // If the delete bulk action is triggered if ((isset($_POST['action']) && 'bulk-delete' === $_POST['action']) || (isset($_POST['action2']) && 'bulk-delete' === $_POST['action2']) ) { $delete_ids = $_POST['snippets']; // loop over the array of record IDs and delete them foreach ( $delete_ids as $id ) { $id = absint($id); if (!empty($id) && is_int($id) ) { self::delete_snippet($id); } } NNR_HFCM::hfcm_redirect(admin_url('admin.php?page=hfcm-list')); return; } elseif ((isset($_POST['action']) && 'bulk-activate' === $_POST['action']) || (isset($_POST['action2']) && 'bulk-activate' === $_POST['action2']) ) { $activate_ids = $_POST['snippets']; // loop over the array of record IDs and activate them foreach ( $activate_ids as $id ) { $id = absint($id); if (!empty($id) && is_int($id) ) { self::activate_snippet($id); } } NNR_HFCM::hfcm_redirect(admin_url('admin.php?page=hfcm-list')); return; } elseif ((isset($_POST['action']) && 'bulk-deactivate' === $_POST['action']) || (isset($_POST['action2']) && 'bulk-deactivate' === $_POST['action2']) ) { $delete_ids = $_POST['snippets']; // loop over the array of record IDs and deactivate them foreach ( $delete_ids as $id ) { $id = absint($id); if (!empty($id) && is_int($id) ) { self::deactivate_snippet($id); } } NNR_HFCM::hfcm_redirect(admin_url('admin.php?page=hfcm-list')); return; } } /** * Displays the search box. * * @param string $text The 'submit' button label. * @param string $input_id ID attribute value for the search input field. * @since 3.1.0 */ public function search_box( $text, $input_id ) { if (empty($_REQUEST['s']) && !$this->has_items() ) { return; } $input_id = $input_id . '-search-input'; ?>