__('Certificate ID is required', 'academic-certificate-verification'))); } $options = get_option('acceve_certificate_verification_options'); $enable_dob = ! empty($options['enable_date_of_birth']); $enable_issue_date = ! empty($options['enable_issue_date']); if ($enable_dob && empty($birth_date)) { wp_send_json_error(array('message' => __('Date of Birth is required', 'academic-certificate-verification'))); } if ($enable_issue_date && empty($issue_date)) { wp_send_json_error(array('message' => __('Certificate Issue Date is required', 'academic-certificate-verification'))); } $dob_param = $enable_dob ? $birth_date : null; $issue_param = $enable_issue_date ? $issue_date : null; $certificate = $this->verify_certificate_with_verification_details($certificate_id, $dob_param, $issue_param); if ($certificate && !is_string($certificate)) { // Certificate is valid - generate HTML ob_start(); $this->render_certificate_details($certificate); $html = ob_get_clean(); wp_send_json_success(array('html' => $html, 'certificate' => $certificate, 'url' => home_url('/verify-certificate?id=' . $certificate_id))); } elseif ($certificate === 'expired') { $html = '

' . esc_html__('This certificate has expired.', 'academic-certificate-verification') . '

' . esc_html__('If you believe this is an error, please contact the issuing institution.', 'academic-certificate-verification') . '

'; wp_send_json_error(array('message' => $html)); } elseif ($certificate === 'inactive') { $html = '

' . esc_html__('This certificate is no longer active.', 'academic-certificate-verification') . '

' . esc_html__('If you believe this is an error, please contact the issuing institution.', 'academic-certificate-verification') . '

'; wp_send_json_error(array('message' => $html)); } else { if ($enable_dob && $enable_issue_date) { $err_msg = __('Certificate not found. Please check the ID, date of birth, and certificate issue date.', 'academic-certificate-verification'); } elseif ($enable_issue_date) { $err_msg = __('Certificate not found. Please check the ID and certificate issue date.', 'academic-certificate-verification'); } elseif ($enable_dob) { $err_msg = __('Certificate not found. Please check the ID and date of birth.', 'academic-certificate-verification'); } else { $err_msg = __('Certificate not found. Please check the ID.', 'academic-certificate-verification'); } $html = '

' . esc_html($err_msg) . '

' . esc_html__('If you believe this is an error, please contact the issuing institution.', 'academic-certificate-verification') . '

'; wp_send_json_error(array('message' => $html)); } } /** * Render certificate details HTML. * * @param object $certificate Certificate object. * @return void * @since 1.0.0 */ private function render_certificate_details($certificate) { $options = get_option('acceve_certificate_verification_options'); $label_cert_id = ! empty($options['label_certificate_id']) ? $options['label_certificate_id'] : __('Certificate ID', 'academic-certificate-verification'); $cert_success = ! empty($options['certificate_verified_successful_message']) ? $options['certificate_verified_successful_message'] : __('Certificate Verified Successfully!', 'academic-certificate-verification'); ?>

: certificate_id); ?>
student_name)) : ?>
student_name); ?>
course_name)) : ?>
course_name); ?>
issue_date) && $certificate->issue_date !== '0000-00-00') : ?>
issue_date)); ?>
expiry_date)) : ?>
expiry_date)); ?>
institution)) : ?>
institution); ?>
get_certificate_with_date($certificate_id, $birth_date); if (!$certificate) { return false; } if ($certificate->expiry_date && strtotime($certificate->expiry_date) < time()) { return 'expired'; } if (!$certificate->is_active) { return 'inactive'; } return $certificate; } /** * Verify certificate with flexible filters (Date of Birth, Issue Date). * * @param string $certificate_id Certificate ID to verify. * @param string|null $birth_date Optional date of birth filter. * @param string|null $issue_date Optional issue date filter. * * @return object|string|false Certificate object on success, 'expired', 'inactive', or false. * @since 1.0.6 */ public function verify_certificate_with_verification_details($certificate_id, $birth_date = null, $issue_date = null) { $db = ACCEVE_Certificate_Verification_Database::get_instance(); $certificate = $db->get_certificate_with_verification_details($certificate_id, $birth_date, $issue_date); if (!$certificate) { return false; } if ($certificate->expiry_date && strtotime($certificate->expiry_date) < time()) { return 'expired'; } if (!$certificate->is_active) { return 'inactive'; } return $certificate; } /** * Verify certificate status for display. * * Checks whether a certificate exists and determines its current status: * - Returns the certificate object if it is valid and active * - Returns 'expired' if the certificate has passed its expiry date * - Returns 'inactive' if the certificate is disabled * - Returns false if the certificate does not exist or verification fails * * @since 1.0.0 * * @param string|int $certificate_id Certificate ID to verify. * @param string $verification_code Optional verification code. * * @return object|string|false Certificate object on success, * 'expired' if expired, * 'inactive' if inactive, * false if not found or invalid. */ public function verify_certificate($certificate_id, $verification_code = '') { $db = ACCEVE_Certificate_Verification_Database::get_instance(); $certificate = $db->get_certificate($certificate_id, $verification_code); if (!$certificate) { return false; } if ($certificate->expiry_date && strtotime($certificate->expiry_date) < time()) { return 'expired'; } if (!$certificate->is_active) { return 'inactive'; } return $certificate; } /** * Resolve which certificate layout to use for a verified certificate. * * Per-course settings in acceve_courses (certificate_template, certificate_custom_template) * override the global plugin options when set. Pro-only templates are downgraded if the * Pro plugin or license is not active. * * @param object $certificate Row from get_certificate / verify_certificate. * @return array{certificate_template: string, certificate_custom_template: int} */ public static function resolve_certificate_template_for_display($certificate) { $options = get_option('acceve_certificate_verification_options', array()); if (!is_array($options)) { $options = array(); } $global_template = isset($options['certificate_template']) ? $options['certificate_template'] : 'template_one'; $global_custom = isset($options['certificate_custom_template']) ? intval($options['certificate_custom_template']) : 0; $template = $global_template; $custom_id = $global_custom; $course_id = ''; if (is_object($certificate) && isset($certificate->course_id)) { $course_id = (string) $certificate->course_id; } if ($course_id !== '') { $courses = get_option('acceve_courses', array()); if (isset($courses[ $course_id ]) && is_array($courses[ $course_id ])) { $course = $courses[ $course_id ]; if (!empty($course['certificate_template'])) { $template = $course['certificate_template']; if ($template === 'custom_template') { $custom_id = isset($course['certificate_custom_template']) ? intval($course['certificate_custom_template']) : 0; } else { $custom_id = 0; } } } } $is_pro = class_exists('ACCEVE_Academic_Certificate_Verification_Pro'); $license = ACCEVE_License_Handler::get_instance(); $license_ok = $is_pro && $license->is_license_active(); if (!$license_ok && ('template_two' === $template || 'custom_template' === $template)) { $template = $global_template; $custom_id = $global_custom; if (!$license_ok && ('template_two' === $template || 'custom_template' === $template)) { $template = 'template_one'; $custom_id = 0; } } if ('custom_template' === $template && $custom_id <= 0) { $template = 'template_one'; $custom_id = 0; } return array( 'certificate_template' => $template, 'certificate_custom_template' => $custom_id, ); } }