'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')
);
}
}