' . esc_html__( 'SeatHive Event Ticketing', 'seathive' ) . ': ' . esc_html__( 'the earlier copy of this plugin (Seat Ticketing) is still active. Deactivate it on the Plugins screen (deactivate the SeatWP Seating Map add-on first). Your events, bookings and settings stay and SeatHive takes over.', 'seathive' ) . '

'; } } ); return; } define( 'SEATT_VERSION', '3.4.0' ); define( 'SEATT_PLUGIN_FILE', __FILE__ ); define( 'SEATT_PLUGIN_DIR', plugin_dir_path( __FILE__ ) ); define( 'SEATT_PLUGIN_URL', plugin_dir_url( __FILE__ ) ); /** * Cache-proof asset version: the file's own last-modified time instead of * a hand-maintained constant. This is belt-and-suspenders against any * caching plugin/CDN/proxy that might otherwise keep serving an old copy * of a .js/.css file after an update — the query string changes the * instant the file on disk changes, with nothing to remember to bump. */ function seatt_asset_ver( $relative_path ) { $file = SEATT_PLUGIN_DIR . ltrim( $relative_path, '/' ); return file_exists( $file ) ? (string) filemtime( $file ) : SEATT_VERSION; } /** * Tags and attributes allowed in the plugin's own inline SVG (icons, QR * codes, charts) — used with wp_kses() when such markup is printed. */ function seatt_svg_allowed() { $common = array( 'class' => true, 'style' => true, 'id' => true, 'role' => true, 'aria-label' => true, 'aria-hidden' => true, 'focusable' => true ); $shape = $common + array( 'x' => true, 'y' => true, 'x1' => true, 'x2' => true, 'y1' => true, 'y2' => true, 'width' => true, 'height' => true, 'r' => true, 'cx' => true, 'cy' => true, 'rx' => true, 'ry' => true, 'd' => true, 'points' => true, 'fill' => true, 'fill-rule' => true, 'clip-rule' => true, 'stroke' => true, 'stroke-width' => true, 'stroke-linecap' => true, 'stroke-linejoin' => true, 'stroke-dasharray' => true, 'stroke-dashoffset' => true, 'transform' => true, 'opacity' => true, 'text-anchor' => true, 'font-size' => true, 'font-weight' => true, 'font-family' => true, 'shape-rendering' => true ); return array( 'svg' => $common + array( 'viewbox' => true, 'width' => true, 'height' => true, 'xmlns' => true, 'preserveaspectratio' => true, 'fill' => true, 'stroke' => true, 'stroke-width' => true, 'stroke-linecap' => true, 'stroke-linejoin' => true, 'shape-rendering' => true ), 'g' => $shape, 'path' => $shape, 'rect' => $shape, 'circle' => $shape, 'line' => $shape, 'polyline' => $shape, 'polygon' => $shape, 'text' => $shape, 'title' => array(), ); } /** * Allowed HTML for markup the plugin builds itself (event page, booking * form, share buttons, admin cards): post HTML + SVG icons + form fields. * Used with wp_kses() when such markup is echoed. */ function seatt_kses_allowed() { static $allowed = null; if ( null !== $allowed ) { return $allowed; } $global = array( 'class' => true, 'id' => true, 'style' => true, 'title' => true, 'role' => true, 'hidden' => true, 'tabindex' => true, 'lang' => true, 'dir' => true, 'data-*' => true, 'aria-label' => true, 'aria-labelledby' => true, 'aria-describedby' => true, 'aria-hidden' => true, 'aria-controls' => true, 'aria-selected' => true, 'aria-expanded' => true, 'aria-live' => true, 'aria-current' => true, 'aria-pressed' => true, 'aria-disabled' => true, 'aria-haspopup' => true, 'aria-modal' => true, 'aria-atomic' => true, 'aria-busy' => true, 'aria-invalid' => true, 'aria-required' => true, 'aria-checked' => true, 'aria-valuenow' => true, 'aria-valuemin' => true, 'aria-valuemax' => true, 'aria-valuetext' => true, 'aria-owns' => true, 'aria-orientation' => true, 'aria-roledescription' => true ); $field = $global + array( 'name' => true, 'value' => true, 'type' => true, 'disabled' => true, 'readonly' => true, 'required' => true, 'autocomplete' => true, 'autofocus' => true, 'form' => true, 'placeholder' => true, 'inputmode' => true, 'pattern' => true, 'min' => true, 'max' => true, 'step' => true, 'minlength' => true, 'maxlength' => true, 'size' => true, 'checked' => true, 'multiple' => true, 'accept' => true, 'list' => true, 'spellcheck' => true, 'enterkeyhint' => true ); $allowed = wp_kses_allowed_html( 'post' ); foreach ( $allowed as $tag => $attrs ) { $allowed[ $tag ] = ( is_array( $attrs ) ? $attrs : array() ) + $global; } $allowed['a'] = ( $allowed['a'] ?? array() ) + array( 'href' => true, 'target' => true, 'rel' => true, 'download' => true ); $allowed['form'] = $global + array( 'action' => true, 'method' => true, 'enctype' => true, 'novalidate' => true, 'autocomplete' => true, 'target' => true, 'name' => true ); $allowed['input'] = $field; $allowed['textarea'] = $field + array( 'rows' => true, 'cols' => true, 'wrap' => true ); $allowed['select'] = $field; $allowed['option'] = $global + array( 'value' => true, 'selected' => true, 'disabled' => true, 'label' => true ); $allowed['optgroup'] = $global + array( 'label' => true, 'disabled' => true ); $allowed['button'] = $field; $allowed['label'] = $global + array( 'for' => true ); $allowed['fieldset'] = $global + array( 'disabled' => true, 'name' => true ); $allowed['legend'] = $global; $allowed['output'] = $global + array( 'for' => true, 'name' => true ); $allowed['progress'] = $global + array( 'value' => true, 'max' => true ); $allowed['time'] = $global + array( 'datetime' => true ); $allowed['img'] = ( $allowed['img'] ?? array() ) + array( 'src' => true, 'srcset' => true, 'sizes' => true, 'alt' => true, 'width' => true, 'height' => true, 'loading' => true, 'decoding' => true, 'fetchpriority' => true ); foreach ( seatt_svg_allowed() as $tag => $attrs ) { $allowed[ $tag ] = $attrs + $global; } return $allowed; } /** * Small page-specific scripts are attached to a script handle with * wp_add_inline_script() (never printed as raw