| | |
| | | Textdomain: jvb |
| | | */ |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; // Exit if accessed directly |
| | | } |
| | | use JVBase\admin\SEOAdmin; |
| | | use JVBase\base\SchemaHelper; |
| | | use JVBase\blocks\CustomBlocks; |
| | | use JVBase\JVB; |
| | | use JVBase\managers\AdminPages; |
| | | use JVBase\managers\Approvals; |
| | | use JVBase\managers\Dashboard\Dashboard; |
| | | use JVBase\managers\DirectoryManager; |
| | | use JVBase\managers\Emails; |
| | | use JVBase\managers\Favourites; |
| | | use JVBase\managers\IconsManager; |
| | | use JVBase\managers\InvitationsManager; |
| | | use JVBase\managers\Login; |
| | | use JVBase\managers\MagicLinks; |
| | | use JVBase\managers\NotificationManager; |
| | | use JVBase\managers\queue\Queue; |
| | | use JVBase\managers\Referrals; |
| | | use JVBase\managers\Responses; |
| | | use JVBase\managers\Roles; |
| | | use JVBase\managers\SEO\render\SchemaOutput; |
| | | use JVBase\managers\TaxonomyRelationships; |
| | | use JVBase\managers\UserTermsManager; |
| | | use JVBase\registrar\Registrar; |
| | | |
| | | use JVBase\base\Site; |
| | | |
| | | //security |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | //add_action('admin_enqueue_scripts', function() { |
| | | // global $wp_scripts; |
| | | // add_action('admin_print_scripts', function() use ($wp_scripts) { |
| | |
| | | add_filter('show_admin_bar', '__return_false'); |
| | | //} |
| | | |
| | | //if (JVB_TESTING) { |
| | | // error_log('In testing mode...'); |
| | | //} else { |
| | | // error_log('Not in testing mode...'); |
| | | //} |
| | | |
| | | |
| | | const JVB_DIR = WP_PLUGIN_DIR . '/jvb'; |
| | | define('JVB_URL', plugin_dir_url(__FILE__)); |
| | | |
| | | // Session Security |
| | | define('JVB_SESSION_FINGERPRINT', true); |
| | | const JVB_SESSION_FINGERPRINT = true; |
| | | |
| | | // Login Security |
| | | define('JVB_MAX_LOGIN_ATTEMPTS', 5); |
| | | define('JVB_LOCKOUT_DURATION', 15 * MINUTE_IN_SECONDS); |
| | | const JVB_MAX_LOGIN_ATTEMPTS = 5; |
| | | const JVB_LOCKOUT_DURATION = 15 * MINUTE_IN_SECONDS; |
| | | |
| | | |
| | | require(JVB_DIR.'/inc/Instance.php'); |
| | | require(JVB_DIR.'/base/_setup.php'); |
| | | |
| | | require(JVB_DIR.'/inc/utility/setup.php'); |
| | | require(JVB_DIR.'/checks.php'); |
| | | |
| | | require(JVB_DIR . '/inc/integrations/ServiceMap.php'); |
| | | require(JVB_DIR . '/inc/registrar/_setup.php'); |
| | | require(JVB_DIR . '/activate.php'); |
| | | |
| | |
| | | 'display' => __('Every minute', 'jvb') |
| | | ]; |
| | | $schedules[ 'monthly' ] = [ |
| | | 'interval' => 604800 * 4, |
| | | 'interval' => MONTH_IN_SECONDS, |
| | | 'display' => __('Once Monthly', 'jvb') |
| | | ]; |
| | | |
| | |
| | | register_deactivation_hook(JVB_DIR.'/jvb.php', 'jvbDeactivatePlugin'); |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | add_action('init', 'jvbUserCheck'); |
| | | function jvbUserCheck():void |
| | | { |
| | | if (is_admin() && isOurPeople()) { |
| | | wp_redirect(get_home_url(null, '/dash')); |
| | | exit; |
| | | } |
| | | } |
| | | |
| | | //require(JVB_DIR . '/inc/users/UserSettings.php'); |
| | | |
| | | |
| | |
| | | |
| | | function jvbLoadBase():void |
| | | { |
| | | JVB::getInstance(); |
| | | do_action('jvbloaded'); |
| | | Emails::getInstance(); |
| | | Queue::getInstance(); |
| | | Roles::getInstance(); |
| | | Login::getInstance(); |
| | | SEOAdmin::getInstance(); |
| | | SchemaOutput::getInstance(); |
| | | SchemaHelper::getInstance(); |
| | | CustomBlocks::getInstance(); |
| | | |
| | | AdminPages::getInstance(); |
| | | |
| | | if (Site::has('magic_link')) { |
| | | MagicLinks::getInstance(); |
| | | } |
| | | if (Site::has('dashboard')) { |
| | | Dashboard::getInstance(); |
| | | } |
| | | if (Site::has('referrals')) { |
| | | Referrals::getInstance(); |
| | | } |
| | | |
| | | |
| | | if (Site::has('is_directory')) { |
| | | DirectoryManager::getInstance(); |
| | | } |
| | | |
| | | if (Site::has('feed_block')) { |
| | | TaxonomyRelationships::getInstance(); |
| | | } |
| | | |
| | | if (Site::hasAll(['dashboard', 'membership', 'feed_block'])) { |
| | | UserTermsManager::getInstance(); |
| | | } |
| | | |
| | | if (Site::has('favourites')) { |
| | | Favourites::getInstance(); |
| | | } |
| | | |
| | | if (!empty(Registrar::withFeature('has_responses'))) { |
| | | Responses::getInstance(); |
| | | } |
| | | |
| | | $membership = Site::membership(); |
| | | if ($membership && $membership->has('notifications')) { |
| | | NotificationManager::getInstance(); |
| | | } |
| | | if ($membership && $membership->has('invitable')) { |
| | | InvitationsManager::getInstance(); |
| | | } |
| | | |
| | | if (!empty(Registrar::withFeature('approve_new'))) { |
| | | Approvals::getInstance(); |
| | | } |
| | | jvbLoadRoutes(); |
| | | } |
| | | |
| | | function jvb_integration_definitions():void |
| | |
| | | Registrar::maybeBuildSections(); |
| | | } |
| | | |
| | | add_action('wp_footer', 'jvbAdditionalActions'); |
| | | function jvbAdditionalActions():void |
| | | { |
| | | if (Login::isLogin()) { |
| | | return; |
| | | } |
| | | $extras = apply_filters('jvbAdditionalActions', []); |
| | | $extras = array_filter($extras, function ($extra) { |
| | | return is_array($extra) && array_key_exists('button', $extra) && array_key_exists('content', $extra); |
| | | }); |
| | | if (empty ($extras)) { |
| | | return; |
| | | } |
| | | $buttons = array_map(function ($extra) { |
| | | return $extra['button']; |
| | | }, $extras); |
| | | $contents = array_map(function($extra) { |
| | | return $extra['content']; |
| | | }, $extras); |
| | | |
| | | if (!empty ($buttons)) { |
| | | ?> |
| | | <section class="main-actions"> |
| | | <div class="buttons col"> |
| | | <?= implode('', $buttons); ?> |
| | | </div> |
| | | <div class="actions"> |
| | | <?= implode('', $contents); ?> |
| | | </div> |
| | | </section> |
| | | <?php |
| | | } |
| | | } |
| | | |
| | | |
| | | function JVB(): JVB |
| | | { |
| | | return JVB::getInstance(); |
| | | } |
| | | |
| | | use JVBase\rest\routes\AdminRoutes; |
| | | use JVBase\rest\routes\ContentRoutes; |
| | | use JVBase\rest\routes\ContentTermsRoutes; |
| | | use JVBase\rest\routes\ErrorRoutes; |
| | | use JVBase\rest\routes\FeedRoutes; |
| | | use JVBase\rest\routes\FormRoutes; |
| | | use JVBase\rest\routes\NewsRoutes; |
| | | use JVBase\rest\routes\OptionsRoutes; |
| | | use JVBase\rest\routes\SEORoutes; |
| | | use JVBase\rest\routes\SettingsRoutes; |
| | | use JVBase\rest\routes\TermRoutes; |
| | | use JVBase\rest\routes\UploadRoutes; |
| | | |
| | | function jvbLoadRoutes():void |
| | | { |
| | | SEORoutes::getInstance(); |
| | | SettingsRoutes::getInstance(); |
| | | UploadRoutes::getInstance(); |
| | | if (!empty(apply_filters('jvb_register_forms', []))) { |
| | | FormRoutes::getInstance(); |
| | | } |
| | | UserRoutes::getInstance(); |
| | | |
| | | if (Site::has('feed_block')) { |
| | | FeedRoutes::getInstance(); |
| | | } |
| | | |
| | | if (Site::has('feed_block') || Site::has('dashboard')) { |
| | | TermRoutes::getInstance(); |
| | | } |
| | | |
| | | if (Site::has('dashboard')) { |
| | | ErrorRoutes::getInstance(); |
| | | AdminRoutes::getInstance(); |
| | | ContentRoutes::getInstance(); |
| | | ContentTermsRoutes::getInstance(); |
| | | OptionsRoutes::getInstance(); |
| | | } |
| | | |
| | | $membership = Site::membership(); |
| | | if ($membership && $membership->has('forum')) |
| | | { |
| | | NewsRoutes::getInstance(); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Scripts |
| | | */ |
| | | add_action('wp_enqueue_scripts', 'jvbScripts', 10); |
| | | |
| | | function jvbScripts():void |
| | | { |
| | | add_action('wp_head', 'jvbInlineNavStyles'); |
| | | |
| | | if (Site::has('dashboard')) { |
| | | wp_enqueue_script('jvb-queue'); |
| | | } |
| | | |
| | | wp_enqueue_script('jvb-auth'); |
| | | wp_enqueue_script('jvb-settings'); |
| | | wp_enqueue_script('jvb-navigation'); |
| | | // wp_enqueue_script('jvb-ui'); |
| | | // wp_enqueue_script('jvb-media'); |
| | | wp_enqueue_script('jvb-gallery'); |
| | | wp_enqueue_script('jvb-cache'); |
| | | |
| | | |
| | | $interactions = []; |
| | | if (Site::has('favourites')) { |
| | | $interactions[] = 'favourites'; |
| | | } |
| | | if (!empty(Registrar::withFeature('karma'))) { |
| | | $interactions[] = 'karma'; |
| | | } |
| | | if (Site::has('notifications')) { |
| | | $interactions[] = 'notifications'; |
| | | } |
| | | |
| | | if (!empty($interactions)) { |
| | | foreach($interactions as $interaction) { |
| | | wp_enqueue_script('jvb-'.$interaction); |
| | | } |
| | | } |
| | | |
| | | |
| | | $queue = [ |
| | | 'api' => rest_url('jvb/v1/'), |
| | | 'redirect' => get_home_url(null, '/login/'), |
| | | 'labels' => Registrar::getLabels(), |
| | | ]; |
| | | |
| | | wp_localize_script('jvb-auth', 'jvbSettings', $queue); |
| | | |
| | | |
| | | $initUserSettings = 'async function initUserItems() { |
| | | if (!jvbSettings.currentUser) return; |
| | | |
| | | window.userFavourites = {}; |
| | | window.userVotes = {}; |
| | | '; |
| | | if (Site::has('favourites')) { |
| | | wp_enqueue_script('jvb-favourites'); |
| | | $initUserSettings .= ' |
| | | //Fetch user favourites |
| | | try { |
| | | const result = await window.jvbCache.fetchWithCache( |
| | | `${jvbSettings.api}favourites?all=true`, |
| | | { |
| | | method: \'GET\', |
| | | headers: {\'X-WP-Nonce\': jvbSettings.nonce} |
| | | } |
| | | ); |
| | | |
| | | if (result && result.favourites) { |
| | | for (const key in result.favourites) { |
| | | window.userFavourites[key] = new Set(); |
| | | result.favourites[key].forEach(id => { |
| | | window.userFavourites[key].add(parseInt(id)); |
| | | }); |
| | | } |
| | | } |
| | | } catch (error) { |
| | | console.error(\'Failed to fetch user favourites:\', error); |
| | | }'; |
| | | } |
| | | |
| | | if (!empty(Registrar::withFeature('karma'))) { |
| | | wp_enqueue_script('jvb-votes'); |
| | | $initUserSettings .= '// Fetch user votes |
| | | try { |
| | | const result = await window.jvbCache.fetchWithCache( |
| | | `${jvbSettings.api}vote?user=${jvbSettings.currentUser}`, |
| | | { |
| | | method: \'GET\', |
| | | headers: {\'X-WP-Nonce\': jvbSettings.nonce} |
| | | }, |
| | | {forceRefresh: true} |
| | | ); |
| | | |
| | | window.userVotes = {}; |
| | | if (result) { |
| | | for (const key in result) { |
| | | window.userVotes[key] = new Map(); |
| | | for (const [id, vote] of Object.entries(result[key])) { |
| | | window.userVotes[key].set(parseInt(id), vote); |
| | | } |
| | | } |
| | | } |
| | | } catch (error) { |
| | | console.error(\'Failed to fetch user votes:\', error); |
| | | }'; |
| | | } |
| | | |
| | | $initUserSettings .= '} initUserItems();'; |
| | | |
| | | // wp_add_inline_script('jvb-queue', $initUserSettings, 'after'); |
| | | |
| | | |
| | | if (is_search() || |
| | | is_tax(BASE.'shop') || |
| | | is_singular(BASE.'artist') || |
| | | jvbIsDirectory() |
| | | ) { |
| | | wp_enqueue_script('jvb-page-nav'); |
| | | } |
| | | |
| | | if (has_block('jvb/summaryBlock')) { |
| | | wp_enqueue_script('jvb-page-nav'); |
| | | } |
| | | |
| | | // Only load on single shop pages or other relevant pages |
| | | if (is_tax(BASE.'shop') || |
| | | is_singular(BASE.'partner')) { |
| | | $ID = get_queried_object_id(); |
| | | if (is_tax()) { |
| | | $check = get_term_meta($ID, BASE.'has_map', true); |
| | | } else { |
| | | $check = get_post_meta($ID, BASE.'has_map', true); |
| | | } |
| | | |
| | | // if ($check && $check !== '') { |
| | | //// wp_enqueue_script( |
| | | //// 'google-maps-frontend', |
| | | //// 'https://maps.googleapis.com/maps/api/js?key=' . GOOGLE_API . '&callback=googleMapsLoaded', |
| | | //// [], |
| | | //// null, |
| | | //// ['strategy' => 'async', |
| | | //// 'in_footer' => true] |
| | | //// ); |
| | | // |
| | | // // Add the callback function |
| | | // wp_add_inline_script('google-maps-frontend', ' |
| | | // function googleMapsLoaded() { |
| | | // if (window.googleMapsCallbacks && window.googleMapsCallbacks.length) { |
| | | // window.googleMapsCallbacks.forEach(callback => callback()); |
| | | // } |
| | | // } |
| | | // '); |
| | | // } |
| | | } |
| | | if (is_user_logged_in() && Site::has('notifications')) { |
| | | wp_enqueue_script('jvb-notifications'); |
| | | |
| | | wp_localize_script('jvb-notifications', 'notificationSettings', array( |
| | | 'homeUrl' => home_url(), |
| | | 'strings' => array( |
| | | 'loading' => 'Loading...', |
| | | 'error' => 'Failed to load notifications', |
| | | 'noNotifications' => 'No new notifications', |
| | | 'viewAll' => 'View All Notifications', |
| | | 'markRead' => 'Mark as read', |
| | | 'review' => 'Review' |
| | | ) |
| | | )); |
| | | } |
| | | |
| | | // jvbAddScriptDependency('jvb-feed-view-script', 'jvb-queue'); |
| | | jvbAddScriptDependency('jvb-feed-view-script', 'jvb-selector'); |
| | | jvbAddScriptDependency('jvb-feed-view-script', 'jvb-data-store'); |
| | | jvbAddScriptDependency('jvb-feed-view-script', 'jvb-cache'); |
| | | jvbAddScriptDependency('jvb-feed-view-script', 'jvb-a11y'); |
| | | jvbAddScriptDependency('jvb-feed-view-script', 'jvb-utility'); |
| | | jvbAddScriptDependency('jvb-feed-view-script', 'jvb-gallery'); |
| | | // jvbAddScriptDependency('jvb-feed-view-script', 'jvb-loading'); |
| | | jvbAddScriptDependency('jvb-forms-view-script', 'jvb-queue'); |
| | | jvbAddScriptDependency('jvb-forms-view-script', 'jvb-quill'); |
| | | jvbAddScriptDependency('jvb-forms-view-script', 'jvb-form'); |
| | | jvbAddScriptDependency('jvb-forms-view-script', 'jvb-tabs'); |
| | | |
| | | jvbAddScriptDependency('jvb-timeline-view-script', 'jvb-gallery'); |
| | | } |
| | | |
| | | function jvbAdminMap():void |
| | | { |
| | |
| | | // '); |
| | | } |
| | | |
| | | function jvbAddScriptDependency(string $handle, string $dep):bool |
| | | { |
| | | global $wp_scripts; |
| | | |
| | | $script = $wp_scripts->query($handle); |
| | | if (!$script) { |
| | | return false; |
| | | } |
| | | |
| | | if (!in_array($dep, $script->deps)) { |
| | | $script->deps[] = $dep; |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | |
| | | add_action('wp_body_open', 'jvbAccessibility'); |
| | |
| | | { |
| | | echo '<div class="screen-reader-text live-region" aria-live="polite" role="status"></div>'; |
| | | } |
| | | |
| | | /* |
| | | add_action('wp_head', 'jvbFrontendBase',1); |
| | | function jvbFrontendBase():void |
| | | { |
| | | ?> |
| | | |
| | | <script type="text/javascript">window.jvbBase = '<?= BASE ?>';</script> |
| | | <?php |
| | | } |
| | | */ |
| | | |
| | | //add_action('wp_head', 'jvbDumpIt'); |
| | | function jvbDumpIt() |
| | | { |
| | | |
| | | } |
| | | |
| | | add_action('after_setup_theme', 'jvbImageSize'); |
| | | function jvbImageSize():void |
| | | { |
| | | add_theme_support('post-thumbnails'); |
| | | add_image_size( 'tiny', 50, 50, false ); |
| | | add_image_size( 'directory-preview', 100, 100, false ); |
| | | add_image_size( 'tiny', 50, 50 ); |
| | | add_image_size( 'directory-preview', 100, 100 ); |
| | | } |
| | | |
| | | |
| | |
| | | // return $result; |
| | | //}, 10, 3); |
| | | |
| | | add_filter('rest_authentication_errors', function($result) { |
| | | |
| | | // Don't override existing authentication |
| | | if (is_wp_error($result) || $result === true) { |
| | | return $result; |
| | | } |
| | | |
| | | // Try to authenticate from cookie |
| | | $cookie_user = wp_validate_auth_cookie('', 'logged_in'); |
| | | |
| | | if ($cookie_user) { |
| | | wp_set_current_user($cookie_user); |
| | | return true; |
| | | } |
| | | return $result; |
| | | }, 99); |
| | | |
| | | |
| | | add_action('wp_footer', 'jvb_back_to_top'); |
| | | function jvb_back_to_top():void |