Changeset 3693658
- Timestamp:
- 09/13/2026 12:45:04 PM (6 weeks ago)
- Location:
- edutain-certificate-validator/trunk
- Files:
-
- 3 added
- 1 deleted
- 11 edited
-
admin/assets/css/admin.css (modified) (5 diffs)
-
admin/assets/images/banner-free.gif (added)
-
admin/assets/images/banner-free.png (deleted)
-
admin/assets/js/admin.js (modified) (1 diff)
-
admin/class-edcv-admin.php (modified) (1 diff)
-
admin/partials/admin-dashboard.php (modified) (3 diffs)
-
admin/partials/admin-data-summary.php (modified) (1 diff)
-
admin/partials/admin-hero-navbar.php (modified) (1 diff)
-
admin/partials/admin-instructions-content.php (modified) (1 diff)
-
edutain-certificate-validator.php (modified) (2 diffs)
-
public/assets/css/public.css (modified) (3 diffs)
-
public/assets/images (added)
-
public/assets/images/edcv-verified-logo.png (added)
-
public/class-edcv-public.php (modified) (4 diffs)
-
readme.txt (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
edutain-certificate-validator/trunk/admin/assets/css/admin.css
r3649741 r3693658 1127 1127 } 1128 1128 1129 /* Hero — image-based banner (banner-free.png / banner-pro.png). Uses the 1130 shared .edcv-wrap width, with the image's aspect ratio locked so it 1131 scales as one proportional block at its measured 1214x311 natural size. */ 1129 /* Shared animated banners retain their original 2172x724 proportions. */ 1132 1130 .edcv-dash-hero { 1133 1131 position: relative; … … 1140 1138 display: block; 1141 1139 width: 100%; 1142 aspect-ratio: 1214 / 311;1140 aspect-ratio: 3 / 1; 1143 1141 height: auto; 1144 1142 object-fit: contain; … … 1146 1144 } 1147 1145 1146 1148 1147 /* Overlaid CTA — sized/positioned as a % of the banner, measured directly 1149 from the dashed placeholder box baked into banner-free. png(natural1148 from the dashed placeholder box baked into banner-free.gif (natural 1150 1149 pixel bounds: x 89-463, y ~470-578 of the 1906x700 artwork). */ 1151 1150 .edcv-dash-hero-cta { 1152 1151 position: absolute; 1153 1152 left: 4.67%; 1154 top: 67.1%;1155 width: 1 9.6%;1153 top: 72%; 1154 width: 17%; 1156 1155 height: 15.4%; 1157 1156 box-sizing: border-box; … … 1159 1158 align-items: center; 1160 1159 justify-content: center; 1161 background: # 7238f3;1162 color: # fff;1160 background: #ffe600; 1161 color: #5422b8; 1163 1162 font-size: clamp(9px, 1.2vw, 16px); 1164 1163 font-weight: 700; … … 1168 1167 border: 0; 1169 1168 border-radius: 8px; 1170 box-shadow: 0 4px 14px rgba( 114, 56, 243, .35);1169 box-shadow: 0 4px 14px rgba(76, 31, 169, .28); 1171 1170 transition: transform .25s ease, box-shadow .25s ease, background .25s ease; 1172 1171 } 1173 1172 .edcv-dash-hero-cta:hover, 1174 1173 .edcv-dash-hero-cta:focus { 1175 background: # 601fe8;1176 color: # fff;1174 background: #ffd500; 1175 color: #5422b8; 1177 1176 transform: scale(1.05); 1178 box-shadow: 0 8px 22px rgba( 114, 56, 243, .5);1177 box-shadow: 0 8px 22px rgba(76, 31, 169, .38); 1179 1178 } 1180 1179 .edcv-dash-hero-cta:focus-visible { 1181 outline: 2px solid # fff;1180 outline: 2px solid #5422b8; 1182 1181 outline-offset: 2px; 1183 1182 } -
edutain-certificate-validator/trunk/admin/assets/js/admin.js
r3649741 r3693658 800 800 var TAB_STORAGE_KEY = 'edcv_active_tab'; 801 801 802 $(document).on('click', '[data-edcv-force-add-tab]', function () { 803 try { 804 window.sessionStorage.setItem(TAB_STORAGE_KEY, 'add'); 805 } catch (e) { 806 // sessionStorage unavailable; the URL parameter still requests Add Data. 807 } 808 }); 809 802 810 /** 803 811 * (Re)initialize flatpickr on the Add Data tab's Issue Date field. -
edutain-certificate-validator/trunk/admin/class-edcv-admin.php
r3649741 r3693658 125 125 public static function render_hero_navbar( $active_slug ) { 126 126 $edcv_is_premium = edcv_premium_active(); 127 $edcv_banner_rel = 'admin/assets/images/banner-free. png';127 $edcv_banner_rel = 'admin/assets/images/banner-free.gif'; 128 128 $edcv_banner_alt = __( 'Edutain Certificate Validator — Upgrade to Pro', 'edutain-certificate-validator' ); 129 129 $edcv_nav_tabs = array( -
edutain-certificate-validator/trunk/admin/partials/admin-dashboard.php
r3649741 r3693658 35 35 esc_html_e( 'Browse our collection of quick guides and tutorials to get the most out of the plugin.', 'edutain-certificate-validator' ); 36 36 ?></p> 37 <a href="https://edutain -certificate-validator.edutainmentuk.com/documentation" target="_blank" rel="noopener" class="edcv-dash-card-btn"><?php37 <a href="https://edutainvalidator.com/documentation/" target="_blank" rel="noopener" class="edcv-dash-card-btn"><?php 38 38 esc_html_e( 'View Docs', 'edutain-certificate-validator' ); 39 39 ?></a> … … 50 50 ?></h3> 51 51 <p><?php 52 esc_html_e( 'Quickly read the instructions before using this tool ', 'edutain-certificate-validator' );52 esc_html_e( 'Quickly read the instructions before using this tool.', 'edutain-certificate-validator' ); 53 53 ?></p> 54 54 <a href="#edcv-instructions" class="edcv-dash-card-btn" data-edcv-help-target="edcv-instructions"><?php … … 217 217 <li><span class="dashicons dashicons-yes"></span><?php 218 218 esc_html_e( 'All Features Included', 'edutain-certificate-validator' ); 219 ?></li> 220 <li><span class="dashicons dashicons-yes"></span><?php 221 esc_html_e( 'QR codes & branded PDFs', 'edutain-certificate-validator' ); 222 ?></li> 223 <li><span class="dashicons dashicons-yes"></span><?php 224 esc_html_e( 'Expiry, revocation & analytics', 'edutain-certificate-validator' ); 219 225 ?></li> 220 226 <li><span class="dashicons dashicons-yes"></span><?php -
edutain-certificate-validator/trunk/admin/partials/admin-data-summary.php
r3649741 r3693658 38 38 </div> 39 39 <?php if ( $edcv_summary_dashboard ) : ?> 40 <a class="edcv-stat-card edcv-stat-card-action" href="<?php echo esc_url( $edcv_summary_add_url ); ?>" >40 <a class="edcv-stat-card edcv-stat-card-action" href="<?php echo esc_url( $edcv_summary_add_url ); ?>" data-edcv-force-add-tab> 41 41 <span class="edcv-stat-icon dashicons dashicons-plus-alt2" aria-hidden="true"></span> 42 42 <span class="edcv-stat-label"><?php esc_html_e( 'Add record', 'edutain-certificate-validator' ); ?></span> -
edutain-certificate-validator/trunk/admin/partials/admin-hero-navbar.php
r3649741 r3693658 20 20 21 21 <section class="edcv-dash-hero"> 22 <img class="edcv-dash-hero-img" src="<?php echo esc_url( EDCV_PLUGIN_URL . $edcv_banner_rel ); ?>" alt="<?php echo esc_attr( $edcv_banner_alt ); ?>" >22 <img class="edcv-dash-hero-img" src="<?php echo esc_url( EDCV_PLUGIN_URL . $edcv_banner_rel ); ?>" alt="<?php echo esc_attr( $edcv_banner_alt ); ?>" width="2172" height="724"> 23 23 <?php if ( ! $edcv_is_premium ) : ?> 24 24 <a class="edcv-dash-hero-cta" href="<?php echo esc_url( $edcv_pricing_url ); ?>"> -
edutain-certificate-validator/trunk/admin/partials/admin-instructions-content.php
r3649741 r3693658 67 67 </div> 68 68 69 <div class="edcv-card edcv-instructions-card"> 70 <h3><?php esc_html_e( 'Want QR codes on your certificates?', 'edutain-certificate-validator' ); ?></h3> 71 <p> 72 <?php esc_html_e( 'The Pro version generates a scannable QR code for every certificate that opens its direct verification link.', 'edutain-certificate-validator' ); ?> 73 <button type="button" class="button edcv-pro-trigger" data-feature="qr"><?php esc_html_e( 'Learn more', 'edutain-certificate-validator' ); ?> <span class="edcv-pro-badge"><?php esc_html_e( 'Pro', 'edutain-certificate-validator' ); ?></span></button> 74 </p> 75 </div> 69 <?php if ( ! edcv_premium_active() ) : ?> 70 <div class="edcv-card edcv-instructions-card"> 71 <h3><?php esc_html_e( 'Want QR codes on your certificates?', 'edutain-certificate-validator' ); ?></h3> 72 <p> 73 <?php esc_html_e( 'The Pro version generates a scannable QR code for every certificate that opens its direct verification link.', 'edutain-certificate-validator' ); ?> 74 <button type="button" class="button edcv-pro-trigger" data-feature="qr"><?php esc_html_e( 'Learn more', 'edutain-certificate-validator' ); ?> <span class="edcv-pro-badge"><?php esc_html_e( 'Pro', 'edutain-certificate-validator' ); ?></span></button> 75 </p> 76 </div> 77 <?php endif; ?> 76 78 </div> -
edutain-certificate-validator/trunk/edutain-certificate-validator.php
r3649741 r3693658 5 5 * Plugin URI: https://wordpress.org/plugins/edutain-certificate-validator/ 6 6 * Description: Upload a CSV of certificates and allow visitors to verify a certificate by its code via a shortcode. Premium features add QR codes, PDF certificates, expiry/revocation, custom fields, email delivery and verification analytics. 7 * Version: 2.0. 07 * Version: 2.0.1 8 8 * Requires at least: 5.0 9 9 * Requires PHP: 7.2 … … 63 63 do_action( 'ecv_fs_loaded' ); 64 64 } 65 define( 'EDCV_VERSION', '2.0. 0' );65 define( 'EDCV_VERSION', '2.0.1' ); 66 66 define( 'EDCV_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); 67 67 define( 'EDCV_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); -
edutain-certificate-validator/trunk/public/assets/css/public.css
r3649741 r3693658 170 170 } 171 171 .edcv-result-meta { color: var(--edcv-muted); font-size: 12.5px; } 172 .edcv-result-actions { display: flex; gap: 8px; } 173 .edcv-mini-btn { 172 .edcv-result-footer-branded { 173 display: grid; 174 grid-template-columns: minmax(0, 1fr) auto; 175 } 176 .edcv-result-footer-branded .edcv-result-actions { 177 grid-column: 1 / -1; 178 } 179 .edcv-verification-brand { 180 display: inline-flex; 181 align-items: center; 182 justify-content: flex-end; 183 gap: 5px; 184 min-width: 0; 185 padding: 5px 8px; 186 border: 1px solid #d8d1fa; 187 border-radius: 7px; 188 background: #f7f5ff; 189 color: #4b5563; 190 font-size: 12px; 191 font-weight: 500; 192 line-height: 1.25; 193 } 194 .edcv-verification-brand img { 195 display: block; 196 width: 22px; 197 height: 22px; 198 object-fit: contain; 199 } 200 .edcv-verification-brand a { 201 color: #5422b8; 202 font-weight: 700; 203 text-decoration: none; 204 cursor: pointer; 205 transition: color .15s ease, text-decoration-color .15s ease; 206 } 207 .edcv-verification-brand a:hover, 208 .edcv-verification-brand a:focus-visible { 209 color: #7238f3; 210 text-decoration: underline; 211 text-underline-offset: 2px; 212 } 213 .edcv-result-actions { 214 display: flex; 215 align-items: center; 216 gap: 9px; 217 flex-wrap: wrap; 218 } 219 .edcv-result-box .edcv-mini-btn { 220 display: inline-flex; 221 align-items: center; 222 justify-content: center; 223 gap: 7px; 224 min-height: 38px; 225 box-sizing: border-box; 226 margin: 0; 227 padding: 8px 13px; 228 border: 1px solid transparent; 229 border-radius: 9px; 174 230 background: #fff; 175 border: 1px solid var(--edcv-border); 176 border-radius: 8px; 177 padding: 6px 12px; 231 box-shadow: 0 2px 5px rgba(17, 24, 39, .06); 232 font: inherit; 178 233 font-size: 13px; 179 color: var(--edcv-ink); 234 font-weight: 650; 235 line-height: 1.2; 236 text-decoration: none; 180 237 cursor: pointer; 181 transition: border-color .15s ease; 182 } 183 .edcv-mini-btn:hover { border-color: var(--edcv-ink); } 238 transition: transform .15s ease, border-color .15s ease, background-color .15s ease, box-shadow .15s ease; 239 } 240 .edcv-result-box .edcv-mini-btn svg { 241 flex: 0 0 17px; 242 width: 17px; 243 height: 17px; 244 fill: none; 245 stroke: currentColor; 246 stroke-width: 1.9; 247 stroke-linecap: round; 248 stroke-linejoin: round; 249 } 250 .edcv-result-box .edcv-pro-pdf-btn { 251 border-color: #7238f3; 252 background: linear-gradient(135deg, #7238f3, #5b24d6); 253 color: #fff; 254 box-shadow: 0 4px 10px rgba(114, 56, 243, .22); 255 } 256 .edcv-result-box .edcv-copy-btn { 257 border-color: #d8ccff; 258 background: #f5f1ff; 259 color: #5422b8; 260 } 261 .edcv-result-box .edcv-print-btn { 262 border-color: #d9dee7; 263 background: #fff; 264 color: #374151; 265 } 266 .edcv-result-box .edcv-mini-btn:hover { 267 transform: translateY(-1px); 268 box-shadow: 0 5px 12px rgba(17, 24, 39, .13); 269 } 270 .edcv-result-box .edcv-pro-pdf-btn:hover { 271 border-color: #5b24d6; 272 background: linear-gradient(135deg, #642be6, #4d1fbd); 273 color: #fff; 274 } 275 .edcv-result-box .edcv-copy-btn:hover { 276 border-color: #bca7ff; 277 background: #ece5ff; 278 color: #441996; 279 } 280 .edcv-result-box .edcv-print-btn:hover { 281 border-color: #aeb7c5; 282 background: #f8fafc; 283 color: #111827; 284 } 285 .edcv-result-box .edcv-mini-btn:focus-visible { 286 outline: 2px solid #7238f3; 287 outline-offset: 2px; 288 } 289 290 @media (max-width: 620px) { 291 .edcv-result-footer-branded { grid-template-columns: 1fr; } 292 .edcv-verification-brand { justify-self: start; } 293 .edcv-result-footer-branded .edcv-result-actions { grid-column: 1; } 294 } 184 295 185 296 /* Valid-certificate social sharing ------------------------------------------ */ … … 265 376 266 377 /* Wrapper card on the auto-created page --------------------------------------- */ 378 .edcv-validation-page .entry-title, 379 .edcv-validation-page .wp-block-post-title { 380 width: 100%; 381 text-align: center; 382 } 383 267 384 .edcv-validate-info { 268 385 background: #fff; … … 274 391 box-shadow: 0 8px 20px rgba(0, 0, 0, .04); 275 392 } 276 .edcv-validate-info h2 { margin: 0 0 8px; }277 .edcv-validate-info p { margin: 0 0 10px; color: #374151; }393 .edcv-validate-info h2 { margin: 0 0 8px; text-align: center; } 394 .edcv-validate-info > p { margin: 0 0 10px; color: #374151; text-align: center; } 278 395 279 396 /* Print: show only the verified card ------------------------------------------- */ -
edutain-certificate-validator/trunk/public/class-edcv-public.php
r3649741 r3693658 46 46 add_shortcode( 'edcv_validator', array( $this, 'render_shortcode' ) ); 47 47 add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_assets' ) ); 48 add_filter( 'body_class', array( $this, 'validation_page_body_class' ) ); 48 49 add_action( 'wp_head', array( $this, 'output_certificate_share_metadata' ), 5 ); 49 50 add_action( 'wp_ajax_edcv_verify_certificate', array( $this, 'verify_certificate_ajax' ) ); 50 51 add_action( 'wp_ajax_nopriv_edcv_verify_certificate', array( $this, 'verify_certificate_ajax' ) ); 52 } 53 54 /** 55 * Add a styling hook to the plugin's automatically created validation page. 56 * 57 * @param string[] $classes Existing body classes. 58 * @return string[] 59 */ 60 public function validation_page_body_class( $classes ) { 61 $page_id = absint( get_option( 'edcv_validate_page_id', 0 ) ); 62 if ( $page_id && is_page( $page_id ) ) { 63 $classes[] = 'edcv-validation-page'; 64 } 65 66 return $classes; 51 67 } 52 68 … … 200 216 $verified_on = date_i18n( get_option( 'date_format' ) ); 201 217 $status = $this->certificate_status( $row ); 218 $show_brand = ! edcv_premium_active(); 202 219 203 220 /** … … 245 262 $html .= '</div>'; 246 263 247 $html .= '<div class="edcv-result-footer ">';264 $html .= '<div class="edcv-result-footer' . ( $show_brand ? ' edcv-result-footer-branded' : '' ) . '">'; 248 265 $html .= '<span class="edcv-result-meta">' . sprintf( 249 266 /* translators: 1: date, 2: site name */ … … 252 269 esc_html( $site_name ) 253 270 ) . '</span>'; 254 $actions = '<button type="button" class="edcv-mini-btn" id="edcv-copy-link">' . esc_html__( 'Copy verification link', 'edutain-certificate-validator' ) . '</button>'; 255 $actions .= '<button type="button" class="edcv-mini-btn" id="edcv-print-card">' . esc_html__( 'Print', 'edutain-certificate-validator' ) . '</button>'; 271 if ( $show_brand ) { 272 $html .= '<span class="edcv-verification-brand">' 273 . '<span>' . esc_html__( 'Verified with', 'edutain-certificate-validator' ) . '</span>' 274 . '<img src="' . esc_url( EDCV_PLUGIN_URL . 'public/assets/images/edcv-verified-logo.png' ) . '" alt="" aria-hidden="true">' 275 . '<a href="' . esc_url( 'https://edutainvalidator.com' ) . '">' . esc_html__( 'Edutain Certificate Validator', 'edutain-certificate-validator' ) . '</a>' 276 . '</span>'; 277 } 278 $copy_icon = '<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><rect x="8" y="8" width="11" height="11" rx="2"/><path d="M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2"/></svg>'; 279 $print_icon = '<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M7 9V4h10v5M7 18H5a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"/><rect x="7" y="14" width="10" height="7" rx="1"/><path d="M17 12h.01"/></svg>'; 280 $actions = '<button type="button" class="edcv-mini-btn edcv-copy-btn" id="edcv-copy-link">' . $copy_icon . '<span>' . esc_html__( 'Copy verification link', 'edutain-certificate-validator' ) . '</span></button>'; 281 $actions .= '<button type="button" class="edcv-mini-btn edcv-print-btn" id="edcv-print-card">' . $print_icon . '<span>' . esc_html__( 'Print', 'edutain-certificate-validator' ) . '</span></button>'; 256 282 257 283 /** -
edutain-certificate-validator/trunk/readme.txt
r3655976 r3693658 1 === Edutain Certificate Validator – Certificate Verification, QR Code & Digital Credentials ===2 Contributors: edutainmentuk 1 === Edutain Certificate Validator – Certificate Verification, QR Code & Digital Credentials === 2 Contributors: edutainmentuk, freemius 3 3 Tags: certificate verification, course certificate, certificate, verification, certificate validation 4 4 Requires at least: 5.0 5 5 Tested up to: 7.0 6 6 Requires PHP: 7.2 7 Stable tag: 2.0. 07 Stable tag: 2.0.1 8 8 License: GPLv2 or later 9 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 17 17 18 18 [Edutain Certificate Validator](https://edutain-certificate-validator.edutainmentuk.com/) is a professional WordPress certificate verification plugin that lets anyone verify a certificate online, in seconds, on your own website. It is a no-code certificate validator built for training providers, educators, online course creators, and organizations that issue certificates. 19 20 21 https://www.youtube.com/watch?v=bcZ9-ULFbbw 19 22 20 23 … … 283 286 284 287 288 = 2.0.1 = 289 * Updated: replaced the Free and Pro dashboard banners with animated designs. 290 * Added: displayed linked Edutain Certificate Validator branding on Free public verification results. 291 * Added: supported WebP and restricted SVG logos on Pro PDF certificates when the server can process the selected format. 292 * Improved: centered the public verification headings and redesigned the verification action buttons. 293 * Fixed: made the dashboard Add Record button reliably open the Add Data tab. 294 * Changed: displayed the QR code upgrade prompt only when Pro is inactive. 295 * Updated: revised the Agency pricing features, documentation link, and dashboard instruction text. 296 297 285 298 = 2.0.0 = 286 299 * New: added Email as an optional core certificate field for manual entry, CSV import, and record editing.
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)