'certificate', 'plural' => 'certificates', 'ajax' => false )); } /** * Get the columns for the list table. * * Defines all columns that should be displayed in the certificates table. * * @since 1.0.0 * * @return array Associative array of column ID => Column Title pairs. */ public function get_columns() { return array( 'cb' => '', 'certificate_id' => __('Certificate ID', 'academic-certificate-verification'), 'student_name' => __('Student Name', 'academic-certificate-verification'), 'course_type' => __('Course Type', 'academic-certificate-verification'), 'course_name' => __('Course Name', 'academic-certificate-verification'), 'institution' => __('Institution', 'academic-certificate-verification'), 'issue_date' => __('Issue Date', 'academic-certificate-verification'), 'status' => __('Status', 'academic-certificate-verification'), 'actions' => __('Actions', 'academic-certificate-verification') ); } /** * Get sortable columns. * * Defines which columns can be sorted and their sorting parameters. * * @since 1.0.0 * * @return array Associative array of column ID => array('database_field', 'initial_sort_direction'). */ protected function get_sortable_columns() { return array( 'certificate_id' => array('certificate_id', false), 'student_name' => array('student_name', false), 'issue_date' => array('issue_date', false) ); } /** * Default column display. * * Handles display for columns without a specific method. * * @since 1.0.0 * * @param array $item The current certificate item. * @param string $column_name The column being displayed. * * @return string The column content. */ protected function column_default($item, $column_name) { return isset($item[$column_name]) ? $item[$column_name] : ''; } /** * Issue date column. * * @since 1.0.0 * * @param array $item The current certificate item. * * @return string Formatted issue date. */ protected function column_issue_date($item) { return acceve_format_date($item['issue_date'] ?? ''); } /** * Checkbox column. * * Displays a checkbox for bulk actions. * * @since 1.0.0 * * @param array $item The current certificate item. * * @return string HTML checkbox element. */ protected function column_cb($item) { return sprintf('', $item['certificate_id']); } /** * Certificate ID column. * * Displays the certificate ID with edit and delete actions. * * @since 1.0.0 * * @param array $item The current certificate item. * * @return string Certificate ID with row actions. */ protected function column_certificate_id($item) { $title = '' . $item['certificate_id'] . ''; $actions = array( 'edit' => sprintf('%s', $item['certificate_id'], __('Edit', 'academic-certificate-verification')), 'delete' => sprintf('%s', wp_nonce_url( admin_url('admin.php?page=certificate_verification&action=delete&certificate_id=' . $item['certificate_id']), 'delete_certificate_' . $item['certificate_id'] ), __('Are you sure?', 'academic-certificate-verification'), __('Delete', 'academic-certificate-verification')) ); return $title . $this->row_actions($actions); } /** * Status column. * * Displays certificate status with appropriate CSS class. * Status can be: active, inactive, or expired. * * @since 1.0.0 * * @param array $item The current certificate item. * * @return string Status HTML with CSS class. */ protected function column_status($item) { $current_date = gmdate('Y-m-d'); $status = 'active'; $label = __('Active', 'academic-certificate-verification'); if (!$item['is_active']) { $status = 'inactive'; $label = __('Inactive', 'academic-certificate-verification'); } elseif ($item['expiry_date'] && $item['expiry_date'] < $current_date) { $status = 'expired'; $label = __('Expired', 'academic-certificate-verification'); } return sprintf('%s', $status, $label); } /** * Actions column. * * Displays action buttons for each certificate. * * @since 1.0.0 * * @param array $item The current certificate item. * * @return string Action button HTML. */ protected function column_actions($item) { $view_button = sprintf( '%s', home_url('/verify-certificate?id=' . urlencode($item['certificate_id'])), __('View', 'academic-certificate-verification') ); $license_handler = ACCEVE_License_Handler::get_instance(); $pro_available = class_exists('ACCEVE_Academic_Certificate_Verification_Pro') && $license_handler->is_license_active(); $disabled_attr = $pro_available ? '' : ' disabled'; $title_attr = $pro_available ? '' : sprintf( ' title="%s"', esc_attr__('Requires Academic Certificate Verification Pro with an active license.', 'academic-certificate-verification') ); $download_button = sprintf( '', $disabled_attr, $title_attr, esc_attr($item['certificate_id']), __('Download PDF', 'academic-certificate-verification') ); return '' . $view_button . ' ' . $download_button . ''; } /** * Prepare items for display. * * Handles pagination, sorting, and fetching data from database. * * @since 1.0.0 * * @global wpdb $wpdb WordPress database abstraction object. * * @return void */ public function prepare_items() { global $wpdb; $db = ACCEVE_Certificate_Verification_Database::get_instance(); $columns = $this->get_columns(); $hidden = array(); $sortable = $this->get_sortable_columns(); $this->_column_headers = array($columns, $hidden, $sortable); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Reading search parameter for admin list table display. $search = isset($_REQUEST['s']) ? sanitize_text_field(wp_unslash($_REQUEST['s'])) : ''; $per_page = $this->get_items_per_page('certificates_per_page', 20); $current_page = $this->get_pagenum(); $total_items = $db->count_certificates($search); $this->set_pagination_args(array( 'total_items' => $total_items, 'per_page' => $per_page )); $this->items = $db->get_all_certificates($per_page, $current_page, $search); } /** * Get bulk actions. * * Defines available bulk actions for the list table. * * @since 1.0.0 * * @return array Associative array of action slug => Action Label. */ protected function get_bulk_actions() { return array( 'export_csv' => __('Export to CSV', 'academic-certificate-verification'), 'delete' => __('Delete', 'academic-certificate-verification') ); } }