=MAJOR OVERHAUL. Likely should have made a new branch ages ago. Key changes: Registrar.php is the base for custom post types, taxonomies, and user roles. Replaces JVB_CONTENT, JVB_TAXONOMY, and JVB_USER constants, eliminates most of Features.php (except for JVB_SITE, JVB_MEMBERSHIP), and has built in sanitizing and validation via sub-classes. Also started a major overhaul of the Schema output. Created a shit ton of property traits and classes to help sanitize and ensure proper data for different schema types. Still a bunch to do, but better to be starting committing changes here on this other branch.
4 files renamed
678 files added
81 files modified
6 files copied
9 files deleted
| | |
| | | use JVBase\managers\ReferralManager; |
| | | use JVBase\managers\RoleManager; |
| | | //use JVBase\managers\SchemaManager; |
| | | use JVBase\managers\SEO\render\SchemaOutput; |
| | | use JVBase\managers\SEO\SchemaOutputManager; |
| | | use JVBase\managers\SEO\SEOAdminPage; |
| | | use JVBase\admin\SEOAdmin; |
| | | use JVBase\managers\AdminPages; |
| | | use JVBase\managers\NotificationManager; |
| | | use JVBase\managers\UserTermsManager; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\rest\routes\FeedRoutes; |
| | | use JVBase\rest\routes\FavouritesRoutes; |
| | | use JVBase\rest\routes\IntegrationsSquareRoutes; |
| | |
| | | { |
| | | $this->customBlocks = new CustomBlocks(); |
| | | $this->managers = [ |
| | | 'errors' => new ErrorHandler(), |
| | | 'queue' => new Queue(), |
| | | // 'dash' => new DashboardManager(), |
| | | 'roles' => new RoleManager(), |
| | | // 'forms' => new FormManager(), |
| | | 'schema' => new SchemaOutputManager(), |
| | | 'admin' => new AdminPages(), |
| | | 'seoAdmin' => new SEOAdminPage(), |
| | | // 'uploads' => new UploadManager(), |
| | | 'errors' => new ErrorHandler(), |
| | | 'queue' => new Queue(), |
| | | // 'dash' => new DashboardManager(), |
| | | 'roles' => new RoleManager(), |
| | | // 'forms' => new FormManager(), |
| | | // 'schema' => new SchemaOutputManager(), |
| | | 'admin' => new AdminPages(), |
| | | 'seoAdmin' => new SEOAdmin(), |
| | | 'seo' => new SchemaOutput(), |
| | | // 'uploads' => new UploadManager(), |
| | | 'userTerms' => new UserTermsManager(), |
| | | 'email' => new EmailManager(), |
| | | 'email' => new EmailManager(), |
| | | ]; |
| | | |
| | | $this->routes = [ |
| | |
| | | if (Features::forSite()->has('feed_block')) { |
| | | $this->routes['feed'] = new FeedRoutes(); |
| | | } |
| | | if (jvbSiteHasNotifications()) { |
| | | if (Features::forMembership()->has('notifications')) { |
| | | $this->managers['notifications'] = new NotificationManager(); |
| | | $this->routes['notifications'] = new NotificationsRoutes(); |
| | | } |
| | | if (Features::forSite()->has('feed_block') || jvbSiteHasDashboard()) { |
| | | if (Features::forSite()->has('feed_block') || Features::forSite()->has('dashboard')) { |
| | | $this->routes['term'] = new TermRoutes(); |
| | | } |
| | | |
| | |
| | | $this->managers['directory'] = new DirectoryManager(); |
| | | } |
| | | |
| | | if (jvbSiteHasDashboard()) { |
| | | if (Features::forSite()->has('dashboard')) { |
| | | $this->routes['error'] = new ErrorRoutes(); |
| | | $this->routes['admin'] = new AdminRoutes(); |
| | | $this->routes['content'] = new ContentRoutes(); |
| | |
| | | $this->routes['options'] = new OptionsRoutes(); |
| | | } |
| | | |
| | | if (jvbSiteHasFavourites()) { |
| | | if (Features::forSite()->has('favourites')) { |
| | | $this->routes['favourites'] = new FavouritesRoutes(); |
| | | } |
| | | |
| | |
| | | if (Features::forMembership()->has('invitable')) { |
| | | $this->managers['invitations'] = new InvitationsManager(); |
| | | } |
| | | if (Features::anyContentHas('response') || Features::anyTaxonomyHas('response') || Features::anyUserHas('response')) { |
| | | if (!empty(Registrar::getFeatured('has_responses'))) { |
| | | $this->routes['comments'] = new ResponseRoutes(); |
| | | } |
| | | if (Features::anyContentHas('karma') || Features::anyTaxonomyHas('karma') || Features::anyUserHas('karma')) { |
| | | if (!empty(Registrar::getFeatured('karma'))) { |
| | | $this->routes['vote'] = new VoteRoutes(); |
| | | } |
| | | if (Features::anyContentHas('karma') || Features::anyTaxonomyHas('karma') || Features::anyUserHas('karma') |
| | | if (!empty(Registrar::getFeatured('karma')) |
| | | || Features::forMembership()->has('member_verified') || |
| | | Features::forMembership()->has('term_approval')) { |
| | | $this->routes['approvals'] = new ApprovalRoutes(); |
| | |
| | | |
| | | public function getFields($type): array |
| | | { |
| | | $content = JVB_CONTENT[$type] ?? JVB_TAXONOMY[$type] ?? JVB_USER[$type] ?? []; |
| | | return $content['fields'] ?? []; |
| | | return Registrar::getFieldsFor($type)??[]; |
| | | } |
| | | |
| | | public function getContent($type): mixed |
| | |
| | | } |
| | | } |
| | | |
| | | public function seo():SchemaOutput |
| | | { |
| | | return $this->managers['seo']; |
| | | } |
| | | |
| | | public function blocks():CustomBlocks|bool |
| | | { |
| | | return $this->customBlocks??false; |
| | |
| | | |
| | | use JVBase\integrations\Umami; |
| | | use JVBase\managers\Cache; |
| | | use JVBase\managers\CustomTable; |
| | | use JVBase\managers\DirectoryManager; |
| | | use JVBase\managers\queue\Queue; |
| | | use JVBase\managers\ReferralManager; |
| | | use JVBase\managers\RoleManager; |
| | | use JVBase\managers\SEO\SEOAdminPage; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | |
| | | |
| | | function jvbActivatePlugin():void |
| | | { |
| | | $validator = new JVBase\utility\Validator(); |
| | | $validation = $validator->validateAll(); |
| | | error_log('Validation result: '.print_r($validation, true)); |
| | | $checker = JVBase\utility\Checker::getInstance(); |
| | | error_log('Doing our activation action...'); |
| | | |
| | | // $validator = new JVBase\utility\Validator(); |
| | | // $validation = $validator->validateAll(); |
| | | // error_log('Validation result: '.print_r($validation, true)); |
| | | // $checker = JVBase\utility\Checker::getInstance(); |
| | | // error_log('Doing our activation action...'); |
| | | // Get ContentRegistry instance early |
| | | $registry = new JVBase\registry\ContentRegistry(); |
| | | // $registry = new JVBase\registry\ContentRegistry(); |
| | | // Initialize content types |
| | | $registry->onActivation(); |
| | | $checker->invalidateContentCache(); |
| | | $checker->invalidateTaxonomyCache(); |
| | | // $registry->onActivation(); |
| | | // $checker->invalidateContentCache(); |
| | | // $checker->invalidateTaxonomyCache(); |
| | | do_action(BASE.'activation'); |
| | | error_log('Action done!'); |
| | | error_log('Checking custom tables...'); |
| | | (new JVBase\registry\CheckCustomTables())->maybeCreateTables(); |
| | | Queue::defineTables(); |
| | | CustomTable::ensureTables(); |
| | | // (new JVBase\registry\CheckCustomTables())->maybeCreateTables(); |
| | | error_log('Tables created!'); |
| | | |
| | | // Store schema version |
| | |
| | | jvbSchedules(); |
| | | error_log('Schedules done!'); |
| | | error_log('checking Admin capabilities...'); |
| | | jvbAddAdminCaps(); |
| | | |
| | | jvb_register_do_once('admin_caps', 'jvbAddAdminCaps'); |
| | | |
| | | error_log('Admin caps done!'); |
| | | error_log('Removing unneeded roles...'); |
| | | remove_role('contributor'); |
| | |
| | | Umami::createTables(); |
| | | } |
| | | |
| | | if (Features::forSite()->has('is_directory')) { |
| | | error_log('Activating DirectoryManager'); |
| | | DirectoryManager::activate(); |
| | | } |
| | | // if (Features::forSite()->has('is_directory')) { |
| | | // error_log('Activating DirectoryManager'); |
| | | // jvb_register_do_once('buildDirectory', ['JVBase\managers\DirectoryManager', 'activate']); |
| | | // } |
| | | error_log('Activation done! Huzzah!'); |
| | | } |
| | | |
| | | function jvbAddAdminCaps() |
| | | { |
| | | $roleManager = new \JVBase\managers\RoleManager(); |
| | | $roleManager = new RoleManager(); |
| | | |
| | | |
| | | $role = get_role('administrator'); |
| | | $users = get_users(['role' => 'administrator']); |
| | | foreach (JVB_CONTENT as $slug => $config) { |
| | | |
| | | $plural = strtolower($config['plural']); |
| | | foreach (array_merge(Registrar::getRegistered('post'), Registrar::getFeatured('is_content')) as $slug) { |
| | | error_log('Adding administrative roles to '.$slug); |
| | | $plural = $roleManager->getContentPlural($slug); |
| | | $capabilities = [ |
| | | 'edit_' . $plural, |
| | | 'edit_published_' . $plural, |
| | |
| | | function jvbGrantAdminUserCaps() |
| | | { |
| | | // Only run once after activation |
| | | if (get_option('jvb_admin_caps_granted') === '1') { |
| | | if (get_option(BASE.'admin_caps_granted') === '1') { |
| | | return; |
| | | } |
| | | |
| | | $roleManager = new \JVBase\managers\RoleManager(); |
| | | $roleManager = new RoleManager(); |
| | | $users = get_users(['role' => 'administrator']); |
| | | |
| | | foreach (JVB_CONTENT as $slug => $config) { |
| | | foreach (array_merge(Registrar::getRegistered('post'), Registrar::getFeatured('is_content', 'term')) as $slug) { |
| | | |
| | | foreach ($users as $user) { |
| | | // These methods should check if post type exists before adding caps |
| | | $roleManager->grantContent($user, $slug); |
| | |
| | | } |
| | | |
| | | // Mark as complete to prevent running again |
| | | update_option('jvb_admin_caps_granted', '1'); |
| | | update_option(BASE.'admin_caps_granted', '1'); |
| | | remove_action('init', 'jvbGrantAdminUserCaps', 99); |
| | | } |
| | | function jvbScheduledHooks() |
| | |
| | | if (Features::forSite()->has('referrals')){ |
| | | ReferralManager::addSubpage(); |
| | | } |
| | | SEOAdminPage::addSubpage(); |
| | | // SEOAdminPage::addSubpage(); |
| | | } |
| | |
| | | nav,nav ol,nav ul{--padding:0 1rem;--wrap:nowrap;display:flex;flex-direction:var(--dir,row);justify-content:var(--justify,flex-start);align-items:var(--align,center);gap:var(--gap,0);flex-wrap:var(--wrap,nowrap);height:var(--btn,3rem);max-width:100%;font-family:var(--heading);padding:0;margin:0}nav li{display:flex;align-items:center;height:max(var(--btn),max-content);width:100%;max-inline-size:none;padding:0}nav a,nav button{display:flex;text-decoration:none;align-items:center;justify-content:center;height:var(--btn);width:100%;white-space:nowrap;text-transform:uppercase;transition:var(--trans-color)}nav a{height:var(--btn);padding:var(--padding)}nav button{justify-content:center;aspect-ratio:1;padding:0;border:2px solid var(--base);color:var(--contrast);border-radius:0}nav .current a,nav a.current,nav a:focus,nav a:focus:visited,nav a:hover,nav button:focus{background-color:var(--action-0);color:var(--action-contrast)}.toggle .icon{transform:rotate(0);transition:transform var(--trans-base)}.has-submenu.open>button .icon{transform:rotate(900deg)}.has-submenu{position:relative}ul.submenu{--dir:column;height:max-content;position:absolute;top:100%;left:0;max-height:0;transform:scaleY(0);transform-origin:top;width:max(100%,max-content);background-color:rgba(var(--base-rgb),var(--op-3));border:2px solid rgba(var(--base-rgb),var(--op-3));transition:all var(--trans-t) var(--trans-fn);box-shadow:var(--shdw-none);overflow:hidden}.submenu li{background-color:rgba(var(--base-rgb),var(--op-6));border:1px solid var(--base-50)}.open>ul.submenu{transform:scaleY(1);max-height:1000%;box-shadow:rgba(var(--base-rgb),var(--op-45)) var(--shdw)}.screen-reader-text{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}nav a:focus:not(:focus-visible){outline:0}nav a:focus-visible{outline:2px solid var(--action-0);outline-offset:2px}nav.always{--dir:column;--wrap:nowrap;position:fixed;bottom:0;right:0;width:var(--btn);z-index:var(--z-10)}nav.always.open{--justify:flex-end;width:100vw;height:100vh;padding-bottom:var(--btn_);background-color:rgba(var(--base-rgb),var(--op-6));backdrop-filter:blur(5px)}nav.always>ul{--dir:column;--align:center;--justify:flex-start;--gap:0;height:100%;position:relative;right:-300vw;width:100vw;max-height:100%;padding:1rem 0 0;overflow:hidden auto;transition:right var(--trans-base)}nav.always.open>ul{right:0}nav.always li{flex-wrap:wrap;background-color:rgba(var(--base-rgb),var(--op-6))}nav.always a{padding:1rem;max-width:calc(100% - var(--btn));text-align:center}nav.always .has-submenu{display:flex}nav.always .has-submenu>a{flex:1}nav.always .has-submenu>button{flex:0 0 var(--btn)}nav.always .submenu{position:relative;padding-right:4rem;height:max-content;top:0;width:100%;border:2px solid var(--action-0);background-color:rgba(var(--contrast-rgb),var(--op-1))}nav.always .submenu li{background-color:rgba(var(--base-rgb),var(--op-3))}nav.always>button{position:fixed;bottom:0;right:0;width:var(--btn);height:var(--btn);background-color:var(--base);color:var(--contrast);box-shadow:rgba(var(--base-rgb),var(--op-45)) var(--shdw);transition:width var(--trans-base)}nav.always>button:hover{background-color:var(--action-0);color:var(--action-contrast)}nav.always.open>button{width:100%;background-color:rgba(var(--base-rgb),var(--op-6));backdrop-filter:blur(5px);z-index:1000000}nav.always.open>button .icon-list,nav.always>button .icon-x{display:none}nav.always.open>button .icon-x,nav.always>button .icon-list{display:block;width:32px;height:32px}@media (min-width:768px){nav.always>ul{padding-top:var(--btn)}}nav#breadcrumbs{height:max-content;--wrap:wrap;--gap:0;width:max-content;max-width:var(--full);position:absolute;background-color:rgba(var(--base-rgb),var(--op-4));font-size:var(--txt-x-small);padding:.125em;z-index:var(--z-7)}#breadcrumbs ol{height:max-content}#breadcrumbs li{width:max-content}#breadcrumbs a{height:var(--chip)}#breadcrumbs li::after{content:'/';color:var(--contrast-200);padding:0 .25rem}#breadcrumbs li:last-of-type::after{display:none}#breadcrumbs :is(a,span){padding:0 .125rem;color:var(--contrast);text-transform:none}#breadcrumbs a:focus{background-color:transparent;color:var(--action-0)}nav.fixed.bottom{position:fixed;bottom:0;left:0;width:calc(100% - var(--btn));box-shadow:rgba(var(--base-rgb),var(--op-45)) var(--shdw);z-index:var(--z-9)}nav.fixed.bottom ul{--justify:space-between;width:100%;background-color:var(--base);padding:0 .25rem}nav.fixed.bottom li{flex:1;justify-content:center}nav.fixed.bottom a{gap:1rem;--w:var(--chip_);color:var(--contrast);font-size:var(--txt-x-small)}@media (min-width:768px){nav.fixed.bottom a{font-size:var(--txt-medium)}}nav.on-this-page{--justify:space-between;position:fixed;bottom:0;left:0;width:calc(100% - var(--btn));max-width:none;padding:0 .5rem;background-color:rgba(var(--base-rgb),var(--op-4));color:var(--base-200);box-shadow:rgba(var(--base-rgb),var(--op-45)) var(--shdw);z-index:var(--z-6)}body:has(nav.fixed) nav.on-this-page{bottom:var(--btn)}body:has(.additional-actionsbutton) nav.on-this-page{width:calc(100vw - var(--btn_) - 1rem)}.on-this-page ul{width:100%;gap:0}.on-this-page li{justify-content:center}.on-this-page .active a{background-color:rgba(var(--base-rgb),var(--op-6));color:var(--action-contrast)}.on-this-page a{height:var(--chip);padding:0}nav.letters li{height:var(--chip);max-width:calc(7.69% - 2px)}nav.letters ul{--wrap:wrap}nav.letters,nav.letters ul{height:var(--chipchip)}@media (min-width:768px){nav.letters,nav.letters ul{height:var(--chip)}nav.letters ul{--wrap:nowrap}nav.letters li{max-width:none}nav.letters a{padding:.25rem .66rem}}nav.index{--justify:flex-start;--padding:0;background-color:rgba(var(--base-rgb),var(--op-6))}.index ul{width:max-content}.index li{flex-shrink:0;transform:scaleX(0);transform-origin:right;max-width:0;overflow:hidden;transition:transform var(--trans-base)}.index li.active,.index li.adj{transform:scaleX(1);transform-origin:left;width:100%;flex-shrink:1;max-width:fit-content}@media (max-width:767px){.index li.adj{transform:scaleX(0);max-width:0}}.index a{border-bottom:4px solid transparent}.index .active a{border-color:var(--action-0);color:var(--contrast)}.index.open{--dir:column-reverse;height:var(--maxHeight);width:100%;align-items:flex-end;background-color:rgba(var(--base-rgb),var(--op-6));backdrop-filter:blur(5px);z-index:var(--z-10)}.index.open ul{--dir:column;--justify:flex-end;height:100%;width:100%}.index.open li{width:100%;height:var(--btn);max-width:100%!important;transform:scaleX(1);overflow:visible}.index.open a{justify-content:flex-end;padding:0 2rem 0 0;background-color:transparent}nav.condensed{height:max-content;--wrap:wrap;--gap:0 .25rem}nav.condensed ul{min-height:var(--chip_);height:max-content;--justify:center;--wrap:wrap}.condensed li{width:max-content;min-height:var(--chip)}.condensed li+li::before{content:'·';padding:0 .25em}.condensed a{height:max-content;min-height:var(--chip);font-size:var(--txt-x-small);padding:0 .25rem;text-transform:none;border-bottom:2px solid transparent}.condensed a:focus{border-color:var(--action-0)}ul.socials{--dir:row;height:max-content;--gap:.5rem;--justify:stretch;--wrap:nowrap;overflow:auto hidden;touch-action:pan-x}.always ul.socials,.always ul.socials a,.always ul.socials li{width:100%}ul.socials a{padding:.5rem;max-width:none}ul.socials .icon{margin:0}nav.tabs{position:fixed;bottom:var(--btn);left:var(--btnbtn);right:var(--btnbtn);padding-bottom:2px;z-index:var(--z-6);touch-action:pan-x pan-y;--wrap:nowrap;overflow:auto hidden}nav.tabs button{aspect-ratio:unset}nav.tabs button.active{cursor:default}nav.tabs button.active:hover{background-color:var(--base-100);color:var(--contrast)}nav.tabs button h2{--wrap:nowrap;margin:0;font-size:var(--txt-x-small)}.tab-content nav.tabs button{height:var(--chip_);padding:.25rem .75rem;min-height:0}.tab-content.active{padding:1rem 0}.tab-content h2{margin:0 0 .5rem}.tab-content nav.tabs{height:max-content;background-color:var(--base);--gap:0}.tab-content .tab-content nav.tabs{background-color:var(--base-100)}.tab-content .tab-content .tab-content nav.tabs{background-color:var(--base-200)}.tab-content nav.tabs button.active h2{color:var(--action-0)}nav.menu a{padding:.5rem .66rem}nav.share{height:max-content;margin:1rem 0}nav.share ul{overflow:visible}nav.share h4{display:inline-block;width:max-content;margin:.25rem .5rem .25rem 0;font-size:var(--txt-x-small)}:where(body>header,.wp-site-blocks>header){--dir:row;--justify:space-between;position:sticky;top:0;left:0;right:0;height:var(--btn);width:100vw;display:flex;align-items:center;padding:0 .5rem;background-color:var(--base);box-shadow:rgba(var(--base-rgb),var(--op-45)) var(--shdw);z-index:var(--z-9)}.wp-site-blocks>header img{width:var(--btn)}nav.term-navigation:has([hidden]){display:none}.dashboard-nav{--justify:flex-start;width:100%}nav.filters{--dir:row;--justify:flex-start;overflow:auto hidden}nav.filters .filter{width:auto;padding:.25rem .75rem} |
| | | nav,nav ol,nav ul{--padding:0 1rem;--wrap:nowrap;display:flex;flex-direction:var(--dir,row);justify-content:var(--justify,flex-start);align-items:var(--align,center);gap:var(--gap,0);flex-wrap:var(--wrap,nowrap);height:var(--btn,3rem);max-width:100%;font-family:var(--heading);padding:0;margin:0}nav li{display:flex;align-items:center;height:max(var(--btn),max-content);width:100%;max-inline-size:none;padding:0}nav a,nav button{display:flex;text-decoration:none;align-items:center;justify-content:center;height:var(--btn);width:100%;white-space:nowrap;text-transform:uppercase;transition:var(--trans-color)}nav a{height:var(--btn);padding:var(--padding)}nav button{justify-content:center;aspect-ratio:1;padding:0;border:2px solid var(--base);color:var(--contrast);border-radius:0}nav .current a,nav a.current,nav a:focus,nav a:focus:visited,nav a:hover,nav button:focus{background-color:var(--action-0);color:var(--action-contrast)}.toggle .icon{transform:rotate(0);transition:transform var(--trans-base)}.has-submenu.open>button .icon{transform:rotate(900deg)}.has-submenu{position:relative}ul.submenu{--dir:column;height:max-content;position:absolute;top:100%;left:0;max-height:0;transform:scaleY(0);transform-origin:top;width:max(100%,max-content);background-color:rgba(var(--base-rgb),var(--op-3));border:2px solid rgba(var(--base-rgb),var(--op-3));transition:all var(--trans-t) var(--trans-fn);box-shadow:var(--shdw-none);overflow:hidden}.submenu li{background-color:rgba(var(--base-rgb),var(--op-6));border:1px solid var(--base-50)}.open>ul.submenu{transform:scaleY(1);max-height:1000%;box-shadow:rgba(var(--base-rgb),var(--op-45)) var(--shdw)}.screen-reader-text{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}nav a:focus:not(:focus-visible){outline:0}nav a:focus-visible{outline:2px solid var(--action-0);outline-offset:2px}nav.always{--dir:column;--wrap:nowrap;position:fixed;bottom:0;right:0;width:var(--btn);z-index:var(--z-10)}nav.always.open{--justify:flex-end;width:100vw;height:100vh;padding-bottom:var(--btn_);background-color:rgba(var(--base-rgb),var(--op-6));backdrop-filter:blur(5px)}nav.always>ul{--dir:column;--align:center;--justify:flex-start;--gap:0;height:100%;position:relative;right:-300vw;width:100vw;max-height:100%;padding:1rem 0 0;overflow:hidden auto;transition:right var(--trans-base)}nav.always.open>ul{right:0}nav.always li{flex-wrap:wrap;background-color:rgba(var(--base-rgb),var(--op-6))}nav.always a{padding:1rem;max-width:calc(100% - var(--btn));text-align:center}nav.always .has-submenu{display:flex}nav.always .has-submenu>a{flex:1}nav.always .has-submenu>button{flex:0 0 var(--btn)}nav.always .submenu{position:relative;padding-right:4rem;height:max-content;top:0;width:100%;border:2px solid var(--action-0);background-color:rgba(var(--contrast-rgb),var(--op-1))}nav.always .submenu li{background-color:rgba(var(--base-rgb),var(--op-3))}nav.always>button{position:fixed;bottom:0;right:0;width:var(--btn);height:var(--btn);background-color:var(--base);color:var(--contrast);box-shadow:rgba(var(--base-rgb),var(--op-45)) var(--shdw);transition:width var(--trans-base)}nav.always>button:hover{background-color:var(--action-0);color:var(--action-contrast)}nav.always.open>button{width:100%;background-color:rgba(var(--base-rgb),var(--op-6));backdrop-filter:blur(5px);z-index:1000000}nav.always.open>button .icon-list,nav.always>button .icon-x{display:none}nav.always.open>button .icon-x,nav.always>button .icon-list{display:block;width:32px;height:32px}@media (min-width:768px){nav.always>ul{padding-top:var(--btn)}}nav#breadcrumbs{height:max-content;--wrap:wrap;--gap:0;width:max-content;max-width:var(--full);position:absolute;background-color:rgba(var(--base-rgb),var(--op-4));font-size:var(--txt-x-small);padding:.125em;z-index:var(--z-7)}#breadcrumbs ol{height:max-content;--wrap:wrap!important;--justify:flex-start!important}#breadcrumbs li{width:max-content}#breadcrumbs a{height:var(--chip)}#breadcrumbs li::after{content:'/';color:var(--contrast-200);padding:0 .25rem}#breadcrumbs li:last-of-type::after{display:none}#breadcrumbs :is(a,span){padding:0 .125rem;color:var(--contrast);text-transform:none}#breadcrumbs a:focus{background-color:transparent;color:var(--action-0)}nav.fixed.bottom{position:fixed;bottom:0;left:0;width:calc(100% - var(--btn));box-shadow:rgba(var(--base-rgb),var(--op-45)) var(--shdw);z-index:var(--z-9)}nav.fixed.bottom ul{--justify:space-between;width:100%;background-color:var(--base);padding:0 .25rem}nav.fixed.bottom li{flex:1;justify-content:center}nav.fixed.bottom a{gap:1rem;--w:var(--chip_);color:var(--contrast);font-size:var(--txt-x-small)}@media (min-width:768px){nav.fixed.bottom a{font-size:var(--txt-medium)}}nav.on-this-page{--justify:space-between;position:fixed;bottom:0;left:0;width:calc(100% - var(--btn));max-width:none;padding:0 .5rem;background-color:rgba(var(--base-rgb),var(--op-4));color:var(--base-200);box-shadow:rgba(var(--base-rgb),var(--op-45)) var(--shdw);z-index:var(--z-6)}body:has(nav.fixed) nav.on-this-page{bottom:var(--btn)}body:has(.additional-actionsbutton) nav.on-this-page{width:calc(100vw - var(--btn_) - 1rem)}.on-this-page ul{width:100%;gap:0}.on-this-page li{justify-content:center}.on-this-page .active a{background-color:rgba(var(--base-rgb),var(--op-6));color:var(--action-contrast)}.on-this-page a{height:var(--chip);padding:0}nav.letters li{height:var(--chip);max-width:calc(7.69% - 2px)}nav.letters ul{--wrap:wrap}nav.letters,nav.letters ul{height:var(--chipchip)}@media (min-width:768px){nav.letters,nav.letters ul{height:var(--chip)}nav.letters ul{--wrap:nowrap}nav.letters li{max-width:none}nav.letters a{padding:.25rem .66rem}}nav.index{--justify:flex-start;--padding:0;background-color:rgba(var(--base-rgb),var(--op-6))}.index ul{width:max-content}.index li{flex-shrink:0;transform:scaleX(0);transform-origin:right;max-width:0;overflow:hidden;transition:transform var(--trans-base)}.index li.active,.index li.adj{transform:scaleX(1);transform-origin:left;width:100%;flex-shrink:1;max-width:fit-content}@media (max-width:767px){.index li.adj{transform:scaleX(0);max-width:0}}.index a{border-bottom:4px solid transparent}.index .active a{border-color:var(--action-0);color:var(--contrast)}.index.open{--dir:column-reverse;height:var(--maxHeight);width:100%;align-items:flex-end;background-color:rgba(var(--base-rgb),var(--op-6));backdrop-filter:blur(5px);z-index:var(--z-10)}.index.open ul{--dir:column;--justify:flex-end;height:100%;width:100%}.index.open li{width:100%;height:var(--btn);max-width:100%!important;transform:scaleX(1);overflow:visible}.index.open a{justify-content:flex-end;padding:0 2rem 0 0;background-color:transparent}nav.condensed{height:max-content;--wrap:wrap;--gap:0 .25rem}nav.condensed ul{min-height:var(--chip_);height:max-content;--justify:center;--wrap:wrap}.condensed li{width:max-content;min-height:var(--chip)}.condensed li+li::before{content:'·';padding:0 .25em}.condensed a{height:max-content;min-height:var(--chip);font-size:var(--txt-x-small);padding:0 .25rem;text-transform:none;border-bottom:2px solid transparent}.condensed a:focus{border-color:var(--action-0)}ul.socials{--dir:row;height:max-content;--gap:.5rem;--justify:stretch;--wrap:nowrap;overflow:auto hidden;touch-action:pan-x}.always ul.socials,.always ul.socials a,.always ul.socials li{width:100%}ul.socials a{padding:.5rem;max-width:none}ul.socials .icon{margin:0}nav.tabs{position:fixed;bottom:var(--btn);left:var(--btnbtn);right:var(--btnbtn);padding-bottom:2px;z-index:var(--z-6);touch-action:pan-x pan-y;--wrap:nowrap;overflow:auto hidden}nav.tabs button{aspect-ratio:unset}nav.tabs button.active{cursor:default}nav.tabs button.active:hover{background-color:var(--base-100);color:var(--contrast)}nav.tabs button h2{--wrap:nowrap;margin:0;font-size:var(--txt-x-small)}.tab-content nav.tabs button{height:var(--chip_);padding:.25rem .75rem;min-height:0}.tab-content.active{padding:1rem 0}.tab-content h2{margin:0 0 .5rem}.tab-content nav.tabs{height:max-content;background-color:var(--base);--gap:0}.tab-content .tab-content nav.tabs{background-color:var(--base-100)}.tab-content .tab-content .tab-content nav.tabs{background-color:var(--base-200)}.tab-content nav.tabs button.active h2{color:var(--action-0)}nav.menu a{padding:.5rem .66rem}nav.share{height:max-content;margin:1rem 0}nav.share ul{overflow:visible}nav.share h4{display:inline-block;width:max-content;margin:.25rem .5rem .25rem 0;font-size:var(--txt-x-small)}:where(body>header,.wp-site-blocks>header){--dir:row;--justify:space-between;position:sticky;top:0;left:0;right:0;height:var(--btn);width:100vw;display:flex;align-items:center;padding:0 .5rem;background-color:var(--base);box-shadow:rgba(var(--base-rgb),var(--op-45)) var(--shdw);z-index:var(--z-9)}.wp-site-blocks>header img{width:var(--btn)}nav.term-navigation:has([hidden]){display:none}.dashboard-nav{--justify:flex-start;width:100%}nav.filters{--dir:row;--justify:flex-start;overflow:auto hidden}nav.filters .filter{width:auto;padding:.25rem .75rem} |
| | |
| | | } |
| | | |
| | | handleItemUpdate(e) { |
| | | |
| | | let item = window.targetCheck(e, '[data-item-id]'); |
| | | if (!item) return; |
| | | |
| | | let field = e.target.closest('[data-field-type="repeater"],[data-field-type="tag-list"],[data-field]'); |
| | | let name = field.dataset.field; |
| | | let value = this.forms.getFieldValue(e.target); |
| | | // Check if inside a collection field first |
| | | const collection = e.target.closest('[data-field-type="repeater"], [data-field-type="tag-list"]'); |
| | | |
| | | let name, value; |
| | | if (collection) { |
| | | name = collection.dataset.field; |
| | | value = this.forms.getFieldValue(collection); |
| | | } else { |
| | | let field = e.target.closest('[data-field]'); |
| | | name = field.dataset.field; |
| | | value = this.forms.getFieldValue(e.target); |
| | | } |
| | | |
| | | item.dataset.itemId.split(',').forEach(itemId => { |
| | | this.updateItem(itemId, name, value); |
| | | }); |
| | |
| | | (()=>{class e{constructor(){this.container=document.querySelector(".crud[data-content]:not([data-ignore])"),this.container&&(this.content=this.container.dataset.content,this.endpoint=this.container.dataset.endpoint??"content",this.singular=this.container.dataset.singular,this.plural=this.container.dataset.plural,this.queue=window.jvbQueue,this.a11y=window.jvbA11y,this.error=window.jvbError,this.populate=window.jvbPopulate,this.cache=new window.jvbCache(this.content),this.activeItem=null,this.isTimeline=!1,this.isPopulating=!1,this.changes=new Map,this.items=new Map,this.init())}init(){this.initElements(),this.initListeners(),this.defineTemplates();let e=this.initSettings();this.initStore(e),this.checkHideFilters(),this.initIntegrations(),this.initUploader(),this.initModals()}defineTemplates(){const e=window.jvbTemplates,t=this,i=(e,i,s)=>{e.dataset.itemId=s.id;let a=i.checkbox.closest(".preview");window.prefixInput(i.checkbox,`select-${s.id}`,a,!0),i.checkbox.value=s.id,i.checkbox.checked=t.selected.has(parseInt(s.id)),i.selectLabel&&(i.selectLabel.htmlFor=`select-${s.id}`),i.edit&&(i.edit.dataset.id=s.id),i.trash&&(i.trash.dataset.id=s.id)},s=function(e,t,i){if(i?.fields?.post_thumbnail){const e=i.images[i.fields.post_thumbnail]??{};t.img.src=e.medium??"",t.img.alt=e.alt??i.fields.post_title??""}};e.define("gridView",{refs:{img:"img",checkbox:".select-item",selectLabel:"label.select-item-label",edit:'[data-action="edit"]',trash:'[data-action="trash"]'},setup({el:e,refs:t,manyRefs:a,data:l}){i(e,t,l),s(0,t,l)}}),e.define("listView",{refs:{img:"img",checkbox:".select-item",selectLabel:"label.select-item-label",edit:'[data-action="edit"]',trash:'[data-action="trash"]'},manyRefs:{attrs:"[data-attr]",fields:"[data-field]"},setup({el:e,refs:t,manyRefs:a,data:l}){i(e,t,l),s(0,t,l),a?.attrs?.forEach((e=>{const t=l[e.dataset.attr];t&&""!==t?e.textContent=t:e.remove()})),a?.fields?.forEach((e=>{const t=l.fields?.[e.dataset.field];t&&""!==t?"DIV"===e.tagName?e.innerHTML=t:e.textContent=t:e.remove()}))}});let a={};this.isTimeline&&(a.sharedRow="tr.shared",a.point="tr.timeline-point"),e.define("tableView",{refs:{checkbox:".select-item",selectLabel:"label.select-item-label",...a},manyRefs:{inputs:"input,select,textarea",status:'input[name="post_status"]',selectors:'[data-type="selector"]',fields:"[data-field]"},setup({el:e,refs:s,manyRefs:a,data:l}){if(i(e,s,l),a?.inputs?.forEach((e=>{let t=e.closest("[data-field]");window.prefixInput(e,`${l.id}-`,t)})),a?.status?.forEach((e=>{e.value===l.status&&(e.checked=!0)})),t.isTimeline)s.sharedRow&&(s.sharedRow.querySelectorAll("input,select,textarea").forEach((e=>{let t=e.closest("[data-field]");window.prefixInput(e,`${l.id}-`,t)})),t.populate.populate(s.sharedRow,l),s.sharedRow.querySelectorAll('input[name="post_status"]').forEach((e=>{e.value===l.status&&(e.checked=!0)}))),s.point&&l.fields?.timeline&&(Object.entries(l.fields.timeline).forEach((([i,a],n)=>{const o=s.point.cloneNode(!0);o.dataset.index=`${n}`,o.dataset.itemId=a.id,o.querySelectorAll("input,select,textarea").forEach((e=>{let t=e.closest("[data-field]");window.prefixInput(e,`${a.id}-`,t)})),t.populate.populate(o,{fields:a,images:l.images,taxonomies:l.taxonomies});const d=l.images?.[a.post_thumbnail];d&&o.querySelector(".field.upload")?.setAttribute("title",d["image-title"]??""),e.insertBefore(o,s.point)})),s.point.remove());else if(void 0!==t.ui.table.form?.dataset.edit)a?.inputs?.forEach((e=>{let t=e.closest("[data-field]");window.prefixInput(e,`${l.id}-`,t)})),a?.status?.forEach((e=>{e.value===l.status&&(e.checked=!0)})),t.populate.populate(e,l);else{const e=Object.hasOwn(l,"fields")?l.fields:l;a?.fields?.forEach((t=>{if(Object.hasOwn(e,t.dataset.field)&&""!==e[t.dataset.field]){let i=e[t.dataset.field],s=e.children[0];s&&(s.textContent="date"===t.dataset.field?window.formatTimeAgo(i):i)}}))}a?.selectors?.forEach((e=>e.setAttribute("data-lazy","")))}}),e.define("emptyState"),e.define("bulkItem",{refs:{checkbox:"input",img:"img",label:"label"},setup({el:e,refs:t,manyRefs:i,data:s}){t.checkbox&&(t.checkbox.id=`bulk_${s.id}`,t.checkbox.value=s.id,t.checkbox.checked=!0,t.checkbox.name="selected[]");let a=s?.images[s?.fields?.post_thumnbail]??{};t.img&&Object.keys(a).length>0&&(t.img.src=a.medium??"",t.img.alt=a.alt??""),t.label&&(t.label.title=item.fields.post_title)}}),e.define("trashOptions"),e.define("notTrashOptions"),e.define("contentTable")}initElements(){this.allowedFilters=["status","orderby","order","search","date-filter","dateFrom","dateTo"],this.selectors={buttons:{create:".create-item",clearFilters:'[data-action="clear-filters"]'},views:{grid:'input[data-view="grid"]',list:'input[data-view="list"]',table:'input[data-view="table"]'},modals:{create:{modal:"dialog.create",form:"dialog.create form",h2:"dialog.create h2"},edit:{modal:"dialog.edit",form:"dialog.edit form",h2:"dialog.edit h2"},bulkEdit:{modal:"dialog.bulkEdit",selected:"dialog.bulkEdit .selected",h2:"dialog.bulkEdit h2 span",form:"dialog.bulkEdit form"},date:{modal:"dialog.date-range",start:"dialog.date-range .date-start",end:"dialog.date-range .date-end",month:"dialog.date-range .month-select"}},grid:`.${this.content}.item-grid`,table:{nav:"#vertical",form:"form.table",table:"form.table table",body:"form.table body",head:"form.table thead",foot:"form.table tfoot",selectedColumns:".all-filters .multi-select",columns:"thead th"},bulk:{action:".bulk-action-select",count:".bulk-controls .selected-count",control:".bulk-controls .bulk-actions",select:".bulk-controls select",selectAll:".select-all"},filters:{container:"details.all-filters",search:'.all-filters input[type="search"]',status:{all:'[name="status"]#all',publish:'[name="status"]#publish',draft:'[name="status"]#draft',trash:'[name="status"]#trash'},orderby:{date:'[name="orderby"]#date',alphabetical:'[name="orderby"]#alphabetical'},order:{asc:'[name="order"][value="asc"]',desc:'[name="order"][value="desc"]'},date:'[data-filter="date"]'},uploader:"details.uploader"},this.ui=window.uiFromSelectors(this.selectors);const e=document.querySelectorAll('[data-filter="taxonomies"]');e.length>0&&(this.ui.filters.taxonomies={},e.forEach((e=>{const t=e.dataset.taxonomy;this.ui.filters.taxonomies[t]=e,this.allowedFilters.push(`tax_${t}`)}))),this.isTimeline=!!document.querySelector("[data-timeline]")}initUploader(){this.ui.uploader&&(window.jvbUploads.scanFields(this.ui.uploader),window.jvbUploads.subscribe(((e,t)=>{if("sent-to-queue"===e&&t===this.ui.uploader.dataset.uploader&&window.debouncer.schedule("crud-complete",(()=>{this.store.clearCache()})),"sent-to-queue"===e&&t.field){const e=t.field.config.name,i=t.field.config.itemID;i&&e&&this.changes.has(i)&&delete this.changes.get(i)[e]}})))}initModals(){this.modals={};for(let[e,t]of Object.entries(this.ui.modals))t.modal&&(this.modals[e]=new window.jvbModal(t.modal),this.modals[e].subscribe(((t,i)=>{if("modal-close"===t){const t=this.ui.modals[e].form.dataset.formId;t&&this.forms.clearForm(t),this.resetForm(this.ui.modals[e].form),"date"===e&&this.handleCustomDateSelection(),["edit","bulkEdit","create"].includes(e)&&window.debouncer.timeouts.has(`save-${this.content}`)&&this.scheduleSave(0)}})))}initStore(e){let t={...this.defaults,...e};const i=window.jvbStore.register(this.content,[{storeName:this.content,keyPath:"id",endpoint:this.endpoint??"content",headers:{"X-Action-Nonce":window.auth.getNonce("dash")},indexes:[{name:"id",keyPath:"id"},{name:"status",keyPath:"status"},{name:"date",keyPath:"date"},{name:"modified",keyPath:"modified"},{name:"title",keyPath:"title"}],filters:t,ignore:["content","user"],TTL:36e5,showLoading:!0},{storeName:"changes",keyPath:"id"}]);this.changesStore=i.changes,this.store=i[this.content],this.store.subscribe(((e,t)=>{if("data-loaded"===e)this.render(),this.selectionHandler.collectItems()})),this.changesStore.subscribe(((e,t)=>{if("data-ready"===e){let e=this.changesStore.getAll();e.length>0&&(e.forEach((e=>{this.changes.set(e.id,e)})),this.savePosts("",!1).then((()=>{})))}}))}initIntegrations(){this.selected=new Set,this.selectionHandler=new window.jvbHandleSelection(this.container,{selectAll:{checkbox:"#select-all",label:".bulk-select label",span:".bulk-select label span"},wrapper:{wrapper:".wrap"},item:{idAttribute:"itemId"}}),this.selectionHandler.subscribe(((e,t)=>{this.selected=new Set([...t.selectedItems].map((e=>parseInt(e)))),this.ui.bulk.control.hidden=0===this.selected.size,this.ui.bulk.count.hidden=0===this.selected.size,this.ui.bulk.count.textContent=`${this.selected.size} ${this.plural} selected`})),this.forms=window.jvbForm,window.jvbUploads&&window.jvbUploads.subscribe(((e,t)=>{"groups_uploaded"===e&&t.content===this.content&&this.handleGroupsUploaded(t)})),this.queue.subscribe(((e,t)=>{if(["image_upload","video_upload","document_upload"].includes(t.type)&&"operation-status"===e&&"completed"===t.status&&this.store.clearCache(),"operation-status"===e&&"completed"===t.status&&"uploads/groups"===t.endpoint&&(t.result&&t.result.group_mappings&&this.handleGroupMappings(t.result.group_mappings),this.store.clearCache()),"operation-status"===e&&"completed"===t.status&&"content_update"===t.type){if(this.store.clearCache(),!t.result||!t.result.posts)return void console.warn("Content update completed but no result.posts",t);const e=Object.keys(t.result.posts);if(0===e.length)return;this.changesStore.deleteMany(e),e.forEach((e=>this.changes.delete(e)))}}))}initSettings(){this.defaults={content:this.content,user:window.auth.getUser(),page:1,status:"all",orderby:"date",order:"desc",search:""};let e={},t=this.container.dataset.view??"grid";this.view=this.cache.get("view")??t,this.view!==t&&(this.ui.views[this.view].checked=!0),this.status=this.cache.get("status")??this.defaults.status,this.status!==this.defaults.status&&(this.ui.filters.status[this.status].checked=!0,e.status=this.status),this.orderby=this.cache.get("orderby")??this.defaults.orderby,this.orderby!==this.defaults.orderby&&(this.ui.filters.orderby[this.orderby].checked=!0,e.orderBy=this.orderby),this.order=this.cache.get("order")??this.defaults.order,this.order!==this.defaults.order&&(this.ui.filters.order[this.order].checked=!0,e.order=this.order),this.ui.filters.taxonomies&&Object.entries(this.ui.filters.taxonomies).forEach((([t,i])=>{const s=`tax_${t}`,a=this.cache.get(s);a&&(i.value=a,e[s]=a)}));let i=this.cache.get("tabNav")??"horizontal";this.ui.table.nav&&"vertical"===i&&(this.ui.table.nav.checked=!0);let s={showFilters:{element:this.ui.filters.container,default:"closed"},showUploader:{element:this.ui.uploader,default:"open"}};for(let[e,t]of Object.entries(s))if(t.element){let i=this.cache.get(e)??t.default;t.element.open="open"===i,t.element.addEventListener("toggle",(()=>{this.cache.set(e,t.element.open?"open":"closed")}))}return e}initListeners(){this.changeHandler=this.handleChange.bind(this),this.clickHandler=this.handleClick.bind(this),this.inputHandler=this.handleInput.bind(this),this.submitHandler=this.handleModalSubmit.bind(this),document.addEventListener("change",this.changeHandler),document.addEventListener("click",this.clickHandler),this.ui.filters.search&&this.ui.filters.search.addEventListener("input",this.inputHandler);for(let[e,t]of Object.entries(this.ui.modals))t.form&&t.form.addEventListener("submit",this.submitHandler)}handleModalSubmit(e){e.preventDefault();const t=e.target.closest("dialog");if(!t)return;if(t.classList.contains("create"))return void this.handleCreateSubmit(t);this.plural;this.scheduleSave(0)}async handleCreateSubmit(e){e.dataset.itemId;this.changes.size>0&&(this.cancelBackup(),await this.handleBackup());const t=await this.changesStore.getAll();if(0===t.length)return;let i={};t.forEach((e=>{const{id:t,...s}=e;i[t]=s}));let s=this.queue.addToQueue({endpoint:this.endpoint,headers:{"X-Action-Nonce":window.auth.getNonce("dash")},data:{posts:i},popup:`Creating your new ${this.singular}`,title:`Creating your new ${this.singular}`});if(!s)return;const a=e.querySelectorAll("[data-upload-field]");for(const e of a){const t=e.dataset.uploader;if(!t)continue;0!==window.jvbUploads.stores.uploads.filterByIndex({field:t}).length&&await window.jvbUploads.queueUploads("uploads",t,s)}}handleChange(e){const t=e.target.closest("[data-item-id]"),i=e.target.matches("[data-filter]"),s=e.target.matches(".bulk-action-select"),a=e.target.matches("[data-view]");if(t||i||s||a)if(this.isPopulating||!t||e.target.closest("[data-ignore], .select-item")){if(a)return this.items.clear(),void this.handleViewChange(e.target);if(s)this.handleBulkAction(e.target);else if(i)this.handleFilterChange(e.target);else if("table"===this.view){if(e.target.matches("details.multi-select"))return void this.toggleColumn(e.target.id,e.target.checked);e.target.matches(this.selectors.table.nav)&&(this.tabNav=e.target.checked,this.cache.set("tabNav",e.target.checked?"vertical":"horizontal"))}}else this.handleItemUpdate(e)}handleBulkAction(e){if(e.value.startsWith("tax-")){const t=e.options[e.selectedIndex],i=t.dataset.taxonomy,s=t.dataset.single,a=t.dataset.plural;return window.jvbSelector.openEmpty(i,s,a,(e=>this.handleBulkTaxonomy(e))),void(e.value="")}switch(e.value){case"edit":this.openBulkEditModal();break;case"publish":case"trash":case"delete":this.setBulkStatus(e.value);break;case"draft":case"restore":this.setBulkStatus("draft")}}handleBulkTaxonomy(e){e.termIds.length&&this.selected.size&&(this.selected.forEach((t=>{const i=this.store.get(t);if(!i)return;const s=(i.taxonomies?.[e.taxonomy]||[]).map((e=>e.id)),a=[...new Set([...s,...e.termIds])];this.updateItem(t,e.taxonomy,a)})),this.savePosts(`Adding ${e.terms.length} ${e.taxonomy} to ${this.selected.size} ${this.plural}...`).then((()=>{})),this.selectionHandler.clearSelection())}handleItemUpdate(e){let t=window.targetCheck(e,"[data-item-id]");if(!t)return;let i=e.target.closest('[data-field-type="repeater"],[data-field-type="tag-list"],[data-field]').dataset.field,s=this.forms.getFieldValue(e.target);t.dataset.itemId.split(",").forEach((e=>{this.updateItem(e,i,s)}))}updateItem(e,t,i){if(this.isPopulating)return;const s=this.store.get(e);if(s){const a=s.fields?.[t]??s[t];if(null===window.getDifferences.map(a,i)){if(this.changes.has(e)){delete this.changes.get(e)[t];0===Object.keys(this.changes.get(e)).filter((e=>"id"!==e&&"content"!==e)).length&&(this.changes.delete(e),this.changesStore.delete(e))}return}}this.changes.has(e)||this.changes.set(e,{id:e,content:this.content}),this.changes.get(e)[t]=i,this.scheduleBackup(),"number"!=typeof e&&String(e).includes("group")||this.scheduleSave()}scheduleBackup(){window.debouncer.schedule(`changes-${this.content}`,(async()=>{this.changes.size>0&&await this.handleBackup()}),2e3)}cancelBackup(){window.debouncer.cancel(`changes-${this.content}`)}async handleBackup(){const e=Array.from(this.changes.values());this.changes.clear();const t=e.map((e=>e.id)),i=await Promise.all(t.map((e=>this.changesStore.get(e)))),s=e.map(((e,t)=>i[t]?window.deepMerge(i[t],e):e));await this.changesStore.saveMany(s)}scheduleSave(e=1e4){window.debouncer.schedule(`save-${this.content}`,(async()=>{this.changes.size>0&&(this.cancelBackup(),await this.handleBackup()),await this.savePosts("",!1)}),e)}handleFilterChange(e){let t=e.dataset.filter;return"date"===t&&"custom"===e.value?(e.value="",void this.modals.date.handleOpen()):"date"===t&&""!==e.value?(this.setFilter("date-filter",e.value),this.deleteFilter("dateFrom"),this.deleteFilter("dateTo"),void this.checkHideFilters()):("taxonomies"===t&&(t=`tax_${e.dataset.taxonomy}`),void this.setFilter(t,e.value))}checkHideFilters(){const e=this.store.filters,t=Object.entries(e).some((([e,t])=>!["content","user","page"].includes(e)&&(this.defaults[e]!==t&&""!==t&&null!==t)));this.ui.buttons.clearFilters.hidden=!t}clearAllFilters(){let e=this.store.filters;this.store.clearFilters();for(let[t,i]of Object.entries(e))this.cache.remove(t),this.deleteFilter(t,i);this.a11y.announce("All filters cleared")}handleCustomDateSelection(){if(this.ui.modals.date.month&&this.ui.modals.date.month.value){const[e,t]=this.ui.modals.date.month.value.split("-"),i=`${e}-${t}-01`,s=new Date(e,parseInt(t),0).getDate(),a=`${e}-${t}-${String(s).padStart(2,"0")}`;this.setFilter("dateFrom",i),this.setFilter("dateTo",a),this.deleteFilter("date-filter"),this.ui.modals.date.month.value=""}else this.ui.modals.date.start&&this.ui.modals.date.start.value&&this.ui.modals.date.end&&this.ui.modals.date.end.value&&(this.setFilter("dateFrom",this.ui.modals.date.start.value),this.setFilter("dateTo",this.ui.modals.date.end.value),this.deleteFilter("date-filter"),this.ui.modals.date.start.value="",this.ui.modals.date.end.value="");this.checkHideFilters()}handleViewChange(e){this.view=e.dataset.view,this.cache.set("view",this.view),this.render()}handleClick(e){if(e.target.matches(".clear-search"))return void this.deleteFilter("search","");const t=e.target.closest("[data-action]");return t?(e.preventDefault(),void this.handleActionButton(t)):e.target.matches(".apply-date-filter")?(this.handleCustomDateSelection(),void this.modals.date.handleClose()):void(e.target.matches(this.selectors.buttons.create)&&this.openCreateModal())}openCreateModal(){this.forms.registerForm(this.ui.modals.create.form,{cache:!1}),this.ui.modals.create.modal.dataset.itemId=window.generateID("new"),this.modals.create.handleOpen()}handleActionButton(e){const t=e.dataset.id;switch(e.dataset.action){case"edit":this.openEditModal(t);break;case"delete":confirm("Delete this item? This cannot be undone")&&(this.updateItem(t,"post_status","delete"),window.fade(e.closest(".item"),!1),this.savePosts(`Permanently deleting ${this.singular}...`).then((()=>{})),this.store.delete(t));break;case"trash":"trash"===this.status?confirm("Delete this item? This cannot be undone")&&(this.updateItem(t,"post_status","delete"),window.fade(e.closest(".item"),!1),this.savePosts(`Permanently deleting ${this.singular}...`).then((()=>{})),this.store.delete(t)):(this.updateItem(t,"post_status","trash"),window.fade(e.closest(".item"),!1),this.savePosts(`Sending ${this.singular} to trash...`).then((()=>{})));break;case"bulk-edit":this.selected.size>0&&this.openBulkEditModal();break;case"bulk-delete":this.handleBulkDelete();break;case"refresh":this.store.clearCache(),this.store.fetch();break;case"clear-filters":this.clearAllFilters()}}handleBulkDelete(){let e="trash"===this.status;if(this.selected.size>0&&confirm(`${e?"Permanently delete":"Send"} ${this.selected.size} ${1===this.selected.size?this.singular:this.plural}${e?"":"to trash"}?`)){this.selected.forEach((t=>{this.store.delete(t),this.updateItem(t,"post_status",e?"delete":"trash")}));let t=e?`Permanently deleting ${this.selected.size} ${1===this.selected.size?this.singular:this.plural}`:`Sending ${this.selected.size} ${1===this.selected.size?this.singular:this.plural} to trash`;this.savePosts(t).then((()=>{})),this.selectionHandler.clearSelection()}}handleInput(e){e.preventDefault(),e.stopPropagation();let t=e.target.value.trim(),i=`${this.content}-search`;0!==t.length?window.debouncer.schedule(i,(()=>{this.a11y.announce(`Searching for "${t}"...`),this.store.setFilters({search:t,page:1})}),300):this.deleteFilter("search","")}handleKeys(e){if(this.tabNav&&"Tab"===e.key){e.preventDefault();const t=e.target.closest("[data-field]"),i=e.target.closest("tr");if(!t||!i)return;const s=t.dataset.field,a=e.shiftKey;let l=this.findNextEditableRow(i,a);l||(l=this.wrapToRow(i,a)),l&&this.focusFieldInRow(l,s,a)}}findNextEditableRow(e,t=!1){let i=t?e.previousElementSibling:e.nextElementSibling;for(;i&&!this.isEditableRow(i);)i=t?i.previousElementSibling:i.nextElementSibling;return i}wrapToRow(e,t=!1){if(this.isTimeline){const i=e.closest("tbody");if(!i)return null;const s=Array.from(i.querySelectorAll("tr")).filter((e=>this.isEditableRow(e)));return t?s[s.length-1]:s[0]}{if(!this.ui.table.body)return null;const e=Array.from(this.ui.table.body.querySelectorAll("tr")).filter((e=>this.isEditableRow(e)));return t?e[e.length-1]:e[0]}}isEditableRow(e){return!e.closest("thead")&&!e.closest("tfoot")&&(this.isTimeline?e.classList.contains("shared")||e.classList.contains("timeline-point"):!!e.dataset.itemId)}focusFieldInRow(e,t,i=!1){const s=e.querySelector(`[data-field="${t}"]`);if(!s)return;const a=this.findFocusableInput(s);if(a){a.focus(),a.select&&"text"===a.type&&a.select();const e=i?"next":"previous";this.a11y?.announce(`Moved to ${t} in ${e} row`)}}findFocusableInput(e){const t=['input:not([type="hidden"]):not([disabled])',"textarea:not([disabled])","select:not([disabled])","button:not([disabled])"];for(const i of t){const t=e.querySelector(i);if(t)return t}return null}openEditModal(e){let t=this.store.get(parseInt(e));t&&(this.activeItem=t.id,this.ui.modals.edit.modal.dataset.itemId=e,this.ui.modals.edit.modal.dataset.content=this.content,this.ui.modals.edit.h2.textContent=`Editing ${""===t.fields.post_title?this.singular:t.fields.post_title}`,this.ui.modals.edit.form.dataset.formId=`edit-${e}`,this.forms.registerForm(this.ui.modals.edit.form,{cache:!1,autoUpload:!0}),this.isPopulating=!0,this.populate.populate(this.ui.modals.edit.form,t),requestAnimationFrame((()=>{requestAnimationFrame((()=>{this.isPopulating=!1}))})),this.modals.edit.handleOpen())}openBulkEditModal(){window.removeChildren(this.ui.modals.bulkEdit.selected),this.ui.modals.edit.form.reset(),window.chunkIt(this.selected,(t=>{let i=this.store.get(parseInt(t));if(i)return e.push(i.id),window.jvbTemplates.create("bulkItem",i)}),(e=>this.ui.modals.bulkEdit.selected.append(e))).then((()=>{}));let e=Array.from(this.selected).map((e=>this.store.get(parseInt(e)))).filter(Boolean);this.ui.modals.bulkEdit.modal.dataset.itemId=e.join(","),this.ui.modals.bulkEdit.h2&&(this.ui.modals.bulkEdit.h2.textContent=this.selected.size),this.modals.bulkEdit.handleOpen(),this.forms.registerForm(this.ui.modals.bulkEdit.form,{cache:!1}),this.isPopulating=!0,this.populate.populate(this.ui.modals.edit.form,item),requestAnimationFrame((()=>{requestAnimationFrame((()=>{this.isPopulating=!1}))}))}async savePosts(e="",t=!1){this.changes.size>0&&(this.cancelBackup(),await this.handleBackup());let i=await this.changesStore.getAll();if(0===i.length)return;if(i=this.validateChanges(i),0===i.length)return;""===e&&(e=`Saving ${i.length} ${1===i.length?this.singular:this.plural}`);let s={},a=[];i.forEach((e=>{let t=e.id;const{id:i,...l}=e;s[t]=l,e.post_status&&this.shouldRemoveItemUI(e.post_status)&&a.push(t)})),a.length>0&&this.removeItems(a);let l={endpoint:this.endpoint,headers:{"X-Action-Nonce":window.auth.getNonce("dash")},data:{posts:s},delay:t,popup:"Saving changes",title:e};this.queue.addToQueue(l)}validateChanges(e){return e.reduce(((e,t)=>{const{id:i,content:s,...a}=t,l=this.store.get(i);if(!l)return e.push(t),e;const n={id:i,content:s};let o=!1;for(const[e,t]of Object.entries(a)){const i=l.fields?.[e]??l[e];null!==window.getDifferences.map(i,t)&&(n[e]=t,o=!0)}return o?e.push(n):(this.changes.delete(i),this.changesStore.delete(i)),e}),[])}setBulkStatus(e){if(!["publish","draft","trash","delete"].includes(e))return;let t,i=[];if(this.selected.forEach((t=>{i.push(t),this.updateItem(t,"post_status",e)})),"delete"===e)t="Deleting";else t=window.uppercaseFirst(e)+"ing";this.shouldRemoveItemUI(e)&&this.removeItems(i),this.selectionHandler.clearSelection(),this.savePosts(`${t} ${i.length} ${1===i.length?this.singular:this.plural}...`).then((()=>{}))}render(){const e=this.store.getFiltered();if(0!==e.length){switch(this.view){case"grid":this.renderGrid(e);break;case"table":this.renderTable(e).then((()=>{}));break;case"list":this.renderList(e)}this.updateUI()}else this.renderEmpty()}updateUI(){if(this.ui.bulk.action){let e=!1,t=this.ui.bulk.action.querySelector('[value="edit"]'),i=this.status;"trash"===i&&t?(window.removeChildren(this.ui.bulk.action),e=window.jvbTemplates.create("trashOptions")):"trash"===i||t||(window.removeChildren(this.ui.bulk.action),e=window.jvbTemplates.create("notTrashOptions")),e&&e.querySelectorAll("option").forEach(((e,t)=>{0===t&&(e.checked=!0),this.ui.bulk.action.append(e)})),this.ui.bulk.action.value=""}this.selected.size>0&&this.selectionHandler.updateSelectionUI()}renderEmpty(){this.toggleTable(!1),window.removeChildren(this.ui.grid);const e=window.jvbTemplates.create("emptyState");e&&(this.ui.grid.append(e),this.a11y.announceItems(0,!1,!1))}toggleTable(e=!0){if(this.ui.table.selectedColumns&&(this.ui.table.selectedColumns.hidden=!e),e&&!this.ui.table.form){let e=window.jvbTemplates.create("contentTable");this.container.append(e),this.ui.table=window.uiFromSelectors(this.selectors.table),this.ui.table.columns=this.container.querySelectorAll(this.selectors.table.columns)}this.ui.table.form&&(this.ui.table.form.hidden=!e,e||this.forms.clearForm(this.ui.table.form.dataset.formId),this.ui.table.body&&window.removeChildren(this.ui.table.body)),this.keyHandler=this.handleKeys.bind(this),e?document.addEventListener("keydown",this.keyHandler):document.removeEventListener("keydown",this.keyHandler)}renderGrid(e){window.removeChildren(this.ui.grid),this.toggleTable(!1),this.ui.grid.classList.remove("list-view"),this.ui.grid.classList.add("grid-view"),window.chunkIt(e,(e=>this.renderGridItem(e)),(e=>this.ui.grid.append(e))).then((()=>{}))}renderList(e){window.removeChildren(this.ui.grid),this.toggleTable(!1),this.ui.grid.classList.remove("grid-view"),this.ui.grid.classList.add("list-view"),window.chunkIt(e,(e=>this.renderListItem(e)),(e=>this.ui.grid.append(e))).then((()=>{}))}async renderTable(e){this.toggleTable(),window.removeChildren(this.ui.grid),await window.chunkIt(e,(e=>this.renderTableItem(e)),(e=>{this.ui.table.body?this.ui.table.body.append(e):this.ui.table.table.insertBefore(e,this.ui.table.foot)}),5),requestAnimationFrame((()=>{window.jvbSelector?.scanExistingFields(this.ui.table.table)}))}renderGridItem(e){let t=window.jvbTemplates.create("gridView",e);return this.items.set(e.id,t),t}renderListItem(e){let t=window.jvbTemplates.create("listView",e);return this.items.set(e.id,t),t}renderTableItem(e){let t=window.jvbTemplates.create("tableView",e);return this.items.set(e.id,t),t}toggleColumn(e,t){this.ui.table.table.querySelectorAll(`.${e}`).forEach((e=>{e.hidden=!t}))}handleGroupsUploaded(e){const{posts:t,fieldId:i}=e;let s=window.jvbUploads,a=(s.fields.get(i),[]);t.forEach((e=>{const t={id:e.groupId,title:e.fields.post_title||`New ${this.singular}`,status:"draft",date:(new Date).toISOString(),modified:(new Date).toISOString(),thumbnail:null,icon:this.content,taxonomies:{},fields:e.fields,images:{}};e.images.forEach(((e,i)=>{let a=e.upload_id;0===i&&(t.fields.post_thumbnail=e);let l=s.stores.uploads.get(a);l&&(t.images[a]={"image-alt-text":"","image-caption":"","image-title":l.fields.originalName,medium:s.createPreviewUrl(s.formatFile(l))})})),a.push(t)})),this.store.saveMany(a).then((()=>this.render())),this.a11y.announce(`${t.length} ${1===t.length?this.singular:this.plural} created. Waiting for server confirmation...`)}handleGroupMappings(e){for(const[t,i]of Object.entries(e)){let e={};this.changes.has(t)&&(e=this.changes.get(t),this.changes.delete(t));let s=this.changesStore.get(t)??{};(e.size>0||s.size>0)&&(e=window.deepMerge(s,e),this.changes.set(i,e),this.scheduleBackup())}}shouldRemoveItemUI(e){return"all"===this.status&&!["publish","draft"].includes(e)||e!==this.store.filters.status}removeItems(e){e.forEach((e=>{if(this.items.has(e)){let t=this.items.get(e);t&&window.fade(t,!1)}}))}setFilters(e){for(let[t,i]of Object.entries(e)){if(!this.allowedFilters.includes(t)){delete e[t];continue}this.cache.set(t,i);let s=this.findFilterEl(t);this.setElValue(s,i)}this.store.setFilters(e)}setFilter(e,t){if(!this.allowedFilters.includes(e))return;this.cache.set(e,t),"status"===e&&(this.status=t),"orderby"===e&&(this.orderby=t),"order"===e&&(this.order=t);let i=this.findFilterEl(e,t);this.setElValue(i,t),this.store.setFilter(e,t)}deleteFilter(e,t){if(!this.allowedFilters.includes(e))return;if(Object.hasOwn(this.defaults,e))return void this.setFilter(e,this.defaults[e]);let i=this.findFilterEl(e,t);this.setElValue(i,!1),this.cache.remove(e),this.setFilter(e,"")}setElValue(e,t){if(e){if(!t)return["SELECT","TEXTAREA"].includes(e.tagName)&&(e.value=""),["text","search"].includes(e.type)&&(e.value=""),void("radio"===e.type&&(e.checked=!1));["SELECT","TEXTAREA"].includes(e.tagName)&&(e.value=t),["text","search"].includes(e.type)&&(e.value=t),"radio"===e.type&&(e.checked=!0)}}findFilterEl(e,t){if(["date-filter","dateFrom","dateTo"].includes(e)){switch(e){case"date-filter":e="month";break;case"dateFrom":e="start";break;case"dateTo":e="end"}return this.ui.modals.date[e]}if(e.includes("tax_")){const t=e.replace("tax_",""),i=this.ui.filters.taxonomies?.[t];return i||(console.warn("Taxonomy filter element not found:",t),null)}if(!Object.hasOwn(this.ui.filters,e))return console.warn("Filter el not found: ",e),!1;let i=this.ui.filters[e];if("object"==typeof i){if(!Object.hasOwn(this.ui.filters[e],t))return!1;i=this.ui.filters[e][t]}return i}resetForm(e){e.querySelectorAll('input[type="hidden"], input[type="text"], input[type="number"], input[type="email"], input[type="url"], textarea').forEach((e=>{e.value=""})),e.querySelectorAll('input[type="checkbox"], input[type="radio"]').forEach((e=>{e.checked=!1})),e.querySelectorAll("select").forEach((e=>{e.selectedIndex=0})),e.querySelectorAll(".selected-items").forEach((e=>{window.removeChildren(e)})),e.querySelectorAll(".item-grid.preview").forEach((e=>{window.removeChildren(e)}))}destroy(){window.debouncer.cancel(`changes-${this.content}`),this.changes.size>0&&(this.changesStore.saveMany(this.changes).then((()=>{})),this.changes.clear()),this.timelineSortables&&(this.timelineSortables.forEach((e=>e.destroy())),this.timelineSortables=[]);for(let[e,t]of Object.entries(this.ui.modals))t.form&&t.form.removeEventListener("submit",this.submitHandler);document.removeEventListener("click",this.clickHandler),document.removeEventListener("change",this.changeHandler),this.ui.filters.search&&this.ui.filters.search.removeEventListener("input",this.handleInput)}}document.addEventListener("DOMContentLoaded",(async function(){window.auth.subscribe((t=>{if("auth-loaded"===t){let t=document.querySelector("[data-content]");t&&!Object.hasOwn(t.dataset,"ignore")&&(window.crudManager=new e({content:t.dataset.content}))}}))}))})(); |
| | | (()=>{class e{constructor(){this.container=document.querySelector(".crud[data-content]:not([data-ignore])"),this.container&&(this.content=this.container.dataset.content,this.endpoint=this.container.dataset.endpoint??"content",this.singular=this.container.dataset.singular,this.plural=this.container.dataset.plural,this.queue=window.jvbQueue,this.a11y=window.jvbA11y,this.error=window.jvbError,this.populate=window.jvbPopulate,this.cache=new window.jvbCache(this.content),this.activeItem=null,this.isTimeline=!1,this.isPopulating=!1,this.changes=new Map,this.items=new Map,this.init())}init(){this.initElements(),this.initListeners(),this.defineTemplates();let e=this.initSettings();this.initStore(e),this.checkHideFilters(),this.initIntegrations(),this.initUploader(),this.initModals()}defineTemplates(){const e=window.jvbTemplates,t=this,i=(e,i,s)=>{e.dataset.itemId=s.id;let a=i.checkbox.closest(".preview");window.prefixInput(i.checkbox,`select-${s.id}`,a,!0),i.checkbox.value=s.id,i.checkbox.checked=t.selected.has(parseInt(s.id)),i.selectLabel&&(i.selectLabel.htmlFor=`select-${s.id}`),i.edit&&(i.edit.dataset.id=s.id),i.trash&&(i.trash.dataset.id=s.id)},s=function(e,t,i){if(i?.fields?.post_thumbnail){const e=i.images[i.fields.post_thumbnail]??{};t.img.src=e.medium??"",t.img.alt=e.alt??i.fields.post_title??""}};e.define("gridView",{refs:{img:"img",checkbox:".select-item",selectLabel:"label.select-item-label",edit:'[data-action="edit"]',trash:'[data-action="trash"]'},setup({el:e,refs:t,manyRefs:a,data:l}){i(e,t,l),s(0,t,l)}}),e.define("listView",{refs:{img:"img",checkbox:".select-item",selectLabel:"label.select-item-label",edit:'[data-action="edit"]',trash:'[data-action="trash"]'},manyRefs:{attrs:"[data-attr]",fields:"[data-field]"},setup({el:e,refs:t,manyRefs:a,data:l}){i(e,t,l),s(0,t,l),a?.attrs?.forEach((e=>{const t=l[e.dataset.attr];t&&""!==t?e.textContent=t:e.remove()})),a?.fields?.forEach((e=>{const t=l.fields?.[e.dataset.field];t&&""!==t?"DIV"===e.tagName?e.innerHTML=t:e.textContent=t:e.remove()}))}});let a={};this.isTimeline&&(a.sharedRow="tr.shared",a.point="tr.timeline-point"),e.define("tableView",{refs:{checkbox:".select-item",selectLabel:"label.select-item-label",...a},manyRefs:{inputs:"input,select,textarea",status:'input[name="post_status"]',selectors:'[data-type="selector"]',fields:"[data-field]"},setup({el:e,refs:s,manyRefs:a,data:l}){if(i(e,s,l),a?.inputs?.forEach((e=>{let t=e.closest("[data-field]");window.prefixInput(e,`${l.id}-`,t)})),a?.status?.forEach((e=>{e.value===l.status&&(e.checked=!0)})),t.isTimeline)s.sharedRow&&(s.sharedRow.querySelectorAll("input,select,textarea").forEach((e=>{let t=e.closest("[data-field]");window.prefixInput(e,`${l.id}-`,t)})),t.populate.populate(s.sharedRow,l),s.sharedRow.querySelectorAll('input[name="post_status"]').forEach((e=>{e.value===l.status&&(e.checked=!0)}))),s.point&&l.fields?.timeline&&(Object.entries(l.fields.timeline).forEach((([i,a],n)=>{const o=s.point.cloneNode(!0);o.dataset.index=`${n}`,o.dataset.itemId=a.id,o.querySelectorAll("input,select,textarea").forEach((e=>{let t=e.closest("[data-field]");window.prefixInput(e,`${a.id}-`,t)})),t.populate.populate(o,{fields:a,images:l.images,taxonomies:l.taxonomies});const d=l.images?.[a.post_thumbnail];d&&o.querySelector(".field.upload")?.setAttribute("title",d["image-title"]??""),e.insertBefore(o,s.point)})),s.point.remove());else if(void 0!==t.ui.table.form?.dataset.edit)a?.inputs?.forEach((e=>{let t=e.closest("[data-field]");window.prefixInput(e,`${l.id}-`,t)})),a?.status?.forEach((e=>{e.value===l.status&&(e.checked=!0)})),t.populate.populate(e,l);else{const e=Object.hasOwn(l,"fields")?l.fields:l;a?.fields?.forEach((t=>{if(Object.hasOwn(e,t.dataset.field)&&""!==e[t.dataset.field]){let i=e[t.dataset.field],s=e.children[0];s&&(s.textContent="date"===t.dataset.field?window.formatTimeAgo(i):i)}}))}a?.selectors?.forEach((e=>e.setAttribute("data-lazy","")))}}),e.define("emptyState"),e.define("bulkItem",{refs:{checkbox:"input",img:"img",label:"label"},setup({el:e,refs:t,manyRefs:i,data:s}){t.checkbox&&(t.checkbox.id=`bulk_${s.id}`,t.checkbox.value=s.id,t.checkbox.checked=!0,t.checkbox.name="selected[]");let a=s?.images[s?.fields?.post_thumnbail]??{};t.img&&Object.keys(a).length>0&&(t.img.src=a.medium??"",t.img.alt=a.alt??""),t.label&&(t.label.title=item.fields.post_title)}}),e.define("trashOptions"),e.define("notTrashOptions"),e.define("contentTable")}initElements(){this.allowedFilters=["status","orderby","order","search","date-filter","dateFrom","dateTo"],this.selectors={buttons:{create:".create-item",clearFilters:'[data-action="clear-filters"]'},views:{grid:'input[data-view="grid"]',list:'input[data-view="list"]',table:'input[data-view="table"]'},modals:{create:{modal:"dialog.create",form:"dialog.create form",h2:"dialog.create h2"},edit:{modal:"dialog.edit",form:"dialog.edit form",h2:"dialog.edit h2"},bulkEdit:{modal:"dialog.bulkEdit",selected:"dialog.bulkEdit .selected",h2:"dialog.bulkEdit h2 span",form:"dialog.bulkEdit form"},date:{modal:"dialog.date-range",start:"dialog.date-range .date-start",end:"dialog.date-range .date-end",month:"dialog.date-range .month-select"}},grid:`.${this.content}.item-grid`,table:{nav:"#vertical",form:"form.table",table:"form.table table",body:"form.table body",head:"form.table thead",foot:"form.table tfoot",selectedColumns:".all-filters .multi-select",columns:"thead th"},bulk:{action:".bulk-action-select",count:".bulk-controls .selected-count",control:".bulk-controls .bulk-actions",select:".bulk-controls select",selectAll:".select-all"},filters:{container:"details.all-filters",search:'.all-filters input[type="search"]',status:{all:'[name="status"]#all',publish:'[name="status"]#publish',draft:'[name="status"]#draft',trash:'[name="status"]#trash'},orderby:{date:'[name="orderby"]#date',alphabetical:'[name="orderby"]#alphabetical'},order:{asc:'[name="order"][value="asc"]',desc:'[name="order"][value="desc"]'},date:'[data-filter="date"]'},uploader:"details.uploader"},this.ui=window.uiFromSelectors(this.selectors);const e=document.querySelectorAll('[data-filter="taxonomies"]');e.length>0&&(this.ui.filters.taxonomies={},e.forEach((e=>{const t=e.dataset.taxonomy;this.ui.filters.taxonomies[t]=e,this.allowedFilters.push(`tax_${t}`)}))),this.isTimeline=!!document.querySelector("[data-timeline]")}initUploader(){this.ui.uploader&&(window.jvbUploads.scanFields(this.ui.uploader),window.jvbUploads.subscribe(((e,t)=>{if("sent-to-queue"===e&&t===this.ui.uploader.dataset.uploader&&window.debouncer.schedule("crud-complete",(()=>{this.store.clearCache()})),"sent-to-queue"===e&&t.field){const e=t.field.config.name,i=t.field.config.itemID;i&&e&&this.changes.has(i)&&delete this.changes.get(i)[e]}})))}initModals(){this.modals={};for(let[e,t]of Object.entries(this.ui.modals))t.modal&&(this.modals[e]=new window.jvbModal(t.modal),this.modals[e].subscribe(((t,i)=>{if("modal-close"===t){const t=this.ui.modals[e].form.dataset.formId;t&&this.forms.clearForm(t),this.resetForm(this.ui.modals[e].form),"date"===e&&this.handleCustomDateSelection(),["edit","bulkEdit","create"].includes(e)&&window.debouncer.timeouts.has(`save-${this.content}`)&&this.scheduleSave(0)}})))}initStore(e){let t={...this.defaults,...e};const i=window.jvbStore.register(this.content,[{storeName:this.content,keyPath:"id",endpoint:this.endpoint??"content",headers:{"X-Action-Nonce":window.auth.getNonce("dash")},indexes:[{name:"id",keyPath:"id"},{name:"status",keyPath:"status"},{name:"date",keyPath:"date"},{name:"modified",keyPath:"modified"},{name:"title",keyPath:"title"}],filters:t,ignore:["content","user"],TTL:36e5,showLoading:!0},{storeName:"changes",keyPath:"id"}]);this.changesStore=i.changes,this.store=i[this.content],this.store.subscribe(((e,t)=>{if("data-loaded"===e)this.render(),this.selectionHandler.collectItems()})),this.changesStore.subscribe(((e,t)=>{if("data-ready"===e){let e=this.changesStore.getAll();e.length>0&&(e.forEach((e=>{this.changes.set(e.id,e)})),this.savePosts("",!1).then((()=>{})))}}))}initIntegrations(){this.selected=new Set,this.selectionHandler=new window.jvbHandleSelection(this.container,{selectAll:{checkbox:"#select-all",label:".bulk-select label",span:".bulk-select label span"},wrapper:{wrapper:".wrap"},item:{idAttribute:"itemId"}}),this.selectionHandler.subscribe(((e,t)=>{this.selected=new Set([...t.selectedItems].map((e=>parseInt(e)))),this.ui.bulk.control.hidden=0===this.selected.size,this.ui.bulk.count.hidden=0===this.selected.size,this.ui.bulk.count.textContent=`${this.selected.size} ${this.plural} selected`})),this.forms=window.jvbForm,window.jvbUploads&&window.jvbUploads.subscribe(((e,t)=>{"groups_uploaded"===e&&t.content===this.content&&this.handleGroupsUploaded(t)})),this.queue.subscribe(((e,t)=>{if(["image_upload","video_upload","document_upload"].includes(t.type)&&"operation-status"===e&&"completed"===t.status&&this.store.clearCache(),"operation-status"===e&&"completed"===t.status&&"uploads/groups"===t.endpoint&&(t.result&&t.result.group_mappings&&this.handleGroupMappings(t.result.group_mappings),this.store.clearCache()),"operation-status"===e&&"completed"===t.status&&"content_update"===t.type){if(this.store.clearCache(),!t.result||!t.result.posts)return void console.warn("Content update completed but no result.posts",t);const e=Object.keys(t.result.posts);if(0===e.length)return;this.changesStore.deleteMany(e),e.forEach((e=>this.changes.delete(e)))}}))}initSettings(){this.defaults={content:this.content,user:window.auth.getUser(),page:1,status:"all",orderby:"date",order:"desc",search:""};let e={},t=this.container.dataset.view??"grid";this.view=this.cache.get("view")??t,this.view!==t&&(this.ui.views[this.view].checked=!0),this.status=this.cache.get("status")??this.defaults.status,this.status!==this.defaults.status&&(this.ui.filters.status[this.status].checked=!0,e.status=this.status),this.orderby=this.cache.get("orderby")??this.defaults.orderby,this.orderby!==this.defaults.orderby&&(this.ui.filters.orderby[this.orderby].checked=!0,e.orderBy=this.orderby),this.order=this.cache.get("order")??this.defaults.order,this.order!==this.defaults.order&&(this.ui.filters.order[this.order].checked=!0,e.order=this.order),this.ui.filters.taxonomies&&Object.entries(this.ui.filters.taxonomies).forEach((([t,i])=>{const s=`tax_${t}`,a=this.cache.get(s);a&&(i.value=a,e[s]=a)}));let i=this.cache.get("tabNav")??"horizontal";this.ui.table.nav&&"vertical"===i&&(this.ui.table.nav.checked=!0);let s={showFilters:{element:this.ui.filters.container,default:"closed"},showUploader:{element:this.ui.uploader,default:"open"}};for(let[e,t]of Object.entries(s))if(t.element){let i=this.cache.get(e)??t.default;t.element.open="open"===i,t.element.addEventListener("toggle",(()=>{this.cache.set(e,t.element.open?"open":"closed")}))}return e}initListeners(){this.changeHandler=this.handleChange.bind(this),this.clickHandler=this.handleClick.bind(this),this.inputHandler=this.handleInput.bind(this),this.submitHandler=this.handleModalSubmit.bind(this),document.addEventListener("change",this.changeHandler),document.addEventListener("click",this.clickHandler),this.ui.filters.search&&this.ui.filters.search.addEventListener("input",this.inputHandler);for(let[e,t]of Object.entries(this.ui.modals))t.form&&t.form.addEventListener("submit",this.submitHandler)}handleModalSubmit(e){e.preventDefault();const t=e.target.closest("dialog");if(!t)return;if(t.classList.contains("create"))return void this.handleCreateSubmit(t);this.plural;this.scheduleSave(0)}async handleCreateSubmit(e){e.dataset.itemId;this.changes.size>0&&(this.cancelBackup(),await this.handleBackup());const t=await this.changesStore.getAll();if(0===t.length)return;let i={};t.forEach((e=>{const{id:t,...s}=e;i[t]=s}));let s=this.queue.addToQueue({endpoint:this.endpoint,headers:{"X-Action-Nonce":window.auth.getNonce("dash")},data:{posts:i},popup:`Creating your new ${this.singular}`,title:`Creating your new ${this.singular}`});if(!s)return;const a=e.querySelectorAll("[data-upload-field]");for(const e of a){const t=e.dataset.uploader;if(!t)continue;0!==window.jvbUploads.stores.uploads.filterByIndex({field:t}).length&&await window.jvbUploads.queueUploads("uploads",t,s)}}handleChange(e){const t=e.target.closest("[data-item-id]"),i=e.target.matches("[data-filter]"),s=e.target.matches(".bulk-action-select"),a=e.target.matches("[data-view]");if(t||i||s||a)if(this.isPopulating||!t||e.target.closest("[data-ignore], .select-item")){if(a)return this.items.clear(),void this.handleViewChange(e.target);if(s)this.handleBulkAction(e.target);else if(i)this.handleFilterChange(e.target);else if("table"===this.view){if(e.target.matches("details.multi-select"))return void this.toggleColumn(e.target.id,e.target.checked);e.target.matches(this.selectors.table.nav)&&(this.tabNav=e.target.checked,this.cache.set("tabNav",e.target.checked?"vertical":"horizontal"))}}else this.handleItemUpdate(e)}handleBulkAction(e){if(e.value.startsWith("tax-")){const t=e.options[e.selectedIndex],i=t.dataset.taxonomy,s=t.dataset.single,a=t.dataset.plural;return window.jvbSelector.openEmpty(i,s,a,(e=>this.handleBulkTaxonomy(e))),void(e.value="")}switch(e.value){case"edit":this.openBulkEditModal();break;case"publish":case"trash":case"delete":this.setBulkStatus(e.value);break;case"draft":case"restore":this.setBulkStatus("draft")}}handleBulkTaxonomy(e){e.termIds.length&&this.selected.size&&(this.selected.forEach((t=>{const i=this.store.get(t);if(!i)return;const s=(i.taxonomies?.[e.taxonomy]||[]).map((e=>e.id)),a=[...new Set([...s,...e.termIds])];this.updateItem(t,e.taxonomy,a)})),this.savePosts(`Adding ${e.terms.length} ${e.taxonomy} to ${this.selected.size} ${this.plural}...`).then((()=>{})),this.selectionHandler.clearSelection())}handleItemUpdate(e){let t=window.targetCheck(e,"[data-item-id]");if(!t)return;const i=e.target.closest('[data-field-type="repeater"], [data-field-type="tag-list"]');let s,a;if(i)s=i.dataset.field,a=this.forms.getFieldValue(i);else{let t=e.target.closest("[data-field]");s=t.dataset.field,a=this.forms.getFieldValue(e.target)}t.dataset.itemId.split(",").forEach((e=>{this.updateItem(e,s,a)}))}updateItem(e,t,i){if(this.isPopulating)return;const s=this.store.get(e);if(s){const a=s.fields?.[t]??s[t];if(null===window.getDifferences.map(a,i)){if(this.changes.has(e)){delete this.changes.get(e)[t];0===Object.keys(this.changes.get(e)).filter((e=>"id"!==e&&"content"!==e)).length&&(this.changes.delete(e),this.changesStore.delete(e))}return}}this.changes.has(e)||this.changes.set(e,{id:e,content:this.content}),this.changes.get(e)[t]=i,this.scheduleBackup(),"number"!=typeof e&&String(e).includes("group")||this.scheduleSave()}scheduleBackup(){window.debouncer.schedule(`changes-${this.content}`,(async()=>{this.changes.size>0&&await this.handleBackup()}),2e3)}cancelBackup(){window.debouncer.cancel(`changes-${this.content}`)}async handleBackup(){const e=Array.from(this.changes.values());this.changes.clear();const t=e.map((e=>e.id)),i=await Promise.all(t.map((e=>this.changesStore.get(e)))),s=e.map(((e,t)=>i[t]?window.deepMerge(i[t],e):e));await this.changesStore.saveMany(s)}scheduleSave(e=1e4){window.debouncer.schedule(`save-${this.content}`,(async()=>{this.changes.size>0&&(this.cancelBackup(),await this.handleBackup()),await this.savePosts("",!1)}),e)}handleFilterChange(e){let t=e.dataset.filter;return"date"===t&&"custom"===e.value?(e.value="",void this.modals.date.handleOpen()):"date"===t&&""!==e.value?(this.setFilter("date-filter",e.value),this.deleteFilter("dateFrom"),this.deleteFilter("dateTo"),void this.checkHideFilters()):("taxonomies"===t&&(t=`tax_${e.dataset.taxonomy}`),void this.setFilter(t,e.value))}checkHideFilters(){const e=this.store.filters,t=Object.entries(e).some((([e,t])=>!["content","user","page"].includes(e)&&(this.defaults[e]!==t&&""!==t&&null!==t)));this.ui.buttons.clearFilters.hidden=!t}clearAllFilters(){let e=this.store.filters;this.store.clearFilters();for(let[t,i]of Object.entries(e))this.cache.remove(t),this.deleteFilter(t,i);this.a11y.announce("All filters cleared")}handleCustomDateSelection(){if(this.ui.modals.date.month&&this.ui.modals.date.month.value){const[e,t]=this.ui.modals.date.month.value.split("-"),i=`${e}-${t}-01`,s=new Date(e,parseInt(t),0).getDate(),a=`${e}-${t}-${String(s).padStart(2,"0")}`;this.setFilter("dateFrom",i),this.setFilter("dateTo",a),this.deleteFilter("date-filter"),this.ui.modals.date.month.value=""}else this.ui.modals.date.start&&this.ui.modals.date.start.value&&this.ui.modals.date.end&&this.ui.modals.date.end.value&&(this.setFilter("dateFrom",this.ui.modals.date.start.value),this.setFilter("dateTo",this.ui.modals.date.end.value),this.deleteFilter("date-filter"),this.ui.modals.date.start.value="",this.ui.modals.date.end.value="");this.checkHideFilters()}handleViewChange(e){this.view=e.dataset.view,this.cache.set("view",this.view),this.render()}handleClick(e){if(e.target.matches(".clear-search"))return void this.deleteFilter("search","");const t=e.target.closest("[data-action]");return t?(e.preventDefault(),void this.handleActionButton(t)):e.target.matches(".apply-date-filter")?(this.handleCustomDateSelection(),void this.modals.date.handleClose()):void(e.target.matches(this.selectors.buttons.create)&&this.openCreateModal())}openCreateModal(){this.forms.registerForm(this.ui.modals.create.form,{cache:!1}),this.ui.modals.create.modal.dataset.itemId=window.generateID("new"),this.modals.create.handleOpen()}handleActionButton(e){const t=e.dataset.id;switch(e.dataset.action){case"edit":this.openEditModal(t);break;case"delete":confirm("Delete this item? This cannot be undone")&&(this.updateItem(t,"post_status","delete"),window.fade(e.closest(".item"),!1),this.savePosts(`Permanently deleting ${this.singular}...`).then((()=>{})),this.store.delete(t));break;case"trash":"trash"===this.status?confirm("Delete this item? This cannot be undone")&&(this.updateItem(t,"post_status","delete"),window.fade(e.closest(".item"),!1),this.savePosts(`Permanently deleting ${this.singular}...`).then((()=>{})),this.store.delete(t)):(this.updateItem(t,"post_status","trash"),window.fade(e.closest(".item"),!1),this.savePosts(`Sending ${this.singular} to trash...`).then((()=>{})));break;case"bulk-edit":this.selected.size>0&&this.openBulkEditModal();break;case"bulk-delete":this.handleBulkDelete();break;case"refresh":this.store.clearCache(),this.store.fetch();break;case"clear-filters":this.clearAllFilters()}}handleBulkDelete(){let e="trash"===this.status;if(this.selected.size>0&&confirm(`${e?"Permanently delete":"Send"} ${this.selected.size} ${1===this.selected.size?this.singular:this.plural}${e?"":"to trash"}?`)){this.selected.forEach((t=>{this.store.delete(t),this.updateItem(t,"post_status",e?"delete":"trash")}));let t=e?`Permanently deleting ${this.selected.size} ${1===this.selected.size?this.singular:this.plural}`:`Sending ${this.selected.size} ${1===this.selected.size?this.singular:this.plural} to trash`;this.savePosts(t).then((()=>{})),this.selectionHandler.clearSelection()}}handleInput(e){e.preventDefault(),e.stopPropagation();let t=e.target.value.trim(),i=`${this.content}-search`;0!==t.length?window.debouncer.schedule(i,(()=>{this.a11y.announce(`Searching for "${t}"...`),this.store.setFilters({search:t,page:1})}),300):this.deleteFilter("search","")}handleKeys(e){if(this.tabNav&&"Tab"===e.key){e.preventDefault();const t=e.target.closest("[data-field]"),i=e.target.closest("tr");if(!t||!i)return;const s=t.dataset.field,a=e.shiftKey;let l=this.findNextEditableRow(i,a);l||(l=this.wrapToRow(i,a)),l&&this.focusFieldInRow(l,s,a)}}findNextEditableRow(e,t=!1){let i=t?e.previousElementSibling:e.nextElementSibling;for(;i&&!this.isEditableRow(i);)i=t?i.previousElementSibling:i.nextElementSibling;return i}wrapToRow(e,t=!1){if(this.isTimeline){const i=e.closest("tbody");if(!i)return null;const s=Array.from(i.querySelectorAll("tr")).filter((e=>this.isEditableRow(e)));return t?s[s.length-1]:s[0]}{if(!this.ui.table.body)return null;const e=Array.from(this.ui.table.body.querySelectorAll("tr")).filter((e=>this.isEditableRow(e)));return t?e[e.length-1]:e[0]}}isEditableRow(e){return!e.closest("thead")&&!e.closest("tfoot")&&(this.isTimeline?e.classList.contains("shared")||e.classList.contains("timeline-point"):!!e.dataset.itemId)}focusFieldInRow(e,t,i=!1){const s=e.querySelector(`[data-field="${t}"]`);if(!s)return;const a=this.findFocusableInput(s);if(a){a.focus(),a.select&&"text"===a.type&&a.select();const e=i?"next":"previous";this.a11y?.announce(`Moved to ${t} in ${e} row`)}}findFocusableInput(e){const t=['input:not([type="hidden"]):not([disabled])',"textarea:not([disabled])","select:not([disabled])","button:not([disabled])"];for(const i of t){const t=e.querySelector(i);if(t)return t}return null}openEditModal(e){let t=this.store.get(parseInt(e));t&&(this.activeItem=t.id,this.ui.modals.edit.modal.dataset.itemId=e,this.ui.modals.edit.modal.dataset.content=this.content,this.ui.modals.edit.h2.textContent=`Editing ${""===t.fields.post_title?this.singular:t.fields.post_title}`,this.ui.modals.edit.form.dataset.formId=`edit-${e}`,this.forms.registerForm(this.ui.modals.edit.form,{cache:!1,autoUpload:!0}),this.isPopulating=!0,this.populate.populate(this.ui.modals.edit.form,t),requestAnimationFrame((()=>{requestAnimationFrame((()=>{this.isPopulating=!1}))})),this.modals.edit.handleOpen())}openBulkEditModal(){window.removeChildren(this.ui.modals.bulkEdit.selected),this.ui.modals.edit.form.reset(),window.chunkIt(this.selected,(t=>{let i=this.store.get(parseInt(t));if(i)return e.push(i.id),window.jvbTemplates.create("bulkItem",i)}),(e=>this.ui.modals.bulkEdit.selected.append(e))).then((()=>{}));let e=Array.from(this.selected).map((e=>this.store.get(parseInt(e)))).filter(Boolean);this.ui.modals.bulkEdit.modal.dataset.itemId=e.join(","),this.ui.modals.bulkEdit.h2&&(this.ui.modals.bulkEdit.h2.textContent=this.selected.size),this.modals.bulkEdit.handleOpen(),this.forms.registerForm(this.ui.modals.bulkEdit.form,{cache:!1}),this.isPopulating=!0,this.populate.populate(this.ui.modals.edit.form,item),requestAnimationFrame((()=>{requestAnimationFrame((()=>{this.isPopulating=!1}))}))}async savePosts(e="",t=!1){this.changes.size>0&&(this.cancelBackup(),await this.handleBackup());let i=await this.changesStore.getAll();if(0===i.length)return;if(i=this.validateChanges(i),0===i.length)return;""===e&&(e=`Saving ${i.length} ${1===i.length?this.singular:this.plural}`);let s={},a=[];i.forEach((e=>{let t=e.id;const{id:i,...l}=e;s[t]=l,e.post_status&&this.shouldRemoveItemUI(e.post_status)&&a.push(t)})),a.length>0&&this.removeItems(a);let l={endpoint:this.endpoint,headers:{"X-Action-Nonce":window.auth.getNonce("dash")},data:{posts:s},delay:t,popup:"Saving changes",title:e};this.queue.addToQueue(l)}validateChanges(e){return e.reduce(((e,t)=>{const{id:i,content:s,...a}=t,l=this.store.get(i);if(!l)return e.push(t),e;const n={id:i,content:s};let o=!1;for(const[e,t]of Object.entries(a)){const i=l.fields?.[e]??l[e];null!==window.getDifferences.map(i,t)&&(n[e]=t,o=!0)}return o?e.push(n):(this.changes.delete(i),this.changesStore.delete(i)),e}),[])}setBulkStatus(e){if(!["publish","draft","trash","delete"].includes(e))return;let t,i=[];if(this.selected.forEach((t=>{i.push(t),this.updateItem(t,"post_status",e)})),"delete"===e)t="Deleting";else t=window.uppercaseFirst(e)+"ing";this.shouldRemoveItemUI(e)&&this.removeItems(i),this.selectionHandler.clearSelection(),this.savePosts(`${t} ${i.length} ${1===i.length?this.singular:this.plural}...`).then((()=>{}))}render(){const e=this.store.getFiltered();if(0!==e.length){switch(this.view){case"grid":this.renderGrid(e);break;case"table":this.renderTable(e).then((()=>{}));break;case"list":this.renderList(e)}this.updateUI()}else this.renderEmpty()}updateUI(){if(this.ui.bulk.action){let e=!1,t=this.ui.bulk.action.querySelector('[value="edit"]'),i=this.status;"trash"===i&&t?(window.removeChildren(this.ui.bulk.action),e=window.jvbTemplates.create("trashOptions")):"trash"===i||t||(window.removeChildren(this.ui.bulk.action),e=window.jvbTemplates.create("notTrashOptions")),e&&e.querySelectorAll("option").forEach(((e,t)=>{0===t&&(e.checked=!0),this.ui.bulk.action.append(e)})),this.ui.bulk.action.value=""}this.selected.size>0&&this.selectionHandler.updateSelectionUI()}renderEmpty(){this.toggleTable(!1),window.removeChildren(this.ui.grid);const e=window.jvbTemplates.create("emptyState");e&&(this.ui.grid.append(e),this.a11y.announceItems(0,!1,!1))}toggleTable(e=!0){if(this.ui.table.selectedColumns&&(this.ui.table.selectedColumns.hidden=!e),e&&!this.ui.table.form){let e=window.jvbTemplates.create("contentTable");this.container.append(e),this.ui.table=window.uiFromSelectors(this.selectors.table),this.ui.table.columns=this.container.querySelectorAll(this.selectors.table.columns)}this.ui.table.form&&(this.ui.table.form.hidden=!e,e||this.forms.clearForm(this.ui.table.form.dataset.formId),this.ui.table.body&&window.removeChildren(this.ui.table.body)),this.keyHandler=this.handleKeys.bind(this),e?document.addEventListener("keydown",this.keyHandler):document.removeEventListener("keydown",this.keyHandler)}renderGrid(e){window.removeChildren(this.ui.grid),this.toggleTable(!1),this.ui.grid.classList.remove("list-view"),this.ui.grid.classList.add("grid-view"),window.chunkIt(e,(e=>this.renderGridItem(e)),(e=>this.ui.grid.append(e))).then((()=>{}))}renderList(e){window.removeChildren(this.ui.grid),this.toggleTable(!1),this.ui.grid.classList.remove("grid-view"),this.ui.grid.classList.add("list-view"),window.chunkIt(e,(e=>this.renderListItem(e)),(e=>this.ui.grid.append(e))).then((()=>{}))}async renderTable(e){this.toggleTable(),window.removeChildren(this.ui.grid),await window.chunkIt(e,(e=>this.renderTableItem(e)),(e=>{this.ui.table.body?this.ui.table.body.append(e):this.ui.table.table.insertBefore(e,this.ui.table.foot)}),5),requestAnimationFrame((()=>{window.jvbSelector?.scanExistingFields(this.ui.table.table)}))}renderGridItem(e){let t=window.jvbTemplates.create("gridView",e);return this.items.set(e.id,t),t}renderListItem(e){let t=window.jvbTemplates.create("listView",e);return this.items.set(e.id,t),t}renderTableItem(e){let t=window.jvbTemplates.create("tableView",e);return this.items.set(e.id,t),t}toggleColumn(e,t){this.ui.table.table.querySelectorAll(`.${e}`).forEach((e=>{e.hidden=!t}))}handleGroupsUploaded(e){const{posts:t,fieldId:i}=e;let s=window.jvbUploads,a=(s.fields.get(i),[]);t.forEach((e=>{const t={id:e.groupId,title:e.fields.post_title||`New ${this.singular}`,status:"draft",date:(new Date).toISOString(),modified:(new Date).toISOString(),thumbnail:null,icon:this.content,taxonomies:{},fields:e.fields,images:{}};e.images.forEach(((e,i)=>{let a=e.upload_id;0===i&&(t.fields.post_thumbnail=e);let l=s.stores.uploads.get(a);l&&(t.images[a]={"image-alt-text":"","image-caption":"","image-title":l.fields.originalName,medium:s.createPreviewUrl(s.formatFile(l))})})),a.push(t)})),this.store.saveMany(a).then((()=>this.render())),this.a11y.announce(`${t.length} ${1===t.length?this.singular:this.plural} created. Waiting for server confirmation...`)}handleGroupMappings(e){for(const[t,i]of Object.entries(e)){let e={};this.changes.has(t)&&(e=this.changes.get(t),this.changes.delete(t));let s=this.changesStore.get(t)??{};(e.size>0||s.size>0)&&(e=window.deepMerge(s,e),this.changes.set(i,e),this.scheduleBackup())}}shouldRemoveItemUI(e){return"all"===this.status&&!["publish","draft"].includes(e)||e!==this.store.filters.status}removeItems(e){e.forEach((e=>{if(this.items.has(e)){let t=this.items.get(e);t&&window.fade(t,!1)}}))}setFilters(e){for(let[t,i]of Object.entries(e)){if(!this.allowedFilters.includes(t)){delete e[t];continue}this.cache.set(t,i);let s=this.findFilterEl(t);this.setElValue(s,i)}this.store.setFilters(e)}setFilter(e,t){if(!this.allowedFilters.includes(e))return;this.cache.set(e,t),"status"===e&&(this.status=t),"orderby"===e&&(this.orderby=t),"order"===e&&(this.order=t);let i=this.findFilterEl(e,t);this.setElValue(i,t),this.store.setFilter(e,t)}deleteFilter(e,t){if(!this.allowedFilters.includes(e))return;if(Object.hasOwn(this.defaults,e))return void this.setFilter(e,this.defaults[e]);let i=this.findFilterEl(e,t);this.setElValue(i,!1),this.cache.remove(e),this.setFilter(e,"")}setElValue(e,t){if(e){if(!t)return["SELECT","TEXTAREA"].includes(e.tagName)&&(e.value=""),["text","search"].includes(e.type)&&(e.value=""),void("radio"===e.type&&(e.checked=!1));["SELECT","TEXTAREA"].includes(e.tagName)&&(e.value=t),["text","search"].includes(e.type)&&(e.value=t),"radio"===e.type&&(e.checked=!0)}}findFilterEl(e,t){if(["date-filter","dateFrom","dateTo"].includes(e)){switch(e){case"date-filter":e="month";break;case"dateFrom":e="start";break;case"dateTo":e="end"}return this.ui.modals.date[e]}if(e.includes("tax_")){const t=e.replace("tax_",""),i=this.ui.filters.taxonomies?.[t];return i||(console.warn("Taxonomy filter element not found:",t),null)}if(!Object.hasOwn(this.ui.filters,e))return console.warn("Filter el not found: ",e),!1;let i=this.ui.filters[e];if("object"==typeof i){if(!Object.hasOwn(this.ui.filters[e],t))return!1;i=this.ui.filters[e][t]}return i}resetForm(e){e.querySelectorAll('input[type="hidden"], input[type="text"], input[type="number"], input[type="email"], input[type="url"], textarea').forEach((e=>{e.value=""})),e.querySelectorAll('input[type="checkbox"], input[type="radio"]').forEach((e=>{e.checked=!1})),e.querySelectorAll("select").forEach((e=>{e.selectedIndex=0})),e.querySelectorAll(".selected-items").forEach((e=>{window.removeChildren(e)})),e.querySelectorAll(".item-grid.preview").forEach((e=>{window.removeChildren(e)}))}destroy(){window.debouncer.cancel(`changes-${this.content}`),this.changes.size>0&&(this.changesStore.saveMany(this.changes).then((()=>{})),this.changes.clear()),this.timelineSortables&&(this.timelineSortables.forEach((e=>e.destroy())),this.timelineSortables=[]);for(let[e,t]of Object.entries(this.ui.modals))t.form&&t.form.removeEventListener("submit",this.submitHandler);document.removeEventListener("click",this.clickHandler),document.removeEventListener("change",this.changeHandler),this.ui.filters.search&&this.ui.filters.search.removeEventListener("input",this.handleInput)}}document.addEventListener("DOMContentLoaded",(async function(){window.auth.subscribe((t=>{if("auth-loaded"===t){let t=document.querySelector("[data-content]");t&&!Object.hasOwn(t.dataset,"ignore")&&(window.crudManager=new e({content:t.dataset.content}))}}))}))})(); |
| | |
| | | 'paymentAccepted' => 'payment_accepted', |
| | | ], |
| | | 'overrides' => [ |
| | | 'additionalType' => 'https://schema.org/TattooParlor', |
| | | 'additionalTypeTrait' => 'https://schema.org/TattooParlor', |
| | | ] |
| | | ] |
| | | ] |
| | |
| | | * - verify_entry = (bool) if true, users not already attached to this taxonomy need to be approved before entry. |
| | | * - approve_new = (bool) if true, admin/verified users need to approve before 'live' |
| | | * - track_changes = (bool) if true, table is created to track historical changes |
| | | * - for_content = (array) of post type slugs, as defined in JVB_CONTENT |
| | | * - for_content = (array) of post type slugs, as defined in Registrar instances |
| | | * - fields = (array) of custom field definitions, from inc/managers/Meta.php |
| | | * -> add use_in_stats (bool) to use the field in user statistics |
| | | */ |
| | |
| | | * ] |
| | | * - manage_others = (array) of post types this role can manage other users items |
| | | * - can_register = (bool) if true, this user can self register |
| | | * - profile = (string) associated post type to treat as archive page, as registered in JVB_CONTENT |
| | | * - register_fields = (array) of field names available in registration, as defined in settings OR associated profile JVB_CONTENT |
| | | * - profile = (string) associated post type to treat as archive page, as registered in Registrar |
| | | * - register_fields = (array) of field names available in registration, as defined in settings OR associated profile post Registrar |
| | | * - approve_new = (bool) if true, user content is hidden until verified by admin/other verified users |
| | | * - keep_stats = (bool) if true, creates a statistics table that tracks how much content is created per user per day |
| | | * - settings = (array) of fields users can modify |
| | |
| | | <?php |
| | | |
| | | use JVBase\managers\Cache; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | function jvbCheck(string $key, $config = []) |
| | | function jvbCheck(string $key, $config = []):bool |
| | | { |
| | | return (array_key_exists($key, $config) && $config[$key] === true); |
| | | } |
| | | /** |
| | | * Tests whether this site needs forum functionality |
| | | * @return bool |
| | | */ |
| | | function jvbSiteHasForum():bool |
| | | { |
| | | return jvbCheck('forum', JVB_MEMBERSHIP); |
| | | } |
| | | |
| | | function jvbSiteUsesSquare():bool |
| | | { |
| | | return jvbSiteHasIntegrations() && jvbCheck('square', JVB_SITE['integrations']); |
| | | } |
| | | function jvbSiteUsesGoogleBusiness():bool |
| | | { |
| | | return jvbSiteUsesGMB(); |
| | | } |
| | | |
| | | function jvbSiteHasFavourites():bool |
| | | { |
| | | return jvbCheck('favourites', JVB_SITE); |
| | | } |
| | | |
| | | /** |
| | | * Tests whether this site has a custom dashboard |
| | | * @return bool |
| | | */ |
| | | function jvbSiteHasDashboard():bool |
| | | { |
| | | return jvbCheck('dashboard', JVB_SITE); |
| | | } |
| | | |
| | | function jvbSiteHasKarma():bool |
| | | { |
| | | global $jvb_karma; |
| | | return (!empty($jvb_karma['content']) || !empty($jvb_karma['taxonomy'])); |
| | | } |
| | | |
| | | function jvbSiteHasSupport():bool |
| | | { |
| | | return jvbCheck('has_support', JVB_SITE); |
| | | } |
| | | |
| | | function jvbSiteHasInvitations():bool |
| | | { |
| | | return jvbCheck('can_invite', JVB_MEMBERSHIP); |
| | | } |
| | | |
| | | function jvbSiteHasMemberApproval():bool |
| | | { |
| | | return jvbCheck('member_verified', JVB_MEMBERSHIP); |
| | | } |
| | | |
| | | function jvbSiteHasMembership():bool |
| | | { |
| | | return jvbCheck('has_membership', JVB_SITE); |
| | | } |
| | | |
| | | function jvbSiteHasResponse():bool |
| | | { |
| | | global $jvb_responses; |
| | | return (!empty($jvb_responses['content']) || !empty($jvb_responses['taxonomy'])); |
| | | } |
| | | |
| | | function jvbSiteUsesFeedBlock():bool |
| | | { |
| | | return jvbCheck('use_feed_block', JVB_SITE); |
| | | } |
| | | |
| | | function jvbSiteCanFavourite():bool |
| | | { |
| | | return jvbCheck('enthusiast', JVB_SITE) && jvbCheck('favourites', JVB_SITE); |
| | | } |
| | | |
| | | function jvbSiteUsesUmami():bool |
| | | { |
| | | return jvbSiteHasIntegrations() && jvbCheck('umami', JVB_SITE['integrations']); |
| | | } |
| | | function jvbSiteUsesCloudflare():bool |
| | | { |
| | | return jvbSiteHasIntegrations() && jvbCheck('cloudflare', JVB_SITE['integrations']); |
| | | } |
| | | |
| | | function jvbSiteUsesFacebook():bool |
| | | { |
| | | return jvbSiteHasIntegrations() && jvbCheck('facebook', JVB_SITE['integrations']); |
| | | } |
| | | function jvbSiteUsesInstagram():bool |
| | | { |
| | | return jvbSiteHasIntegrations() && jvbCheck('instagram', JVB_SITE['integrations']); |
| | | } |
| | | function jvbSiteUsesBluesky():bool |
| | | { |
| | | return jvbSiteHasIntegrations() && jvbCheck('bluesky', JVB_SITE['integrations']); |
| | | } |
| | | function jvbSiteUsesGMB():bool |
| | | { |
| | | return jvbSiteHasIntegrations() && jvbCheck('gmb', JVB_SITE['integrations']); |
| | | } |
| | | function jvbSiteUsesHelcim():bool |
| | | { |
| | | return jvbSiteHasIntegrations() && jvbCheck('helcim', JVB_SITE['integrations']); |
| | | } |
| | | |
| | | function jvbSiteUses(string $key):bool |
| | | { |
| | | return jvbCheck($key, JVB_SITE); |
| | | } |
| | | |
| | | function jvbSiteUsesMaps():bool |
| | | { |
| | | return true; |
| | | } |
| | | |
| | | function jvbSiteHasTermContent():bool |
| | | { |
| | | return (!empty(array_keys(array_filter(JVB_TAXONOMY, function ($taxonomy) { |
| | | return jvbCheck('is_content', $taxonomy); |
| | | })))); |
| | | } |
| | | |
| | | function jvbSiteHasNotifications():bool |
| | | { |
| | | return jvbCheck('notifications', JVB_MEMBERSHIP); |
| | | } |
| | | |
| | | function jvbUserCanCreate(int $userID = 0):bool |
| | | { |
| | | $user = ($userID === 0) ? wp_get_current_user() : get_userdata($userID); |
| | | $roles = array_intersect( |
| | | jvbRolesWithDashboard(), |
| | | array_map(function ($role) { |
| | | return jvbNoBase($role); |
| | | }, |
| | | $user->roles) |
| | | ); |
| | | $creatable = []; |
| | | foreach ($roles as $role) { |
| | | $creatable = array_merge($creatable, JVB_USER[$role]['can_create']??[]); |
| | | } |
| | | |
| | | $creatable = jvbExtractUserContent($creatable); |
| | | return !empty($creatable); |
| | | } |
| | | |
| | | function jvbRolesWithDashboard():array |
| | | { |
| | | return array_keys(array_filter(JVB_USER, function ($role) { |
| | | return jvbCheck('has_dashboard', $role); |
| | | })); |
| | | } |
| | | |
| | | function jvbSiteHasTermApproval():bool |
| | | { |
| | | return jvbCheck('terms_approval', JVB_MEMBERSHIP); |
| | | } |
| | | |
| | | function jvbUserIsVerified():bool |
| | | { |
| | |
| | | return $types; |
| | | } |
| | | |
| | | function isJVBUserType():bool |
| | | { |
| | | return (is_singular(jvbUserTypes()) || is_post_type_archive(jvbUserTypes())); |
| | | } |
| | | |
| | | function contentIsJVBUserType(string $content):bool |
| | | { |
| | | $content = jvbCheckBase($content); |
| | | return in_array($content, jvbUserTypes()); |
| | | } |
| | | |
| | | |
| | | function isJVBContentTax():bool |
| | | { |
| | | return is_tax(jvbContentTaxonomies()); |
| | | return is_tax(array_map(function ($tax) { |
| | | return jvbCheckBase($tax); |
| | | }, Registrar::getFeatured('is_content', 'term'))); |
| | | } |
| | | |
| | | function taxIsJVBContentTax($tax):bool |
| | | { |
| | | $tax = jvbCheckBase($tax); |
| | | return in_array($tax, jvbContentTaxonomies()); |
| | | $allowed = Registrar::getFeatured('is_content', 'term'); |
| | | $tax = jvbNoBase($tax); |
| | | return in_array($tax, $allowed); |
| | | } |
| | | |
| | | function jvbSiteHasIntegrations():bool |
| | | { |
| | | return array_key_exists('integrations', JVB_SITE) && !empty(JVB_SITE['integrations']); |
| | | } |
| | | |
| | | |
| | | function jvbIsOpen():bool |
| | | { |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | function jvbIsValidType(string $type):bool { |
| | | |
| | | return (array_key_exists($type, JVB_CONTENT) || |
| | | array_key_exists($type, JVB_TAXONOMY) || |
| | | array_key_exists($type, JVB_USER) || |
| | | $type === 'options'); |
| | | } |
| | | |
| | | function jvbGetObjectType(string $type):string { |
| | | if (array_key_exists($type, JVB_CONTENT)) { |
| | | return 'post'; |
| | | } elseif (array_key_exists($type, JVB_TAXONOMY)) { |
| | | return 'term'; |
| | | } elseif (array_key_exists($type, JVB_USER)) { |
| | | return 'user'; |
| | | } elseif ($type === 'options') { |
| | | return 'options'; |
| | | } |
| | | return ''; |
| | | } |
| | | |
| | | |
| | | function jvbTermHasPosts(int $termID, string $taxonomy):bool |
| | | { |
| | | $cache = Cache::for('termUtility', 30*60)->connect('taxonomy'); |
| | |
| | | exit; |
| | | } |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\registry\TaxonomyRegistrar; |
| | | use WP_Error; |
| | | use Exception; |
| | |
| | | { |
| | | public function __construct() |
| | | { |
| | | if (!jvbSiteHasTermContent()){ |
| | | if (empty(Registrar::getFeatured('is_content', 'term'))){ |
| | | return; |
| | | } |
| | | add_filter(BASE.'handle_bulk_operation', [ $this, 'processOperation' ], 10, 3); |
| | |
| | | // Handle individual taxonomy rebuild |
| | | if (isset($_POST['rebuild_taxonomy']) && wp_verify_nonce($_POST['_wpnonce'], 'rebuild_taxonomy')) { |
| | | $taxonomy = sanitize_text_field($_POST['taxonomy']); |
| | | |
| | | if (isset(JVB_TAXONOMY[$taxonomy]) && (JVB_TAXONOMY[$taxonomy]['is_content'] ?? false)) { |
| | | $registrar = Registrar::getInstance($taxonomy)); |
| | | if ($registrar && $registrar->hasFeature('is_content')) { |
| | | $results = $this->rebuildCustomTable($taxonomy); |
| | | // Store results in transient to display after redirect |
| | | set_transient('jvb_rebuild_results_' . $taxonomy, $results, 300); // 5 minutes |
| | |
| | | </tr> |
| | | </thead> |
| | | <tbody> |
| | | <?php foreach (JVB_TAXONOMY as $slug => $config): ?> |
| | | <?php if (!($config['is_content'] ?? false)) continue; ?> |
| | | <?php |
| | | <?php |
| | | $taxonomies = Registrar::getFeatured('is_content', 'term'); |
| | | foreach ($taxonomies as $slug): |
| | | $registrar = Registrar::getInstance($slug); |
| | | $taxonomy = BASE . $slug; |
| | | $table_info = $this->getTableInfo($slug); |
| | | $term_count = wp_count_terms($taxonomy, ['hide_empty' => false]); |
| | | ?> |
| | | <tr> |
| | | <td> |
| | | <strong><?= esc_html($config['plural'] ?? ucfirst($slug)) ?></strong><br> |
| | | <strong><?= esc_html($registrar->getPlural()) ?></strong><br> |
| | | <code><?= esc_html($taxonomy) ?></code> |
| | | </td> |
| | | <td> |
| | |
| | | */ |
| | | public function rebuildCustomTable(string $taxonomy):array |
| | | { |
| | | global $wpdb; |
| | | |
| | | $results = [ |
| | | 'success' => 0, |
| | | 'errors' => 0, |
| | |
| | | ]; |
| | | |
| | | // Check if this is a content taxonomy |
| | | if (!(JVB_TAXONOMY[$taxonomy]['is_content'] ?? false)) { |
| | | $registrar = Registrar::getInstance($taxonomy)); |
| | | if (!$registrar->hasFeature('is_content')) { |
| | | $results['messages'][] = "Taxonomy {$taxonomy} is not a content taxonomy"; |
| | | return $results; |
| | | } |
| | | |
| | | global $wpdb; |
| | | $table = $wpdb->prefix . BASE . 'content_' . $taxonomy; |
| | | |
| | | // Check if table exists |
| | |
| | | namespace JVBase\admin; |
| | | |
| | | use JVBase\managers\IconsManager; |
| | | use JVBase\registrar\Registrar; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | |
| | | |
| | | IconsManager::for()->enqueueIconStyles(); |
| | | IconsManager::for('dash')->enqueueIconStyles(); |
| | | IconsManager::for('form')->enqueueIconStyles(); |
| | | IconsManager::for('forms')->enqueueIconStyles(); |
| | | |
| | | $queue = [ |
| | | 'api' => rest_url('jvb/v1/'), |
| | | 'redirect' => wp_login_url(home_url(add_query_arg(null, null))), |
| | | 'labels' => jvbGetLabels(), |
| | | 'labels' => Registrar::getLabels(), |
| | | ]; |
| | | |
| | | wp_localize_script('jvb-auth', 'jvbSettings', $queue); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\admin; |
| | | |
| | | use JVBase\meta\Form; |
| | | use JVBase\meta\Sanitizer; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\ui\Tabs; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class SEOAdmin { |
| | | protected string $admin_page; |
| | | protected array $types = [ |
| | | 'JVBase\managers\SEO\render\Thing' => 'Thing', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork' => ' - Creative Work', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\CategoryCodeSet' => '- - Category Code Set', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\Certification' => '- - Certification', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\Clip' => ' - - Clip', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\DefinedTermSet' => ' - - Defined Term Set', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\HowTo' => ' - - How To', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\Menu' => ' - - Menu', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\MenuSection' => ' - - Menu Section', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\MusicRecording' => ' - - Music Recording', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\Photograph' => ' - - Photograph', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\Review' => ' - - Review', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\WebPage\Webpage' => ' - - WebPage', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\WebPage\AboutPage' => ' - - - About Page', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\WebPage\CheckoutPage' => ' - - - Checkout Page', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\WebPage\CollectionPage' => ' - - - Collection Page', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\WebPage\ContactPage' => ' - - - Contact Page', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\WebPage\FAQPage' => ' - - - FAQ Page', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\WebPage\ItemPage' => ' - - - Item Page', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\WebPage\MedicalWebPage' => ' - - - Medical Web Page', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\WebPage\ProfilePage' => ' - - - Profile Page', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\WebPage\QAPage' => ' - - - QA Page', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\WebPage\RealEstateListing' => ' - - - Real Estate Listing', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\WebPage\SearchResultsPage' => ' - - - Search Results Page', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\WebSite' => ' - - - Website', |
| | | 'JVBase\managers\SEO\render\Thing\Event\Event' => ' - Event', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization' => ' - Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\LocalBusiness' => ' - - Local Business', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment' => ' - - - Food Establishment', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment\Bakery' => ' - - - - Bakery', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment\BarOrPub' => ' - - - - Bar or Pub', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment\Brewery' => ' - - - - Brewery', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment\CafeOrCoffeeShop' => ' - - - - Cafe or Coffee Shop', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment\Distillery' => ' - - - - Distillery', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment\FastFoodRestaurant' => ' - - - - Fast Food Restaurant', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment\IceCreamShop' => ' - - - - Ice Cream Shop', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment\Restaurant' => ' - - - - Restaurant', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment\Winery' => ' - - - - Winery', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\HealthAndBeautyBusiness' => ' - - - Health & Beauty Business', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\MedicalBusiness\MedicalBusiness' => ' - - - Medical Business', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\ProfessionalService' => ' - - - Professional Service', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\Store' => ' - - - Store', |
| | | 'JVBase\managers\SEO\render\Thing\Person' => ' - Person', |
| | | 'JVBase\managers\SEO\render\Thing\Place' => ' - Place', |
| | | 'JVBase\managers\SEO\render\Thing\Product' => ' - Product', |
| | | ]; |
| | | |
| | | protected array $isHidden = [ |
| | | 'additionalType', |
| | | 'mainEntityOfPage', |
| | | 'subjectOf', |
| | | 'brand', |
| | | 'companyRegistration', |
| | | 'contactPoint', |
| | | 'department', |
| | | 'duns', |
| | | 'employee', |
| | | 'ethicsPolicy', |
| | | 'event', |
| | | 'founder', |
| | | 'funder', |
| | | 'funding', |
| | | 'globalLocationNumber', |
| | | 'hasMerchantReturnPolicy', |
| | | 'hasPOS', |
| | | 'interactionStatistic', |
| | | 'knowsLanguage', |
| | | 'makesOffer', |
| | | 'member', |
| | | 'memberOf', |
| | | 'ownershipFundingInfo', |
| | | 'sponsor', |
| | | 'containsInPlace', |
| | | 'containsPlace', |
| | | 'openingHours' |
| | | ]; |
| | | |
| | | protected array $hints = [ |
| | | 'alternateName' => 'An alias for the item.', |
| | | 'description' => 'A description of the item.', |
| | | 'disambiguatingDescription' => 'A sub property of description. A short description of the item used to disambiguate from other, similar items. Information from other properties (in particular, name) may be necessary for the description to be useful for disambiguation.', |
| | | 'image' => 'An image of the item.', |
| | | 'name' => 'The name of the item.', |
| | | 'owner' => 'A person or organization who owns this Thing.', |
| | | 'slogan' => 'A slogan or motto associated with the item.' |
| | | ]; |
| | | |
| | | protected array $checks; |
| | | |
| | | public function __construct() |
| | | { |
| | | $this->setChecks(); |
| | | add_filter('jvbDashboardPage', [$this, 'addDashboardSection'], 20, 2); |
| | | add_action('admin_menu', [$this, 'addAdminMenu']); |
| | | $this->addFormListeners(); |
| | | } |
| | | |
| | | protected function setChecks():void |
| | | { |
| | | $checks = [ |
| | | 'website' |
| | | ]; |
| | | $this->checks = array_merge($checks, Registrar::getRegistered()); |
| | | } |
| | | |
| | | protected function addFormListeners():void |
| | | { |
| | | |
| | | foreach ($this->checks as $check){ |
| | | $based = jvbCheckBase($check); |
| | | add_action('admin_post_'.$based, [$this, 'handleAJAXFormSubmit']); |
| | | } |
| | | } |
| | | |
| | | public function addAdminMenu():void |
| | | { |
| | | $main = JVB()->admin()->getMainConfig(); |
| | | $this->admin_page = add_submenu_page( |
| | | $main['menu_slug'], |
| | | 'SEO', |
| | | 'SEO', |
| | | 'manage_options', |
| | | 'jvb-seo', |
| | | [$this, 'renderAdminPage'] |
| | | ); |
| | | } |
| | | |
| | | public function addDashboardSection(string $content, string $page):string |
| | | { |
| | | if ($page !== 'jvb-seo') { |
| | | return $content; |
| | | } |
| | | ob_start(); |
| | | $this->renderAdminPage(); |
| | | return ob_get_clean(); |
| | | } |
| | | |
| | | public function renderAdminPage(bool $outputScripts = true):void |
| | | { |
| | | ?> |
| | | <div class="wrap jvb-seo-admin"> |
| | | <h1><?= jvbDashIcon('magnifying-glass'); ?> SEO Configuration</h1> |
| | | |
| | | <?php |
| | | $tabs = new Tabs(); |
| | | |
| | | $tabs->addTab('website') |
| | | ->title('Website') |
| | | ->icon('globe-simple') |
| | | ->content($this->renderWebsite()); |
| | | |
| | | $tabs->addTab('business') |
| | | ->title('Organization') |
| | | ->icon('storefront') |
| | | ->content($this->renderOrganization()); |
| | | |
| | | // if (count(Registrar::getRegistered('post')) > 0) { |
| | | // $tabs->addTab('content') |
| | | // ->title('Content') |
| | | // ->icon('note') |
| | | // ->content($this->renderConfig('content')); |
| | | // } |
| | | // |
| | | // |
| | | // if (count(Registrar::getRegistered('taxonomy')) > 0) { |
| | | // $tabs->addTab('taxonomies') |
| | | // ->title('Taxonomies') |
| | | // ->icon('tag') |
| | | // ->content($this->renderConfig('taxonomy')); |
| | | // } |
| | | // |
| | | // if (count(Registrar::getRegistered('user')) > 0) { |
| | | // $tabs->addTab('user-roles') |
| | | // ->title('User Roles') |
| | | // ->icon('users-three') |
| | | // ->content($this->renderConfig('taxonomy')); |
| | | // } |
| | | |
| | | echo $tabs->render(); |
| | | ?> |
| | | </div> |
| | | |
| | | <?php |
| | | if ($outputScripts) { |
| | | $this->renderStyles(); |
| | | } |
| | | } |
| | | |
| | | public function renderProperty(string $property, ?string $value, mixed $class):void |
| | | { |
| | | $method = 'get'.ucFirst($property).'FieldConfig'; |
| | | $config = method_exists($class, $method) ? $class->$method() : $this->buildConfig($property); |
| | | if(!array_key_exists('type', $config)) { |
| | | error_log('Invalid Config for '.$property.': '.print_r($config, true)); |
| | | } |
| | | echo Form::render($property, $value, $config); |
| | | } |
| | | |
| | | protected function buildConfig($property) { |
| | | return [ |
| | | 'type' => $this->getPropertyType($property), |
| | | 'label' => $this->getLabel($property) |
| | | ]; |
| | | } |
| | | protected function getPropertyType(string $property):string |
| | | { |
| | | return match($property) { |
| | | default => 'text' |
| | | }; |
| | | } |
| | | protected function getLabel(string $property):string |
| | | { |
| | | $data = preg_split('/(?=[A-Z])/', $property); |
| | | $string = implode(' ', $data); |
| | | return ucwords($string); |
| | | } |
| | | |
| | | public function renderSchemaTypeSelection(?string $value = null):void |
| | | { |
| | | $config = [ |
| | | 'type' => 'select', |
| | | 'label' => 'Schema Type', |
| | | 'hint' => 'Save changes & refresh after changing.', |
| | | 'options' => $this->types |
| | | ]; |
| | | echo Form::render('type', $value, $config); |
| | | } |
| | | |
| | | public function renderWebsite():string |
| | | { |
| | | ob_start(); |
| | | $this->formStart('website'); |
| | | $default = 'JVBase\managers\SEO\render\Thing\CreativeWork\WebSite'; |
| | | // $this->renderSchemaTypeSelection($value); |
| | | $stored = get_option(BASE.'WebsiteSchema',apply_filters(BASE.'websiteSchema', [])); |
| | | $this->renderFieldsFor($default, $stored); |
| | | $this->formEnd(); |
| | | return ob_get_clean(); |
| | | } |
| | | public function renderOrganization():string |
| | | { |
| | | ob_start(); |
| | | $this->formStart('organization'); |
| | | $default = apply_filters(BASE.'OrganizationSchemaType', 'JVBase\managers\SEO\render\Thing\Organization\Organization'); |
| | | $value = get_option(BASE.'OrganizationSchemaType', $default); |
| | | $this->renderSchemaTypeSelection($value); |
| | | $stored = get_option(BASE.'OrganizationSchema',apply_filters(BASE.'OrganizationSchema', [])); |
| | | $this->renderFieldsFor($value, $stored); |
| | | $this->formEnd(); |
| | | return ob_get_clean(); |
| | | } |
| | | |
| | | protected function formStart(string $action):void |
| | | { |
| | | $action = jvbCheckBase($action); |
| | | |
| | | echo sprintf( |
| | | '<form action="%s" method="POST"> |
| | | <input type="hidden" name="action" value="%s"> |
| | | <input type="hidden" name="%s_nonce" value="%s">', |
| | | esc_url(admin_url('admin-post.php')), |
| | | $action, |
| | | $action, |
| | | wp_create_nonce($action) |
| | | ); |
| | | } |
| | | protected function formEnd():void |
| | | { |
| | | echo '<button type="submit">Save Changes</button> |
| | | </form>'; |
| | | } |
| | | public function renderFieldsFor(string $class, array $stored):void |
| | | { |
| | | $fields = $this->getFieldsFor($class); |
| | | $instance = new $class(); |
| | | foreach ($fields as $property => $value) { |
| | | $this->renderProperty($property, $stored[$property]??null, $instance); |
| | | } |
| | | } |
| | | |
| | | public function getFieldsFor(string $class):array |
| | | { |
| | | if (!class_exists($class)) { |
| | | error_log('Class not found: '.$class); |
| | | return []; |
| | | } |
| | | $class = new $class(); |
| | | |
| | | return array_filter($class->getProperties(), function ($item) { |
| | | return !in_array($item, $this->isHidden); |
| | | }, ARRAY_FILTER_USE_KEY); |
| | | } |
| | | |
| | | public function handleAJAXFormSubmit() { |
| | | $action = $_POST['action']; |
| | | if (!isset($_POST[$action.'_nonce']) || !wp_verify_nonce($_POST[$action.'_nonce'], $action)) { |
| | | wp_die( __( 'Invalid nonce specified', 'jvb' ), __( 'Error', 'jvb' ), array( |
| | | 'response' => 403, |
| | | 'back_link' => 'admin.php?page=jvb-seo', |
| | | ) ); |
| | | } |
| | | $action = jvbNoBase($action); |
| | | |
| | | error_log('[SEOAdmin]Post request: '.print_r($_POST, true)); |
| | | if ($action !== 'website'){ |
| | | |
| | | $type = sanitize_text_field(stripslashes($_POST['type'])); |
| | | if (empty($type) || !array_key_exists($type, $this->types)){ |
| | | error_log('Invalid type: '.print_r($type, true)); |
| | | return; |
| | | } |
| | | update_option(BASE.ucfirst($action).'SchemaType', $type); |
| | | } else { |
| | | $type = 'JVBase\managers\SEO\render\Thing\CreativeWork\WebSite'; |
| | | } |
| | | |
| | | |
| | | |
| | | $result = $this->saveFields($action, $type, $_POST); |
| | | |
| | | |
| | | // redirect the user to the appropriate page |
| | | wp_redirect(esc_url_raw(add_query_arg($result, |
| | | admin_url('admin.php?page=jvb-seo') |
| | | ))); |
| | | exit; |
| | | } |
| | | |
| | | public function saveFields(string $action, string $class, array $data):array |
| | | { |
| | | if (!in_array($action, $this->checks)) { |
| | | error_log('[SEOAdmin]Action is not allowed: '.$action); |
| | | return [ |
| | | 'jvb_notice' => 'error', |
| | | 'jvb_message' => 'Action is not allowed: '.$action |
| | | ]; |
| | | } |
| | | |
| | | $allowed = $this->getFieldsFor($class); |
| | | if (empty($allowed)) { |
| | | return [ |
| | | 'jvb_notice' => 'error', |
| | | 'jvb_message' => 'Could not get fields from class' |
| | | ]; |
| | | } |
| | | |
| | | $checked = array_filter($data, function ($item) use ($allowed) { |
| | | return array_key_exists($item, $allowed); |
| | | }, ARRAY_FILTER_USE_KEY); |
| | | |
| | | $stored = get_option(BASE.ucfirst($action).'Schema', []); |
| | | $updates = []; |
| | | foreach ($checked as $property => $value) { |
| | | $sanitized = Sanitizer::sanitize($value, $this->buildConfig($property)); |
| | | if (!array_key_exists($property, $stored) || $stored[$property] !== $sanitized) |
| | | $updates[$property] = $sanitized; |
| | | } |
| | | if (!empty($updates)) { |
| | | $history = get_option(BASE.ucfirst($action).'SchemaHistory', []); |
| | | array_unshift($history, $stored); |
| | | if (count($history) > 5){ |
| | | array_pop($history); |
| | | } |
| | | update_option(BASE.ucfirst($action).'SchemaHistory', $history); |
| | | |
| | | $update = array_merge($stored, $updates); |
| | | update_option(BASE.ucfirst($action).'Schema', $update); |
| | | } |
| | | return [ |
| | | 'jvb_notice' => 'success', |
| | | 'jvb_message' => 'Saved changes successfully' |
| | | ]; |
| | | } |
| | | } |
| | |
| | | <?php |
| | | use JVBase\utility\Features; |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | |
| | | require(JVB_DIR . '/inc/admin/Integrations.php'); |
| | | require(JVB_DIR . '/inc/admin/SEOAdmin.php'); |
| | | |
| | | if (Features::anyTaxonomyHas('is_content')) { |
| | | if (!empty(Registrar::getFeatured('is_content', 'term'))) { |
| | | require(JVB_DIR . '/inc/admin/ContentTaxonomy.php'); |
| | | } |
| | |
| | | global $post; |
| | | $ID = get_post_thumbnail_id($post->ID); |
| | | $aOpen = $aClose = ''; |
| | | if(!is_single($ID)) { |
| | | if(!is_single($post->ID)) { |
| | | $aOpen = '<a href="'.get_the_permalink($post->ID).'">'; |
| | | $aClose = '</a>'; |
| | | } |
| | | |
| | | return $aOpen.'<figure'.$this->getClassesAndStyles($block['attrs']).'>'. |
| | | return '<figure'.$this->getClassesAndStyles($block['attrs']).'>'.$aOpen. |
| | | apply_filters('jvbCoreFeaturedImage', $this->image($ID), $post->post_type). |
| | | '</figure>'.$aClose; |
| | | $aClose.'</figure>'; |
| | | } |
| | | //core_post_navigation_link |
| | | //core_post_template |
| | |
| | | namespace JVBase\blocks; |
| | | |
| | | use JVBase\managers\Cache; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\utility\Checker; |
| | | use JVBase\forms\TaxonomySelector; |
| | | use WP_Block; |
| | | |
| | |
| | | |
| | | if (is_post_type_archive() || is_singular()) { |
| | | $content = is_singular() ? jvbNoBase($type->post_type) : jvbNoBase($type->name); |
| | | $mainConfig = JVB_CONTENT[$content]??false; |
| | | if ($mainConfig && array_key_exists('feed', $mainConfig) && array_key_exists('config', $mainConfig['feed'])){ |
| | | $config = array_merge($config, $mainConfig['feed']['config']); |
| | | |
| | | $registrar = Registrar::getInstance($content)??false; |
| | | if ($registrar) { |
| | | $config = array_merge($config, $registrar->getConfig('feed')); |
| | | } else { |
| | | $config['content'] = $content; |
| | | $config['icon'] = JVB_CONTENT[$content]['icon']??[jvbLogoIcon()]; |
| | | $config['icon'] = jvbDefaultIcon(); |
| | | } |
| | | if (is_singular()) { |
| | | $config['source'] = $type->ID; |
| | |
| | | $config['taxonomies'] = $this->getTaxonomies([$content]); |
| | | } elseif (is_tax()) { |
| | | $content = jvbNoBase($type->taxonomy); |
| | | $mainConfig = JVB_TAXONOMY[$content]??false; |
| | | if ($mainConfig) { |
| | | $config['content'] = $mainConfig['for_content']; |
| | | $config['context'] = $content; // ← ADD THIS |
| | | $config['taxonomies'] = $this->getTaxonomies($mainConfig['for_content']); |
| | | if (array_key_exists('feed', $mainConfig) && array_key_exists('config', $mainConfig['feed'])){ |
| | | $config = array_merge($config, $mainConfig['feed']['config']); |
| | | $registrar = Registrar::getInstance($content)??false; |
| | | if ($registrar) { |
| | | $config['content'] = $registrar->registrar->for; |
| | | $config['context'] = $content; |
| | | $config['taxonomies'] = $this->getTaxonomies($registrar->registrar->for); |
| | | if (!empty($registrar->getConfig('feed'))){ |
| | | $config = array_merge($config, $registrar->getConfig('feed')); |
| | | } |
| | | } |
| | | $config['source'] = $type->term_id; |
| | |
| | | |
| | | /** |
| | | * Get taxonomies for given content types |
| | | * Uses Checker instead of globals |
| | | |
| | | */ |
| | | protected function getTaxonomies(array $content): array |
| | | { |
| | | $checker = Checker::getInstance(); |
| | | |
| | | $taxonomies = []; |
| | | |
| | | foreach ($content as $contentType) { |
| | | $contentTaxonomies = $checker->getTaxonomiesForContent($contentType); |
| | | $registrar = Registrar::getInstance($contentType); |
| | | |
| | | $contentTaxonomies = $registrar->registrar->taxonomies; |
| | | $contentTaxonomies = array_filter($contentTaxonomies, function($taxonomy) { |
| | | return array_key_exists('show_feed', JVB_TAXONOMY[$taxonomy]) && JVB_TAXONOMY[$taxonomy]['show_feed']; |
| | | return Registrar::getInstance($taxonomy)->hasFeature('show_feed'); |
| | | }); |
| | | $taxonomies = array_merge($taxonomies, $contentTaxonomies); |
| | | } |
| | |
| | | <span class="label">FILTER BY:</span> |
| | | |
| | | <?php |
| | | $checker = Checker::getInstance(); |
| | | foreach ($this->config['taxonomies'] as $tax) : |
| | | $taxConfig = JVB_TAXONOMY[$tax] ?? null; |
| | | if (!$taxConfig) continue; |
| | | $registrar = Registrar::getInstance($tax)??false; |
| | | if (!$registrar) continue; |
| | | |
| | | $contentForTax = $checker->getContentForTaxonomy($tax); |
| | | $contentForTax = $registrar->registrar->for; |
| | | $hidden = empty($contentForTax) ? ' hidden' : ''; |
| | | |
| | | $taxSelector = new TaxonomySelector( |
| | | 'feed-'.$tax, |
| | | $tax, |
| | | [ |
| | | 'icon' => $taxConfig['icon']??jvbLogoIcon(), |
| | | 'icon' => $registrar->getIcon()??jvbLogoIcon(), |
| | | 'update' => '.selected-items-section .selected-items', |
| | | 'types' => $contentForTax, |
| | | 'autocomplete' => false, |
| | |
| | | <?php |
| | | $custom = []; |
| | | foreach ($this->getContent() as $content) { |
| | | $config = JVB_CONTENT[$content]??JVB_TAXONOMY[$content]??JVB_USER[$content]??false; |
| | | if ($config && array_key_exists('custom_order', $config)) { |
| | | $custom = array_merge_recursive($custom, $config['custom_order']); |
| | | $registrar = Registrar::getInstance($content)??false; |
| | | |
| | | if ($registrar && !empty($registrar->config('feed')->getCustomOrder())) { |
| | | $custom = array_merge_recursive($custom, $registrar->config('feed')->getCustomOrder()); |
| | | } |
| | | } |
| | | foreach ($custom as $slug => $conf) { |
| | |
| | | $total = count($this->getContent()) - 1; |
| | | for ($i = 1; $i <= 36; $i++) { |
| | | $rand = rand(0, $total); |
| | | $config = Features::getConfig($this->getContent()[$rand]); |
| | | $icon = jvbIcon($config['icon']??jvbLogoIcon()); |
| | | $config = Registrar::getInstance($this->getContent()[$rand]); |
| | | $icon = jvbIcon($config->getIcon??jvbLogoIcon()); |
| | | ?> |
| | | <div class="placeholder"><?=apply_filters('jvbFeedPlaceholder', $icon) ?></div> |
| | | <?php |
| | |
| | | |
| | | protected function getFavouritesButton(string $content):string |
| | | { |
| | | if (!Features::forSite()->has('favourites') && !Features::forContent($content)->has('favouritable')) { |
| | | $registrar = Registrar::getInstance($content); |
| | | if (!$registrar || !Features::forSite()->has('favourites') || !$registrar->hasFeature('favouritable')) { |
| | | return ''; |
| | | } |
| | | return '<button class="favourite" type="button" title="Add to favourites" data-action="favourite"> |
| | |
| | | } |
| | | protected function getUpvotesButton(string $content):string |
| | | { |
| | | if (!Features::forSite()->has('karma') && !Features::forContent($content)->has('karma')){ |
| | | $registrar = Registrar::getInstance($content); |
| | | if (!Features::forSite()->has('karma') || !$registrar || !$registrar->hasFeature('karma')){ |
| | | return ''; |
| | | } |
| | | return '<div class="karma row"> |
| | |
| | | } |
| | | protected function getDefaultTemplate(string $content): string |
| | | { |
| | | $config = JVB_CONTENT[$content]??[]; |
| | | $hasConfig = array_key_exists('feed', $config); |
| | | $images = ($hasConfig && array_key_exists('images', $config['feed']) ? $config['feed']['images']:['post_thumbnail']); |
| | | $images = (is_array($images)) ? $images : [$images]; |
| | | $fields = ($hasConfig && array_key_exists('fields', $config['feed']) ? $config['feed']['fields']:['post_title', 'post_date']); |
| | | $config = Registrar::getInstance($content)->getConfig('feed'); |
| | | $allFields = Registrar::getFieldsFor($content); |
| | | $images = $config['images']??['post_thumbnail']; |
| | | $fields = $config['fields']??['post_title','post_date','post_excerpt']; |
| | | $fields = array_filter($fields, function($field) use($images) { |
| | | return !in_array($field, $images); |
| | | }); |
| | | $fields = array_filter($allFields, function($field) use($fields) { |
| | | return in_array($field, $fields); |
| | | }, ARRAY_FILTER_USE_KEY); |
| | | $template = '<div class="feed item col '.$content.'">'.$this->getFavouritesButton($content).$this->getUpvotesButton($content); |
| | | |
| | | //Add all defined images, but allow for filtering |
| | |
| | | |
| | | $fieldsTemplate = ''; |
| | | |
| | | foreach ($fields as $fieldName) { |
| | | $fieldType = JVB_CONTENT[$content][$fieldName]['type']??'text'; |
| | | $fieldsTemplate .= apply_filters('jvbFeedItemField', $this->defaultFieldTemplate($fieldType, $fieldName), $content, $fieldName, $fieldType); |
| | | foreach ($fields as $fieldName => $config) { |
| | | $fieldsTemplate .= apply_filters('jvbFeedItemField', $this->defaultFieldTemplate($config['type'], $fieldName), $content, $fieldName, $config['type']); |
| | | } |
| | | $template .= '<div class="item-info">'.apply_filters('jvbFeedItemFields', $fieldsTemplate, $content, $fields).'</div>'; |
| | | $template .= '</details></div>'; |
| | |
| | | <?php |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | |
| | | require(JVB_DIR . '/build/summary/render.php'); |
| | | require(JVB_DIR . '/build/forms/render.php'); |
| | | require(JVB_DIR . '/build/menu/render.php'); |
| | | if (Features::anyContentHas('is_glossary')) { |
| | | if (!empty(Registrar::getFeatured('is_glossary'))) { |
| | | error_log('Has Glossary Type'); |
| | | require(JVB_DIR . '/build/glossary/render.php'); |
| | | } |
| | | if (Features::forSite()->has('faq') || array_key_exists('faq', JVB_CONTENT)) { |
| | | if (Features::forSite()->has('faq')) { |
| | | require(JVB_DIR . '/build/faq/render.php'); |
| | | } |
| | | if (Features::hasIntegration('gmb')) { |
| | |
| | | // ] |
| | | // ); |
| | | // } |
| | | if (Features::anyContentHas('show_directory') || Features::anyTaxonomyHas('show_directory')) { |
| | | if (!empty(Registrar::getFeatured('show_directory'))) { |
| | | register_block_type( |
| | | JVB_DIR . '/build/list', |
| | | [ |
| | |
| | | ]); |
| | | } |
| | | add_filter('block_categories_all', 'jvbRegisterBlockCategory'); |
| | | |
| | | |
| | | /** |
| | | * Enqueue block editor assets |
| | | */ |
| | | function jvbEnqueueBlockEditorAssets():void |
| | | { |
| | | // Only localize for block editor |
| | | if (!is_admin()) { |
| | | return; |
| | | } |
| | | // Localize list types for the block |
| | | wp_localize_script( |
| | | 'jvb-list-editor-script', // This should match your editor script handle |
| | | 'jvbListTypes', |
| | | jvbGlobalDirectoryInfo() |
| | | ); |
| | | } |
| | | add_action('enqueue_block_editor_assets', 'jvbEnqueueBlockEditorAssets'); |
| | |
| | | |
| | | use JVBase\managers\Cache; |
| | | use JVBase\meta\Meta; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use WP_Block; |
| | | |
| | |
| | | public function render(array $attributes, string $content, WP_Block $block) |
| | | { |
| | | global $post; |
| | | if (!$post || !Features::forContent(jvbNoBase($post->post_type))->has('is_timeline') ) { |
| | | $registrar = Registrar::getInstance($post->post_type)); |
| | | if (!$post || !$registrar || !$registrar->hasFeature('is_timeline') ) { |
| | | return ''; |
| | | } |
| | | $this->parentID = $post->ID; |
| | |
| | | if ($value === '' || $slug === 'person') { |
| | | continue; |
| | | } |
| | | $config = JVB_TAXONOMY[$slug]; |
| | | $registrar = Registrar::getInstance($slug); |
| | | $taxSlug = jvbCheckBase($slug); |
| | | $terms = get_the_terms($this->parentID, $taxSlug); |
| | | if ($terms && !is_wp_error($terms)) { |
| | | $many = count($terms) > 1; |
| | | ?> |
| | | <li class="<?=$slug?>"> |
| | | <span title="<?= $config['singular']?>" class="term tldr" data-short="" data-long="<?= $config['singular']?>"> |
| | | <?=jvbIcon($config['icon']??jvbDefaultIcon())?> |
| | | <span title="<?= $registrar->getSingular()?>" class="term tldr" data-short="" data-long="<?= $registrar->getSingular()?>"> |
| | | <?=jvbIcon($registrar->getIcon())?> |
| | | <span></span> |
| | | </span> |
| | | <?php |
| | |
| | | return ''; |
| | | } |
| | | $out = '<ul class="term-list">'; |
| | | $registrar = Registrar::getInstance('timeline'); |
| | | foreach ($timeline as $term) { |
| | | $link = get_term_link($term->term_id, BASE.'timeline'); |
| | | $out .= '<li><a href="'.$link.'" rel="tag" title="See more progressions at this timeline">'.jvbIcon(JVB_TAXONOMY['timeline']['icon']??'hourglass').html_entity_decode($term->name).'</a><small>after the treatment</small></li>'; |
| | | $out .= '<li><a href="'.$link.'" rel="tag" title="See more progressions at this timeline">'.jvbIcon($registrar->getIcon('hourglass')).html_entity_decode($term->name).'</a><small>after the treatment</small></li>'; |
| | | } |
| | | $out .='</ul>'; |
| | | return $out; |
| | |
| | | <?php |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | |
| | | //require(JVB_DIR . '/inc/blocks/RegisterBlocks.php'); |
| | |
| | | new JVBase\blocks\MenuBlock(); |
| | | } |
| | | |
| | | if (Features::forSite()->has('faq') || array_key_exists('faq', JVB_CONTENT)) { |
| | | if (Features::forSite()->has('faq')) { |
| | | require(JVB_DIR . '/inc/blocks/FAQBlock.php'); |
| | | new JVBase\blocks\FAQBlock(); |
| | | } |
| | | |
| | | |
| | | if (Features::anyContentHas('is_gallery')) { |
| | | if (!empty(Registrar::getFeatured('is_gallery'))) { |
| | | require(JVB_DIR . '/inc/blocks/GlossaryBlock.php'); |
| | | new JVBase\blocks\GlossaryBlock(); |
| | | } |
| | | if (Features::anyContentHas('is_timeline')) { |
| | | if (!empty(Registrar::getFeatured('is_timeline'))) { |
| | | require(JVB_DIR . '/inc/blocks/TimelineBlock.php'); |
| | | new JVBase\blocks\TimelineBlock(); |
| | | } |
| | |
| | | // ] |
| | | // ); |
| | | // } |
| | | if (Features::anyContentHas('show_directory') || Features::anyTaxonomyHas('show_directory')) { |
| | | if (!empty(Registrar::getFeatured('show_directory'))) { |
| | | register_block_type( |
| | | JVB_DIR . '/build/list', |
| | | [ |
| | |
| | | <?php |
| | | namespace JVBase\forms; |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use WP_Term; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | |
| | | protected string $base; |
| | | protected string $title; |
| | | protected array $config; |
| | | protected Registrar $registrar; |
| | | |
| | | public function __construct(string $id, string $taxonomy, array $config = []) { |
| | | $this->id = sanitize_key($id); |
| | | $this->taxonomy = jvbCheckBase($taxonomy); |
| | | $this->name = jvbNoBase($taxonomy); |
| | | |
| | | $this->title = JVB_TAXONOMY[$this->name]['plural']; |
| | | $registrar = Registrar::getInstance($this->name); |
| | | if ($registrar) { |
| | | $this->registrar = $registrar; |
| | | } |
| | | |
| | | $this->title = $registrar->getPlural(); |
| | | $this->base = $config['base']??''; |
| | | $this->config = wp_parse_args($config, [ |
| | | 'types' => false, // for feed block implementation |
| | |
| | | 'update' => true, // Whether to update on close |
| | | ]); |
| | | |
| | | $this->plural = JVB_TAXONOMY[$taxonomy]['plural']; |
| | | $this->singular = JVB_TAXONOMY[$taxonomy]['singular']; |
| | | $this->plural = $registrar->getPlural(); |
| | | $this->singular = $registrar->getSingular(); |
| | | } |
| | | |
| | | |
| | |
| | | { |
| | | return sprintf( |
| | | '<button type="button" data-icon="%s" data-filter="taxonomy" data-taxonomy="%s" data-type="selector" data-single="%s" data-plural="%s" title="Filter by %s">%s<span class="label">%s</span></button>', |
| | | JVB_TAXONOMY[$this->name]['icon'], |
| | | $this->registrar->getIcon(), |
| | | $this->name, |
| | | $this->singular, |
| | | $this->plural, |
| | | $this->singular, |
| | | jvbIcon($this->config['icon']), |
| | | jvbIcon($this->registrar->getIcon()), |
| | | $this->singular |
| | | ); |
| | | } |
| | |
| | | require(JVB_DIR . '/inc/helpers/media.php'); |
| | | require(JVB_DIR . '/inc/helpers/members.php'); |
| | | require(JVB_DIR . '/inc/helpers/renderFields.php'); |
| | | require(JVB_DIR . '/inc/helpers/saveFields.php'); |
| | | //require(JVB_DIR . '/inc/helpers/saveFields.php'); |
| | | require(JVB_DIR . '/inc/helpers/terms.php'); |
| | | require(JVB_DIR . '/inc/helpers/time.php'); |
| | | require(JVB_DIR . '/inc/helpers/ui.php'); |
| | | //require(JVB_DIR . '/inc/helpers/umami.php'); |
| | | |
| | | add_action('init', 'jvb_do_once'); |
| | | add_action('wp_loaded', 'jvb_do_once',99); |
| | | /** |
| | | * Helper to do things once |
| | | * @return void |
| | |
| | | |
| | | // delete_option(BASE.'do_these_once'); |
| | | $options = get_option(BASE.'do_these_once', []); |
| | | |
| | | foreach ($options as $option => $callback) { |
| | | // delete_option($option); |
| | | if (!get_option($option, false)) { |
| | |
| | | } |
| | | } |
| | | |
| | | function jvb_register_do_once(string $option, array $callback) |
| | | function jvb_register_do_once(string $option, array|string $callback):void |
| | | { |
| | | // delete_option(BASE.'do_these_once'); |
| | | //Ensure we have the option starting with BASE |
| | | $option = (str_starts_with($option, BASE)) ? $option : BASE.$option; |
| | | $option = jvbCheckBase($option); |
| | | $options = get_option(BASE.'do_these_once', []); |
| | | // delete_option($option); |
| | | if (!array_key_exists($option, $options)) { |
| | |
| | | |
| | | use JVBase\managers\Cache; |
| | | use JVBase\meta\Form; |
| | | use JVBase\registrar\Registrar; |
| | | |
| | | /** |
| | | * For whatever reason, after much testing, it seems that |
| | |
| | | } |
| | | |
| | | /** |
| | | * @deprecated use CRUDManager.php or CRUDSkeleton.php |
| | | * Outputs the blocks of a CRUD management in backend |
| | | * Mainly used in news.php so far |
| | | * @param string $content |
| | |
| | | $nav .= '</nav>'; |
| | | echo $nav; |
| | | |
| | | $fields = jvbGetFields($postType); |
| | | $fields = Registrar::getFieldsFor($postType); |
| | | ?> |
| | | <form class="jvb-form" id="bio" data-form-id="bio-<?=$ID?>" data-save="bio" |
| | | data-object-id="<?=$ID?>" data-content-type="<?=$postType?>"> |
| | |
| | | <?php |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | |
| | | array_map(function ($role) { |
| | | return BASE.$role; |
| | | }, |
| | | jvbRolesWithDashboard()) |
| | | Registrar::getFeatured('has_dashboard', 'user')) |
| | | ) |
| | | )>0; |
| | | } |
| | | |
| | | /** |
| | | * The basis for the dashboard navigation |
| | | * @return array |
| | | */ |
| | | function jvbGetUserDashboardPages():array |
| | | { |
| | | if (!isOurPeople() && !current_user_can('manage_options')) { |
| | | return []; |
| | | } |
| | | $user = wp_get_current_user(); |
| | | $pages = get_transient('jvb_'.$user->ID.'_dashboard_pages'); |
| | | $pages = false; |
| | | if (!$pages) { |
| | | $pages = ['dash']; |
| | | $roles = array_intersect( |
| | | jvbRolesWithDashboard(), |
| | | array_map(function ($role) { |
| | | return jvbNoBase($role); |
| | | }, |
| | | $user->roles) |
| | | ); |
| | | |
| | | $content = []; |
| | | |
| | | foreach ($roles as $role) { |
| | | $content = array_unique(array_merge(jvbRolePages($role), $content)); |
| | | } |
| | | error_log('Content: '.print_r($content, true)); |
| | | foreach ($content as $c) { |
| | | |
| | | $permission = JVB_CONTENT[$c]['plural']??$c.'s'; |
| | | if (current_user_can('edit_'.$permission)) { |
| | | $pages[] = $c; |
| | | } |
| | | } |
| | | |
| | | |
| | | if (jvbCheck('can_invite', JVB_MEMBERSHIP) && jvbUserIsVerified()) { |
| | | $pages[] = 'invites'; |
| | | } |
| | | if (jvbCheck('term_approval', JVB_MEMBERSHIP) && jvbUserIsVerified()) { |
| | | $pages[] = 'approvals'; |
| | | } |
| | | if (jvbSiteHasTermContent()) { |
| | | $terms = array_filter(JVB_TAXONOMY, function ($tax) { |
| | | return jvbCheck('is_content', $tax); |
| | | }); |
| | | foreach ($terms as $term => $config) { |
| | | if (current_user_can('manage_'.$term)) { |
| | | $pages[] = $config['plural']; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (jvbSiteHasIntegrations()) { |
| | | //TODO: Check that user has integrations enabled |
| | | $pages[] = 'integrations'; |
| | | } |
| | | if (jvbSiteHasForum() && |
| | | (empty(JVB_MEMBERSHIP['member_only']??[]) || array_intersect(JVB_MEMBERSHIP['member_only'], $roles) > 0)) { |
| | | $pages[] = 'news'; |
| | | } |
| | | |
| | | if (jvbCheck('member_content', JVB_MEMBERSHIP) && jvbUserCanCreate()) { |
| | | $pages[] = 'metrics'; |
| | | } |
| | | |
| | | if (jvbCheck('favourites', JVB_SITE)) { |
| | | $pages[] = 'favourites'; |
| | | } |
| | | |
| | | if (jvbSiteHasSupport()) { |
| | | $pages[] = 'support'; |
| | | } |
| | | $pages = apply_filters('jvbUserDashboardPages', $pages, $user->roles); |
| | | set_transient('jvb_'.$user->ID.'_dashboard_pages', $pages, WEEK_IN_SECONDS); |
| | | } |
| | | |
| | | return $pages; |
| | | } |
| | | |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | $role = jvbUserRole((int) $link); |
| | | $config = JVB_USER[$role]; |
| | | foreach ($config['can_create'] as $type) { |
| | | if (is_array($type)) { |
| | | $types = array_unique(array_merge($types, array_values($type)[0])); |
| | | } else { |
| | | $types[] = $type; |
| | | } |
| | | } |
| | | $registrar = Registrar::getInstance($role); |
| | | if ($registrar && !empty($registrar->getCreatable())){ |
| | | foreach ($registrar->getCreatable() as $type) { |
| | | if (is_array($type)) { |
| | | $types = array_unique(array_merge($types, array_values($type)[0])); |
| | | } else { |
| | | $types[] = $type; |
| | | } |
| | | } |
| | | } |
| | | |
| | | $temp = []; |
| | | foreach ($types as $t) { |
| | | $permission = JVB_CONTENT[$t]['plural']??$t.'s'; |
| | | if (user_can($link, 'edit_'.$permission)){ |
| | | $permission = JVB()->roles()->getPermission('edit',$t); |
| | | if (user_can($link, $permission)){ |
| | | $temp[] = $t; |
| | | } |
| | | } |
| | | |
| | | global $jvb_feed; |
| | | $types = array_filter($temp, function ($type) use ($jvb_feed) { |
| | | return array_key_exists($type, $jvb_feed); |
| | | $types = Registrar::getFeatured('show_feed'); |
| | | $types = array_filter($temp, function ($type) use ($types) { |
| | | return in_array($type, $types); |
| | | }); |
| | | |
| | | update_post_meta($postID, BASE.'content_types', $types); |
| | |
| | | } |
| | | |
| | | /** |
| | | * Clear taxonomy list caches when terms are saved |
| | | * @param int $term_id |
| | | * @param int $tt_id |
| | | * @param string $taxonomy |
| | | * |
| | | * @return void |
| | | */ |
| | | add_action('edited_term', 'jvbClearTermListCache', 10, 3); |
| | | add_action('created_term', 'jvbClearTermListCache', 10, 3); |
| | | add_action('delete_term', 'jvbClearTermListCache', 10, 3); |
| | | |
| | | function jvbClearTermListCache(int $term_id, int $tt_id, string $taxonomy):void |
| | | { |
| | | // Check if this taxonomy has a corresponding list |
| | | $types = jvbGlobalDirectoryInfo(); |
| | | foreach ($types as $type) { |
| | | if ($type['slug'] === $taxonomy) { |
| | | // Delete the option to force regeneration |
| | | delete_option(BASE . $type['slug'] . '_list'); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // If this is a city and it's linked to other taxonomies, clear those too |
| | | if ($taxonomy === BASE.'city') { |
| | | foreach ($types as $type) { |
| | | if (!empty($type['links']) && in_array(BASE.'_city', $type['links'])) { |
| | | delete_option(BASE . $type['slug'] . '_list'); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Clear list caches when post types are saved |
| | | */ |
| | | add_action('save_post', 'jvbClearListCache', 10, 2); |
| | | function jvbClearListCache(int $post_id, \WP_Post $post):void |
| | | { |
| | | // SAFETY: Skip attachments and other non-content post types |
| | | if (in_array($post->post_type, jvbIgnoredPostTypes())) { |
| | | return; |
| | | } |
| | | if (jvbNoSaveIt($post_id, $post)) { |
| | | return; |
| | | } |
| | | |
| | | // Get post type |
| | | $post_type = get_post_type($post_id); |
| | | |
| | | // Check if this post type has a corresponding list |
| | | $types = jvbGlobalDirectoryInfo(); |
| | | foreach ($types as $type) { |
| | | if ($type['slug'] === $post_type) { |
| | | // Delete the option to force regeneration |
| | | delete_option(BASE . $type['slug'] . '_list'); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * @param int $artistID |
| | | * @param string $taxonomy |
| | | * |
| | |
| | | */ |
| | | function jvbNotificationMenu():string |
| | | { |
| | | if (jvbSiteHasNotifications() && is_user_logged_in()) { |
| | | if (Features::forMembership()->has('notifications') && is_user_logged_in()) { |
| | | |
| | | ob_start(); |
| | | ?> |
| | |
| | | } |
| | | } |
| | | |
| | | public function getAdditionalFields(?string $content_type = null):array |
| | | { |
| | | return array_combine( |
| | | array_map(fn($k) => 'hc_' . $k, array_keys($this->getHelcimMeta($content_type))), |
| | | $this->getHelcimMeta($content_type) |
| | | ); |
| | | } |
| | | |
| | | /** |
| | | * Get Helcim product meta fields by type. |
| | | * |
| | | * Used by FieldRegistry when 'use_helcim' => true is set |
| | | * in a JVB_CONTENT definition. |
| | | * Used by Registrar.php when helcim is configured |
| | | */ |
| | | public function getHelcimMeta(?string $type = null): array |
| | | { |
| | |
| | | use JVBase\meta\Form; |
| | | use JVBase\meta\Meta; |
| | | use JVBase\managers\ErrorHandler; |
| | | use JVBase\registrar\helpers\AddIntegrationFields; |
| | | use JVBase\registrar\Registrar; |
| | | use WP_Error; |
| | | use WP_Post; |
| | | use WP_REST_Request; |
| | |
| | | 'test_connection' => 'Test Connection', |
| | | ]; |
| | | |
| | | protected array $allowedContent = []; |
| | | |
| | | /** |
| | | * Caching Configuration |
| | |
| | | 'update' => false, // Can update already-shared posts |
| | | 'delete' => false, // Can remove posts from the service |
| | | ]; |
| | | protected array $syncPostTypes = []; // Post types that can be synced (e.g., ['artwork', 'tattoo']): usually built by querying the global JVB_CONTENT if the integration name exists as a key in [ 'integrations' => []] |
| | | protected array $syncTaxonomies = []; // Post types that can be synced (e.g., ['artwork', 'tattoo']): usually built by querying the global JVB_CONTENT if the integration name exists as a key in [ 'integrations' => []] |
| | | protected array $syncPostTypes = []; // Post types that can be synced (e.g., ['artwork', 'tattoo']): usually built by Registrar.php if the integration name exists as a key in [ 'integrations' => []] |
| | | protected array $syncTaxonomies = []; // Post types that can be synced (e.g., ['artwork', 'tattoo']): usually built by Registrar.php if the integration name exists as a key in [ 'integrations' => []] |
| | | protected array $contentTypes = []; // Integration's available content types. Set by child classes' getContentTypes |
| | | protected bool $has_content = false; // Whether integration has content that can sync |
| | | /** |
| | |
| | | $postTypes = get_option($key, false); |
| | | if (!$postTypes) { |
| | | $postTypes = []; |
| | | |
| | | // Get from JVB_CONTENT |
| | | |
| | | foreach (JVB_CONTENT as $type => $config) { |
| | | if (array_key_exists('integrations', $config) && array_key_exists($this->service_name, $config['integrations'])) { |
| | | $postTypes[] = $type; |
| | | foreach (Registrar::getRegistered('post') as $registrar) { |
| | | $registrar = Registrar::getInstance($registrar); |
| | | if ($registrar->hasIntegration($this->service_name)) { |
| | | $postTypes[] = $registrar->getSlug(); |
| | | } |
| | | } |
| | | |
| | |
| | | if (!$taxonomies) { |
| | | // Combine both content and taxonomy filtering |
| | | $taxonomies = []; |
| | | // Get from JVB_TAXONOMY (content taxonomies) |
| | | foreach (JVB_TAXONOMY as $type => $config) { |
| | | if (jvbCheck('is_content', $config) && |
| | | isset($config['integrations'][$this->service_name])) { |
| | | $taxonomies[] = $type; |
| | | foreach (Registrar::getFeatured('is_content', 'term') as $registrar) { |
| | | if ($registrar->hasIntegration($this->service_name)) { |
| | | $taxonomies[] = $registrar->getSlug(); |
| | | } |
| | | } |
| | | |
| | |
| | | */ |
| | | public function handleSavePost(int $postID, WP_Post $post, bool $update): void |
| | | { |
| | | if (jvbNoSaveIt($postID, $post)) { |
| | | if (!$postID || $postID === 0) { |
| | | return; |
| | | } |
| | | $postType = jvbNoBase($post->post_type); |
| | | |
| | | if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; |
| | | if (wp_is_post_revision($postID)) return; |
| | | |
| | | $registrar = Registrar::getInstance($postType); |
| | | if (!$registrar){ |
| | | return; |
| | | } |
| | | |
| | | if (empty($this->syncPostTypes)) { |
| | | return; |
| | | } |
| | | |
| | | $config = JVB_CONTENT[jvbNoBase($post->post_type)]??null; |
| | | if (!$config) { |
| | | return; |
| | | } |
| | | |
| | | $settings = $config['integrations'][$this->service_name]??null; |
| | | $settings = $registrar->hasIntegration($this->service_name)??null; |
| | | if (!$settings) { |
| | | return; |
| | | } |
| | | |
| | | $settings = $registrar->getIntegrationConfig($this->service_name); |
| | | if (!$settings){ |
| | | return; |
| | | } |
| | | |
| | | |
| | | $fields = $this->getSyncFields($postID, 'post', ['schedule_'.$this->service_name]); |
| | | if (!$fields['share_to_'.$this->service_name]) { |
| | | return; |
| | |
| | | if (!in_array($noBase, $this->syncTaxonomies)) { |
| | | return; |
| | | } |
| | | // Check if taxonomy is content-type |
| | | $config = JVB_TAXONOMY[$noBase] ?? null; |
| | | if (!$config || !($config['is_content'] ?? false)) { |
| | | $registrar = Registrar::getInstance($noBase); |
| | | if (!$registrar->hasFeature('is_content')) { |
| | | return; |
| | | } |
| | | |
| | | $settings = $config['integrations'][$this->service_name] ?? null; |
| | | |
| | | $settings = $registrar->getIntegrationConfig($this->service_name); |
| | | if (!$settings) { |
| | | return; |
| | | } |
| | |
| | | echo Form::render($name, null, $config); |
| | | } |
| | | foreach ($this->syncPostTypes as $type) { |
| | | $config = JVB_CONTENT[$type]; |
| | | $registrar = Registrar::getInstance($type); |
| | | |
| | | $icon = $registrar->getIcon(); |
| | | $icon = $icon === '' ? jvbDefaultIcon() : $icon; |
| | | ?> |
| | | <details> |
| | | <summary><?= jvbIcon($config['icon']) ?><?= $config['singular']?> Defaults</summary> |
| | | <summary><?= jvbIcon($icon) ?><?= $registrar->getSingular()?> Defaults</summary> |
| | | <?php |
| | | $fields = new \JVBase\registry\providers\IntegrationFieldProvider(); |
| | | $fields = $fields->getIntegrationFields($this->service_name, $config); |
| | | $fields = new AddIntegrationFields($this->service_name); |
| | | $fields = $fields->getIntegrationFields(); |
| | | foreach($fields as $name=>$c) { |
| | | $c['required'] = false; |
| | | if ($c['type'] === 'number') { |
| | |
| | | $enabled = get_option($key); |
| | | if (!$enabled) { |
| | | $enabled = []; |
| | | foreach (array_merge(JVB_CONTENT, JVB_TAXONOMY) as $content => $config) { |
| | | if (!array_key_exists('integrations', $config)) { |
| | | foreach (Registrar::getRegistered() as $registrar) { |
| | | $registrar = Registrar::getInstance($registrar); |
| | | if (!$registrar->hasIntegration($this->service_name)) { |
| | | continue; |
| | | } |
| | | if (!array_key_exists($this->service_name, $config['integrations'])) { |
| | | $type = $registrar->getIntegration($this->service_name)->getContent_type(); |
| | | if (!$type) { |
| | | continue; |
| | | } |
| | | if (!array_key_exists('content_type', $config['integrations'][$this->service_name])) { |
| | | continue; |
| | | } |
| | | $type = $config['integrations'][$this->service_name]['content_type']; |
| | | |
| | | if (!in_array($type, $enabled)) { |
| | | $enabled[] = $type; |
| | | } |
| | |
| | | { |
| | | $this->token_refresh_attempted = false; |
| | | } |
| | | |
| | | public function getAllowedContent():array |
| | | { |
| | | return $this->allowedContent; |
| | | } |
| | | |
| | | /** |
| | | * Used by JVBase\registrar\helpers\AddIntegrationFields.php |
| | | * @return array |
| | | */ |
| | | public function getAdditionalFields(?string $content_type = null):array |
| | | { |
| | | return []; |
| | | } |
| | | } |
| | |
| | | use JVBase\meta\Form; |
| | | use JVBase\meta\Meta; |
| | | use Exception; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\registry\PostTypeRegistrar; |
| | | use WP_Error; |
| | | use JVBase\ui\Checkout; |
| | |
| | | */ |
| | | protected function getVariationMapping(string $post_type): array |
| | | { |
| | | $product_type = JVB_CONTENT[jvbNoBase($post_type)]['integrations']['square']['content_type'] ?? 'REGULAR'; |
| | | $registrar = Registrar::getInstance($post_type)); |
| | | if (!$registrar) { |
| | | return []; |
| | | } |
| | | $config = $registrar->getIntegrationConfig($this->service_name); |
| | | $product_type = $config['content_type']??'REGULAR'; |
| | | $valid_fields = $this->getValidFieldsForProductType($product_type); |
| | | |
| | | $defaults = [ |
| | |
| | | */ |
| | | protected function getFieldMapping(string $post_type): array |
| | | { |
| | | $product_type = JVB_CONTENT[jvbNoBase($post_type)]['integrations']['square']['content_type'] ?? 'REGULAR'; |
| | | $registrar = Registrar::getInstance($post_type)); |
| | | if (!$registrar) { |
| | | return []; |
| | | } |
| | | $config = $registrar->getIntegrationConfig($this->service_name); |
| | | $product_type = $config['content_type']??'REGULAR'; |
| | | $valid_fields = $this->getValidFieldsForProductType($product_type); |
| | | |
| | | $defaults = [ |
| | |
| | | public function trackUserLogin(string $user_login, \WP_User $user): void |
| | | { |
| | | // Check if user has Square integration |
| | | $roles = array_keys(JVB_USER); |
| | | $user_roles = $user->roles; |
| | | |
| | | foreach ($user_roles as $role) { |
| | | if (isset(JVB_USER[$role]['integrations']['square']['is_customer'])) { |
| | | $role = jvbUserRole($user->ID); |
| | | $registrar = Registrar::getInstance($role); |
| | | if ($registrar) { |
| | | $config = $registrar->getIntegration($this->service_name); |
| | | if ($config->isCustomer()) { |
| | | $login_count = (int)get_user_meta($user->ID, BASE . '_square_login_count', true); |
| | | $login_count++; |
| | | |
| | |
| | | if ($login_count % self::PASSWORD_RESET_INTERVAL === 0) { |
| | | $this->schedulePasswordReset($user->ID); |
| | | } |
| | | |
| | | break; |
| | | } |
| | | } |
| | | } |
| | |
| | | */ |
| | | private function importSquareItem(array $item): bool|int |
| | | { |
| | | //TODO: We need to add the post type to custom meta for Square, this is not good if we have multiple post types with the same product type |
| | | // Find matching content type |
| | | $product_type = $item['item_data']['product_type'] ?? 'REGULAR'; |
| | | $post_type = null; |
| | | |
| | | foreach (JVB_CONTENT as $key => $config) { |
| | | if (isset($config['integrations']['square']['content_type']) && |
| | | $config['integrations']['square']['content_type'] === $product_type) { |
| | | $post_type = jvbCheckBase($key); |
| | | foreach (Registrar::getRegistered() as $registrar) { |
| | | if (!$registrar->hasIntegration($this->service_name)) { |
| | | continue; |
| | | } |
| | | $config = $registrar->getIntegration($this->service_name); |
| | | if ($config->getContent_type() && $config->getContent_type() === $product_type) { |
| | | $post_type = jvbCheckBase($registrar->getSlug()); |
| | | break; |
| | | } |
| | | |
| | | } |
| | | |
| | | if (!$post_type) { |
| | |
| | | 'GIFT_CARD' => array_merge($this->setGiftCardFields()) |
| | | ]; |
| | | } |
| | | public function getAdditionalFields(?string $content_type = null):array { |
| | | if ($content_type && array_key_exists($content_type, $this->contentTypes)){ |
| | | $array = $this->contentTypes[$content_type]; |
| | | return array_combine( |
| | | array_map(fn($k) => 'sq_' . $k, array_keys($array)), |
| | | $array |
| | | ); |
| | | } else if ($content_type && !array_key_exists($content_type, $this->contentTypes)) { |
| | | error_log('Could not get default fields for '.$this->service_name.' content type: '.$content_type); |
| | | return []; |
| | | } |
| | | $array = $this->setBaseFields(); |
| | | return array_combine( |
| | | array_map(fn($k) => 'sq_' . $k, array_keys($array)), |
| | | $array |
| | | ); |
| | | } |
| | | protected function setBaseFields():array |
| | | { |
| | | return [ |
| | |
| | | <?php |
| | | namespace JVBase\managers; |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use JVBase\rest\Route; |
| | | use JVBase\rest\PermissionHandler; |
| | |
| | | } |
| | | } |
| | | |
| | | public function getMainConfig():array |
| | | { |
| | | return $this->main_page; |
| | | } |
| | | |
| | | /** |
| | | * Render the main settings page |
| | | */ |
| | |
| | | </li> |
| | | <li> |
| | | <span class="status-label">Content Types:</span> |
| | | <span class="status-value"><?= count(JVB_CONTENT); ?> registered</span> |
| | | <span class="status-value"><?= count(Registrar::getRegistered('post')); ?> registered</span> |
| | | </li> |
| | | <li> |
| | | <span class="status-label">Taxonomies:</span> |
| | | <span class="status-value"><?= count(JVB_TAXONOMY); ?> registered</span> |
| | | <span class="status-value"><?= count(Registrar::getRegistered('term')); ?> registered</span> |
| | | </li> |
| | | <?php |
| | | } |
| | |
| | | global $wpdb; |
| | | |
| | | $week_ago = date('Y-m-d H:i:s', strtotime('-7 days')); |
| | | $content_types = []; |
| | | foreach (JVB_CONTENT as $content => $config) { |
| | | $content_types[jvbCheckBase($content)] = $config['plural']; |
| | | } |
| | | $content_types = array_map(function ($type) { return jvbCheckBase($type); }, |
| | | Registrar::getRegistered('post')); |
| | | |
| | | ?> |
| | | <table class="jvb-content-table"> |
| | |
| | | { |
| | | $group = jvbNoBase($group); |
| | | |
| | | if (defined('JVB_CONTENT')) { |
| | | foreach (JVB_CONTENT as $key => $config) { |
| | | if (jvbNoBase($key) === $group) { |
| | | return true; |
| | | } |
| | | $registered = Registrar::getRegistered(); |
| | | foreach ($registered as $r) { |
| | | if ($r === $group) { |
| | | return true; |
| | | } |
| | | } |
| | | |
| | | if (defined('JVB_TAXONOMY')) { |
| | | foreach (JVB_TAXONOMY as $key => $config) { |
| | | if (jvbNoBase($key) === $group) { |
| | | return true; |
| | | } |
| | | } |
| | | } |
| | | |
| | | return false; |
| | | } |
| | | |
| | |
| | | <?php |
| | | namespace JVBase\managers; |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\ui\CRUDSkeleton; |
| | | use JVBase\utility\Features; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | |
| | | class CRUD { |
| | | protected CRUDSkeleton $skeleton; |
| | | protected Cache $cache; |
| | | protected array $config; |
| | | protected string $content; |
| | | protected array $taxonomies = []; |
| | | protected int $user_id; |
| | | protected ?string $type = null; |
| | | protected ?array $constant = null; |
| | | protected Registrar $registrar; |
| | | |
| | | public function __construct(string $content) { |
| | | if (array_key_exists($content, JVB_CONTENT)) { |
| | | $this->type = 'post'; |
| | | $this->constant = JVB_CONTENT; |
| | | } elseif (array_key_exists($content, JVB_TAXONOMY)) { |
| | | $this->type = 'term'; |
| | | $this->constant = JVB_TAXONOMY; |
| | | } elseif (array_key_exists($content, JVB_USER)) { |
| | | $this->type = 'user'; |
| | | $this->constant = JVB_USER; |
| | | } else { |
| | | $this->registrar = Registrar::getInstance($content); |
| | | |
| | | if (!$this->registrar) { |
| | | return; |
| | | } |
| | | |
| | | $this->user_id = get_current_user_id(); |
| | | $this->config = $this->constant[$content]; |
| | | $this->content = $content; |
| | | $this->cache = Cache::for('crud')->connect('post')->connect('taxonomy'); |
| | | |
| | |
| | | protected function configure(): void { |
| | | // Basic info |
| | | $this->skeleton |
| | | ->content($this->content, $this->config['singular'], $this->config['plural']) |
| | | ->content($this->content, $this->registrar->getSingular(), $this->registrar->getPlural()) |
| | | ->title( |
| | | 'Your ' . $this->config['plural'], |
| | | $this->config['page_description'] ?? '' |
| | | $this->registrar->config('dashboard')->getTitle(), |
| | | $this->registrar->config('dashboard')->getDescription()?? '' |
| | | ); |
| | | |
| | | // Initialize meta |
| | | $this->skeleton->addSearch(); |
| | | |
| | | // Timeline if applicable |
| | | if (Features::forContent($this->content)->has('is_timeline')) { |
| | | if ($this->registrar && $this->registrar->hasFeature('is_timeline')) { |
| | | $this->skeleton->setTimeline(); |
| | | } |
| | | |
| | | // Fields and sections |
| | | $this->skeleton->setFields($this->config['fields']); |
| | | $this->skeleton->setFields($this->registrar->getFields()); |
| | | |
| | | $sections = array_key_exists('sections', $this->config) ? $this->config['sections'] : []; |
| | | foreach ($sections as $id => $config) { |
| | | $this->skeleton->addSection($id, $config); |
| | | foreach ($this->registrar->getSections() as $config) { |
| | | $this->skeleton->addSection($config['id'], $config); |
| | | } |
| | | |
| | | // Taxonomies |
| | | $this->initTaxonomies(); |
| | | |
| | | // Statuses |
| | | if (Features::forContent($this->content)->has('is_calendar')) { |
| | | if ($this->registrar && $this->registrar->hasFeature('is_calendar')) { |
| | | $this->skeleton->setCalendar(); |
| | | } |
| | | |
| | |
| | | // Capabilities |
| | | $this->skeleton->addCapabilities(['view', 'edit', 'create', 'delete']); |
| | | |
| | | $plural = strtolower($this->config['plural'] ?? $this->content . 's'); |
| | | $plural = strtolower($this->registrar->getPlural() ?? $this->content . 's'); |
| | | $canPublish = jvbUserIsVerified() && user_can($this->user_id, "publish_{$plural}"); |
| | | $this->skeleton->userCanPublish($canPublish); |
| | | |
| | |
| | | $this->skeleton->addBulkActions(['edit', 'publish', 'draft', 'trash']); |
| | | |
| | | // Uploader |
| | | $this->setupUploader(); |
| | | if ($this->registrar->getType() === 'post') { |
| | | $this->setupUploader(); |
| | | } |
| | | |
| | | |
| | | // Sticky fields |
| | | $stuck = ['post_title', 'term_name']; |
| | |
| | | * Setup uploader configuration |
| | | */ |
| | | protected function setupUploader(): void { |
| | | $isSingleImage = jvbCheck('single_image', $this->config); |
| | | |
| | | $isSingleImage = $this->registrar->hasFeature('single_image'); |
| | | |
| | | $config = [ |
| | | 'type' => 'upload', |
| | | 'subtype' => 'image', |
| | | 'mode' => $isSingleImage ? 'direct' : 'selection', |
| | | 'create_new' => true, |
| | | 'label' => $this->config['upload_title'] ?? 'Bulk Upload ' . $this->config['plural'], |
| | | 'label' => $this->registrar->getUploadTitle(), |
| | | 'content' => $this->content, |
| | | 'singular' => $this->config['singular'], |
| | | 'plural' => $this->config['plural'], |
| | | 'singular' => $this->registrar->getSingular(), |
| | | 'plural' => $this->registrar->getPlural(), |
| | | 'multiple' => true, |
| | | 'destination' => $isSingleImage ? 'post' : 'post_group' |
| | | ]; |
| | | |
| | | if (!$isSingleImage) { |
| | | $config['upload_text'] = '<p>Drag images into groups. Each group becomes its own ' . $this->config['singular'] . '.</p> |
| | | $config['upload_text'] = '<p>Drag images into groups. Each group becomes its own ' . $this->registrar->getSingular() . '.</p> |
| | | <p>You can also select multiple images and click the "Add to Group" button.</p> |
| | | <p>If a ' . $this->config['singular'] . ' has multiple images, you can select the ' . jvbDashIcon('star') . ' to set an image as the main one.</p> |
| | | <p>Images left ungrouped will become individual ' . $this->config['plural'] . '</p> |
| | | <p>If a ' . $this->registrar->getSingular() . ' has multiple images, you can select the ' . jvbDashIcon('star') . ' to set an image as the main one.</p> |
| | | <p>Images left ungrouped will become individual ' . $this->registrar->getPlural() . '</p> |
| | | <p>Once finished, click the \'Save Changes\' button to send to server for processing.</p>'; |
| | | } else { |
| | | $config['description'] = 'Each image will become its own ' . $this->config['singular'] . '.'; |
| | | $config['description'] = 'Each image will become its own ' . $this->registrar->getSingular() . '.'; |
| | | } |
| | | |
| | | $this->skeleton->addUploader($config); |
| | |
| | | * Initialize taxonomies from WordPress config |
| | | */ |
| | | protected function initTaxonomies(): void { |
| | | $this->taxonomies = array_filter(JVB_TAXONOMY, function ($config) { |
| | | return in_array($this->content, $config['for_content']); |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * Get statuses - calendar or standard |
| | | */ |
| | | protected function getStatuses(): array { |
| | | return array_key_exists('is_calendar', $this->config) ? |
| | | [ |
| | | 'all' => [ |
| | | 'icon' => 'calendar', |
| | | 'label' => 'Everything', |
| | | ], |
| | | 'future' => [ |
| | | 'label' => 'Upcoming', |
| | | 'icon' => 'clock-clockwise', |
| | | ], |
| | | 'past' => [ |
| | | 'label' => 'Past', |
| | | 'icon' => 'clock-counter-clockwise', |
| | | ], |
| | | 'repeat' => [ |
| | | 'label' => 'Recurring', |
| | | 'icon' => 'repeat', |
| | | ], |
| | | 'draft' => [ |
| | | 'icon' => 'eye-closed', |
| | | 'label' => 'Hidden', |
| | | ], |
| | | 'trash' => [ |
| | | 'label' => 'Scrapped', |
| | | 'icon' => 'trash', |
| | | ], |
| | | ] : |
| | | [ |
| | | 'all' => [ |
| | | 'icon' => 'infinity', |
| | | 'label' => 'Everything', |
| | | ], |
| | | 'publish' => [ |
| | | 'icon' => 'eye', |
| | | 'label' => 'Live', |
| | | ], |
| | | 'draft' => [ |
| | | 'icon' => 'eye-closed', |
| | | 'label' => 'Hidden', |
| | | ], |
| | | 'trash' => [ |
| | | 'label' => 'Scrapped', |
| | | 'icon' => 'trash', |
| | | ], |
| | | ]; |
| | | $this->taxonomies = $this->registrar->registrar->taxonomies; |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | public function createItem(array $actions): array { |
| | | $actions[] = [ |
| | | 'button' => '<button type="button" class="create-item row" title="Create New ' . $this->config['singular'] . '">' |
| | | 'button' => '<button type="button" class="create-item row" title="Create New ' . $this->registrar->getSingular() . '">' |
| | | . jvbDashIcon('plus-square') |
| | | . '<span class="screen-reader-text">Create New ' . $this->config['singular'] . '</span></button>', |
| | | . '<span class="screen-reader-text">Create New ' . $this->registrar->getSingular() . '</span></button>', |
| | | 'content' => '', // Modal is rendered by skeleton |
| | | ]; |
| | | |
| | |
| | | { |
| | | protected \wpdb $wpdb; |
| | | protected string $tableName; |
| | | protected string $definition; |
| | | protected string $fullTableName; |
| | | protected bool $useTransactions; |
| | | protected array $columns; |
| | | protected array $keys = []; |
| | | protected array $constraints =[]; |
| | | |
| | | /** @var array<string, self> Instance cache for fluent interface */ |
| | | protected static array $instances = []; |
| | | protected static string $charsetCollate; |
| | | |
| | | protected static string $userTable; |
| | | protected static string $userIDType; |
| | | protected static string $termIDType; |
| | | protected static string $postIDType; |
| | | |
| | | /** |
| | | * Fluent factory method |
| | |
| | | self::$instances[$tableName] = new self($tableName); |
| | | } |
| | | |
| | | |
| | | return self::$instances[$tableName]; |
| | | } |
| | | |
| | | public function ensureDefined() { |
| | | $this->ensureUserTable(); |
| | | $this->ensureUserIDType(); |
| | | $this->ensureTermIDType(); |
| | | $this->ensurePostIDType(); |
| | | } |
| | | protected function ensureUserTable():void |
| | | { |
| | | if (!isset(static::$userTable)) { |
| | | static::$userTable = is_multisite() ? $this->getMultisiteUsersTable() : $this->wpdb->users; |
| | | } |
| | | } |
| | | protected function getMultisiteUsersTable():string |
| | | { |
| | | $siteUsersTable = $this->wpdb->prefix . 'users'; |
| | | $siteExists = $this->wpdb->get_var( |
| | | $this->wpdb->prepare("SHOW TABLES LIKE %s", $siteUsersTable) |
| | | ); |
| | | if ($siteExists) { |
| | | return $siteUsersTable; |
| | | } |
| | | //fallback to main one |
| | | return $this->wpdb->users; |
| | | } |
| | | protected function ensureUserIDType():void |
| | | { |
| | | if (!isset(static::$userIDType)) { |
| | | $this->ensureUserTable(); |
| | | static::$userIDType = $this->getColumnType(static::$userTable, 'ID'); |
| | | } |
| | | } |
| | | |
| | | protected function ensureTermIDType():void |
| | | { |
| | | if (!isset(static::$termIDType)) { |
| | | static::$termIDType = $this->getColumnType($this->wpdb->terms, 'term_id'); |
| | | } |
| | | } |
| | | |
| | | protected function ensurePostIDType():void |
| | | { |
| | | if (!isset(static::$postIDType)) { |
| | | static::$postIDType = $this->getColumnType($this->wpdb->posts, 'ID'); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * |
| | | * @param array $columns An array of $columnName => $columnDefinition |
| | | * @return $this |
| | | */ |
| | | public function setColumns(array $columns):self |
| | | { |
| | | $this->columns = $columns; |
| | | return $this; |
| | | } |
| | | |
| | | /** |
| | | * @param array $keys An array of {string} $keys. If a $key is an array, you can define a custom $key => $value, example: 'UNIQUE' => $value, or 'PRIMARY' => $value |
| | | * @return $this |
| | | */ |
| | | public function setKeys(array $keys):self |
| | | { |
| | | $this->keys = $keys; |
| | | return $this; |
| | | } |
| | | |
| | | /** |
| | | * @param array $constraints an array of arrays, each value a $constraint => $references |
| | | * @return $this |
| | | */ |
| | | public function setConstraints(array $constraints):self |
| | | { |
| | | $this->constraints = $constraints; |
| | | return $this; |
| | | } |
| | | |
| | | public function defineTable(): self |
| | | { |
| | | if (empty($this->columns)) { |
| | | error_log('[CustomTable] No columns defined for ' . $this->tableName); |
| | | return $this; |
| | | } |
| | | |
| | | $parts = []; |
| | | |
| | | // Columns |
| | | foreach ($this->columns as $name => $type) { |
| | | $parts[] = "`{$name}` {$type}"; |
| | | } |
| | | |
| | | // Keys |
| | | if (empty($this->keys)) { |
| | | $parts[] = 'PRIMARY KEY (`' . array_key_first($this->columns) . '`)'; |
| | | } else { |
| | | foreach ($this->keys as $key) { |
| | | if (is_array($key)) { |
| | | $value = $key['value']; |
| | | // Ensure value is wrapped in parentheses |
| | | if (!str_starts_with(trim($value), '(')) { |
| | | $value = '(`' . $value . '`)'; |
| | | } |
| | | $parts[] = $key['key'] . ' KEY ' . $value; |
| | | } else { |
| | | $parts[] = 'KEY ' . $key; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // Constraints |
| | | foreach ($this->constraints as $constraint => $references) { |
| | | $parts[] = "CONSTRAINT {$constraint} REFERENCES {$references}"; |
| | | } |
| | | |
| | | $this->definition = "(\n " . implode(",\n ", $parts) . "\n)"; |
| | | return $this; |
| | | } |
| | | |
| | | public static function ensureTables():void |
| | | { |
| | | require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); |
| | | |
| | | foreach (self::$instances as $instance) { |
| | | if (!$instance->wpdb->get_var("SHOW TABLES LIKE '{$instance->fullTableName}'")) { |
| | | $instance->createTable(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | protected function createTable():void |
| | | { |
| | | if (!$this->definition && empty($this->definition)) { |
| | | error_log('[CustomTable]No definition set for '.$this->tableName); |
| | | return; |
| | | } |
| | | $charset = self::$charsetCollate; |
| | | $schema = "CREATE TABLE IF NOT EXISTS {$this->fullTableName} {$this->definition} {$charset}"; |
| | | $this->wpdb->flush(); |
| | | |
| | | $hasForeignKey = stripos($schema, 'FOREIGN KEY') !== false; |
| | | if ($hasForeignKey) { |
| | | $result = $this->wpdb->query($schema); |
| | | $success = ($result !== false && !$this->wpdb->last_error); |
| | | } else { |
| | | dbDelta($schema.';'); |
| | | $success = !$this->wpdb->last_error; |
| | | } |
| | | |
| | | if (!$success) { |
| | | $error_msg = "SQL Error creating table {$this->tableName}: " . $this->wpdb->last_error; |
| | | error_log($error_msg); |
| | | error_log("Failed SQL Query: " . $schema); |
| | | } elseif ($this->wpdb->get_var("SHOW TABLES LIKE '{$this->fullTableName}'")) { |
| | | error_log("Successfully created table: {$this->fullTableName}"); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Clear instance cache (useful for testing) |
| | | */ |
| | |
| | | global $wpdb; |
| | | $this->wpdb = $wpdb; |
| | | $this->tableName = $tableName; |
| | | $this->fullTableName = $wpdb->prefix . BASE . $tableName; |
| | | $this->fullTableName = $wpdb->prefix . apply_filters('jvb_base', BASE) . $tableName; |
| | | $this->useTransactions = $useTransactions; |
| | | |
| | | $usersStatus = $this->wpdb->get_row("SHOW TABLE STATUS LIKE '{$this->wpdb->users}'"); |
| | | $parentCollation = $usersStatus->Collation ?? 'utf8mb4_general_ci'; |
| | | self::$charsetCollate = "DEFAULT CHARACTER SET utf8mb4 COLLATE {$parentCollation}"; |
| | | |
| | | } |
| | | |
| | | // ========================================================================= |
| | |
| | | return $this->wpdb->rows_affected; |
| | | } |
| | | |
| | | public function getUserIDType():string |
| | | { |
| | | $this->ensureUserIdType(); |
| | | return static::$userIDType; |
| | | } |
| | | public function getUserTable():string |
| | | { |
| | | $this->ensureUserTable(); |
| | | return static::$userTable; |
| | | } |
| | | public function getTermIDType():string |
| | | { |
| | | $this->ensureTermIDType(); |
| | | return static::$termIDType; |
| | | } |
| | | public function getPostIDType():string |
| | | { |
| | | $this->ensurePostIDType(); |
| | | return static::$postIDType; |
| | | } |
| | | |
| | | // ========================================================================= |
| | | // PRIVATE HELPERS |
| | | // ========================================================================= |
| | | private function getColumnType(string $table, string $column):string|false { |
| | | $tableExists = $this->wpdb->get_var( |
| | | $this->wpdb->prepare("SHOW TABLES LIKE %s", $table) |
| | | ); |
| | | if (!$tableExists) { |
| | | error_log("[CustomTable] Table {$table} does not exist for getColumnType"); |
| | | return 'bigint(20) unsigned'; // safe fallback |
| | | } |
| | | |
| | | $result = $this->wpdb->get_row( |
| | | $this->wpdb->prepare( |
| | | "SELECT COLUMN_TYPE |
| | | FROM INFORMATION_SCHEMA.COLUMNS |
| | | WHERE TABLE_SCHEMA = DATABASE() |
| | | AND TABLE_NAME = %s |
| | | AND COLUMN_NAME = %s", |
| | | $table, |
| | | $column |
| | | ) |
| | | ); |
| | | if ($result && isset($result->COLUMN_TYPE)) { |
| | | return $result->COLUMN_TYPE; |
| | | } |
| | | error_log("[CustomTable] Could not determine column type for {$table}.{$column}"); |
| | | return 'bigint(20) unsigned'; |
| | | } |
| | | |
| | | private function tableExists():bool |
| | | { |
| | | return !is_null($this->wpdb->get_var($this->wpdb->prepare("SHOW TABLES LIKE %s", $this->fullTableName))); |
| | | } |
| | | /** |
| | | * Build WHERE clause from associative array |
| | | */ |
| | |
| | | use JVBase\managers\CRUD; |
| | | use JVBase\meta\Form; |
| | | use JVBase\meta\Meta; |
| | | use JVBase\utility\Features; |
| | | use JVBase\registrar\Registrar;use JVBase\utility\Features; |
| | | use JVBase\ui\Navigation; |
| | | use WP_User; |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | protected function getConfig(string $page):array |
| | | protected function getConfig(string $page):Registrar|false |
| | | { |
| | | $pages = $this->getAllDashboardPages(); |
| | | $key = array_search($page, $pages); |
| | | if ($key === false || is_numeric($key)) { |
| | | return []; |
| | | return false; |
| | | } |
| | | return Features::getConfig($key); |
| | | return Registrar::getInstance($key)??false; |
| | | } |
| | | |
| | | /** |
| | |
| | | |
| | | protected function getTitle(string $slug):string |
| | | { |
| | | $config = $this->getConfig($slug); |
| | | if (!empty($config)) { |
| | | return $config['dash_title']??$config['plural']; |
| | | $registrar = $this->getConfig($slug); |
| | | if ($registrar) { |
| | | return $registrar->getConfig('dashboard')['title']??$registrar->getPlural(); |
| | | } |
| | | return ucwords(str_replace('-', ' ', str_replace('_', ' ', $slug))); |
| | | } |
| | |
| | | |
| | | protected function getDescription(string $page):string |
| | | { |
| | | $config = $this->getConfig($page); |
| | | if (!empty($config)) { |
| | | $description = (array_key_exists('dash_description', $config)) ? $config['dash_description'] : ''; |
| | | $registrar = $this->getConfig($page); |
| | | if ($registrar) { |
| | | $description = $registrar->getConfig('dashboard')['description']??''; |
| | | } else { |
| | | $description = apply_filters('jvbDashboardDescription', $page); |
| | | switch ($page) { |
| | |
| | | |
| | | // Get current page/section |
| | | $page = $this->getCurrentPageTitle(); |
| | | $config = $this->getConfig($page); |
| | | if(!empty($config)) { |
| | | add_filter('jvbLoadingIcon', function() use ($config) { |
| | | return $config['icon']; |
| | | $registrar = $this->getConfig($page); |
| | | if($registrar) { |
| | | add_filter('jvbLoadingIcon', function() use ($registrar) { |
| | | return $registrar->getIcon(); |
| | | }); |
| | | } |
| | | $integrationSlugs = array_map(function($name) { |
| | |
| | | $this->renderHeader(); |
| | | // Pass to page handler |
| | | $constantSlug = $this->getConstantSlug($page); |
| | | |
| | | echo apply_filters( |
| | | 'jvbDashboardPage', |
| | | $this->renderPage($page), |
| | |
| | | return $this->cache->remember('icon_'.sanitize_title($page), function() use ($slug, $page) { |
| | | $icon = sanitize_title($page); |
| | | if (!is_numeric($slug)) { |
| | | $config = Features::getConfig($slug); |
| | | if (array_key_exists('icon', $config)) { |
| | | $icon = $config['icon']; |
| | | $registrar =Registrar::getInstance($slug); |
| | | if ($registrar) { |
| | | return $registrar->getIcon(); |
| | | } |
| | | |
| | | } |
| | | return $icon; |
| | | }); |
| | |
| | | //content types |
| | | //Taxonomies |
| | | $availableContent = array_filter($pages, function($page, $key) { |
| | | return !is_numeric($key) && array_key_exists($key, JVB_CONTENT); |
| | | return !is_numeric($key) && array_key_exists($key, Registrar::getRegistered('post')); |
| | | }, ARRAY_FILTER_USE_BOTH); |
| | | if (!empty ($availableContent)){ |
| | | $content = $menu->addItem('Your Content', jvbDashIcon('book-bookmark')) |
| | |
| | | ->defaultMenuClasses($menuClasses) |
| | | ->defaultItemClasses($itemClasses); |
| | | foreach ($availableContent as $slug => $page) { |
| | | $config = JVB_CONTENT[$slug]; |
| | | $item = $content->addItem($page, jvbDashIcon($config['icon'])) |
| | | $registrar = Registrar::getInstance($slug); |
| | | |
| | | $item = $content->addItem($page, $registrar->getIcon()) |
| | | ->url($this->baseURL.'/'.$slug); |
| | | |
| | | $taxonomies = array_filter(JVB_TAXONOMY, function ($value, $key) use ($slug) { |
| | | return in_array($slug, $value['for_content']); |
| | | },1); |
| | | $taxonomies = $registrar->registrar->taxonomies; |
| | | if (!empty ($taxonomies)) { |
| | | //TODO: If we add a dedicated 'create item' page, remove this from the empty check |
| | | $itemMenu = $item->submenu($slug); |
| | | foreach ($taxonomies as $s => $config) { |
| | | $itemMenu->addItem($config['plural'], $config['icon']) |
| | | foreach ($taxonomies as $s) { |
| | | $taxRegistrar = Registrar::getInstance($s); |
| | | $itemMenu->addItem($taxRegistrar->getPlural(), $taxRegistrar->getIcon()) |
| | | ->url($this->baseURL.'/'.$s); |
| | | } |
| | | } |
| | |
| | | $connection = (array_key_exists($page, $map)) ? $map[$page] : $page; |
| | | if ($connection !== 'integrations') { |
| | | |
| | | $userID = (jvbSiteHasMembership()) ? $this->user->ID : null; |
| | | $userID = (Features::forSite()->has('has_membership')) ? $this->user->ID : null; |
| | | $integration = JVB()->connect($connection, $userID); |
| | | |
| | | echo '<h1>Managing '.$integration->title.'</h1>'; |
| | |
| | | <nav class="tabs row start" role="tablist"> |
| | | <?php |
| | | $i=1; |
| | | $content = JVB_CONTENT; |
| | | $contentTax = array_filter(JVB_TAXONOMY, function ($tax) { |
| | | return jvbCheck('is_content', $tax); |
| | | }); |
| | | $taxonomies = JVB_TAXONOMY; |
| | | foreach($contentTax as $key => $config) { |
| | | unset($taxonomies[$key]); |
| | | $content = Registrar::getRegistered('post'); |
| | | $contentTax = Registrar::getFeatured('is_content', 'term'); |
| | | $taxonomies = Registrar::getRegistered('term'); |
| | | foreach($contentTax as $index => $tax) { |
| | | unset($taxonomies[$index]); |
| | | } |
| | | $content = array_merge($content, $contentTax); |
| | | foreach ($content as $type => $settings) { |
| | | foreach ($content as $type) { |
| | | $registrar = Registrar::getInstance($type); |
| | | $active = ($i === 1) ? ' active' : ''; |
| | | ?> |
| | | <button type="button" class="tab<?=$active?>" data-tab="<?=$type?>" role="tab" aria-selected="<?= ($active !== '') ? 'true' : 'false'?>"> |
| | | <h2><?=jvbDashIcon($settings['icon']??$key)?> <?= $settings['plural'] ?></h2> |
| | | <h2><?=jvbDashIcon($registrar->getIcon())?> <?= $registrar->getPlural() ?></h2> |
| | | </button> |
| | | <?php |
| | | $i++; |
| | |
| | | <option> ... Taxonomy</option> |
| | | <?php |
| | | |
| | | foreach ($taxonomies as $type => $settings) { |
| | | echo '<option value="'.$type.'">'.$settings['plural'].'</option>'; |
| | | foreach ($taxonomies as $type) { |
| | | $taxRegistrar = Registrar::getInstance($type); |
| | | echo '<option value="'.$type.'">'.$taxRegistrar->getPlural().'</option>'; |
| | | } |
| | | ?> |
| | | </select> |
| | |
| | | |
| | | <?php |
| | | |
| | | $jvb_everything = array_merge(JVB_CONTENT, JVB_TAXONOMY); |
| | | |
| | | foreach ($jvb_everything as $type => $settings) { |
| | | $fields = jvbGetFields($type); |
| | | |
| | | foreach (Registrar::getRegistered() as $type) { |
| | | $fields = Registrar::getFieldsFor($type); |
| | | ?> |
| | | <template class="<?= $type ?>Table"> |
| | | <table> |
| | |
| | | $pages[] = 'Favourites'; |
| | | } |
| | | |
| | | if (Features::anyContentHas('karma') || Features::anyTaxonomyHas('karma') || Features::anyUserHas('karma')) { |
| | | if (!empty(Registrar::getFeatured('karma'))) { |
| | | $pages[] = 'Karmic Score'; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | // Add all content types (with config keys) |
| | | foreach (JVB_CONTENT as $slug => $config) { |
| | | $pages[$slug] = $config['plural']; |
| | | foreach (Registrar::getRegistered('post') as $slug) { |
| | | $registrar = Registrar::getInstance($slug); |
| | | $pages[$slug] = $registrar->getPlural(); |
| | | } |
| | | |
| | | foreach (JVB_TAXONOMY as $slug=>$config) { |
| | | $pages[$slug] = $config['plural']; |
| | | foreach (Registrar::getRegistered('term') as $slug) { |
| | | $registrar = Registrar::getInstance($slug); |
| | | $pages[$slug] = $registrar->getPlural(); |
| | | } |
| | | |
| | | // Allow filtering |
| | |
| | | { |
| | | $role = jvbNoBase($role); |
| | | |
| | | if (!array_key_exists($role, JVB_USER)) { |
| | | if (!Registrar::getInstance($role)){ |
| | | return []; |
| | | } |
| | | |
| | |
| | | //Default to Remove pages |
| | | $remove = true; |
| | | if (!is_numeric($key)) { |
| | | $type = Features::getType($key); |
| | | $registrar = Registrar::getInstance($key); |
| | | $type = $registrar? $registrar->getType() : false; |
| | | if ($type) { |
| | | $permission = RoleManager::getPlural($key); |
| | | $permission = JVB()->roles()->getPermission('edit', $key); |
| | | } |
| | | switch ($type) { |
| | | case 'content': |
| | | if (user_can($userID, "edit_{$permission}")) { |
| | | if (user_can($userID, $permission)) { |
| | | $remove = false; |
| | | } |
| | | break; |
| | | case 'taxonomy': |
| | | $config = Features::getConfig($key, 'taxonomy'); |
| | | if (array_key_exists('is_content', $config) && $config['is_content'] && (user_can($userID, "own_{$key}") || user_can($userID, "manage_{$key}"))) { |
| | | $registrar = Registrar::getInstance($key); |
| | | if ($registrar && $registrar->hasFeature('is_content') && (!empty(JVB()->roles()->getOwnedTerms($userID, $key)) || !empty(JVB()->roles()->getManagedTerms($userID, $key)))){ |
| | | $remove = false; |
| | | } else if (count(array_intersect($config['for_content'], array_keys($pages))) > 0) { |
| | | } else if (count(array_intersect($registrar->registrar->for, array_keys($pages))) > 0) { |
| | | $remove = false; |
| | | } |
| | | break; |
| | |
| | | } |
| | | } |
| | | if ($remove) { |
| | | if ($canSkip || array_key_exists('invitable', $config)) { |
| | | //TODO: Figure out what $config was supposed to be |
| | | if ($canSkip || ($registrar && $registrar->hasFeature('invitable'))) { |
| | | $remove = false; |
| | | } |
| | | } |
| | |
| | | foreach ($roles as $role) { |
| | | $contents = Features::forUser($role)->getCreatableContent(); |
| | | if (!empty($contents)) { |
| | | foreach($contents as $content) { |
| | | if (Features::forContent($content)->has('karma')) { |
| | | $remove = false; |
| | | } |
| | | } |
| | | $hasKarma = Registrar::getFeatured('karma'); |
| | | $remove = empty(array_intersect($contents, $hasKarma)); |
| | | } |
| | | } |
| | | break; |
| | |
| | | */ |
| | | protected function getRolesWithDashboard():array |
| | | { |
| | | return array_keys(array_filter(JVB_USER, function ($role) { |
| | | return Features::forUser(array_search($role, JVB_USER))->has('has_dashboard'); |
| | | })); |
| | | return Registrar::getFeatured('has_dashboard', 'user'); |
| | | } |
| | | |
| | | /** |
| | |
| | | return count(array_intersect($dashboardRoles, $userRoles)) > 0; |
| | | } |
| | | |
| | | /** |
| | | * Get the capability needed to access a content type |
| | | * @param string $type |
| | | * @return string |
| | | */ |
| | | protected function getPermissionForType(string $type):string |
| | | { |
| | | // Check if it's a registered content type |
| | | if (array_key_exists($type, JVB_CONTENT)) { |
| | | $plural = JVB_CONTENT[$type]['plural']; |
| | | return 'edit_'.$plural; |
| | | } |
| | | |
| | | // Default to edit_{type}s |
| | | return 'edit_'.$type.'s'; |
| | | } |
| | | } |
| | |
| | | exit; |
| | | } |
| | | |
| | | use JVBase\registry\PostTypeRegistrar; |
| | | use JVBase\managers\Cache; |
| | | use JVBase\utility\Features; |
| | | use JVBase\registrar\Registrar; |
| | | use WP_Block; |
| | | use WP_Query; |
| | | |
| | |
| | | $this->cache->flush(); |
| | | } |
| | | |
| | | jvb_register_do_once('buildDirectories', [$this, 'activate']); |
| | | add_action('init', [$this, 'registerDirectories']); |
| | | add_action('render_block', [$this, 'renderBlock'], 99999, 3); |
| | | } |
| | | |
| | | public function registerDirectories():void |
| | | { |
| | | |
| | | $singular = (array_key_exists('directory_label', JVB_SITE)) ? JVB_SITE['directory_label'][0] : 'Directory'; |
| | | $plural = (array_key_exists('directory_label', JVB_SITE)) ? JVB_SITE['directory_label'][1] : 'Directories'; |
| | | $config = [ |
| | |
| | | if (!$directories) { |
| | | $directories = []; |
| | | //content |
| | | if(Features::anyContentHas('show_directory')) { |
| | | foreach (JVB_CONTENT as $key => $config) { |
| | | if (Features::forContent($key)->has('show_directory')) { |
| | | $directories[$key] = 'content'; |
| | | } |
| | | |
| | | $content = Registrar::getFeatured('show_directory', 'post'); |
| | | if(!empty($content)) { |
| | | foreach ($content as $key) { |
| | | $directories[$key] = 'content'; |
| | | } |
| | | } |
| | | if(Features::anyTaxonomyHas('show_directory')) { |
| | | foreach (JVB_TAXONOMY as $key=>$config) { |
| | | if (Features::forTaxonomy($key)->has('show_directory')) { |
| | | $directories[$key] = 'taxonomy'; |
| | | } |
| | | |
| | | $taxonomies = Registrar::getFeatured('show_directory', 'term'); |
| | | if(!empty($taxonomies)) { |
| | | foreach ($taxonomies as $key) { |
| | | $directories[$key] = 'taxonomy'; |
| | | } |
| | | } |
| | | if (Features::anyUserHas('show_directory')) { |
| | | foreach(JVB_USER as $key=>$config) { |
| | | if (Features::forUser($key)->has('show_directory')) { |
| | | $directories[$key] = 'user'; |
| | | } |
| | | |
| | | $users = Registrar::getFeatured('show_directory', 'user'); |
| | | if(!empty($users)) { |
| | | foreach ($users as $key) { |
| | | $directories[$key] = 'user'; |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | return $directories; |
| | | } |
| | | protected function getConfigFromType(string $type):array |
| | | { |
| | | if (!array_key_exists($type, $this->directories)) { |
| | | return []; |
| | | } |
| | | return match ($this->directories[$type]) { |
| | | 'content' => JVB_CONTENT[$type], |
| | | 'taxonomy' => JVB_TAXONOMY[$type], |
| | | 'user' => JVB_USER[$type], |
| | | default => [], |
| | | }; |
| | | |
| | | } |
| | | |
| | | public static function activate() |
| | | public function activate():void |
| | | { |
| | | $tmp = new self(); |
| | | $tmp->registerDirectories(); |
| | | // $tmp = new self(); |
| | | // $this->registerDirectories(); |
| | | |
| | | $created = []; |
| | | $directories = []; |
| | | $this->getDirectories(); |
| | | foreach($this->directories as $directory => $type) { |
| | | $registrar = Registrar::getInstance($directory); |
| | | if (!$registrar){ |
| | | error_log('Could not find registrar for making directory for '.$directory); |
| | | continue; |
| | | } |
| | | |
| | | foreach($tmp->directories as $directory => $type) { |
| | | $config = $tmp->getConfigFromType($directory); |
| | | $title = $tmp->directoryTitle($config); |
| | | $config = $registrar->getConfig('directory'); |
| | | |
| | | $title = $config['title']; |
| | | $excerpt = implode(' ', $config['description']??[]); |
| | | $ID = wp_insert_post([ |
| | | 'post_type' => BASE.'directory', |
| | | 'post_type' => BASE.'directory', |
| | | 'post_title' => $title, |
| | | 'post_status' => 'publish', |
| | | 'post_excerpt' => $excerpt, |
| | |
| | | 'extra' => $config[$directory]['directory_extra'] ??[], |
| | | ]; |
| | | } |
| | | $isGrouped = match ($type) { |
| | | 'content' => Features::forContent($directory)->has('isGrouped'), |
| | | 'taxonomy' => Features::forTaxonomy($directory)->has('isGrouped'), |
| | | 'user' => Features::forUser($directory)->has('isGrouped'), |
| | | default => false, |
| | | }; |
| | | if ($isGrouped) { |
| | | if ($config['isGrouped']) { |
| | | $title = $title.', but Grouped'; |
| | | $slug = sanitize_title($title).'-grouped'; |
| | | $excerpt = $config['groupedDescription']??'Too many options? This is grouped by type.'; |
| | |
| | | 'posts_per_page' => -1, |
| | | ]); |
| | | foreach($all->posts as $post) { |
| | | $config = Registrar::getInstance($post->post_name)->getConfig('directory')??false; |
| | | |
| | | $saved[$post->post_name] = [ |
| | | 'slug' => $post->post_name, |
| | | 'title' => $post->post_title, |
| | | 'ID' => $post->ID, |
| | | 'url' => get_the_permalink($post->ID), |
| | | 'page' => $post->post_title, |
| | | 'description' => $this->getConfigFromType($post->post_name)['description']??'', |
| | | 'description' => ($config) ?$config['description'] :'', |
| | | 'type' => get_post_meta($post->ID, self::$type,true), |
| | | 'extra' => $this->getConfigFromType($post->post_name)['directory_extra']??[], |
| | | 'extra' => ($config) ?$config['directory_extra'] : [], |
| | | ]; |
| | | } |
| | | update_option(BASE.'directory_list', $saved); |
| | |
| | | return $this->directoryList; |
| | | } |
| | | |
| | | public static function getConfig(int $ID):array |
| | | public static function getConfig(int $ID):Registrar|false |
| | | { |
| | | $type = get_post_meta($ID, self::$type, true); |
| | | $slug = get_post_meta($ID, self::$slug, true); |
| | | return match ($type) { |
| | | 'content' => JVB_CONTENT[$slug], |
| | | 'taxonomy' => JVB_TAXONOMY[$slug], |
| | | 'user' => JVB_USER[$slug], |
| | | default => [], |
| | | }; |
| | | return Registrar::getInstance($slug); |
| | | } |
| | | |
| | | public function letters():array |
| | |
| | | |
| | | public function directories(string $search = 'all'):array |
| | | { |
| | | $directories = $this->getDirectories(); |
| | | $directories = $this->getDirectoryList(); |
| | | if ($search === 'all') { |
| | | return $directories; |
| | | } |
| | |
| | | <p>You like lists? We\'ve got \'em!</p> |
| | | <ul class="directories">'; |
| | | foreach ($this->directoryList as $slug => $directory) { |
| | | $config = $this->getConfigFromType($slug); |
| | | $config = Registrar::getInstance($slug); |
| | | $aOpen = '<a href="'.$directory['url'].'" title="See our list of '.$directory['title'].'">'; |
| | | $aClose = '</a>'; |
| | | $cache .= '<li class="directory col start"> |
| | | '. $aOpen.jvbIcon(array_key_exists('icon', $config) ? $config['icon']:'list-dashes').$directory['title'].$aClose; |
| | | '. $aOpen.jvbIcon($config->getIcon() !== '' ? $config->getIcon() :'list-dashes').$directory['title'].$aClose; |
| | | if (!empty($directory['description'])) { |
| | | $cache .= '<div class="description">'; |
| | | foreach ($directory['description'] as $description) { |
| | |
| | | $cache = '<nav class="directory condensed"><ul>'; |
| | | foreach ($this->getDirectoryList() as $slug => $directory) { |
| | | $actualSlug = str_replace('-grouped', '', $slug); |
| | | $config = $this->getConfigFromType($actualSlug); |
| | | $icon = jvbIcon($config['icon']??''); |
| | | $config = Registrar::getInstance($actualSlug); |
| | | $icon = $config->getIcon() !== '' ? jvbIcon($config->getIcon()) : ''; |
| | | $cache .= '<li id="'.$slug.'"> |
| | | <a href="'.$directory['url'].'" class="'.$actualSlug.'">'. |
| | | $icon.$directory['title'].' |
| | |
| | | } |
| | | |
| | | $type = $this->directories[$slug]; |
| | | $config = $this->getConfigFromType($slug); |
| | | $registrar = Registrar::getInstance($slug); |
| | | $config = $registrar->getConfig('directory'); |
| | | |
| | | $paged = isset($_GET['page']) ? max(1, (int)$_GET['page']) : 1; |
| | | |
| | |
| | | |
| | | return $this->cache->remember( |
| | | $cacheKey, |
| | | function() use ($slug, $type, $config, $paged) { |
| | | $out = '<h1>' . $this->directoryTitle($config) . '</h1>'; |
| | | function() use ($slug, $type, $registrar, $config, $paged) { |
| | | $out = '<h1>' . $this->directoryTitle($registrar) . '</h1>'; |
| | | $out .= '<div class="description">'; |
| | | foreach ($config[$slug]['description'] ?? [] as $p) { |
| | | foreach ($config['description'] ?? [] as $p) { |
| | | $out .= '<p>' . $p . '</p>'; |
| | | } |
| | | $out .= '</div>'; |
| | |
| | | 'order' => 'ASC' |
| | | ]; |
| | | |
| | | if (Features::forContent($slug)->has('is_timeline')) { |
| | | |
| | | if ($registrar->hasFeature('is_timeline')) { |
| | | $args['post_parent'] = 0; |
| | | } |
| | | |
| | | $get = new WP_Query($args); |
| | | |
| | | $hasExtra = Features::forContent($slug)->has('directory_extra'); |
| | | $hasExtra = $registrar->hasFeature('directory_extra'); |
| | | if ($get->have_posts()) { |
| | | while ( $get->have_posts() ) { |
| | | $get->the_post(); |
| | |
| | | return $content; |
| | | } |
| | | |
| | | protected function directoryTitle(array $config):string |
| | | protected function directoryTitle(Registrar $registrar):string |
| | | { |
| | | return array_key_exists('directory', $config) ? $config['directory'] : $config['plural']; |
| | | $config = $registrar->getConfig('directory'); |
| | | return $config['title']?: $registrar->getPlural(); |
| | | } |
| | | |
| | | public function referAs($plural = false):string |
| | |
| | | $slug . '_letter_page_map', |
| | | function() use ($type, $slug) { |
| | | $titles = []; |
| | | |
| | | $registrar = Registrar::getInstance($slug); |
| | | switch ($type) { |
| | | case 'content': |
| | | global $wpdb; |
| | | $post_type = jvbCheckBase($slug); |
| | | |
| | | $where = $wpdb->prepare("post_type = %s AND post_status = 'publish'", $post_type); |
| | | if (Features::forContent($slug)->has('is_timeline')) { |
| | | if ($registrar && $registrar->hasFeature('is_timeline')) { |
| | | $where .= " AND post_parent = 0"; |
| | | } |
| | | |
| | |
| | | <?php |
| | | namespace JVBase\managers; |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | |
| | | // Add icons from content/taxonomy/user configs (like old behavior) |
| | | $configIcons = $this->getIconsFromConfigs(); |
| | | if (!empty($configIcons)) { |
| | | foreach ($configIcons as $source => $icons) { |
| | | if (!isset($defaults[$source])) { |
| | | $defaults[$source] = []; |
| | | } |
| | | $defaults[$source] = array_merge($defaults[$source], $icons); |
| | | } |
| | | $defaults['icons'] = array_merge($defaults['icons'], $configIcons); |
| | | } |
| | | |
| | | // Allow filtering per source (extensibility) |
| | |
| | | } |
| | | |
| | | /** |
| | | * Get icons from JVB_CONTENT, JVB_TAXONOMY, JVB_USER configs |
| | | * Get icons from Registrar instances |
| | | * |
| | | */ |
| | | protected function getIconsFromConfigs(): array |
| | | { |
| | | $icons = []; |
| | | $check = [JVB_CONTENT, JVB_TAXONOMY, JVB_USER]; |
| | | $registered = Registrar::getRegistered(); |
| | | |
| | | foreach ($check as $constant) { |
| | | foreach ($constant as $key => $value) { |
| | | if (isset($value['icon'])) { |
| | | // Determine source based on context (you could add 'icon_source' to configs) |
| | | $source = $value['icon_source'] ?? 'icons'; |
| | | |
| | | if (!isset($icons[$source])) { |
| | | $icons[$source] = []; |
| | | } |
| | | $icons[$source][] = $value['icon']; |
| | | } |
| | | } |
| | | foreach ($registered as $type) { |
| | | $registrar = Registrar::getInstance($type); |
| | | $icons[] = $registrar->getIcon(); |
| | | } |
| | | |
| | | return $icons; |
| | | |
| | | return array_unique(array_filter($icons)); |
| | | } |
| | | |
| | | /** |
| | |
| | | use Exception; |
| | | use JVBase\managers\queue\executors\InvitationExecutor; |
| | | use JVBase\managers\queue\TypeConfig; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use WP_Error; |
| | | |
| | |
| | | protected array $inviteConfig; |
| | | protected CustomTable $table; |
| | | protected int $expiryDays = 14; |
| | | protected Cache $cache; |
| | | public function __construct() |
| | | { |
| | | $this->setInviteConfig(); |
| | | $this->cache = Cache::for('invitations'); |
| | | $this->table = CustomTable::for('invitations'); |
| | | add_action('init', [$this, 'registerInvitationExecutors'], 5); |
| | | |
| | |
| | | */ |
| | | protected function buildInviteTypes(): array |
| | | { |
| | | $types = []; |
| | | $invitable = $this->cache->remember( |
| | | 'invitableTypes', |
| | | function () { |
| | | $types = []; |
| | | |
| | | // Global invitations from JVB_MEMBERSHIP |
| | | if (!empty(JVB_MEMBERSHIP['can_invite'])) { |
| | | foreach (JVB_MEMBERSHIP['can_invite'] as $role => $canInvite) { |
| | | $types[$role] = [ |
| | | 'can_invite' => $canInvite, |
| | | 'to_terms' => [] |
| | | ]; |
| | | } |
| | | } |
| | | // Global invitations from JVB_MEMBERSHIP |
| | | if (!empty(JVB_MEMBERSHIP['can_invite'])) { |
| | | foreach (JVB_MEMBERSHIP['can_invite'] as $role => $canInvite) { |
| | | $types[$role] = [ |
| | | 'can_invite' => $canInvite, |
| | | 'to_terms' => [] |
| | | ]; |
| | | } |
| | | } |
| | | |
| | | // Term invitations from invitable content taxonomies |
| | | foreach (JVB_TAXONOMY as $taxonomy => $config) { |
| | | if (Features::forTaxonomy($taxonomy)->has('invitable') && |
| | | Features::forTaxonomy($taxonomy)->has('is_content') && |
| | | Features::forTaxonomy($taxonomy)->has('is_ownable')) { |
| | | // Term invitations from invitable content taxonomies |
| | | $invitable = Registrar::getFeatured('invitable', 'term'); |
| | | $content = Registrar::getFeatured('is_content', 'term'); |
| | | $ownable = Registrar::getFeatured('is_ownable', 'term'); |
| | | $taxonomies = array_intersect($invitable, $content, $ownable); |
| | | if (!empty($taxonomies)) { |
| | | $users = Registrar::getRegistered('user'); |
| | | } |
| | | foreach ($taxonomies as $taxonomy) { |
| | | $registrar = Registrar::getInstance($taxonomy); |
| | | |
| | | $forContent = $config['for_content'] ?? []; |
| | | foreach ($forContent as $content) { |
| | | // Find which user roles can create this content |
| | | foreach (JVB_USER as $role => $userConfig) { |
| | | $creatable = Features::forUser($role)->getCreatableContent(); |
| | | if (in_array($content, $creatable)) { |
| | | if (!isset($types[$role])) { |
| | | $types[$role] = [ |
| | | 'can_invite' => [], |
| | | 'to_terms' => [] |
| | | ]; |
| | | } |
| | | if (!in_array($taxonomy, $types[$role]['to_terms'])) { |
| | | $types[$role]['to_terms'][] = $taxonomy; |
| | | foreach ($registrar->registrar->for as $content) { |
| | | // Find which user roles can create this content |
| | | foreach ($users as $user) { |
| | | $userRegistrar = Registrar::getInstance($user); |
| | | |
| | | $creatable = $userRegistrar->getCreatable(); |
| | | if (in_array($content, $creatable)) { |
| | | if (!isset($types[$role])) { |
| | | $types[$role] = [ |
| | | 'can_invite' => [], |
| | | 'to_terms' => [] |
| | | ]; |
| | | } |
| | | if (!in_array($taxonomy, $types[$role]['to_terms'])) { |
| | | $types[$role]['to_terms'][] = $taxonomy; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | return $types; |
| | | return $types; |
| | | } |
| | | ); |
| | | return $invitable; |
| | | |
| | | } |
| | | |
| | | /****************************************************************** |
| | |
| | | |
| | | $term = get_term($termID, BASE . $taxonomy); |
| | | if ($term && !is_wp_error($term)) { |
| | | $config = JVB_TAXONOMY[$taxonomy] ?? []; |
| | | $singular = $config['singular'] ?? $taxonomy; |
| | | $registrar = Registrar::getInstance($taxonomy); |
| | | |
| | | $singular = $registrar ? $registrar->getSingular() : $taxonomy; |
| | | |
| | | $termContent[] = sprintf( |
| | | "<p>%s has also invited you to join %s. You'll be automatically added to this %s when you register.</p>", |
| | |
| | | namespace JVBase\managers; |
| | | |
| | | use JVBase\JVB; |
| | | use JVBase\registrar\Registrar; |
| | | use WP_Error; |
| | | use Exception; |
| | | use WP_Post; |
| | |
| | | */ |
| | | public function notifyEveryone(string $type, int|null $action_user_id = null, string $message = '', int|null $target_id = null, string|null $target_type = null, array|null $context = null):bool|WP_Error |
| | | { |
| | | $artists = $this->getUserIDs(array_keys(JVB_USER)); |
| | | $artists = $this->getUserIDs(Registrar::getRegistered('user')); |
| | | return $this->addNotification($artists, $type, $action_user_id, $message, $target_id, $target_type, $context); |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | // Check if this is a relevant content type |
| | | $content_types = jvbBasedFeedContent(); |
| | | $content_types = array_map(function($type) {return jvbCheckBase($type->getSlug()); }, Registrar::getFeatured('show_feed', 'post')); |
| | | if (!in_array($post->post_type, $content_types)) { |
| | | return; |
| | | } |
| | |
| | | */ |
| | | protected function pluralize(string $content):string |
| | | { |
| | | if (array_key_exists($content, JVB_CONTENT)) { |
| | | return JVB_CONTENT[$content]['plural']; |
| | | } elseif (array_key_exists($content, JVB_TAXONOMY)) { |
| | | return JVB_TAXONOMY[$content]['plural']; |
| | | } elseif (array_key_exists($content, JVB_USER)) { |
| | | return JVB_USER[$content]['plural']; |
| | | } |
| | | return $content; |
| | | $registrar = Registrar::getInstance($content); |
| | | return ($registrar) ? $registrar->getPlural() |
| | | : str_replace('_', ' ', $content.'s'); |
| | | } |
| | | |
| | | /** |
| | |
| | | return array_map(function ($r) { |
| | | return jvbCheckBase(trim($r)); |
| | | }, array_filter($roles, function ($r) { |
| | | return array_key_exists(trim($r), JVB_USER); |
| | | return Registrar::getInstance(trim($r))!== false; |
| | | })); |
| | | } |
| | | |
| | |
| | | <?php |
| | | namespace JVBase\managers; |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use WP_User; |
| | | use WP_Role; |
| | |
| | | |
| | | public function __construct() |
| | | { |
| | | $this->roles = array_keys(JVB_USER); |
| | | $this->roles = array_keys(array_map(function ($instance) { |
| | | return $instance->slug; |
| | | }, Registrar::getRegistered('user'))); |
| | | |
| | | $this->content = array_map(function($content) { |
| | | return strtolower($content['plural']??$content['singular'].'s'); |
| | | },JVB_CONTENT); |
| | | $registrar = Registrar::getInstance($content); |
| | | return strtolower(str_replace(' ', '_', $registrar->getPlural()??$registrar->getSingular().'s')); |
| | | },array_merge( |
| | | Registrar::getRegistered('post'), |
| | | Registrar::getFeatured('is_content', 'term') |
| | | )); |
| | | add_action('set_user_role', [$this, 'updateRoles'], 10, 3); |
| | | } |
| | | |
| | |
| | | return; |
| | | } |
| | | $temp = jvbNoBase($role); |
| | | if (array_key_exists($temp, JVB_USER)) { |
| | | $registrar = Registrar::getInstance($temp); |
| | | if ($registrar) { |
| | | $user = get_userdata($userID); |
| | | if (!$user) { |
| | | return; |
| | |
| | | { |
| | | $type = jvbNoBase($type); |
| | | |
| | | // Check in JVB_CONTENT array |
| | | if (array_key_exists($type, JVB_CONTENT)) { |
| | | $registrar = Registrar::getInstance($type); |
| | | if ($registrar && $registrar->getType() === 'post') { |
| | | return true; |
| | | } |
| | | |
| | | // Check in JVB_TAXONOMY for content taxonomies |
| | | if (array_key_exists($type, JVB_TAXONOMY)) { |
| | | $tax_config = JVB_TAXONOMY[$type]; |
| | | if ($tax_config['is_content'] ?? false) { |
| | | return true; |
| | | } |
| | | if ($registrar && $registrar->getType() === 'term' && $registrar->hasFeature('is_content')) { |
| | | return true; |
| | | } |
| | | |
| | | return false; |
| | |
| | | |
| | | foreach ($roles as $role) { |
| | | $role = jvbNoBase($role); |
| | | $config = JVB_USER[$role]??false; |
| | | if (!$config) { |
| | | $registrar = Registrar::getInstance($role); |
| | | if (!$registrar) { |
| | | return false; |
| | | } |
| | | foreach ($config as $type) { |
| | | foreach ($registrar->getCreatable() as $type) { |
| | | if (is_array($type) && in_array($content, $type)) { |
| | | return true; |
| | | } elseif ($content === $type) { |
| | |
| | | if ($check) { |
| | | return $check; |
| | | } |
| | | $check = JVB_USER[$role]['can_create'] ??false; |
| | | if (!$check) { |
| | | |
| | | $registrar = Registrar::getInstance($role); |
| | | if (!$registrar) { |
| | | return false; |
| | | } |
| | | $out = []; |
| | | foreach ($check as $types) { |
| | | foreach ($types as $type => $content) { |
| | | $out[$type] = $content; |
| | | foreach ($registrar->getCreatable() as $types) { |
| | | if (is_array($types)) { |
| | | $out = array_merge($out, $types); |
| | | } else { |
| | | $out = [$types]; |
| | | } |
| | | $out = array_unique($out); |
| | | } |
| | | set_transient(BASE.'role_config_'.$role, $out, MONTH_IN_SECONDS); |
| | | return $out; |
| | |
| | | return $link; |
| | | } |
| | | |
| | | public function registerRole(string $slug, array $config): void |
| | | public function registerRole(string $slug): void |
| | | { |
| | | $role_name = BASE . $slug; |
| | | $display_name = $config['label'] ?? ucfirst($slug); |
| | | |
| | | $registrar = Registrar::getInstance($slug); |
| | | if (!$registrar){ |
| | | return; |
| | | } |
| | | // Build capabilities for this role |
| | | $capabilities = $this->buildRoleCapabilities($slug, $config); |
| | | $capabilities = $this->buildRoleCapabilities($slug, $registrar); |
| | | |
| | | // Remove role first to ensure clean slate |
| | | remove_role($role_name); |
| | |
| | | add_role($role_name, $display_name, $capabilities); |
| | | |
| | | // Add management capabilities to administrator |
| | | if ($config['has_dashboard'] ?? false) { |
| | | if ($registrar->hasFeature('has_dashboard') ?? false) { |
| | | $admin_role = get_role('administrator'); |
| | | if ($admin_role) { |
| | | $admin_role->add_cap("manage_{$role_name}s", true); |
| | |
| | | } |
| | | } |
| | | |
| | | private function buildRoleCapabilities(string $slug, array $config): array |
| | | private function buildRoleCapabilities(string $slug, Registrar $registrar): array |
| | | { |
| | | //Everyone can see the things |
| | | $capabilities = [ |
| | |
| | | ]; |
| | | |
| | | // Dashboard access |
| | | if ($this->config['has_dashboard'] ?? false) { |
| | | if ($registrar->hasFeature('has_dashboard') ?? false) { |
| | | $capabilities['access_dashboard'] = true; |
| | | } |
| | | |
| | | if (Features::forSite()->has('favourites') && $config['can_favourite'] ?? true) { |
| | | if (Features::forSite()->has('favourites') && $registrar->hasFeature('can_favourite') ?? true) { |
| | | $capabilities['can_favourite'] = true; |
| | | } |
| | | |
| | | // Content creation capabilities |
| | | if (!empty($config['can_create'])) { |
| | | foreach ($config['can_create'] as $content_type) { |
| | | $this->addContentCapabilities($capabilities, $content_type, $config); |
| | | if (!empty($registrar->getCreatable())) { |
| | | $content = []; |
| | | foreach ($registrar->getCreatable() as $content_type) { |
| | | if (is_array($content_type)) { |
| | | $content = array_merge($content, $content_type); |
| | | }else { |
| | | $content[] = $content_type; |
| | | } |
| | | } |
| | | foreach ($content as $c) { |
| | | $this->addContentCapabilities($capabilities, $c, $registrar); |
| | | } |
| | | } |
| | | |
| | | // Management capabilities |
| | | if (!empty($this->config['manage_others'])) { |
| | | foreach ($this->config['manage_others'] as $type) { |
| | | if (!empty($registrar->getManageOthers())) { |
| | | foreach ($registrar->getManageOthers() as $type) { |
| | | // Skip if content type doesn't exist |
| | | if (!$this->isValidContentType($type)) { |
| | | error_log("Warning: User role '{$slug}' references non-existent content type '{$type}'"); |
| | |
| | | /** |
| | | * Add content capabilities to capability array |
| | | */ |
| | | private function addContentCapabilities(array &$capabilities, $content_type, array $config): void |
| | | private function addContentCapabilities(array &$capabilities, $content_type, Registrar $registrar): void |
| | | { |
| | | if (is_array($content_type)) { |
| | | // Handle array format for type-specific permissions |
| | | foreach ($content_type as $sub_type => $types) { |
| | | foreach ($types as $type) { |
| | | if (!$this->isValidContentType($type)) { |
| | | error_log("Warning: Role references non-existent content type '{$type}'"); |
| | | continue; |
| | | } |
| | | $this->addSingleContentCapabilities($capabilities, $type, $config); |
| | | } |
| | | } |
| | | } else { |
| | | if (!$this->isValidContentType($content_type)) { |
| | | error_log("Warning: Role references non-existent content type '{$content_type}'"); |
| | | return; |
| | | } |
| | | $this->addSingleContentCapabilities($capabilities, $content_type, $config); |
| | | if (!$this->isValidContentType($content_type)) { |
| | | error_log("Warning: Role references non-existent content type '{$content_type}'"); |
| | | return; |
| | | } |
| | | $this->addSingleContentCapabilities($capabilities, $content_type, $registrar); |
| | | } |
| | | |
| | | /** |
| | | * Add capabilities for a single content type |
| | | */ |
| | | private function addSingleContentCapabilities(array &$capabilities, string $type, array $config): void |
| | | private function addSingleContentCapabilities(array &$capabilities, string $type, Registrar $registrar): void |
| | | { |
| | | $caps = $this->getCapabilities($type); |
| | | foreach ($caps as $cap) { |
| | | $capabilities[$cap] = true; |
| | | } |
| | | |
| | | if (array_key_exists('approve_new', $config)) { |
| | | if ($registrar->hasFeature('approve_new')) { |
| | | $plural = $this->getContentPlural($type); |
| | | // Publish capability depends on approval setting |
| | | $capabilities["publish_{$plural}"] = !($config['approve_new'] ?? false); |
| | | } |
| | | |
| | | } |
| | | |
| | | public function grantRoleCapabilities(string $role_name, string $content_slug, bool $grant = true): void |
| | |
| | | "edit_others_{$plural}", |
| | | "publish_{$plural}", |
| | | "read_private_{$plural}", |
| | | "edit_{$plural}", |
| | | ]; |
| | | } |
| | | protected function getOthersCapabilities(string $content):array |
| | |
| | | public function getContentPlural(string $content): string |
| | | { |
| | | $content = jvbNoBase($content); |
| | | $config = Features::getConfig($content); |
| | | $capsMap = $config['capability_type']??[]; |
| | | if (empty($capsMap)){ |
| | | $capsMap = [ |
| | | $content, |
| | | str_replace('-', '_',sanitize_title(strtolower(JVB_CONTENT[$content]['plural']??JVB_TAXONOMY[$content]['plural']))) |
| | | ]; |
| | | return $capsMap[1]; |
| | | $registrar = Registrar::getInstance($content); |
| | | if ($registrar && $registrar->getPlural()) { |
| | | return str_replace(' ', '_', $registrar->getPlural()); |
| | | } |
| | | return str_replace('-', '_', sanitize_title(strtolower($content . 's'))); |
| | | return str_replace(' ', '_', $content.'s'); |
| | | } |
| | | |
| | | public function activate(): void |
| | | { |
| | | foreach (JVB_USER as $slug => $config) { |
| | | $this->registerRole($slug, $config); |
| | | foreach (Registrar::getRegistered('user') as $role) { |
| | | $this->registerRole($role); |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | $taxonomy = jvbNoBase($taxonomy); |
| | | |
| | | $registrar = Registrar::getInstance($taxonomy); |
| | | // Verify this is an ownable content taxonomy |
| | | if (!Features::forTaxonomy($taxonomy)->has('is_content') || |
| | | !Features::forTaxonomy($taxonomy)->has('is_ownable')) { |
| | | if (!$registrar || !$registrar->hasFeature('is_content') || |
| | | !$registrar->hasFeature('is_ownable')) { |
| | | return false; |
| | | } |
| | | |
| | |
| | | } |
| | | $taxonomy = jvbNoBase($taxonomy); |
| | | |
| | | $registrar = Registrar::getInstance($taxonomy); |
| | | // Verify this is an ownable content taxonomy |
| | | if (!Features::forTaxonomy($taxonomy)->has('is_content') || |
| | | !Features::forTaxonomy($taxonomy)->has('is_ownable')) { |
| | | if (!$registrar || !$registrar->hasFeature('is_content') || |
| | | !$registrar->hasFeature('is_ownable')) { |
| | | return false; |
| | | } |
| | | |
| | |
| | | static $ownable = null; |
| | | |
| | | if ($ownable === null) { |
| | | $ownable = []; |
| | | foreach (JVB_TAXONOMY as $taxonomy => $config) { |
| | | if (Features::forTaxonomy($taxonomy)->has('is_content') && |
| | | Features::forTaxonomy($taxonomy)->has('is_ownable')) { |
| | | $ownable[] = $taxonomy; |
| | | } |
| | | } |
| | | $ownable = array_map(function ($instance) { |
| | | return $instance->slug; |
| | | }, Registrar::getFeatured('is_ownable', 'term')); |
| | | } |
| | | |
| | | return $ownable; |
| | |
| | | static $invitable = null; |
| | | |
| | | if ($invitable === null) { |
| | | $invitable = []; |
| | | foreach (JVB_TAXONOMY as $taxonomy => $config) { |
| | | if (Features::forTaxonomy($taxonomy)->has('invitable')) { |
| | | $invitable[] = $taxonomy; |
| | | } |
| | | } |
| | | $invitable = array_map(function ($instance) { |
| | | return $instance->slug; |
| | | }, Registrar::getFeatured('invitable', 'term')); |
| | | } |
| | | |
| | | return $invitable; |
| | | } |
| | | |
| | | public function getPermission(string $action, string $content, ?int $ID = null):?string |
| | | { |
| | | $plural = $this->getContentPlural($content); |
| | | switch ($action) { |
| | | case 'edit': |
| | | if ($ID) { |
| | | return "edit_{$content}"; |
| | | } |
| | | return "edit_{$plural}"; |
| | | } |
| | | return null; |
| | | } |
| | | } |
| | |
| | | namespace JVBase\managers\SEO; |
| | | |
| | | use JVBase\managers\Cache; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\utility\Features; |
| | | use WP_Post; |
| | | use WP_Term; |
| | |
| | | private function __construct() |
| | | { |
| | | $this->cache = Cache::for('breadcrumbs', MONTH_IN_SECONDS)->connect('post')->connect('taxonomy')->connect('user'); |
| | | $this->cache->flush(); |
| | | if (JVB_TESTING) { |
| | | $this->cache->flush(); |
| | | } |
| | |
| | | |
| | | // Always start with home |
| | | $crumbs[] = [ |
| | | 'name' => 'Home', |
| | | 'name' => get_bloginfo('name'), |
| | | 'icon' => jvbIcon('house'), |
| | | 'url' => get_home_url(), |
| | | ]; |
| | |
| | | private function addTaxonomyCrumbs(array $crumbs, WP_Term $term): array |
| | | { |
| | | $tax = jvbNoBase($term->taxonomy); |
| | | $config = Features::getConfig($tax, 'term'); |
| | | |
| | | $registrar = Registrar::getInstance($tax); |
| | | // Add parent content archive if taxonomy is for single content type |
| | | if (count($config['for_content']) === 1) { |
| | | $contentConfig = JVB_CONTENT[$config['for_content'][0]]; |
| | | $crumbs[] = [ |
| | | 'name' => $contentConfig['breadcrumb'] ?? $contentConfig['plural'], |
| | | 'url' => get_post_type_archive_link(jvbCheckBase($config['for_content'][0])), |
| | | ]; |
| | | $crumbs[] = [ |
| | | 'name' => 'By ' . $config['singular'], |
| | | 'url' => false, |
| | | ]; |
| | | if ($registrar) { |
| | | if (count($registrar->registrar->for) === 1){ |
| | | $content = is_array($registrar->registrar->for) ? $registrar->registrar->for[0] : $registrar->registrar->for; |
| | | $contentRegistrar = Registrar::getInstance($content); |
| | | |
| | | $crumbs[] = [ |
| | | 'name' => $contentRegistrar->getConfig('breadcrumbs')['title']??$contentRegistrar->getPlural(), |
| | | 'url' => get_post_type_archive_link(jvbCheckBase($content)), |
| | | ]; |
| | | $crumbs[] = [ |
| | | 'name' => 'By ' . $registrar->getSingular(), |
| | | 'url' => false, |
| | | ]; |
| | | } |
| | | } |
| | | |
| | | |
| | | // Add directory if exists |
| | | if (Features::forTaxonomy($tax)->has('directory')) { |
| | | if ($registrar && $registrar->hasFeature('directory')) { |
| | | $directory = JVB()->directories()?->directories($tax); |
| | | $crumbs[] = [ |
| | | 'name' => $directory['title'], |
| | |
| | | { |
| | | // Add directory if exists |
| | | $content = jvbNoBase($post->post_type); |
| | | if(Features::forContent($content)->has('show_directory')) { |
| | | $directory = JVB()->directories()->getDirectoryList()[$content]??[]; |
| | | $registrar = Registrar::getInstance($content); |
| | | if ($registrar){ |
| | | $crumbConfig = $registrar->getConfig('breadcrumbs'); |
| | | } |
| | | if($registrar && $registrar->hasFeature('show_directory')) { |
| | | $directory = JVB()->directories()?->directories($content)??[]; |
| | | if (!empty($directory)) { |
| | | $crumbs[] = [ |
| | | 'name' => $directory['title'], |
| | |
| | | } |
| | | |
| | | // Handle directory posts specially |
| | | if (JVB()->directories()->isDirectory()) { |
| | | if (JVB()->directories() && JVB()->directories()->isDirectory()) { |
| | | $pos = jvbGetDirectoryInfo(); |
| | | if (!empty($pos)) { |
| | | // Special case for map |
| | |
| | | ]; |
| | | } |
| | | } else { |
| | | $name = jvbNoBase($post->post_type); |
| | | if (array_key_exists($name, JVB_CONTENT) && array_key_exists('addCrumb', JVB_CONTENT[$name])) { |
| | | $crumbs = $this->addTaxToCrumbs($crumbs, JVB_CONTENT[$name]['addCrumb']); |
| | | |
| | | if ($registrar && !empty($crumbConfig['addCrumb'])) { |
| | | $crumbs = $this->addTaxToCrumbs($crumbs, $crumbConfig['addCrumb']); |
| | | } |
| | | // Add post hierarchy |
| | | $crumbs = array_merge($crumbs, $this->buildPostHierarchy($post)); |
| | |
| | | $type = is_singular() ? $obj->post_type : $obj->name; |
| | | $name = jvbNoBase($type); |
| | | |
| | | $registrar = Registrar::getInstance($name); |
| | | if (Features::forSite()->has('is_directory') && $name === 'directory') { |
| | | $crumbs[] = [ |
| | | 'name' => JVB()->directories()->referAs(true), |
| | | 'url' => get_post_type_archive_link($type) |
| | | ]; |
| | | } elseif ((is_post_type_archive() || !Features::forContent($name)->has('show_directory')) && array_key_exists($name, JVB_CONTENT)) { |
| | | } elseif (is_post_type_archive() && $registrar && $registrar->hasFeature('show_directory')) { |
| | | |
| | | $crumbs[] = [ |
| | | 'name' => JVB_CONTENT[$name]['breadcrumb'] ?? JVB_CONTENT[$name]['plural'], |
| | | 'name' => $registrar->getConfig('breadcrumb')['title'] ?? $registrar->getPlural(), |
| | | 'url' => get_post_type_archive_link($type) |
| | | ]; |
| | | } |
| | |
| | | $items = []; |
| | | $position = 1; |
| | | |
| | | global $wp; |
| | | $current = home_url( add_query_arg( $_GET, $wp->request ) ); |
| | | foreach ($crumbs as $crumb) { |
| | | // Schema requires a URL |
| | | if ($crumb['url'] === false) { |
| | | $crumb['url'] = get_permalink(); |
| | | $crumb['url'] = $current; |
| | | } |
| | | |
| | | $items[] = [ |
| | | '@type' => 'ListItem', |
| | | 'position' => $position, |
| | | 'name' => $crumb['name'], |
| | | 'item' => $crumb['url'], |
| | | '@type' => 'ListItem', |
| | | '@id' => $crumb['url'], |
| | | 'position' => $position, |
| | | 'name' => $crumb['name'], |
| | | ]; |
| | | |
| | | $position++; |
| | |
| | | |
| | | return [ |
| | | '@type' => 'BreadcrumbList', |
| | | '@id' => get_permalink() . '/#breadcrumbs', |
| | | '@id' => $current . '/#breadcrumbs', |
| | | 'itemListElement' => $items |
| | | ]; |
| | | } |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO; |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | |
| | | |
| | | default: |
| | | // Try to find in content, taxonomy, or user configs |
| | | $config = $this->findInConstants($type); |
| | | if (array_key_exists('seo', $config) && is_array($config['seo'])) { |
| | | $config = $config['seo']; |
| | | } |
| | | $registrar = Registrar::getInstance($type); |
| | | $config = $registrar->getConfig('seo'); |
| | | |
| | | // If asking for archive config and none exists, provide default |
| | | if ($configType === 'archive' && !isset($config['archive'])) { |
| | |
| | | return $config[$configType] ?? []; |
| | | } |
| | | } |
| | | /** |
| | | * Find configuration in JVB constants |
| | | */ |
| | | private function findInConstants(string $type): array |
| | | { |
| | | if (defined('JVB_CONTENT') && isset(JVB_CONTENT[$type])) { |
| | | return JVB_CONTENT[$type]; |
| | | } |
| | | if (defined('JVB_TAXONOMY') && isset(JVB_TAXONOMY[$type])) { |
| | | return JVB_TAXONOMY[$type]; |
| | | } |
| | | if (defined('JVB_USER') && isset(JVB_USER[$type])) { |
| | | return JVB_USER[$type]; |
| | | } |
| | | return []; |
| | | } |
| | | |
| | | public function resetConfig(): bool |
| | | { |
| | |
| | | |
| | | use JVBase\managers\AdminPages; |
| | | use JVBase\meta\Form; |
| | | use JVBase\registrar\Registrar; |
| | | use JVBase\ui\Tabs; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | |
| | | class SEOAdminPage |
| | | { |
| | | private ConfigManager $config; |
| | | private SchemaBuilder $registry; |
| | | // private SchemaBuilder $registry; |
| | | |
| | | public function __construct() |
| | | { |
| | | $this->registry = SchemaBuilder::getInstance(); |
| | | // $this->registry = SchemaBuilder::getInstance(); |
| | | |
| | | |
| | | // Add to JVB dashboard |
| | |
| | | { |
| | | $types = ['meta', 'schema']; |
| | | |
| | | switch ($type) { |
| | | case 'content': |
| | | $config = JVB_CONTENT; |
| | | $types[] = 'archive'; |
| | | break; |
| | | case 'taxonomy': |
| | | case 'taxonomies': |
| | | $config = JVB_TAXONOMY; |
| | | break; |
| | | case 'user': |
| | | $config = JVB_USER; |
| | | break; |
| | | default: |
| | | error_log('[SEOAdminPage]:renderConfig --- no config found for '.$type); |
| | | return ''; |
| | | if ($type == 'content') { |
| | | $types[] = 'archive'; |
| | | } |
| | | |
| | | $registrar = Registrar::getInstance($type); |
| | | if (!$registrar){ |
| | | return ''; |
| | | } |
| | | $config = $registrar->getConfig('seo'); |
| | | |
| | | $mainTabs = new Tabs(); |
| | | |
| | | foreach ($config as $c => $opt) { |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO; |
| | | |
| | | use JVBase\registrar\Registrar; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | |
| | | { |
| | | $options = ['' => '-- Select Post Type --']; |
| | | |
| | | if (defined('JVB_CONTENT')) { |
| | | foreach (JVB_CONTENT as $key => $config) { |
| | | $options[jvbCheckBase($key)] = $config['plural'] ?? $config['singular'] ?? ucwords($key); |
| | | $content = Registrar::getRegistered('post'); |
| | | if (!empty($content)){ |
| | | foreach ($content as $c) { |
| | | $registrar = Registrar::getInstance($c); |
| | | $options[jvbCheckBase($c)] = $registrar->getPlural(); |
| | | } |
| | | } |
| | | |
| | |
| | | { |
| | | $options = ['' => '-- Select Taxonomy --']; |
| | | |
| | | if (defined('JVB_TAXONOMY')) { |
| | | foreach (JVB_TAXONOMY as $key => $config) { |
| | | $options[jvbCheckBase($key)] = $config['plural'] ?? $config['singular'] ?? ucwords($key); |
| | | |
| | | $tax = Registrar::getRegistered('term'); |
| | | if (!empty($tax)){ |
| | | foreach ($tax as $c) { |
| | | $registrar = Registrar::getInstance($c); |
| | | $options[jvbCheckBase($c)] = $registrar->getPlural(); |
| | | } |
| | | } |
| | | |
| | |
| | | use JVBase\managers\SEO\schemas\SchemaResolverRegistry; |
| | | use JVBase\meta\Meta; |
| | | use JVBase\managers\SEO\schemas\SchemaDefinition; |
| | | use JVBase\registrar\Registrar; |
| | | use WP_Term; |
| | | use WP_User; |
| | | |
| | |
| | | */ |
| | | public function excludeHiddenSingles(array $ids): array |
| | | { |
| | | $hiddenTypes = []; |
| | | $timelineTypes = []; |
| | | $hiddenTypes = array_map(function($type) { |
| | | return jvbCheckBase($type); |
| | | }, |
| | | Registrar::getFeatured('hide_single', 'post') |
| | | ); |
| | | |
| | | // Find post types with hide_single or is_timeline flags |
| | | foreach (JVB_CONTENT as $slug => $config) { |
| | | $postType = BASE . $slug; |
| | | $timelineTypes = array_map(function($type) { |
| | | return jvbCheckBase($type); |
| | | }, Registrar::getFeatured('is_timeline', 'post')); |
| | | |
| | | if (!empty($config['hide_single'])) { |
| | | $hiddenTypes[] = $postType; |
| | | } |
| | | |
| | | if (!empty($config['is_timeline'])) { |
| | | $timelineTypes[] = $postType; |
| | | } |
| | | } |
| | | |
| | | $hiddenIds = []; |
| | | |
| | |
| | | $post = get_post(); |
| | | if ($post) { |
| | | $postType = jvbNoBase($post->post_type); |
| | | if (defined('JVB_CONTENT') && isset(JVB_CONTENT[$postType])) { |
| | | if (Registrar::getInstance($postType)) { |
| | | $this->config = ConfigManager::for($postType); |
| | | return [ |
| | | 'objectType' => 'post', |
| | |
| | | $term = get_queried_object(); |
| | | if ($term instanceof WP_Term) { |
| | | $taxonomy = jvbNoBase($term->taxonomy); |
| | | if (defined('JVB_TAXONOMY') && isset(JVB_TAXONOMY[$taxonomy])) { |
| | | if (Registrar::getInstance($taxonomy)) { |
| | | $this->config = ConfigManager::for($taxonomy); |
| | | return [ |
| | | 'objectType' => 'term', |
| | |
| | | $user = get_queried_object(); |
| | | if ($user instanceof WP_User) { |
| | | $role = jvbUserRole($user->ID); |
| | | if (defined('JVB_USER') && isset(JVB_USER[$role])) { |
| | | if (Registrar::getInstance($role)) { |
| | | $this->config = ConfigManager::for($role); |
| | | return [ |
| | | 'objectType' => 'user', |
| | |
| | | } |
| | | $postType = jvbNoBase($postType); |
| | | |
| | | if (defined('JVB_CONTENT') && isset(JVB_CONTENT[$postType])) { |
| | | if (Registrar::getInstance($postType)) { |
| | | $this->config = ConfigManager::for($postType); |
| | | return [ |
| | | 'objectType' => 'archive', |
| | |
| | | namespace JVBase\managers\SEO; |
| | | |
| | | use JVBase\meta\Meta; |
| | | use JVBase\registrar\Registrar; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | |
| | | } |
| | | |
| | | // Get config for templates and schema type |
| | | $config = self::getConfigFor($objectType, $objectId); |
| | | $schemaConfig = $config['seo']['schema'] ?? []; |
| | | $schemaConfig = []; |
| | | $registrar = Registrar::getInstance($objectType); |
| | | if ($registrar) { |
| | | $schemaConfig = $registrar->getConfig('seo')['schema']??[]; |
| | | } |
| | | |
| | | // Determine schema type |
| | | if ($schemaType === null) { |
| | |
| | | } |
| | | |
| | | // Create resolver for template resolution |
| | | $resolver = $objectType === 'post' ? new TemplateResolver($objectId,'post') : |
| | | ($objectType === 'term' ? new TemplateResolver($objectId,'term') : |
| | | ($objectType === 'user' ? new TemplateResolver($objectId, 'user') : null)); |
| | | $resolver = new TemplateResolver($objectId, $objectType)??null; |
| | | |
| | | // Build reference based on schema type |
| | | switch ($schemaType) { |
| | |
| | | }; |
| | | } |
| | | |
| | | /** |
| | | * Get config for an object |
| | | */ |
| | | private static function getConfigFor(string $objectType, int $objectId): ?array |
| | | { |
| | | switch ($objectType) { |
| | | case 'post': |
| | | $postType = get_post_type($objectId); |
| | | $typeKey = str_replace(BASE, '', $postType); |
| | | return defined('JVB_CONTENT') && isset(JVB_CONTENT[$typeKey]) |
| | | ? JVB_CONTENT[$typeKey] |
| | | : null; |
| | | |
| | | case 'term': |
| | | $term = get_term($objectId); |
| | | if (!$term || is_wp_error($term)) { |
| | | return null; |
| | | } |
| | | $typeKey = str_replace(BASE, '', $term->taxonomy); |
| | | return defined('JVB_TAXONOMY') && isset(JVB_TAXONOMY[$typeKey]) |
| | | ? JVB_TAXONOMY[$typeKey] |
| | | : null; |
| | | |
| | | case 'user': |
| | | $role = jvbUserRole($objectId); |
| | | return defined('JVB_USER') && isset(JVB_USER[$role]) |
| | | ? JVB_USER[$role] |
| | | : null; |
| | | } |
| | | |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * Build just an @id reference (most minimal) |
| | |
| | | */ |
| | | private static function inferSchemaType(string $objectType, int $objectId): string |
| | | { |
| | | $default = 'Thing'; |
| | | $registrar = false; |
| | | if ($objectType === 'post') { |
| | | $postType = get_post_type($objectId); |
| | | $typeKey = str_replace(BASE, '', $postType); |
| | | |
| | | if (defined('JVB_CONTENT') && isset(JVB_CONTENT[$typeKey])) { |
| | | $config = JVB_CONTENT[$typeKey]; |
| | | return $config['seo']['schema']['type'] ?? 'CreativeWork'; |
| | | } |
| | | |
| | | return 'CreativeWork'; |
| | | } |
| | | |
| | | if ($objectType === 'term') { |
| | | $registrar = Registrar::getInstance($postType)); |
| | | $default = 'CreativeWork'; |
| | | } else if ($objectType === 'term') { |
| | | $term = get_term($objectId); |
| | | if (!$term || is_wp_error($term)) { |
| | | return 'DefinedTerm'; |
| | | } |
| | | |
| | | $taxonomyKey = str_replace(BASE, '', $term->taxonomy); |
| | | |
| | | if (defined('JVB_TAXONOMY') && isset(JVB_TAXONOMY[$taxonomyKey])) { |
| | | $config = JVB_TAXONOMY[$taxonomyKey]; |
| | | return $config['seo']['schema']['type'] ?? 'DefinedTerm'; |
| | | } |
| | | |
| | | return 'DefinedTerm'; |
| | | } |
| | | |
| | | if ($objectType === 'user') { |
| | | $registrar = Registrar::getInstance($term->taxonomy)); |
| | | $default = 'DefinedTerm'; |
| | | } elseif ($objectType === 'user') { |
| | | return 'Person'; |
| | | } |
| | | |
| | | return 'Thing'; |
| | | $type = false; |
| | | |
| | | if ($registrar) { |
| | | $type = $registrar->getConfig('seo')['schema']['type']; |
| | | } |
| | | |
| | | return ($type && !empty($type)) ? $type : $default; |
| | | } |
| | | |
| | | /** |
| | |
| | | namespace JVBase\managers\SEO; |
| | | |
| | | use JVBase\meta\Meta; |
| | | use JVBase\registrar\Registrar; |
| | | use WP_Post; |
| | | use WP_Term; |
| | | use WP_User; |
| | |
| | | */ |
| | | private function isRelatedPostsField(string $fieldName): bool |
| | | { |
| | | if (!defined('JVB_CONTENT')) { |
| | | $posts = Registrar::getRegistered('post'); |
| | | if (empty($posts)) { |
| | | return false; |
| | | } |
| | | |
| | | // Check if field name matches any plural content type |
| | | foreach (JVB_CONTENT as $type => $config) { |
| | | $plural = strtolower($config['plural'] ?? ''); |
| | | if ($plural && $fieldName === $plural) { |
| | | foreach ($posts as $post) { |
| | | $registrar = Registrar::getInstance($post); |
| | | if ($registrar && strtolower($registrar->getPlural()) === $fieldName){ |
| | | return true; |
| | | } |
| | | } |
| | |
| | | */ |
| | | private function isRelatedTermsField(string $fieldName): bool |
| | | { |
| | | if (!defined('JVB_TAXONOMY')) { |
| | | |
| | | $posts = Registrar::getRegistered('term'); |
| | | if (empty($posts)) { |
| | | return false; |
| | | } |
| | | |
| | | // Check if field name matches any plural taxonomy |
| | | foreach (JVB_TAXONOMY as $taxonomy => $config) { |
| | | $plural = strtolower($config['plural'] ?? ''); |
| | | if ($plural && $fieldName === $plural) { |
| | | foreach ($posts as $post) { |
| | | $registrar = Registrar::getInstance($post); |
| | | if ($registrar && strtolower($registrar->getPlural()) === $fieldName){ |
| | | return true; |
| | | } |
| | | } |
| | |
| | | */ |
| | | private function getPostTypeFromPluralName(string $pluralName): ?string |
| | | { |
| | | if (!defined('JVB_CONTENT')) { |
| | | |
| | | $posts = Registrar::getRegistered('post'); |
| | | if (empty($posts)) { |
| | | return null; |
| | | } |
| | | |
| | | foreach (JVB_CONTENT as $type => $config) { |
| | | $plural = strtolower($config['plural'] ?? ''); |
| | | if ($plural === $pluralName) { |
| | | return $type; |
| | | foreach ($posts as $post) { |
| | | $registrar = Registrar::getInstance($post); |
| | | if ($registrar && strtolower($registrar->getPlural()) === $pluralName){ |
| | | return $post; |
| | | } |
| | | } |
| | | |
| | | |
| | | return null; |
| | | } |
| | | |
| | |
| | | */ |
| | | private function getTaxonomyFromPluralName(string $pluralName): ?string |
| | | { |
| | | if (!defined('JVB_TAXONOMY')) { |
| | | |
| | | $posts = Registrar::getRegistered('term'); |
| | | if (empty($posts)) { |
| | | return null; |
| | | } |
| | | |
| | | foreach (JVB_TAXONOMY as $taxonomy => $config) { |
| | | $plural = strtolower($config['plural'] ?? ''); |
| | | if ($plural === $pluralName) { |
| | | return $taxonomy; |
| | | foreach ($posts as $post) { |
| | | $registrar = Registrar::getInstance($post); |
| | | if ($registrar && strtolower($registrar->getPlural()) === $pluralName){ |
| | | return $post; |
| | | } |
| | | } |
| | | |
| | | return null; |
| | | } |
| | | |
| | |
| | | return; |
| | | } |
| | | |
| | | $typeKey = str_replace(BASE, '', $this->contentType); |
| | | |
| | | if ($this->objectType === 'post' && defined('JVB_CONTENT')) { |
| | | $this->fieldDefinitions = JVB_CONTENT[$typeKey]['fields'] ?? []; |
| | | } elseif ($this->objectType === 'term' && defined('JVB_TAXONOMY')) { |
| | | $this->fieldDefinitions = JVB_TAXONOMY[$typeKey]['fields'] ?? []; |
| | | } elseif ($this->objectType === 'user' && defined('JVB_USER')) { |
| | | $this->fieldDefinitions = JVB_USER[$typeKey]['fields'] ?? []; |
| | | $registrar = Registrar::getInstance($this->contentType)); |
| | | if ($registrar) { |
| | | $this->fieldDefinitions = $registrar->getFields(); |
| | | } |
| | | } |
| | | } |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/schemas/_setup.php'); |
| | | //New System |
| | | require(JVB_DIR . '/inc/managers/SEO/render/_setup.php'); |
| | | |
| | | require(JVB_DIR . '/inc/managers/SEO/FieldBuilder.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/FieldOverrideBuilder.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/TypeBuilder.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/SchemaBuilder.php'); |
| | | require(JVB_DIR.'/base/seo.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/ConfigManager.php'); |
| | | |
| | | //require(JVB_DIR . '/inc/managers/SEO/schemas/_setup.php'); |
| | | // |
| | | //require(JVB_DIR . '/inc/managers/SEO/FieldBuilder.php'); |
| | | //require(JVB_DIR . '/inc/managers/SEO/FieldOverrideBuilder.php'); |
| | | //require(JVB_DIR . '/inc/managers/SEO/TypeBuilder.php'); |
| | | //require(JVB_DIR . '/inc/managers/SEO/SchemaBuilder.php'); |
| | | //require(JVB_DIR.'/base/seo.php'); |
| | | //require(JVB_DIR . '/inc/managers/SEO/ConfigManager.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/BreadcrumbManager.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/SchemaFieldHelpers.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/SchemaReferenceBuilder.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/TemplateResolver.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/SchemaOutputManager.php'); |
| | | //require(JVB_DIR . '/inc/managers/SEO/SchemaFieldHelpers.php'); |
| | | //require(JVB_DIR . '/inc/managers/SEO/SchemaReferenceBuilder.php'); |
| | | //require(JVB_DIR . '/inc/managers/SEO/TemplateResolver.php'); |
| | | //require(JVB_DIR . '/inc/managers/SEO/SchemaOutputManager.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/SEOAdminPage.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\DataType; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | final class Date { |
| | | /** |
| | | * @var string Time in ISO 8601 format, hh:mm:ss[Z|(+|-)hh:mm] |
| | | */ |
| | | protected string $date; |
| | | |
| | | /** |
| | | * @throws \DateMalformedStringException |
| | | */ |
| | | public function __construct(string $date) |
| | | { |
| | | $this->setDate($date); |
| | | } |
| | | |
| | | public function getDate():?string { |
| | | if (!isset($this->date)) { |
| | | return null; |
| | | } |
| | | return $this->date; |
| | | } |
| | | |
| | | /** |
| | | * @throws \DateMalformedStringException |
| | | */ |
| | | public function setDate(string $date):void |
| | | { |
| | | $time = new \DateTime(strtotime($date)); |
| | | $time = $time->format('c'); |
| | | if ($time){ |
| | | $this->date = $time; |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\DataType; |
| | | |
| | | use DateMalformedStringException; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | final class DateTime { |
| | | /** |
| | | * @var string Time in ISO 8601 format, hh:mm:ss[Z|(+|-)hh:mm] |
| | | */ |
| | | protected string $dateTime; |
| | | |
| | | /** |
| | | * @throws DateMalformedStringException |
| | | */ |
| | | public function __construct(string $date){ |
| | | error_log('Processing date: '.$date); |
| | | $this->setDateTime($date); |
| | | } |
| | | |
| | | public function getDateTime():?string { |
| | | if (!isset($this->dateTime)) { |
| | | return null; |
| | | } |
| | | return $this->dateTime; |
| | | } |
| | | |
| | | /** |
| | | * @throws DateMalformedStringException |
| | | */ |
| | | public function setDateTime(string $date):void { |
| | | |
| | | $time = new \DateTime($date); |
| | | $time = $time->format('c'); |
| | | if ($time){ |
| | | $this->dateTime = $time; |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\DataType; |
| | | use DateMalformedStringException; |
| | | use DateTime; |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | final class Time { |
| | | /** |
| | | * @var string |
| | | */ |
| | | protected string $time; |
| | | |
| | | public function __construct(string $time) |
| | | { |
| | | $this->setTime($time); |
| | | } |
| | | public function getTime():string { |
| | | return $this->time; |
| | | } |
| | | |
| | | /** |
| | | * @throws DateMalformedStringException |
| | | */ |
| | | public function setTime(string $time):void { |
| | | $time = new DateTime(strtotime($time)); |
| | | $time = $time->format('H:i:s'); |
| | | if ($time){ |
| | | $this->time = $time; |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/DataType/Date.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/DataType/DateTime.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/DataType/Time.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render; |
| | | |
| | | use JVBase\managers\Cache; |
| | | use JVBase\managers\SEO\BreadcrumbManager; |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\WebSite; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\OfferCatalog; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Service; |
| | | use JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\LocalBusiness; |
| | | use JVBase\registrar\config\seo\Resolver; |
| | | use JVBase\registrar\Registrar; |
| | | |
| | | class SchemaOutput { |
| | | protected array $types; |
| | | public function __construct() { |
| | | add_action('wp_head', [$this, 'outputSchema'], 0); |
| | | $this->init(); |
| | | } |
| | | |
| | | protected function init(): void { |
| | | $this->types = array_map(function ($type) { return jvbCheckBase($type); }, Registrar::getRegistered()); |
| | | } |
| | | public function buildSchema():array |
| | | { |
| | | $schema = []; |
| | | if (!is_front_page()) { |
| | | $schema[] = $this->buildBasicWebsiteSchema(); |
| | | } |
| | | if (is_singular($this->types)) { |
| | | $type = get_post_type(); |
| | | $registrar = Registrar::getInstance($type); |
| | | if ($registrar && !empty($registrar->getConfig('seo')['schema']??[])) { |
| | | $seo = $registrar->getSEO(); |
| | | $schema[] = $seo->schema()->outputSingularSchema(); |
| | | } |
| | | }elseif (is_post_type_archive($this->types)) { |
| | | |
| | | $type = get_queried_object(); |
| | | $type = $type->name; |
| | | $registrar = Registrar::getInstance($type); |
| | | |
| | | if ($registrar && !empty($registrar->getConfig('seo')['schema']??[])) { |
| | | $seo = $registrar->getSEO(); |
| | | $schema[] =$seo->schema()->outputArchiveSchema(); |
| | | } |
| | | } elseif (is_tax($this->types)) { |
| | | $type = get_queried_object(); |
| | | $type = jvbNoBase($type->taxonomy); |
| | | $registrar = Registrar::getInstance($type); |
| | | if ($registrar && !empty($registrar->getConfig('seo')['schema']??[])) { |
| | | $seo = $registrar->getSEO(); |
| | | $schema[] = $seo->schema()->outputArchiveSchema(); |
| | | } |
| | | } |
| | | |
| | | $breadcrumbs = $this->buildBreadcrumbs(); |
| | | if ($breadcrumbs) { |
| | | $schema[] = $breadcrumbs; |
| | | } |
| | | |
| | | if (!empty($schema)) { |
| | | $website = get_option(BASE.'WebsiteSchema'); |
| | | if (!empty($website)) { |
| | | Cache::for('websiteSchema')->flush(); |
| | | $website = Cache::for('websiteSchema')->remember( |
| | | 'schema', |
| | | function () { |
| | | return $this->websiteSchema(); |
| | | } |
| | | ); |
| | | array_unshift($schema, $website); |
| | | } |
| | | $schema = [ |
| | | '@context' => 'https://schema.org', |
| | | '@graph' => $schema |
| | | ]; |
| | | } |
| | | return $schema; |
| | | } |
| | | |
| | | protected function websiteSchema():array |
| | | { |
| | | $stored = get_option(BASE.'WebsiteSchema', apply_filters(BASE.'WebsiteSchema', [])); |
| | | |
| | | $seo = new WebSite(); |
| | | foreach ($stored as $property => $value) { |
| | | $method = 'set'.ucfirst($property); |
| | | $seo->$method($value); |
| | | } |
| | | $seo->setUrl(get_home_url()); |
| | | $seo->setName(get_bloginfo('name')); |
| | | |
| | | $seo->setCreator($this->getCreator()); |
| | | return $seo->outputSchema(); |
| | | } |
| | | |
| | | public function outputSchema():void |
| | | { |
| | | $schema = $this->buildSchema(); |
| | | if (empty($schema)) { |
| | | return; |
| | | } |
| | | echo "\n<!-- SEO Schema by JakeVan -->\n"; |
| | | echo '<script type="application/ld+json">' . "\n"; |
| | | echo wp_json_encode($schema, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); |
| | | echo "\n" . '</script>' . "\n"; |
| | | } |
| | | |
| | | public function buildBreadcrumbs():array |
| | | { |
| | | return BreadcrumbManager::getInstance()->toSchema(); |
| | | } |
| | | |
| | | public function buildBasicWebsiteSchema():array |
| | | { Cache::for('websiteSchema')->flush(); |
| | | return Cache::for('websiteSchema')->remember( |
| | | 'reference', |
| | | function () { |
| | | $website = new WebSite(); |
| | | $website->setName(get_bloginfo('name')); |
| | | $website->setUrl(get_home_url()); |
| | | $website->setId(get_home_url().'/#website'); |
| | | $website->setDescription(get_bloginfo('description')); |
| | | $website->setInLanguage('en-CA'); |
| | | $publisher = $this->getOptionSchemaReference('organization'); |
| | | if ($publisher){ |
| | | $website->setPublisher($publisher); |
| | | } |
| | | |
| | | $website->setCreator($this->getCreator(true)); |
| | | |
| | | return $website->outputSchema(); |
| | | } |
| | | ); |
| | | } |
| | | |
| | | |
| | | public function getCreator(bool $reference = false):LocalBusiness |
| | | { |
| | | Cache::for('JakeVanCreator')->flush(); |
| | | if ($reference) { |
| | | return Cache::for('JakeVanCreator')->remember( |
| | | 'reference', |
| | | function () { |
| | | $creator = new LocalBusiness(); |
| | | $creator->setName('JakeVan'); |
| | | $creator->setAlternateName('Jake Vanderwerf'); |
| | | $creator->setUrl('https://jakevan.ca/'); |
| | | $creator->setDescription('Let\'s bring your idea to life.'); |
| | | return $creator; |
| | | } |
| | | ); |
| | | } |
| | | |
| | | return Cache::for('JakeVanCreator')->remember( |
| | | 'full', |
| | | function () { |
| | | $creator = new LocalBusiness(); |
| | | $creator->setName('JakeVan'); |
| | | $creator->setId('https://jakevan.ca/#localbusiness'); |
| | | $creator->setAlternateName(['Jake Vanderwerf', 'Rooted Romantic', 'Jacob Vanderwerf']); |
| | | $creator->setUrl('https://jakevan.ca'); |
| | | $creator->setSameAs([ |
| | | 'https://bsky.app/profile/jakevan.ca', |
| | | ]); |
| | | $creator->setAreaServed(['Edmonton, Alberta', 'Alberta', 'Canada']); |
| | | $offers = new OfferCatalog(); |
| | | $offers->setName('Services'); |
| | | $offers->setUrl('https://jakevan.ca/services'); |
| | | |
| | | $graphicDesign = new Service(); |
| | | $graphicDesign->setName('Graphic Design'); |
| | | $graphicDesign->setUrl('https://jakevan.ca/services/design/'); |
| | | $graphicDesign->setDescription('From print to digital design.'); |
| | | $websiteDesign = new Service(); |
| | | $websiteDesign->setName('Development'); |
| | | $websiteDesign->setUrl('https://jakevan.ca/services/development/'); |
| | | $websiteDesign->setDescription('From basic websites to custom functionality.'); |
| | | $strategy = new Service(); |
| | | $strategy->setName('Strategy'); |
| | | $strategy->setUrl('https://jakevan.ca/services/strategy/'); |
| | | $strategy->setDescription('From developing your business plan to SEO.'); |
| | | $art = new Service(); |
| | | $art->setName('Art'); |
| | | $art->setUrl('https://jakevan.ca/services/art/'); |
| | | $art->setDescription('From unique, custom, handmade pieces to small-scale wholesale.'); |
| | | |
| | | $offers->setItemListElement([ |
| | | $graphicDesign, |
| | | $websiteDesign, |
| | | $strategy, |
| | | $art |
| | | ]); |
| | | |
| | | |
| | | $creator->setHasOfferCatalog($offers); |
| | | return $creator; |
| | | } |
| | | ); |
| | | } |
| | | |
| | | public function getOptionSchemaReference(string $option):mixed |
| | | { |
| | | if (!in_array(strtolower($option), array_merge( |
| | | ['organization', |
| | | 'website'], |
| | | Registrar::getRegistered() |
| | | ))) { |
| | | error_log('Attempted to get schema reference for: '.$option.', but it does not exist'); |
| | | return null; |
| | | } |
| | | $action = BASE.ucfirst($option).'Schema'; |
| | | $stored = get_option($action, apply_filters($action, [])); |
| | | // $stored = get_option($action, apply_filters($action, jvbDefaultSchema($option))); |
| | | if (empty($stored)){ |
| | | error_log('Attempted to get schema reference for: '.$option.', but defaults not set.'); |
| | | return null; |
| | | } |
| | | $type = $stored['type']; |
| | | if (!class_exists($type)){ |
| | | error_log('Attempted to get schema reference, but class does not exist: '.$type); |
| | | return null; |
| | | } |
| | | $class = new $type(); |
| | | unset($stored['type']); |
| | | $minimal = apply_filters($action.'Reference', ['name', 'url', 'sameAs', 'logo']); |
| | | |
| | | foreach ($minimal as $property) { |
| | | $method = 'set'.ucfirst($property); |
| | | $value = array_key_exists($property, $stored) ? $stored[$property] : null; |
| | | if (!$value) {continue;} |
| | | |
| | | $class->$method(Resolver::resolve($property, $value)); |
| | | } |
| | | return $class; |
| | | } |
| | | } |
| | | |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | use JVBase\managers\SEO\render\DataType\Time; |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\HowTo; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ContactPoint\PostalAddress; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\EntryPoint; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\ActionStatusType; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\VirtualLocation; |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\actionProcessTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\actionStatusTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\agentTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\endTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\errorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\instrumentTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\locationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\objectTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\participantTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\providerTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\resultTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\startTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\targetTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Action { |
| | | use actionProcessTrait, actionStatusTrait, agentTrait, |
| | | endTimeTrait, errorTrait, instrumentTrait, locationTrait, |
| | | objectTrait, participantTrait, providerTrait, resultTrait, |
| | | startTimeTrait, targetTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasCategoryCodeTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class CategoryCodeSet extends DefinedTermSet { |
| | | use hasCategoryCodeTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\aboutTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\auditDateTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\certificationIdentificationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\certificationRatingTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\certificationStatusTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\datePublishedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\expiresTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\issuedByTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\logoTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\validFromTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\validInTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Certification extends CreativeWork |
| | | { |
| | | use aboutTrait, auditDateTrait, certificationIdentificationTrait, |
| | | certificationRatingTrait, certificationStatusTrait, datePublishedTrait, |
| | | expiresTrait, issuedByTrait, logoTrait, validFromTrait, validInTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\actorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\clipNumberTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\directorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\endOffsetTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\musicByTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\startOffsetTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Clip extends CreativeWork { |
| | | use actorTrait, clipNumberTrait, directorTrait, endOffsetTrait, |
| | | musicByTrait, startOffsetTrait; |
| | | |
| | | // protected Episode $partOfEpisode; |
| | | // protected CreativeWorkSeason $partOfSeason; |
| | | // protected CreativeWorkSeries $partOfSeries; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\aboutTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\abstractTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\accountablePersonTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\acquireLicensePageTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\aggregateRatingTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\alternativeHeadlineTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\associatedMediaTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\audienceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\audioTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\authorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\awardTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\characterTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\citationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\contentLocationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\contentRatingTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\contentReferenceTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\contributorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\copyrightHolderTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\copyrightNoticeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\copyrightYearTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\countryOfOriginTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\creativeWorkStatusTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\creatorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\creditTextTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\dateCreatedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\dateModifiedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\discussionUrlTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\displayLocationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\editorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\encodingFormatTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\encodingTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\exampleOfWorkTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\expiresTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\funderTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\fundingTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\genreTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasPartTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\headlineTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\inLanguageTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\interactionStatisticTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isAccessibleForFreeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isBasedOnTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isFamilyFriendlyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isPartOfTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\keywordsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\licenseTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\locationCreatedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\mainEntityTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\maintainerTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\materialExtentTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\materialTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\mentionsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\offersTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\patternTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\positionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\producerTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\providerTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\publisherImprintTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\publisherTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\publishingPrinciplesTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\recordedAtTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reviewTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sdDatePublishedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sdLicenseTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sdPublisherTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sizeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sourceOrganizationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\spatialCoverageTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\spatialTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sponsorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\teachesTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\temporalCoverageTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\textTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\thumbnailTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\thumbnailUrlTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\timeRequiredTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\translationOfWorkTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\translatorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\typicalAgeRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\versionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\videoTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\wordCountTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\workExampleTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\workTranslationTrait; |
| | | |
| | | |
| | | class CreativeWork extends Thing { |
| | | use aboutTrait, abstractTrait, accountablePersonTrait, acquireLicensePageTrait, |
| | | aggregateRatingTrait, alternativeHeadlineTrait, associatedMediaTrait, audienceTrait, |
| | | audioTrait, authorTrait, awardTrait, characterTrait, citationTrait, contentLocationTrait, |
| | | contentReferenceTimeTrait, contentRatingTrait, contributorTrait, copyrightHolderTrait, |
| | | copyrightNoticeTrait, copyrightYearTrait, countryOfOriginTrait, creativeWorkStatusTrait, |
| | | creatorTrait, creditTextTrait, dateCreatedTrait, dateModifiedTrait, |
| | | discussionUrlTrait, displayLocationTrait, editorTrait, encodingTrait, encodingFormatTrait, |
| | | exampleOfWorkTrait, expiresTrait, funderTrait, fundingTrait, genreTrait, hasPartTrait, |
| | | headlineTrait, inLanguageTrait, interactionStatisticTrait, isAccessibleForFreeTrait, isBasedOnTrait, |
| | | isFamilyFriendlyTrait, isPartOfTrait, keywordsTrait, licenseTrait, locationCreatedTrait, |
| | | mainEntityTrait, maintainerTrait, materialTrait, materialExtentTrait, mentionsTrait, |
| | | offersTrait, patternTrait, positionTrait, producerTrait, providerTrait, publisherTrait, |
| | | publisherImprintTrait, publishingPrinciplesTrait, recordedAtTrait, reviewTrait, sdDatePublishedTrait, |
| | | sdLicenseTrait, sdPublisherTrait, sizeTrait, sourceOrganizationTrait, spatialTrait, |
| | | spatialCoverageTrait, sponsorTrait, teachesTrait, temporalCoverageTrait, textTrait, |
| | | thumbnailTrait, thumbnailUrlTrait, timeRequiredTrait, translationOfWorkTrait, translatorTrait, |
| | | typicalAgeRangeTrait, versionTrait, videoTrait, wordCountTrait, workExampleTrait, workTranslationTrait; |
| | | // protected PublicationEvent $publication; |
| | | // protected PublicationEvent $releasedEvent; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasDefinedTermTrait; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class DefinedTermSet extends CreativeWork { |
| | | use hasDefinedTermTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Quantity\Duration; |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\AdministrativeArea; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class EducationalOccupationalCredential extends CreativeWork { |
| | | /** |
| | | * @var DefinedTerm|string Knowledge, skill, ability or personal attribute that must be demonstrated by a person or other entity in order to do something such as earn an Educational Occupational Credential or understand a LearningResource. |
| | | */ |
| | | protected DefinedTerm|string $competencyRequired; |
| | | /** |
| | | * @var DefinedTerm|string The category or type of credential being described, for example "degree”, “certificate”, “badge”, or more specific term. |
| | | */ |
| | | protected DefinedTerm|string $credentialCategory; |
| | | /** |
| | | * @var DefinedTerm|string The level in terms of progression through an educational or training context. Examples of educational levels include 'beginner', 'intermediate' or 'advanced', and formal sets of level indicators. |
| | | */ |
| | | protected DefinedTerm|string $educationalLevel; |
| | | /** |
| | | * @var Organization An organization that acknowledges the validity, value or utility of a credential. Note: recognition may include a process of quality assurance or accreditation. |
| | | */ |
| | | protected Organization $recognizedBy; |
| | | /** |
| | | * @var Duration The duration of validity of a permit or similar thing. |
| | | */ |
| | | protected Duration $validFor; |
| | | /** |
| | | * @var AdministrativeArea The geographic area where the item is valid. Applies for example to a Permit, a Certification, or an EducationalOccupationalCredential. |
| | | */ |
| | | protected AdministrativeArea $validIn; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ContactPoint\PostalAddress; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\HowToSupply; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\HowToTool; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Quantity\Duration; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\MonetaryAmount; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\estimateCostTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\performTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\prepTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\totalTimeTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class HowTo extends CreativeWork { |
| | | use estimateCostTrait, performTimeTrait, prepTimeTrait, totalTimeTrait; |
| | | |
| | | /** |
| | | * @var CreativeWork|HowToSection|HowToStep|string A single step item (as HowToStep, text, document, video, etc.) or a HowToSection. Supersedes steps. |
| | | */ |
| | | protected CreativeWork|HowToSection|HowToStep|string $step; |
| | | /** |
| | | * @var HowToSupply|string A sub-property of instrument. A supply consumed when performing instructions or a direction. |
| | | */ |
| | | protected HowToSupply|string $supply; |
| | | /** |
| | | * @var HowToTool|string A sub property of instrument. An object used (but not consumed) when performing instructions or a direction. |
| | | */ |
| | | protected HowToTool|string $tool; |
| | | |
| | | /** |
| | | * @var QuantitativeValue|string The quantity that results by performing instructions. For example, a paper airplane, 10 personalized candles. |
| | | */ |
| | | protected QuantitativeValue|string $yield; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Quantity\Duration; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\MonetaryAmount; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class HowToSection extends CreativeWork |
| | | { |
| | | |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Quantity\Duration; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\MonetaryAmount; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class HowToStep extends CreativeWork |
| | | { |
| | | |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\MediaObject; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\captionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\embeddedTextCaptionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\transcriptTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class AudioObject extends MediaObject { |
| | | use captionTrait, embeddedTextCaptionTrait, transcriptTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\MediaObject; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\captionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\exifDataTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\representativeOfPageTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class ImageObject extends MediaObject { |
| | | use captionTrait, representativeOfPageTrait, exifDataTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\MediaObject; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\bitrateTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\contentSizeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\contentUrlTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\durationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\embedURLTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\encodingFormatTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\endTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\heightTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\ineligibleRegionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\regionsAllowedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\startTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\widthTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class MediaObject extends CreativeWork { |
| | | use bitrateTrait, contentSizeTrait, contentUrlTrait, durationTrait, |
| | | embedURLTrait, encodingFormatTrait, endTimeTrait, heightTrait, |
| | | ineligibleRegionTrait, regionsAllowedTrait, startTimeTrait, widthTrait; |
| | | /** |
| | | * var NewsArticle A NewsArticle associated with the Media Object. |
| | | */ |
| | | // protected NewsArticle $associatedArticle; |
| | | |
| | | /** |
| | | * @var CreativeWork The CreativeWork encoded by this media object. |
| | | * Inverse property: encoding |
| | | */ |
| | | protected CreativeWork $encodesCreativeWork; |
| | | |
| | | /** |
| | | * @var string Player type required—for example, Flash or Silverlight. |
| | | */ |
| | | protected string $playerType; |
| | | /** |
| | | * @var Organization The production company or studio responsible for the item, e.g. series, video game, episode etc. |
| | | */ |
| | | protected Organization $productionCompany; |
| | | |
| | | /** |
| | | * @var bool Indicates if use of the media require a subscription (either paid or free). Allowed values are true or false (note that an earlier version had 'yes', 'no'). |
| | | */ |
| | | protected bool $requiresSubscription; |
| | | |
| | | /** |
| | | * @var Date|DateTime Date (including time if available) when this media object was uploaded to this site. |
| | | */ |
| | | protected Date|DateTime $uploadDate; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\MediaObject; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\actorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\captionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\directorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\embeddedTextCaptionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\musicByTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\transcriptTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\videoFrameSizeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\videoQualityTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class VideoObject extends MediaObject { |
| | | use actorTrait, captionTrait, directorTrait, embeddedTextCaptionTrait, |
| | | musicByTrait, transcriptTrait, videoFrameSizeTrait, videoQualityTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/MediaObject/MediaObject.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/MediaObject/AudioObject.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/MediaObject/ImageObject.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/MediaObject/VideoObject.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasMenuItemTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasMenuSectionTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Menu extends CreativeWork { |
| | | use hasMenuItemTrait, hasMenuSectionTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasMenuItemTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasMenuSectionTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class MenuSection extends CreativeWork { |
| | | use hasMenuItemTrait, hasMenuSectionTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\byArtistTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\durationTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class MusicRecording extends CreativeWork { |
| | | use byArtistTrait, durationTrait; |
| | | |
| | | // protected MusicAlbum $inAlbum; |
| | | // protected MusicPlaylist $inPlaylist; |
| | | /** |
| | | * @var string The International Standard Recording Code for the recording. |
| | | */ |
| | | protected string $isrcCode; |
| | | // protected MusicComposition $recordingOf; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Photograph extends CreativeWork { |
| | | |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\itemReviewedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\negativeNotesTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\positiveNotesTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reviewBodyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reviewRatingTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Review extends CreativeWork |
| | | { |
| | | use itemReviewedTrait, negativeNotesTrait, positiveNotesTrait, |
| | | reviewBodyTrait, reviewRatingTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\WebPage; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class AboutPage extends WebPage |
| | | { |
| | | |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\WebPage; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | |
| | | class CheckoutPage extends WebPage |
| | | { |
| | | |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\WebPage; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\breadcrumbTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\lastReviewedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\primaryImageOfPageTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\relatedLinkTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reviewedByTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\significantLinkTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | |
| | | class CollectionPage extends WebPage |
| | | { |
| | | |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\WebPage; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | |
| | | class ContactPage extends WebPage |
| | | { |
| | | |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\WebPage; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | |
| | | class FAQPage extends WebPage |
| | | { |
| | | |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\WebPage; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | |
| | | class ItemPage extends WebPage |
| | | { |
| | | |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\WebPage; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | |
| | | class MedicalWebPage extends WebPage |
| | | { |
| | | //medicalAudience |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\WebPage; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\breadcrumbTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\lastReviewedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\primaryImageOfPageTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\relatedLinkTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reviewedByTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\significantLinkTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | |
| | | class ProfilePage extends CreativeWork |
| | | { |
| | | use breadcrumbTrait, lastReviewedTrait, primaryImageOfPageTrait, |
| | | relatedLinkTrait, reviewedByTrait, significantLinkTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\WebPage; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | |
| | | class QAPage extends WebPage |
| | | { |
| | | |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\WebPage; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | |
| | | class RealEstateListing extends WebPage |
| | | { |
| | | //datePosted |
| | | //leaseLength |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\WebPage; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | |
| | | class SearchResultsPage extends WebPage |
| | | { |
| | | |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork\WebPage; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\breadcrumbTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\lastReviewedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\primaryImageOfPageTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\relatedLinkTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reviewedByTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\significantLinkTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | |
| | | class WebPage extends CreativeWork |
| | | { |
| | | use breadcrumbTrait, lastReviewedTrait, primaryImageOfPageTrait, |
| | | relatedLinkTrait, reviewedByTrait, significantLinkTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/WebPage/WebPage.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/WebPage/AboutPage.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/WebPage/CheckoutPage.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/WebPage/CollectionPage.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/WebPage/ContactPage.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/WebPage/FAQPage.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/WebPage/ItemPage.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/WebPage/MedicalWebPage.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/WebPage/ProfilePage.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/WebPage/QAPage.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/WebPage/RealEstateListing.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/WebPage/SearchResultsPage.php'); |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\CreativeWork; |
| | | |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\issnTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class WebSite extends CreativeWork |
| | | { |
| | | use issnTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/CreativeWork.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/DefinedTermSet.php'); |
| | | |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/CategoryCodeSet.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/Certification.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/Clip.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/EducationalOccupationalCredential.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/HowTo.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/HowToSection.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/HowToStep.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/Menu.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/MenuSection.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/MusicRecording.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/Photograph.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/Review.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/WebSite.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/MediaObject/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/WebPage/_setup.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Event; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\aboutTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\aggregateRatingTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\attendeeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\audienceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\composerTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\contributorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\directorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\doorTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\durationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\endDateTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\funderTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isAccessibleForFreeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\keywordsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\languageTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\locationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\maximumAttendeeCapacityTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\maximumPhysicalAttendeeCapacityTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\maximumVirtualAttendeeCapacityTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\offersTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\organizerTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\performerTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\previousStartDateTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\recordedInTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\remainingAttendeeCapacityTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reviewTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sponsorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\startDateTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\subEventTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\superEventTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\translatorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\typicalAgeRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\workFeaturedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\workPerformedTrait; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Event extends Thing |
| | | { |
| | | use aboutTrait, aggregateRatingTrait, attendeeTrait, audienceTrait, |
| | | composerTrait, contributorTrait, directorTrait, doorTimeTrait, durationTrait, |
| | | endDateTrait, funderTrait, languageTrait, isAccessibleForFreeTrait, keywordsTrait, |
| | | locationTrait, maximumAttendeeCapacityTrait, maximumPhysicalAttendeeCapacityTrait, |
| | | maximumVirtualAttendeeCapacityTrait, offersTrait, organizerTrait, performerTrait, |
| | | previousStartDateTrait, recordedInTrait, remainingAttendeeCapacityTrait, reviewTrait, |
| | | sponsorTrait, startDateTrait, subEventTrait, superEventTrait, translatorTrait, typicalAgeRangeTrait, |
| | | workFeaturedTrait, workPerformedTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Event/Event.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | use JVBase\managers\SEO\render\DataType\Time; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\AdultOrientedEnumeration; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\BusinessFunction; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\DeliveryMethod; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\ItemAvailability; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\OfferItemCondition; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\PhysicalActivityCategory; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Rating\AggregateRating; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\GeoShape; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\PriceSpecification; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\PropertyValue; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | use JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\AdministrativeArea; |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\highPriceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\lowPriceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\offerCountTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\offersTrait; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class AggregateOffer extends Offer { |
| | | use highPriceTrait, lowPriceTrait, offerCountTrait, offersTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\audienceTypeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\geographicAreaTrait; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Audience extends Thing |
| | | { |
| | | use audienceTypeTrait, geographicAreaTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Brand; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\aggregateRatingTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\logoTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reviewTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sloganTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Brand extends Thing |
| | | { |
| | | use logoTrait, reviewTrait, aggregateRatingTrait, sloganTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Brand/Brand.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CategoryCodeSet; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\codeValueTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\inCodeSetTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class CategoryCode extends DefinedTerm { |
| | | use codeValueTrait, inCodeSetTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\ContactPoint; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\addressCountryTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\addressLocalityTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\addressRegionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\extendedAddressTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\postalCodeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\postOfficeBoxNumberTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\streetAddressTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class PostalAddress extends Thing{ |
| | | use addressCountryTrait, addressLocalityTrait, addressRegionTrait, extendedAddressTrait, |
| | | postOfficeBoxNumberTrait, postalCodeTrait, streetAddressTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/ContactPoint/PostalAddress.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\DefinedTermSet; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\aboutTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\inDefinedTermSetTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\termCodeTrait; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class DefinedTerm extends Thing { |
| | | use aboutTrait, inDefinedTermSetTrait, termCodeTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\acceptedPaymentMethodTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\advancedBookingRequirementTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\areaServedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\availabilityEndsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\availabilityStartsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\availabilityTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\availableAtOrFromTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\availableDeliveryMethodTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\businessFunctionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\deliveryLeadTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\inventoryLevelTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\itemOfferedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceSpecificationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sellerTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\serialNumberTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\skuTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\validFromTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\validThroughTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\warrantyTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Demand extends Thing { |
| | | use acceptedPaymentMethodTrait,advancedBookingRequirementTrait, areaServedTrait, availabilityTrait, |
| | | availabilityEndsTrait, availabilityStartsTrait, availableAtOrFromTrait, availableDeliveryMethodTrait, |
| | | businessFunctionTrait, deliveryLeadTimeTrait, |
| | | inventoryLevelTrait, itemOfferedTrait, priceSpecificationTrait, |
| | | sellerTrait, serialNumberTrait, skuTrait, validFromTrait, validThroughTrait, |
| | | warrantyTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\DefinedTermSet; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\DigitalPlatformEnumeration; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\actionPlatformTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\contentTypeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\encodingTypeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\httpMethodTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\urlTemplateTrait; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class EntryPoint extends Thing { |
| | | use actionPlatformTrait, contentTypeTrait, encodingTypeTrait, |
| | | httpMethodTrait, urlTemplateTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class ActionStatusType extends StatusEnumeration { |
| | | protected string $status; |
| | | protected array $allowedStatus = [ |
| | | 'active' => 'https://schema.org/ActiveActionStatus', |
| | | 'completed' => 'https://schema.org/CompletedActionStatus', |
| | | 'failed' => 'https://schema.org/FailedActionStatus', |
| | | 'potential' => 'https://schema.org/PotentialActionStatus' |
| | | ]; |
| | | } |
| | | |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class AdultOrientedEnumeration extends Enumeration { |
| | | protected string $consideration; |
| | | protected array $allowedConsideration = [ |
| | | 'AlcoholConsideration' => 'https://schema.org/AlcoholConsideration', |
| | | 'DangerousGoodConsideration'=> 'https://schema.org/DangerousGoodConsideration', |
| | | 'HealthcareConsideration' => 'https://schema.org/HealthcareConsideration', |
| | | 'NarcoticConsideration' => 'https://schema.org/NarcoticConsideration', |
| | | 'ReducedRelevanceForChildrenConsideration'=>'https://schema.org/ReducedRelevanceForChildrenConsideration', |
| | | 'SexualContentConsideration'=> 'https://schema.org/SexualContentConsideration', |
| | | 'TobaccoNicotineConsideration' => 'https://schema.org/TobaccoNicotineConsideration', |
| | | 'UnclassifiedAdultConsideration' => 'https://schema.org/UnclassifiedAdultConsideration', |
| | | 'ViolenceConsideration' => 'https://schema.org/ViolenceConsideration', |
| | | 'WeaponConsideration' => 'https://schema.org/WeaponConsideration' |
| | | ]; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class BusinessEntityType extends Enumeration { |
| | | protected string $type; |
| | | protected array $allowedType = [ |
| | | 'business' => 'http://purl.org/goodrelations/v1#Business', |
| | | 'endUser' => 'http://purl.org/goodrelations/v1#Enduser', |
| | | 'publicInstitution'=> 'http://purl.org/goodrelations/v1#PublicInstitution', |
| | | 'reseller' => 'http://purl.org/goodrelations/v1#Reseller' |
| | | ]; |
| | | } |
| | | |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class BusinessFunction extends Enumeration { |
| | | protected string $businessFunction; |
| | | protected array $allowedBusinessFunction = [ |
| | | 'constructionInstallation' => 'http://purl.org/goodrelations/v1#ConstructionInstallation', |
| | | 'dispose' => 'http://purl.org/goodrelations/v1#Dispose', |
| | | 'lease' => 'http://purl.org/goodrelations/v1#LeaseOut', |
| | | 'maintain' => 'http://purl.org/goodrelations/v1#Maintain', |
| | | 'provideService' => 'http://purl.org/goodrelations/v1#ProvideService', |
| | | 'repair' => 'http://purl.org/goodrelations/v1#Repair', |
| | | 'sell' => 'http://purl.org/goodrelations/v1#Sell', |
| | | 'buy' => 'http://purl.org/goodrelations/v1#Buy' |
| | | ]; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class CertificationStatusEnumeration extends Enumeration { |
| | | protected string $status; |
| | | protected array $allowedStatus = [ |
| | | 'active' => 'https://schema.org/CertificationActive', |
| | | 'inactive' => 'https://schema.org/CertificationInactive', |
| | | ]; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class ContactPointOption extends Enumeration { |
| | | protected string $option; |
| | | protected array $allowedOption = [ |
| | | 'hearingImpaired' => 'https://schema.org/HearingImpairedSupported', |
| | | 'tollFree' => 'https://schema.org/TollFree', |
| | | ]; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Schedule; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\OpeningHoursSpecification; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\ServicePeriod; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class DayOfWeek extends Enumeration { |
| | | protected string $day; |
| | | protected array $allowedDay = [ |
| | | 'monday' => 'https://schema.org/Monday', |
| | | 'tuesday' => 'https://schema.org/Tuesday', |
| | | 'wednesday' => 'https://schema.org/Wednesday', |
| | | 'thursday' => 'https://schema.org/Thursday', |
| | | 'friday' => 'https://schema.org/Friday', |
| | | 'saturday' => 'https://schema.org/Saturday', |
| | | 'sunday' => 'https://schema.org/Sunday', |
| | | 'publicHolidays' => 'https://schema.org/PublicHolidays' |
| | | ]; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class DeliveryMethod extends Enumeration { |
| | | protected string $method; |
| | | protected array $allowedMethod = [ |
| | | 'OnSitePickup' => 'OnSitePickup', |
| | | 'ParcelService' => 'ParcelService', |
| | | 'LockerPickup' => 'LockerPickup', |
| | | 'directDownload' =>'http://purl.org/goodrelations/v1#DeliveryModeDirectDownload', |
| | | 'freight' => 'http://purl.org/goodrelations/v1#DeliveryModeFreight', |
| | | 'mail' => 'http://purl.org/goodrelations/v1#DeliveryModeMail', |
| | | 'ownFleet' => 'http://purl.org/goodrelations/v1#DeliveryModeOwnFleet', |
| | | 'pickUp' => 'http://purl.org/goodrelations/v1#DeliveryModePickUp', |
| | | 'DHL' => 'http://purl.org/goodrelations/v1#DHL', |
| | | 'FederalExpress' => 'http://purl.org/goodrelations/v1#FederalExpress', |
| | | 'UPS' => 'http://purl.org/goodrelations/v1#UPS' |
| | | ]; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class DigitalPlatformEnumeration extends Enumeration { |
| | | protected string $platform; |
| | | protected array $allowedPlatform = [ |
| | | 'android' => 'https://schema.org/AndroidPlatform', |
| | | 'desktopWeb' => 'https://schema.org/DesktopWebPlatform', |
| | | 'generic' => 'https://schema.org/GenericWebPlatform', |
| | | 'IOS' => 'https://schema.org/IOSPlatform', |
| | | 'mobileWeb' => 'https://schema.org/MobileWebPlatform' |
| | | ]; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Enumeration extends Thing { |
| | | } |
| | | |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class EventStatusType extends StatusEnumeration { |
| | | protected string $status; |
| | | protected array $allowedStatus = [ |
| | | 'cancelled' => 'https://schema.org/EventCancelled', |
| | | 'movedOnline'=> 'https://schema.org/EventMovedOnline', |
| | | 'postponed' => 'https://schema.org/EventPostponed', |
| | | 'rescheduled'=> 'https://schema.org/EventRescheduled', |
| | | 'scheduled' => 'https://schema.org/EventScheduled', |
| | | ]; |
| | | } |
| | | |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class GovernmentBenefitsType extends Enumeration { |
| | | protected string $benefit; |
| | | protected array $allowedBenefit = [ |
| | | 'basicIncome' => 'https://schema.org/BasicIncome', |
| | | 'businessSupport'=> 'https://schema.org/BusinessSupport', |
| | | 'disabilitySupport'=> 'https://schema.org/DisabilitySupport', |
| | | 'healthCare' => 'https://schema.org/HealthCare', |
| | | 'oneTimePayment' => 'https://schema.org/OneTimePayments', |
| | | 'paidLeave' =>'https://schema.org/PaidLeave', |
| | | 'parentalSupport'=> 'https://schema.org/ParentalSupport', |
| | | 'unemploymentSupport'=> 'https://schema.org/UnemploymentSupport' |
| | | ]; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class ItemAvailability extends Enumeration { |
| | | protected string $availability; |
| | | protected array $options = ['BackOrder', 'Discontinued', 'InStock', 'InStoreOnly', 'LimitedAvailability', 'MadeToOrder', 'OnlineOnly', 'OutOfStock','PreOrder', 'PreSale', 'Reserved', 'SoldOut']; |
| | | |
| | | public function setAvailability(string $availability): void { |
| | | if (!in_array($availability, $this->options)) { |
| | | error_log('[ItemAvailability] Invalid availability: '.$availability); |
| | | return; |
| | | } |
| | | $this->availability = $availability; |
| | | } |
| | | |
| | | public function getAvailability(): string { |
| | | return $this->availability; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class ItemListOrderType extends Enumeration { |
| | | protected string $condition; |
| | | protected array $allowedCondition = [ |
| | | 'ascending' => 'https://schema.org/ItemListOrderAscending', |
| | | 'descending' => 'https://schema.org/ItemListOrderDescending', |
| | | 'unordered' => 'https://schema.org/ItemListUnordered' |
| | | ]; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class OfferItemCondition extends Enumeration { |
| | | protected string $condition; |
| | | protected array $allowedCondition = [ |
| | | 'damaged' => 'https://schema.org/DamagedCondition', |
| | | 'new' => 'https://schema.org/NewCondition', |
| | | 'refurbished' => 'https://schema.org/RefurbishedCondition', |
| | | 'used' => 'https://schema.org/UsedCondition' |
| | | ]; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class OrderStatusType extends StatusEnumeration { |
| | | protected string $status; |
| | | protected array $allowedStatus = [ |
| | | 'cancelled' => 'https://schema.org/OrderCancelled', |
| | | 'delivered' => 'https://schema.org/OrderDelivered', |
| | | 'inTransit' => 'https://schema.org/OrderInTransit', |
| | | 'paymentDue'=> 'https://schema.org/OrderPaymentDue', |
| | | 'pickupAvailable'=> 'https://schema.org/OrderPickupAvailable', |
| | | 'problem' => 'https://schema.org/OrderProblem', |
| | | 'processing'=> 'https://schema.org/OrderProcessing', |
| | | 'returned' => 'https://schema.org/OrderReturned' |
| | | ]; |
| | | } |
| | | |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class PhysicalActivityCategory extends Enumeration { |
| | | protected string $activity; |
| | | protected array $allowedActivity = [ |
| | | 'aerobic' => 'https://schema.org/AerobicActivity', |
| | | 'anaerobic' => 'https://schema.org/AnaerobicActivity', |
| | | 'balance' => 'https://schema.org/Balance', |
| | | 'flexibility'=> 'https://schema.org/Flexibility', |
| | | 'leisure' => 'https://schema.org/LeisureTimeActivity', |
| | | 'occupational'=> 'https://schema.org/OccupationalActivity', |
| | | 'strength' => 'https://schema.org/StrengthTraining' |
| | | ]; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\PropertyValue; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\StructuredValue; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\additionalPropertyTrait; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class QualitativeValue extends Enumeration { |
| | | use additionalPropertyTrait; |
| | | |
| | | /** |
| | | * @var QualitativeValue This ordering relation for qualitative values indicates that the subject is equal to the object. |
| | | */ |
| | | protected QualitativeValue $equal; |
| | | /** |
| | | * @var QualitativeValue This ordering relation for qualitative values indicates that the subject is greater than the object. |
| | | */ |
| | | protected QualitativeValue $greater; |
| | | /** |
| | | * @var QualitativeValue This ordering relation for qualitative values indicates that the subject is greater than or equal to the object. |
| | | */ |
| | | protected QualitativeValue $greaterOrEqual; |
| | | /** |
| | | * @var QualitativeValue This ordering relation for qualitative values indicates that the subject is lesser than the object. |
| | | */ |
| | | protected QualitativeValue $lesser; |
| | | /** |
| | | * @var QualitativeValue This ordering relation for qualitative values indicates that the subject is lesser than or equal to the object. |
| | | */ |
| | | protected QualitativeValue $lesserOrEqual; |
| | | /** |
| | | * @var QualitativeValue This ordering relation for qualitative values indicates that the subject is not equal to the object. |
| | | */ |
| | | protected QualitativeValue $nonEqual; |
| | | /** |
| | | * @var DefinedTerm|Enumeration|PropertyValue|QualitativeValue|QuantitativeValue|StructuredValue|string |
| | | *A secondary value that provides additional information on the original value, e.g. a reference temperature or a type of measurement. |
| | | */ |
| | | protected DefinedTerm|Enumeration|PropertyValue|QualitativeValue|QuantitativeValue|StructuredValue|string $valueReference; |
| | | } |
| | | |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class RefundTypeEnumeration extends Enumeration { |
| | | protected string $refundType; |
| | | protected array $allowedRefundType = [ |
| | | 'exchange' => 'https://schema.org/ExchangeRefund', |
| | | 'full' => 'https://schema.org/FullRefund', |
| | | 'credit' => 'https://schema.org/StoreCreditRefund' |
| | | ]; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class RestrictedDiet extends Enumeration { |
| | | protected string $type = "RestrictedDiet"; |
| | | protected string $diet; |
| | | protected array $allowedDiet = [ |
| | | 'DiabeticDiet' => 'https://schema.org/DiabeticDiet', |
| | | 'GlutenFreeDiet' => 'https://schema.org/GlutenFreeDiet', |
| | | 'HalalDiet' => 'https://schema.org/HalalDiet', |
| | | 'HinduDiet' => 'https://schema.org/HinduDiet', |
| | | 'KosherDiet' => 'https://schema.org/KosherDiet', |
| | | 'LowCalorieDiet' => 'https://schema.org/LowCalorieDiet', |
| | | 'LowFatDiet' => 'https://schema.org/LowFatDiet', |
| | | 'LowLactoseDiet' => 'https://schema.org/LowLactoseDiet', |
| | | 'LowSaltDiet' => 'https://schema.org/LowSaltDiet', |
| | | 'VeganDiet' => 'https://schema.org/VeganDiet', |
| | | 'VegetarianDiet' => 'https://schema.org/VegetarianDiet', |
| | | ]; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class SizeGroupEnumeration extends Enumeration { |
| | | |
| | | } |
| | | |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasMeasurementTrait; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class SizeSpecification extends QualitativeValue { |
| | | use hasMeasurementTrait; |
| | | /** |
| | | * @var SizeGroupEnumeration The size group (also known as "size type") for a product's size. Size groups are common in the fashion industry to define size segments and suggested audiences for wearable products. Multiple values can be combined, for example "men's big and tall", "petite maternity" or "regular". |
| | | */ |
| | | protected SizeGroupEnumeration $sizeGroup; |
| | | /** |
| | | * @var SizeSystemEnumeration|string The size system used to identify a product's size. Typically either a standard (for example, "GS1" or "ISO-EN13402"), country code (for example "US" or "JP"), or a measuring system (for example "Metric" or "Imperial"). |
| | | */ |
| | | protected SizeSystemEnumeration|string $sizeSystem; |
| | | /** |
| | | * @var QuantitativeValue The age or age range for the intended audience or person, for example 3-12 months for infants, 1-5 years for toddlers. |
| | | */ |
| | | protected QuantitativeValue $suggestedAge; |
| | | /** |
| | | * @var string The suggested gender of the intended person or audience, for example "male", "female", or "unisex". |
| | | */ |
| | | protected string $suggestedGender; |
| | | /** |
| | | * @var QuantitativeValue A suggested range of body measurements for the intended audience or person, for example inseam between 32 and 34 inches or height between 170 and 190 cm. Typically found on a size chart for wearable products. |
| | | */ |
| | | protected QuantitativeValue $suggestedMeasurement; |
| | | } |
| | | |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class SizeSystemEnumeration extends Enumeration { |
| | | protected string $system; |
| | | protected array $allowedSystem = [ |
| | | 'imperial' => 'https://schema.org/SizeSystemImperial', |
| | | 'metric' => 'https://schema.org/SizeSystemMetric', |
| | | ]; |
| | | |
| | | } |
| | | |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class StatusEnumeration extends Enumeration { |
| | | protected string $status; |
| | | } |
| | | |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class WarrantyScope extends Enumeration { |
| | | protected string $scope; |
| | | protected array $allowedScope = [ |
| | | 'labor' => 'http://purl.org/goodrelations/v1#Labor-BringIn', |
| | | 'partsLaborBring' => 'http://purl.org/goodrelations/v1#PartsAndLabor-BringIn', |
| | | 'partsLaborPick' => 'http://purl.org/goodrelations/v1#PartsAndLabor-PickUp' |
| | | ]; |
| | | } |
| | | |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Enumeration; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class WearableSizeGroupEnumeration extends Enumeration { |
| | | protected string $sizeGroup; |
| | | protected array $allowedSizeGroup = [ |
| | | 'big' => 'https://schema.org/WearableSizeGroupBig', |
| | | 'boys' => 'https://schema.org/WearableSizeGroupBoys', |
| | | 'extraShort'=> 'https://schema.org/WearableSizeGroupExtraShort', |
| | | 'extraTall'=> 'https://schema.org/WearableSizeGroupExtraTall', |
| | | 'girls' => 'https://schema.org/WearableSizeGroupGirls', |
| | | 'husky' => 'https://schema.org/WearableSizeGroupHusky', |
| | | 'infants'=> 'https://schema.org/WearableSizeGroupInfants', |
| | | 'juniors'=> 'https://schema.org/WearableSizeGroupJuniors', |
| | | 'maternity'=> 'https://schema.org/WearableSizeGroupMaternity', |
| | | 'mens' => 'https://schema.org/WearableSizeGroupMens', |
| | | 'misses'=> 'https://schema.org/WearableSizeGroupMisses', |
| | | 'petite'=> 'https://schema.org/WearableSizeGroupPetite', |
| | | 'plus' => 'https://schema.org/WearableSizeGroupPlus', |
| | | 'short'=> 'https://schema.org/WearableSizeGroupRegular', |
| | | 'tall' => 'https://schema.org/WearableSizeGroupTall', |
| | | 'womens' => 'https://schema.org/WearableSizeGroupWomens' |
| | | ]; |
| | | } |
| | | |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/Enumeration.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/AdultOrientedEnumeration.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/BusinessEntityType.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/BusinessFunction.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/CertificationStatusEnumeration.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/ContactPointOption.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/DayOfWeek.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/DeliveryMethod.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/DigitalPlatformEnumeration.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/GovernmentBenefitsType.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/ItemAvailability.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/ItemListOrderType.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/OfferItemCondition.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/PhysicalActivityCategory.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/QualitativeValue.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/RefundTypeEnumeration.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/RestrictedDiet.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/SizeGroupEnumeration.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/SizeSpecification.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/SizeSystemEnumeration.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/StatusEnumeration.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/ActionStatusType.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/EventStatusType.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/OrderStatusType.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/WarrantyScope.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/WearableSizeGroupEnumeration.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\fundedItemTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\funderTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sponsorTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Grant extends Thing { |
| | | use fundedItemTrait, funderTrait, sponsorTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\requiredQuantityTrait; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class HowToItem extends Thing |
| | | { |
| | | use requiredQuantityTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\estimateCostTrait; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class HowToSupply extends HowToItem |
| | | { |
| | | use estimateCostTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\MonetaryAmount; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\requiredQuantityTrait; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class HowToTool extends HowToItem |
| | | { |
| | | use requiredQuantityTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\ItemList; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\aggregateElementTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\itemListElementTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\itemListOrderTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\numberOfItemsTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | |
| | | class BreadcrumbList extends ItemList |
| | | { |
| | | use aggregateElementTrait, itemListElementTrait, itemListOrderTrait, numberOfItemsTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\ItemList; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\aggregateElementTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\itemListElementTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\itemListOrderTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\numberOfItemsTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class ItemList extends Thing |
| | | { |
| | | use aggregateElementTrait, itemListElementTrait, itemListOrderTrait, numberOfItemsTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/ItemList/ItemList.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/ItemList/BreadcrumbList.php'); |
| | | |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Language extends Thing { |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\itemTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\nextItemTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\positionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\previousItemTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class ListItem extends Thing |
| | | { |
| | | use itemTrait, nextItemTrait, previousItemTrait, positionTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\MenuSection; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\RestrictedDiet; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\NutritionalInformation; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\menuAddOnTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\nutritionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\offersTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\suitableForDietTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class MenuItem extends Thing { |
| | | use menuAddOnTrait, nutritionTrait, offersTrait, suitableForDietTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\additionalPropertyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\applicableCountryTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\inStoreReturnsOfferedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\itemConditionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\merchantReturnDaysTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\merchantReturnLinkTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\refundTypeTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class MerchantReturnPolicy extends Thing |
| | | { |
| | | use additionalPropertyTrait, applicableCountryTrait, |
| | | inStoreReturnsOfferedTrait, itemConditionTrait, merchantReturnDaysTrait, |
| | | merchantReturnLinkTrait, refundTypeTrait; |
| | | /** TODO And more... not necessary at this point */ |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\educationRequirementsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\experienceRequirementsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\occupationalCategoryTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\occupationLocationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\qualificationsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\responsibilitiesTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\skillsTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Occupation extends Thing |
| | | { |
| | | use educationRequirementsTrait, experienceRequirementsTrait, occupationLocationTrait, |
| | | occupationalCategoryTrait, qualificationsTrait, responsibilitiesTrait, skillsTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\monthsOfExperienceTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class OccupationalExperienceRequirements extends Thing |
| | | { |
| | | use monthsOfExperienceTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\acceptedPaymentMethodTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\additionalPropertyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\addOnTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\advancedBookingRequirementTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\aggregateRatingTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\areaServedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\availabilityEndsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\availabilityStartsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\availabilityTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\availableAtOrFromTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\availableDeliveryMethodTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\businessFunctionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\categoryTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\checkoutPageURLTemplateTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\deliveryLeadTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\eligibleCustomerTypeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\eligibleDurationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\eligibleQuantityTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\eligibleRegionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\eligibleTransactionVolumeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\gtinTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasAdultConsiderationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasMeasurementTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasMerchantReturnPolicyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\includesObjectTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\ineligibleLocationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\inventoryLevelTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isFamilyFriendlyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\itemConditionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\itemOfferedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\mobileUrlTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\offeredByTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceCurrencyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceSpecificationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceValidUntilTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reviewTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sellerTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\serialNumberTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\skuTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\validFromTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\validThroughTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\warrantyTrait; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Offer extends Thing { |
| | | use acceptedPaymentMethodTrait, addOnTrait, additionalPropertyTrait, |
| | | advancedBookingRequirementTrait, aggregateRatingTrait, areaServedTrait, |
| | | availabilityTrait, availabilityEndsTrait, availabilityStartsTrait, availableAtOrFromTrait, |
| | | availableDeliveryMethodTrait, businessFunctionTrait, categoryTrait, |
| | | checkoutPageURLTemplateTrait, deliveryLeadTimeTrait, eligibleCustomerTypeTrait, |
| | | eligibleDurationTrait, eligibleQuantityTrait, eligibleRegionTrait, eligibleTransactionVolumeTrait, |
| | | gtinTrait, hasAdultConsiderationTrait, hasMeasurementTrait, hasMerchantReturnPolicyTrait, |
| | | includesObjectTrait, ineligibleLocationTrait, inventoryLevelTrait, isFamilyFriendlyTrait, |
| | | itemConditionTrait, itemOfferedTrait, mobileUrlTrait, offeredByTrait, priceTrait, priceCurrencyTrait, |
| | | priceSpecificationTrait, priceValidUntilTrait, reviewTrait, sellerTrait, serialNumberTrait, skuTrait, |
| | | validFromTrait, validThroughTrait, warrantyTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ItemList\ItemList; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class OfferCatalog extends ItemList |
| | | { |
| | | |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\MenuSection; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\RestrictedDiet; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\NutritionalInformation; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\StructuredValue; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\ThingSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | /** |
| | | * Has defined types, but can also use StructuredValue |
| | | */ |
| | | class PaymentMethod { |
| | | use ThingSchema; |
| | | protected StructuredValue|string $method; |
| | | protected array $allowedMethod = [ |
| | | 'bankTransfer' => 'http://purl.org/goodrelations/v1#ByBankTransferInAdvance', |
| | | 'invoice' => 'http://purl.org/goodrelations/v1#ByInvoice', |
| | | 'cash' => 'http://purl.org/goodrelations/v1#Cash', |
| | | 'check' => 'http://purl.org/goodrelations/v1#CheckInAdvance', |
| | | 'cod' => 'http://purl.org/goodrelations/v1#COD', |
| | | 'directDebit' => 'http://purl.org/goodrelations/v1#DirectDebit', |
| | | 'google' => 'http://purl.org/goodrelations/v1#GoogleCheckout', |
| | | 'paypal' => 'http://purl.org/goodrelations/v1#PayPal', |
| | | 'payswarm' => 'http://purl.org/goodrelations/v1#PaySwarm' |
| | | ]; |
| | | |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Quantity; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Distance extends Thing |
| | | { |
| | | /** |
| | | * @var string <Number> <Length unit of measure>'. E.g., '7 ft'. |
| | | */ |
| | | protected string $distance; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Quantity; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Duration extends Thing |
| | | { |
| | | /** |
| | | * @var string Duration (use ISO 8601 duration format). |
| | | */ |
| | | protected string $duration; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Quantity; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Mass extends Thing |
| | | { |
| | | /** |
| | | * @var string <Number> <Mass unit of measure>'. E.g., '7 kg'. |
| | | */ |
| | | protected string $mass; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Quantity/Distance.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Quantity/Duration.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Quantity/Mass.php'); |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Rating; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\itemReviewedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\ratingCountTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reviewCountTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class AggregateRating extends Rating |
| | | { |
| | | use itemReviewedTrait, ratingCountTrait, reviewCountTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Rating; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\authorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\bestRatingTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\ratingValueTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\worstRatingTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Rating extends Thing |
| | | { |
| | | use authorTrait, bestRatingTrait, ratingValueTrait, worstRatingTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Rating/Rating.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Rating/AggregateRating.php'); |
| | | |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Reservation; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\endTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\partySizeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\startTimeTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class FoodEstablishmentReservation extends Reservation { |
| | | use endTimeTrait, partySizeTrait, startTimeTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\Reservation; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\bookingTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceCurrencyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\providerTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reservationForTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reservationIdTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\totalPriceTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Reservation extends Thing { |
| | | use bookingTimeTrait, priceCurrencyTrait, providerTrait, |
| | | reservationForTrait, reservationIdTrait, totalPriceTrait; |
| | | // protected ReservationStatusType $reservationStatus; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Reservation/Reservation.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Reservation/FoodEstablishmentReservation.php'); |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\byDayTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\byMonthDayTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\byMonthTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\byMonthWeekTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\durationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\endDateTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\endTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\exceptDateTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\repeatCountTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\repeatFrequencyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\scheduleTimezoneTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\startDateTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\startTimeTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Schedule extends Thing |
| | | { |
| | | use byDayTrait, byMonthTrait, byMonthDayTrait, byMonthWeekTrait, |
| | | durationTrait, endDateTrait, endTimeTrait, exceptDateTrait, |
| | | repeatCountTrait, repeatFrequencyTrait, scheduleTimezoneTrait, |
| | | startDateTrait, startTimeTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\aggregateRatingTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\areaServedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\audienceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\availableChannelTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\awardTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\brandTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\brokerTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\categoryTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasCertificationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasOfferCatalogTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hoursAvailableTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isRelatedToTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isSimilarToTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\logoTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\offersTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\providerMobilityTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\providerTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reviewTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\serviceOutputTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\serviceTypeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sloganTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\termsOfServiceTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Service extends Thing{ |
| | | use aggregateRatingTrait, areaServedTrait, audienceTrait, availableChannelTrait, |
| | | awardTrait, brandTrait, brokerTrait, categoryTrait, hasCertificationTrait, hasOfferCatalogTrait, |
| | | hoursAvailableTrait, isRelatedToTrait, isSimilarToTrait, logoTrait, offersTrait, |
| | | providerTrait, providerMobilityTrait, reviewTrait, serviceOutputTrait, |
| | | serviceTypeTrait, sloganTrait, termsOfServiceTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\availableLanguageTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\processingTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\providesServiceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\serviceLocationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\servicePhoneTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\servicePostalAddressTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\serviceSmsNumberTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\serviceUrlTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | /** |
| | | * A means for accessing a service, e.g. a government office location, web site, or phone number. |
| | | */ |
| | | class ServiceChannel extends Thing{ |
| | | use availableLanguageTrait, processingTimeTrait, providesServiceTrait, |
| | | serviceLocationTrait, servicePhoneTrait, servicePostalAddressTrait, |
| | | serviceSmsNumberTrait, serviceUrlTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\StructuredValue; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\areaServedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\availableLanguageTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\contactOptionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\contactTypeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\emailTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\faxNumberTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hoursAvailableTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\productSupportedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\telephoneTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class ContactPoint extends StructuredValue { |
| | | use areaServedTrait, availableLanguageTrait, contactOptionTrait, |
| | | contactTypeTrait, emailTrait, faxNumberTrait, hoursAvailableTrait, |
| | | productSupportedTrait, telephoneTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\StructuredValue; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\addressTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\countryTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\elevationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\latitudeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\longitudeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\postalCodeTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class GeoCoordinates extends StructuredValue { |
| | | use addressTrait, countryTrait, elevationTrait, latitudeTrait, longitudeTrait, |
| | | postalCodeTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\StructuredValue; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\addressCountryTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\boxTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\circleTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\elevationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\lineTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\polygonTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\postalAddressTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\postalCodeTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class GeoShape extends StructuredValue { |
| | | use postalAddressTrait, addressCountryTrait, boxTrait, circleTrait, |
| | | elevationTrait, lineTrait, polygonTrait, postalCodeTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\StructuredValue; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | use JVBase\managers\SEO\render\DataType\Time; |
| | | use JVBase\managers\SEO\render\Thing\Action; |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\WebSite; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ContactPoint\PostalAddress; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\VirtualLocation; |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\endTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\interactionServiceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\interactionTypeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\locationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\startTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\userInteractionCountTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class InteractionCounter extends StructuredValue |
| | | { |
| | | use endTimeTrait, interactionServiceTrait, interactionTypeTrait, |
| | | locationTrait, startTimeTrait, userInteractionCountTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\StructuredValue; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hoursAvailableTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\validFromTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\validThroughTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class LocationFeatureSpecification extends PropertyValue { |
| | | use hoursAvailableTrait, validFromTrait, validThroughTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\StructuredValue; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currencyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\maxValueTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\minValueTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\validFromTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\validThroughTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\valueTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class MonetaryAmount extends StructuredValue { |
| | | use currencyTrait, maxValueTrait, minValueTrait, validFromTrait, validThroughTrait, valueTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\StructuredValue; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\caloriesTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\carbohydrateContentTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\cholesterolContentTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\fatContentTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\fiberContentTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\proteinContentTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\saturatedFatContentTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\servingSizeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sodiumContentTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sugarContentTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\transFatContentTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\unsaturatedFatContentTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class NutritionalInformation extends StructuredValue { |
| | | use caloriesTrait, carbohydrateContentTrait, cholesterolContentTrait, |
| | | fatContentTrait, fiberContentTrait, proteinContentTrait, saturatedFatContentTrait, |
| | | servingSizeTrait, sodiumContentTrait, sugarContentTrait, |
| | | transFatContentTrait, unsaturatedFatContentTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\StructuredValue; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\closesTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\dayOfWeekTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\opensTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\validFromTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\validThroughTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class OpeningHoursSpecification extends StructuredValue { |
| | | use closesTrait, dayOfWeekTrait, opensTrait, validFromTrait, validThroughTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\StructuredValue; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\eligibleQuantityTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\eligibleTransactionVolumeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\maxPriceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\membershipPointsEarnedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\minPriceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceCurrencyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\validFromTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\validThroughTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class PriceSpecification extends StructuredValue { |
| | | use eligibleQuantityTrait, eligibleTransactionVolumeTrait, maxPriceTrait, |
| | | membershipPointsEarnedTrait, minPriceTrait, priceTrait, priceCurrencyTrait, |
| | | validFromTrait, validThroughTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\StructuredValue; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\maxValueTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\minValueTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\propertyIDTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\valueTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class PropertyValue extends StructuredValue { |
| | | use maxValueTrait, minValueTrait, propertyIDTrait, valueTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\StructuredValue; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\additionalPropertyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\maxValueTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\minValueTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\unitCodeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\unitTextTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\valueReferenceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\valueTrait; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class QuantitativeValue extends StructuredValue |
| | | { |
| | | use additionalPropertyTrait, maxValueTrait, minValueTrait, |
| | | unitCodeTrait, unitTextTrait, valueTrait, valueReferenceTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\StructuredValue; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Time; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\DayOfWeek; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Quantity\Duration; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\businessDaysTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\cutoffTimeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\durationTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class ServicePeriod extends StructuredValue { |
| | | use businessDaysTrait, cutoffTimeTrait, durationTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\StructuredValue; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\ThingSchema; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class StructuredValue extends Thing { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\StructuredValue; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\amountOfThisGoodTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\businessFunctionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\typeOfGoodTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\unitCodeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\unitTextTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class TypeAndQuantityNode extends StructuredValue { |
| | | use amountOfThisGoodTrait, businessFunctionTrait, typeOfGoodTrait, |
| | | unitCodeTrait, unitTextTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible\StructuredValue; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\WarrantyScope; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\durationOfWarrantyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\warrantyScopeTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class WarrantyPromise extends StructuredValue { |
| | | use durationOfWarrantyTrait, warrantyScopeTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/StructuredValue.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/ContactPoint.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/GeoCoordinates.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/GeoShape.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/InteractionCounter.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/MonetaryAmount.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/NutritionalInformation.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/OpeningHoursSpecification.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/PriceSpecification.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/PropertyValue.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/QuantitativeValue.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/ServicePeriod.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/TypeAndQuantityNode.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/WarrantyPromise.php'); |
| | | |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/LocationFeatureSpecification.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Intangible; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class VirtualLocation extends Thing |
| | | { |
| | | //No additional properties. Recommended: |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Brand/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/ContactPoint/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Enumeration/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/ItemList/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Quantity/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Rating/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Reservation/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/StructuredValue/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Audience.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/DefinedTerm.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/CategoryCode.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Demand.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/EntryPoint.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Grant.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/HowToItem.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/HowToSupply.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/HowToTool.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Language.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/ListItem.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/MenuItem.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/MerchantReturnPolicy.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Occupation.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/OccupationalExperienceRequirements.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Offer.php'); |
| | | |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/AggregateOffer.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/OfferCatalog.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/PaymentMethod.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Schedule.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/Service.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/ServiceChannel.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/VirtualLocation.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class AnimalShelter extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class AutomotiveBusiness extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class ChildCare extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class Dentist extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class DryCleaningOrLaundry extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class EmergencyService extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class EntertainmentBusiness extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class FinancialService extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\LocalBusiness; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class Bakery extends FoodEstablishment { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\LocalBusiness; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class BarOrPub extends FoodEstablishment { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\LocalBusiness; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class Brewery extends FoodEstablishment { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\LocalBusiness; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class CafeOrCoffeeShop extends FoodEstablishment { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\LocalBusiness; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class Distillery extends FoodEstablishment { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\LocalBusiness; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class FastFoodRestaurant extends FoodEstablishment { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\LocalBusiness; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\acceptsReservationsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasMenuTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\servesCuisineTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\starRatingTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class FoodEstablishment extends LocalBusiness { |
| | | use acceptsReservationsTrait, hasMenuTrait, servesCuisineTrait, starRatingTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\LocalBusiness; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class IceCreamShop extends FoodEstablishment { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\LocalBusiness; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class Restaurant extends FoodEstablishment { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\FoodEstablishment; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\LocalBusiness; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class Winery extends FoodEstablishment { |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/FoodEstablishment/FoodEstablishment.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/FoodEstablishment/Bakery.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/FoodEstablishment/BarOrPub.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/FoodEstablishment/Brewery.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/FoodEstablishment/CafeOrCoffeeShop.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/FoodEstablishment/Distillery.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/FoodEstablishment/FastFoodRestaurant.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/FoodEstablishment/IceCreamShop.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/FoodEstablishment/Restaurant.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/FoodEstablishment/Winery.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class GovernmentOffice extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class HealthAndBeautyBusiness extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class HomeAndConstructionBusiness extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class InternetCafe extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class LegalService extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class Library extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | use JVBase\managers\SEO\render\Traits\Place\PlaceSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class LocalBusiness extends Organization { |
| | | use PlaceSchema, |
| | | currenciesAcceptedTrait, openingHoursTrait, |
| | | paymentAcceptedTrait, priceRangeTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class LodgingBusiness extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\MedicalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\LocalBusiness\LocalBusiness; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class MedicalBusiness extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/MedicalBusiness/MedicalBusiness.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class ProfessionalService extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class RadioStation extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class RealEstateAgent extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class RecyclingCenter extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class SelfStorage extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class ShoppingCenter extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class SportsActivityLocation extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class Store extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization\LocalBusiness; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\currenciesAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentAcceptedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\priceRangeTrait; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | //TODO Check |
| | | class TelevisionStation extends LocalBusiness { |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/LocalBusiness.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/FoodEstablishment/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/MedicalBusiness/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/AnimalShelter.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/AutomotiveBusiness.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/ChildCare.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/Dentist.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/DryCleaningOrLaundry.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/EmergencyService.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/EntertainmentBusiness.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/FinancialService.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/GovernmentOffice.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/HealthAndBeautyBusiness.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/HomeAndConstructionBusiness.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/InternetCafe.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/LegalService.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/Library.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/LodgingBusiness.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/ProfessionalService.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/RadioStation.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/RealEstateAgent.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/RecyclingCenter.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/SelfStorage.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/ShoppingCenter.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/SportsActivityLocation.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/Store.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/TelevisionStation.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class OnlineBusiness extends Organization { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\Organization\OrganizationSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Organization extends Thing { |
| | | use OrganizationSchema; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Organization; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class PerformingGroup extends Organization { |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/Organization.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/LocalBusiness/_setup.php'); |
| | | |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/OnlineBusiness.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/PerformingGroup.php'); |
| New file |
| | |
| | | <?php |
| | | |
| | | namespace JVBase\managers\SEO\render\Thing\Person; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\additionalNameTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\addressTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\affiliationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\awardTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\birthDateTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\birthPlaceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\brandTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\childrenTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\colleagueTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\contactPointTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\deathDateTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\dunsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\emailTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\familyNameTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\faxNumberTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\followsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\funderTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\givenNameTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\globalLocationNumberTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasCertificationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasCredentialTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasOccupationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasOfferCatalogTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasPOSTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\heightTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\homeLocationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\honorificPrefixTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\honorificSuffixTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\interactionStatisticTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\jobTitleTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\knowsAboutTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\knowsLanguageTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\lifeEventTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\makesOfferTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\memberOfTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\nationalityTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\ownsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\parentTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\performerInTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\pronounsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\relatedToTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\seeksTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\siblingTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\skillsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sponsorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\spouseTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\telephoneTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\weightTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\worksAtTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\worksForTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Person extends Thing |
| | | { |
| | | use additionalNameTrait, addressTrait, affiliationTrait, awardTrait, |
| | | birthDateTrait, birthPlaceTrait, brandTrait, childrenTrait, |
| | | colleagueTrait, contactPointTrait, deathDateTrait, deathDateTrait, |
| | | dunsTrait, emailTrait, familyNameTrait, faxNumberTrait, followsTrait, |
| | | funderTrait, givenNameTrait, globalLocationNumberTrait, hasCertificationTrait, |
| | | hasCredentialTrait, hasOccupationTrait, hasOfferCatalogTrait, hasPOSTrait, |
| | | heightTrait, homeLocationTrait, honorificPrefixTrait, honorificSuffixTrait, |
| | | interactionStatisticTrait, jobTitleTrait, knowsAboutTrait, knowsLanguageTrait, |
| | | lifeEventTrait, makesOfferTrait, memberOfTrait, nationalityTrait, ownsTrait, |
| | | parentTrait, performerInTrait, pronounsTrait, relatedToTrait, seeksTrait, siblingTrait, |
| | | skillsTrait, sponsorTrait, spouseTrait, telephoneTrait, weightTrait, |
| | | worksAtTrait, worksForTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Person/Person.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Place\AdministrativeArea; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ContactPoint\PostalAddress; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Rating\AggregateRating; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\LocationFeatureSpecification; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\PropertyValue; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class AdministrativeArea extends Thing |
| | | { |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Place\AdministrativeArea; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ContactPoint\PostalAddress; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Country extends AdministrativeArea { |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Place/AdministrativeArea/AdministrativeArea.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Place/AdministrativeArea/Country.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Place; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\Place\PlaceSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Place { |
| | | use PlaceSchema; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Place/AdministrativeArea/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Place/Place.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Product; |
| | | |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\additionalPropertyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\aggregateRatingTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\audienceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\awardTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\brandTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\categoryTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\colorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\countryOfAssemblyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\countryOfOriginTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\depthTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\displayLocationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasAdultConsiderationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasCertificationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasMeasurementTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasMerchantReturnPolicyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\heightTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isAccessoryOrSparePartForTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isConsumableForTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isFamilyFriendlyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isRelatedToTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isSimilarToTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isVariantOfTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\itemConditionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\keywordsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\logoTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\manufacturerTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\materialTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\negativeNotesTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\offersTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\patternTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\positiveNotesTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\productIDTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\releaseDateTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reviewTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sizeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\skuTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sloganTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\weightTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\widthTrait; |
| | | use JVBase\managers\SEO\render\Traits\ThingSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Product { |
| | | use ThingSchema, |
| | | additionalPropertyTrait, aggregateRatingTrait, audienceTrait, |
| | | awardTrait, brandTrait, categoryTrait, colorTrait, countryOfAssemblyTrait, |
| | | countryOfOriginTrait, depthTrait, displayLocationTrait, hasAdultConsiderationTrait, |
| | | hasCertificationTrait, hasMeasurementTrait, hasMerchantReturnPolicyTrait, |
| | | heightTrait, isAccessoryOrSparePartForTrait, isConsumableForTrait, |
| | | isFamilyFriendlyTrait, isRelatedToTrait, isSimilarToTrait, isVariantOfTrait, |
| | | itemConditionTrait, keywordsTrait, logoTrait, manufacturerTrait, materialTrait, negativeNotesTrait, |
| | | offersTrait, patternTrait, positiveNotesTrait, productIDTrait, releaseDateTrait, |
| | | reviewTrait, sizeTrait, skuTrait, sloganTrait, weightTrait, widthTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Product; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasVariantTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\productGroupIDTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\variesByTrait; |
| | | |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class ProductGroup extends Product { |
| | | use hasVariantTrait, productGroupIDTrait, variesByTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Product; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isVariantOfTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\predecessorOfTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\successorOfTrait; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class ProductModel extends Product { |
| | | use isVariantOfTrait, predecessorOfTrait, successorOfTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Product/Product.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Product/ProductGroup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Product/ProductModel.php'); |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Properties/about.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Properties/alternativeHeadline.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class about { |
| | | /** |
| | | * @var string Defined Schema type |
| | | */ |
| | | protected string $type; |
| | | /** |
| | | * @var string The name of the thing |
| | | */ |
| | | protected string $name; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing\Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | final class alternativeHeadline { |
| | | /** |
| | | * @var string A secondary title of the Creative Work |
| | | */ |
| | | protected string $headline; |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Thing; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\ThingSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | class Thing { |
| | | use ThingSchema; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Action.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Thing.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/CreativeWork/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Event/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Intangible/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Organization/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Person/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Place/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Product/_setup.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Thing/Properties/_setup.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\Organization; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\addressTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\aggregateRatingTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\areaServedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\awardTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\brandTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\companyRegistrationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\contactPointTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\departmentTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\dissolutionDateTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\dunsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\emailTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\employeeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\ethicsPolicyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\eventTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\faxNumberTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\founderTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\foundingDateTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\foundingLocationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\funderTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\fundingTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\globalLocationNumberTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasCertificationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasCredentialTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasMerchantReturnPolicyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasOfferCatalogTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasPOSTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\interactionStatisticTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\keywordsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\knowsAboutTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\knowsLanguageTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\legalAddressTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\legalNameTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\legalRepresentativeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\locationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\logoTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\makesOfferTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\memberOfTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\memberTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\naicsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\numberOfEmployeesTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\ownershipFundInfoTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\ownsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\parentOrganizationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\paymentMethodTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reviewTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\seeksTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\skillsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sloganTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sponsorTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\subOrganizationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\taxIDTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\telephoneTrait; |
| | | use JVBase\managers\SEO\render\Traits\ThingSchema; |
| | | |
| | | trait OrganizationSchema { |
| | | use ThingSchema, |
| | | paymentMethodTrait, addressTrait, aggregateRatingTrait, |
| | | areaServedTrait, awardTrait, brandTrait, companyRegistrationTrait, |
| | | contactPointTrait, departmentTrait, dissolutionDateTrait, |
| | | dunsTrait, emailTrait, employeeTrait, ethicsPolicyTrait, |
| | | eventTrait, faxNumberTrait, founderTrait, foundingDateTrait, |
| | | foundingLocationTrait, funderTrait, fundingTrait, globalLocationNumberTrait, |
| | | hasCertificationTrait, hasCredentialTrait, hasMerchantReturnPolicyTrait, |
| | | hasOfferCatalogTrait, hasPOSTrait, interactionStatisticTrait, |
| | | keywordsTrait, knowsAboutTrait, knowsLanguageTrait, legalAddressTrait, |
| | | legalNameTrait, legalRepresentativeTrait, locationTrait, logoTrait, |
| | | makesOfferTrait, memberTrait, memberOfTrait, naicsTrait, numberOfEmployeesTrait, |
| | | ownershipFundInfoTrait, ownsTrait, parentOrganizationTrait, |
| | | reviewTrait, seeksTrait,skillsTrait, sloganTrait, sponsorTrait, |
| | | subOrganizationTrait, taxIDTrait, telephoneTrait; |
| | | |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/Organization/OrganizationSchema.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\Place; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Properties\additionalPropertyTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\aggregateRatingTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\amenityFeatureTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\branchCodeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\containedInPlaceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\eventTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\faxNumberTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\geoTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\globalLocationNumberTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasCertificationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasDriveThroughServiceTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\hasMapTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\isAccessibleForFreeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\keywordsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\latitudeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\logoTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\longitudeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\maximumAttendeeCapacityTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\openingHoursSpecificationTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\photoTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\postalAddressTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\publicAccessTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\reviewTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sloganTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\smokingAllowedTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\specialOpeningHoursTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\telephoneTrait; |
| | | use JVBase\managers\SEO\render\Traits\ThingSchema; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait PlaceSchema { |
| | | use ThingSchema, |
| | | additionalPropertyTrait, postalAddressTrait, aggregateRatingTrait, |
| | | amenityFeatureTrait, branchCodeTrait, containedInPlaceTrait, eventTrait, |
| | | faxNumberTrait, geoTrait, globalLocationNumberTrait, hasCertificationTrait, |
| | | hasDriveThroughServiceTrait, hasMapTrait, isAccessibleForFreeTrait, keywordsTrait, |
| | | latitudeTrait, longitudeTrait, logoTrait, maximumAttendeeCapacityTrait, openingHoursSpecificationTrait, |
| | | photoTrait, publicAccessTrait, reviewTrait, sloganTrait, smokingAllowedTrait, |
| | | specialOpeningHoursTrait, telephoneTrait; |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/Place/PlaceSchema.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | use JVBase\managers\SEO\render\DataType\Time; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\additionalTypeTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\alternateNameTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\descriptionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\disambiguatingDescriptionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\imageTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\mainEntityOfPageTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\nameTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\ownerTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\potentialActionTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\sameAsTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\subjectOfTrait; |
| | | use JVBase\managers\SEO\render\Traits\_Properties\urlTrait; |
| | | |
| | | trait ThingSchema { |
| | | use additionalTypeTrait, alternateNameTrait, descriptionTrait, |
| | | disambiguatingDescriptionTrait, imageTrait, mainEntityOfPageTrait, |
| | | nameTrait, ownerTrait, potentialActionTrait, sameAsTrait, subjectOfTrait, urlTrait; |
| | | |
| | | protected string $id; |
| | | |
| | | protected array $ignore = [ |
| | | 'mappedMethods', |
| | | 'ignore' |
| | | ]; |
| | | public function outputSchema():array |
| | | { |
| | | global $wp; |
| | | $current = home_url( add_query_arg( $_GET, $wp->request ) ); |
| | | $id = (isset($this->id)) ? $this->id : $current.'/#'.strtolower($this->getTypeName()); |
| | | $elements = array_map( |
| | | function ($value) { |
| | | |
| | | if (is_a($value, Thing::class)) { |
| | | return $value->outputSchema(); |
| | | } elseif (is_array($value)) { |
| | | $temp = []; |
| | | foreach ($value as $v) { |
| | | if (is_a($v, Thing::class)) { |
| | | $temp[] = $v->outputSchema(); |
| | | } else { |
| | | $temp[] = $v; |
| | | } |
| | | } |
| | | return $temp; |
| | | }elseif (is_a($value, DateTime::class)) { |
| | | $value = $value->getDateTime(); |
| | | }else if (is_a($value, Date::class)) { |
| | | $value = $value->getDate(); |
| | | } else if (is_a($value, Time::class)) { |
| | | $value = $value->getTime(); |
| | | }else if (!is_string($value)) { |
| | | |
| | | error_log('Normal value? '.print_r($value, true)); |
| | | } |
| | | |
| | | return $value; |
| | | }, |
| | | array_filter(get_object_vars($this), function ($property) { |
| | | return !in_array($property, $this->ignore); |
| | | }, ARRAY_FILTER_USE_KEY) |
| | | ); |
| | | |
| | | return array_merge([ |
| | | '@type' => $this->getTypeName(), |
| | | '@id' => $id, |
| | | ], array_filter($elements)); |
| | | } |
| | | |
| | | public function getTypeName():string |
| | | { |
| | | return (new \ReflectionClass($this))->getShortName(); |
| | | } |
| | | |
| | | public function getProperties():array |
| | | { |
| | | $properties = get_class_vars(self::class); |
| | | $remove = [ |
| | | 'mappedMethods' |
| | | ]; |
| | | return array_filter($properties, function($property) use ($remove) { |
| | | return !in_array($property, $remove); |
| | | }, ARRAY_FILTER_USE_KEY); |
| | | } |
| | | |
| | | |
| | | public static function fromArray(array $config):self |
| | | { |
| | | $instance = new self(); |
| | | foreach ($config as $key => $value) { |
| | | if (!property_exists($instance, $key)){ |
| | | error_log('[SEO]Could not instantiate '.get_class($instance).' property: '.$key); |
| | | continue; |
| | | } |
| | | $instance->$key = $value; |
| | | } |
| | | return $instance; |
| | | } |
| | | |
| | | public function getId():string { |
| | | return $this->id; |
| | | } |
| | | public function setId(string $id):void |
| | | { |
| | | if (!filter_var($id, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO]Could not set id: '.$id.'. Should be a valid URL'); |
| | | return; |
| | | } |
| | | $this->id = $id; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Helpers/arrayHelper.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Helpers; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait arrayHelper { |
| | | protected function classArray(string $property, array $array, string $className):array |
| | | { |
| | | return array_filter($array, function ($item) use ($property, $className) { |
| | | $test = class_exists($className) && is_a($item, $className); |
| | | if (!$test) { |
| | | error_log('[SEO]Item property '.$property.' is not an instance of '.$className); |
| | | } |
| | | return $test; |
| | | }); |
| | | } |
| | | protected function mixedArray(string $property, array $array, array $allowedTypes):array |
| | | { |
| | | return array_filter($array, function($item) use ($property, $allowedTypes) { |
| | | $test = in_array(gettype($item), $allowedTypes) || $this->testClasses($item, $allowedTypes); |
| | | if (!$test) { |
| | | error_log('[SEO]Item property '.$property.' is not an allowed type: '.print_r($item, true)); |
| | | } |
| | | return $test; |
| | | }); |
| | | } |
| | | protected function testClasses(mixed $item, array $allowedTypes):bool |
| | | { |
| | | if (gettype($item) !== 'object') return false; |
| | | foreach ($allowedTypes as $type) { |
| | | if (!class_exists($type)) continue; |
| | | $test = is_a($item, $type); |
| | | if ($test){ |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | protected function stringArray(string $property, array $array):array |
| | | { |
| | | return array_filter($array, function($item) use($property) { |
| | | if (!is_string($item)) { |
| | | error_log('[SEO]Item property '.$property.' is not string: '.print_r($item, true)); |
| | | } |
| | | return is_string($item); |
| | | }); |
| | | } |
| | | protected function urlArray(string $property, array $array):array |
| | | { |
| | | return array_filter($array, function($item) use($property) { |
| | | $test = filter_var($item, FILTER_VALIDATE_URL); |
| | | if (!$test) { |
| | | error_log('[SEO]Item property '.$property.' is not URL: '.print_r($item, true)); |
| | | } |
| | | return $test; |
| | | }); |
| | | } |
| | | protected function intArray(string $property, array $array):array |
| | | { |
| | | return array_filter($array, function($item) use($property) { |
| | | if (!is_int($item)) { |
| | | error_log('[SEO]Item property '.$property.' is not int: '.print_r($item, true)); |
| | | } |
| | | return is_int($item); |
| | | }); |
| | | } |
| | | protected function floatArray(string $property, array $array):array |
| | | { |
| | | return array_filter($array, function($item) use($property) { |
| | | if (!is_float($item)) { |
| | | error_log('[SEO]Item property '.$property.' is not float: '.print_r($item, true)); |
| | | } |
| | | return is_float($item); |
| | | }); |
| | | } |
| | | |
| | | protected function testAllowed(string $property, array $mappedTypes, array $testTypes):array |
| | | { |
| | | return array_map( |
| | | function($item) use ($mappedTypes) { |
| | | return $mappedTypes[strtolower($item)]; |
| | | }, |
| | | array_filter($testTypes, function($item) use($property, $mappedTypes) { |
| | | $test = array_key_exists(strtolower($item), $mappedTypes); |
| | | if (!$test) { |
| | | error_log('[SEO]Item property '.$property.' has invalid type: '.$item); |
| | | } |
| | | return $test; |
| | | }) |
| | | ); |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait _a { |
| | | /** |
| | | * @var string A description of the item |
| | | */ |
| | | protected string $description; |
| | | |
| | | public function getDescription():?string |
| | | { |
| | | return $this->description??null; |
| | | } |
| | | public function setDescription(string $description):void |
| | | { |
| | | $this->description = $description; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/aboutTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/abstractTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/acceptedPaymentMethodTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/acceptsReservationsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/accountablePersonTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/acquireLicensePageTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/actionPlatformTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/actionProcessTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/actionStatusTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/actorTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/additionalNameTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/additionalPropertyTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/additionalTypeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/addOnTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/addressCountryTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/addressLocalityTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/addressRegionTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/addressTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/advancedBookingRequirementTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/affiliationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/agentTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/aggregateElementTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/aggregateRatingTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/alternateNameTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/alternativeHeadlineTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/amenityFeatureTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/amountOfThisGoodTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/applicableCountryTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/areaServedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/associatedMediaTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/attendeeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/audienceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/audienceTypeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/audioTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/auditDateTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/authorTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/availabilityEndsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/availabilityStartsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/availabilityTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/availableAtOrFromTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/availableChannelTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/availableDeliveryMethodTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/availableLanguageTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/awardTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/bestRatingTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/birthDateTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/birthPlaceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/bitrateTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/bookingTimeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/boxTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/branchCodeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/brandTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/breadcrumbTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/brokerTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/businessDaysTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/businessFunctionTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/byArtistTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/byDayTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/byMonthDayTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/byMonthTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/byMonthWeekTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/caloriesTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/captionTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/carbohydrateContentTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/categoryTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/certificationIdentificationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/certificationRatingTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/certificationStatusTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/characterTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/checkoutPageURLTemplateTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/childrenTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/cholesterolContentTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/circleTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/citationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/clipNumberTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/closesTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/codeValueTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/colleagueTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/colorTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/companyRegistrationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/composerTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/contactOptionTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/contactPointTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/contactTypeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/containedInPlaceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/contentLocationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/contentRatingTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/contentReferenceTimeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/contentSizeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/contentTypeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/contentUrlTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/contributorTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/copyrightHolderTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/copyrightNoticeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/copyrightYearTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/countryOfAssemblyTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/countryOfOriginTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/countryTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/creativeWorkStatusTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/creatorTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/creditTextTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/currenciesAcceptedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/currencyTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/cutoffTimeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/dateCreatedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/dateModifiedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/datePublishedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/dayOfWeekTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/deathDateTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/deathPlaceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/deliveryLeadTimeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/departmentTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/depthTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/descriptionTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/directorTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/disambiguatingDescriptionTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/discussionUrlTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/displayLocationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/dissolutionDateTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/doorTimeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/dunsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/durationOfWarrantyTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/durationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/editorTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/educationRequirementsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/elevationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/eligibleCustomerTypeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/eligibleDurationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/eligibleRegionTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/eligibleQuantityTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/eligibleTransactionVolumeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/emailTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/embeddedTextCaptionTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/embedURLTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/employeeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/encodingFormatTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/encodingTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/encodingTypeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/endDateTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/endOffsetTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/endTimeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/errorTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/estimateCostTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/ethicsPolicyTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/eventTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/exampleOfWorkTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/exceptDateTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/exifDataTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/experienceRequirementsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/expiresTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/extendedAddressTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/familyNameTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/fatContentTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/faxNumberTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/fiberContentTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/followsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/founderTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/foundingDateTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/foundingLocationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/fundedItemTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/funderTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/fundingTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/genreTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/geographicAreaTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/geoTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/givenNameTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/globalLocationNumberTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/gtinTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasAdultConsiderationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasCategoryCodeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasCertificationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasCredentialTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasDefinedTermTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasDriveThroughServiceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasMapTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasMeasurementTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasMenuItemTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasMenuSectionTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasMenuTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasMerchantReturnPolicyTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasOccupationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasOfferCatalogTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasPartTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasPOSTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hasVariantTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/headlineTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/heightTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/highPriceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/homeLocationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/honorificPrefixTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/honorificSuffixTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/hoursAvailableTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/httpMethodTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/imageTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/includesObjectTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/inCodeSetTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/inDefinedTermSetTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/ineligibleLocationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/ineligibleRegionTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/inGroupProductWithIDTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/inLanguageTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/inStoreReturnsOfferedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/instrumentTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/interactionServiceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/interactionStatisticTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/interactionTypeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/inventoryLevelTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/isAccessibleForFreeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/isAccessoryOrSparePartForTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/isBasedOnTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/isConsumableForTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/isFamilyFriendlyTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/isPartOfTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/isRelatedToTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/isSimilarToTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/issnTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/issuedByTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/isVariantOfTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/itemConditionTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/itemListElementTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/itemListOrderTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/itemOfferedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/itemReviewedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/itemTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/jobTitleTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/keywordsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/knowsAboutTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/knowsLanguageTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/knowsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/languageTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/lastReviewedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/latitudeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/legalAddressTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/legalNameTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/legalRepresentativeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/licenseTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/lifeEventTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/lineTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/locationCreatedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/locationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/logoTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/longitudeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/lowPriceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/mainEntityOfPageTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/mainEntityTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/maintainerTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/makesOfferTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/manufacturerTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/materialExtentTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/materialTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/maximumAttendeeCapacityTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/maximumPhysicalAttendeeCapacityTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/maximumVirtualAttendeeCapacityTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/maxPriceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/maxValueTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/memberOfTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/membershipPointsEarnedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/memberTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/mentionsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/menuAddOnTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/merchantReturnDaysTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/merchantReturnLinkTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/minPriceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/minValueTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/mobileUrlTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/monthsOfExperienceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/musicByTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/naicsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/nameTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/nationalityTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/negativeNotesTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/nextItemTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/numberOfEmployeesTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/numberOfItemsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/nutritionTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/objectTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/occupationalCategoryTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/occupationLocationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/offerCountTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/offeredByTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/offersTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/openingHoursSpecificationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/openingHoursTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/opensTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/organizerTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/ownershipFundInfoTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/ownerTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/ownsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/parentOrganizationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/parentTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/participantTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/partySizeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/patternTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/paymentAcceptedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/paymentMethodTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/performerInTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/performerTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/performTimeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/photoTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/polygonTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/positionTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/positiveNotesTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/postalAddressTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/postalCodeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/postOfficeBoxNumberTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/potentialActionTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/predecessorOfTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/prepTimeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/previousItemTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/previousStartDateTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/priceCurrencyTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/priceRangeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/priceSpecificationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/priceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/priceValidUntilTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/primaryImageOfPageTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/processingTimeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/producerTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/productGroupIDTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/productIDTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/productSupportedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/pronounsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/propertyIDTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/proteinContentTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/providerMobilityTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/providerTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/providesServiceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/publicAccessTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/publisherImprintTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/publisherTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/publishingPrinciplesTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/qualificationsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/ratingCountTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/ratingValueTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/recordedAtTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/recordedInTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/refundTypeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/regionsAllowedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/relatedLinkTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/relatedToTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/releaseDateTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/remainingAttendeeCapacityTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/repeatCountTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/repeatFrequencyTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/representativeOfPageTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/requiredQuantityTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/reservationForTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/reservationIdTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/responsibilitiesTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/resultTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/reviewBodyTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/reviewCountTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/reviewedByTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/reviewRatingTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/reviewTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/sameAsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/saturatedFatContentTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/scheduleTimezoneTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/sdDatePublishedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/sdLicenseTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/sdPublisherTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/seeksTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/sellerTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/serialNumberTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/servesCuisineTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/serviceLocationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/serviceOutputTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/servicePhoneTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/servicePostalAddressTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/serviceSmsNumberTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/serviceTypeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/serviceUrlTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/servingSizeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/siblingTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/significantLinkTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/sizeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/skillsTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/skuTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/sloganTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/smokingAllowedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/sodiumContentTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/sourceOrganizationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/spatialCoverageTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/spatialTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/specialOpeningHoursTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/sponsorTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/spouseTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/starRatingTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/startDateTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/startOffsetTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/startTimeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/streetAddressTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/subEventTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/subjectOfTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/subOrganizationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/successorOfTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/sugarContentTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/suitableForDietTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/superEventTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/targetTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/taxIDTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/teachesTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/telephoneTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/temporalCoverageTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/termCodeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/termsOfServiceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/textTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/thumbnailTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/thumbnailUrlTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/timeRequiredTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/totalPriceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/totalTimeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/transcriptTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/transFatContentTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/translationOfWorkTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/translatorTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/typeOfGoodTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/typicalAgeRangeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/unitCodeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/unitTextTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/unsaturatedFatContentTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/urlTemplateTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/urlTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/userInteractionCountTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/validFromTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/validInTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/validThroughTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/valueReferenceTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/valueTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/variesByTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/versionTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/videoFrameSizeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/videoQualityTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/videoTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/warrantyScopeTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/warrantyTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/weightTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/widthTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/wordCountTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/workExampleTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/workFeaturedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/workPerformedTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/worksAtTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/worksForTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/workTranslationTrait.php'); |
| | | require(JVB_DIR . '/inc/managers/SEO/render/Traits/_Properties/worstRatingTrait.php'); |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait aboutTrait { |
| | | /** |
| | | * @var Thing The subject matter of an object. |
| | | * Inverse property: subjectOf |
| | | */ |
| | | protected Thing $about; |
| | | |
| | | public function getAbout():?Thing |
| | | { |
| | | return $this->about??null; |
| | | } |
| | | public function setAbout(Thing $about):void |
| | | { |
| | | $this->about = $about; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait abstractTrait { |
| | | /** |
| | | * @var string An abstract is a short abstract that summarizes a CreativeWork. |
| | | */ |
| | | protected string $abstract; |
| | | |
| | | public function getAbstract():?string |
| | | { |
| | | return $this->abstract??null; |
| | | } |
| | | public function setAbstract(string $abstract):void |
| | | { |
| | | $this->abstract = $abstract; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\PaymentMethod; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait acceptedPaymentMethodTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var PaymentMethod|string|array The payment method(s) that are accepted in general by an organization, or for some specific demand or offer. |
| | | */ |
| | | protected PaymentMethod|string|array $acceptedPaymentMethods; |
| | | |
| | | public function getAcceptedPaymentMethods():PaymentMethod|string|array|null |
| | | { |
| | | return $this->acceptedPaymentMethods??null; |
| | | } |
| | | public function setAcceptedPaymentMethods(PaymentMethod|string|array $acceptedPaymentMethods):void |
| | | { |
| | | if (is_array($acceptedPaymentMethods)) { |
| | | $acceptedPaymentMethods = $this->mixedArray('acceptedPaymentMethods', $acceptedPaymentMethods, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\PaymentMethod' |
| | | ]); |
| | | } |
| | | $this->acceptedPaymentMethods = $acceptedPaymentMethods; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait acceptsReservationsTrait { |
| | | /** |
| | | * @var bool|string Indicates whether a FoodEstablishment accepts reservations. Values can be Boolean, an URL at which reservations can be made or (for backwards compatibility) the strings Yes or No. |
| | | */ |
| | | protected bool|string $acceptsReservations; |
| | | |
| | | public function getAcceptsReservations():bool|string|null |
| | | { |
| | | return $this->acceptsReservations??null; |
| | | } |
| | | public function setAcceptsReservations(bool|string $acceptsReservations):void |
| | | { |
| | | if (is_string($acceptsReservations)) { |
| | | if (!filter_var($acceptsReservations, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO] AcceptsReservations must be a URL pointing to where reservations can be made, or a boolean value.'); |
| | | return; |
| | | } |
| | | } |
| | | $this->acceptsReservations = $acceptsReservations; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait accountablePersonTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Person|array Specifies the Person that is legally accountable for the CreativeWork. |
| | | */ |
| | | protected Person|array $accountablePerson; |
| | | |
| | | public function getAccountablePerson():Person|array|null |
| | | { |
| | | return $this->accountablePerson??null; |
| | | } |
| | | public function setAccountablePerson(Person|array $accountablePerson):void |
| | | { |
| | | if (is_array($accountablePerson)) { |
| | | $accountablePerson = $this->classArray('accountablePerson', $accountablePerson, 'JVBase\managers\SEO\render\Thing\Person\Person'); |
| | | } |
| | | $this->accountablePerson = $accountablePerson; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait acquireLicensePageTrait { |
| | | /** |
| | | * @var CreativeWork|string Indicates a page documenting how licenses can be purchased or otherwise acquired, for the current item. |
| | | */ |
| | | protected CreativeWork|string $acquireLicensePage; |
| | | |
| | | public function getAcquireLicensePage():CreativeWork|string|null |
| | | { |
| | | return $this->acquireLicensePage??null; |
| | | } |
| | | public function setAcquireLicensePage(CreativeWork|string $acquireLicensePage):void |
| | | { |
| | | if (is_string($acquireLicensePage)) { |
| | | if (!filter_var($acquireLicensePage, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO] acquireLicensePage is meant to be a url'); |
| | | return; |
| | | } |
| | | } |
| | | $this->acquireLicensePage = $acquireLicensePage; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\DigitalPlatformEnumeration; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait actionPlatformTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var DigitalPlatformEnumeration|string|array The high level platform(s) where the Action can be performed for the given URL. To specify a specific application or operating system instance, use actionApplication. |
| | | */ |
| | | protected DigitalPlatformEnumeration|string|array $actionPlatform; |
| | | |
| | | public function getActionPlatform():DigitalPlatformEnumeration|string|array|null |
| | | { |
| | | return $this->actionPlatform??null; |
| | | } |
| | | public function setActionPlatform(DigitalPlatformEnumeration|string|array $actionPlatform):void |
| | | { |
| | | if (is_array($actionPlatform)) { |
| | | $actionPlatform = $this->mixedArray('actionPlatform', $actionPlatform, [ |
| | | 'string', |
| | | 'DigitalPlatformEnumeration' |
| | | ]); |
| | | } |
| | | $this->actionPlatform = $actionPlatform; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\HowTo; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait actionProcessTrait { |
| | | /** |
| | | * @var HowTo ActionProcess of the process by which the action was performed. |
| | | */ |
| | | protected HowTo $actionProcess; |
| | | |
| | | public function getActionProcess():?HowTo |
| | | { |
| | | return $this->actionProcess??null; |
| | | } |
| | | public function setActionProcess(HowTo $actionProcess):void |
| | | { |
| | | $this->actionProcess = $actionProcess; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\ActionStatusType; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait actionStatusTrait { |
| | | /** |
| | | * @var ActionStatusType Indicates the current disposition of the Action. |
| | | */ |
| | | protected ActionStatusType $actionStatus; |
| | | |
| | | public function getActionStatus():?ActionStatusType |
| | | { |
| | | return $this->actionStatus??null; |
| | | } |
| | | public function setActionStatus(ActionStatusType $actionStatus):void |
| | | { |
| | | $this->actionStatus = $actionStatus; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait actorTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Person|array An actor (individual or a group), e.g. in TV, radio, movie, video games etc., or in an event. Actors can be associated with individual items or with a series, episode, clip. Supersedes actors. |
| | | * Note: Can also be PerformingGroup, not included |
| | | */ |
| | | protected Person|array $actor; |
| | | |
| | | public function getActor():Person|array|null |
| | | { |
| | | return $this->actor??null; |
| | | } |
| | | public function setActor(Person|array $actor):void |
| | | { |
| | | if (is_array($actor)) { |
| | | $actor = $this->classArray('actor', $actor, 'JVBase\managers\SEO\render\Thing\Person\Person'); |
| | | } |
| | | $this->actor = $actor; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Offer; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait addOnTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Offer|array An additional offer that can only be obtained in combination with the first base offer (e.g. supplements and extensions that are available for a surcharge). |
| | | */ |
| | | protected Offer|array $addOn; |
| | | |
| | | public function getAddOn():Offer|array|null |
| | | { |
| | | return $this->addOn??null; |
| | | } |
| | | public function setAddOn(Offer|array $addOn):void |
| | | { |
| | | if (is_array($addOn)) { |
| | | $addOn = $this->classArray('addOn', $addOn, 'JVBase\managers\SEO\render\Thing\Intangible\Offer'); |
| | | } |
| | | $this->addOn = $addOn; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait additionalNameTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var string|array An additional name for a Person, can be used for a middle name. |
| | | */ |
| | | protected string|array $additionalName; |
| | | |
| | | public function getAdditionalName():string|array|null |
| | | { |
| | | return $this->additionalName??null; |
| | | } |
| | | public function setAdditionalName(string|array $additionalName):void |
| | | { |
| | | if (is_array($additionalName)) { |
| | | $additionalName = $this->stringArray('additionalName',$additionalName); |
| | | } |
| | | $this->additionalName = $additionalName; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\PropertyValue; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait additionalPropertyTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var PropertyValue|array A property-value pair representing an additional characteristic of the entity, e.g. a product feature or another characteristic for which there is no matching property in schema.org. |
| | | * |
| | | * Note: Publishers should be aware that applications designed to use specific schema.org properties (e.g. https://schema.org/width, https://schema.org/color, https://schema.org/gtin13, ...) will typically expect such data to be provided using those properties, rather than using the generic property/value mechanism. |
| | | */ |
| | | protected PropertyValue|array $additionalProperty; |
| | | |
| | | public function getAdditionalProperty():PropertyValue|array|null |
| | | { |
| | | return $this->additionalProperty??null; |
| | | } |
| | | public function setAdditionalProperty(PropertyValue|array $additionalProperty):void |
| | | { |
| | | if (is_array($additionalProperty)) { |
| | | $additionalProperty = $this->classArray('additionalProperty', $additionalProperty, 'JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\PropertyValue'); |
| | | } |
| | | $this->additionalProperty = $additionalProperty; |
| | | } |
| | | |
| | | public function getAdditionalPropertyFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'repeater', |
| | | 'label' => 'Additional Properties', |
| | | 'hint' => 'If you need to define another property that does not exist anywhere on this page, add it here.', |
| | | 'fields' => [ |
| | | 'name' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Name' |
| | | ], |
| | | 'propertyID' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Property ID', |
| | | 'hint' => 'A commonly used identifier for the characteristic represented by the property, e.g. a manufacturer or a standard code for a property. propertyID can be (1) a prefixed string, mainly meant to be used with standards for product properties; (2) a site-specific, non-prefixed string (e.g. the primary key of the property or the vendor-specific ID of the property), or (3) a URL indicating the type of the property, either pointing to an external vocabulary, or a Web resource that describes the property (e.g. a glossary entry). Standards bodies should promote a standard prefix for the identifiers of properties from their standards.' |
| | | ], |
| | | 'value' => [ |
| | | 'type' => 'textarea', |
| | | 'label' => 'Value' |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait additionalTypeTrait { |
| | | /** |
| | | * @var string An additional type for the item, typically used for adding more specific types from external vocabularies in microdata syntax. |
| | | * Can be a URL |
| | | */ |
| | | protected string $additionalType; |
| | | |
| | | public function getAdditionalType():?string |
| | | { |
| | | return $this->additionalType??null; |
| | | } |
| | | public function setAdditionalType(string $additionalType):void |
| | | { |
| | | if (filter_var($additionalType, FILTER_VALIDATE_URL)) { |
| | | $this->additionalType = sanitize_url($additionalType); |
| | | } else { |
| | | $this->additionalType = sanitize_text_field($additionalType); |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\Country; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait addressCountryTrait { |
| | | /** |
| | | * @var Country|string The country. Recommended to be in 2-letter ISO 3166-1 alpha-2 format, for example "US". For backward compatibility, a 3-letter ISO 3166-1 alpha-3 country code such as "SGP" or a full country name such as "Singapore" can also be used. |
| | | */ |
| | | protected Country|string $addressCountry; |
| | | |
| | | public function getAddressCountry():Country|string|null |
| | | { |
| | | return $this->addressCountry??null; |
| | | } |
| | | public function setAddressCountry(Country|string $addressCountry):void |
| | | { |
| | | $this->addressCountry = $addressCountry; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait addressLocalityTrait { |
| | | /** |
| | | * @var string The locality in which the street address is, and which is in the region. For example, Mountain View. |
| | | */ |
| | | protected string $addressLocality; |
| | | |
| | | public function getAddressLocality():?string |
| | | { |
| | | return $this->addressLocality??null; |
| | | } |
| | | public function setAddressLocality(string $addressLocality):void |
| | | { |
| | | $this->addressLocality = $addressLocality; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\AdministrativeArea; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait addressRegionTrait { |
| | | /** |
| | | * @var AdministrativeArea|string The region in which the locality is, and which is in the country. For example, California or another appropriate first-level Administrative division. |
| | | */ |
| | | protected AdministrativeArea|string $addressRegion; |
| | | |
| | | public function getAddressRegion():AdministrativeArea|string|null |
| | | { |
| | | return $this->addressRegion??null; |
| | | } |
| | | public function setAddressRegion(AdministrativeArea|string $addressRegion):void |
| | | { |
| | | $this->addressRegion = $addressRegion; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ContactPoint\PostalAddress; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait addressTrait { |
| | | /** |
| | | * @var PostalAddress|string Physical address of the item. |
| | | */ |
| | | protected PostalAddress|string $address; |
| | | |
| | | public function getAddress():PostalAddress|string|null |
| | | { |
| | | return $this->address??null; |
| | | } |
| | | public function setAddress(PostalAddress|array|string $address):void |
| | | { |
| | | if (is_array($address)){ |
| | | $address = PostalAddress::fromArray($address); |
| | | } |
| | | $this->address = $address; |
| | | } |
| | | public function getAddressFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'group', |
| | | 'label' => 'Address', |
| | | 'wrap' => 'details', |
| | | 'fields' => [ |
| | | 'streetAddress' => [ |
| | | 'type' => 'text', |
| | | 'label'=> 'Street Address', |
| | | 'hint' => 'The street address. For example, "6551 111 St NW"' |
| | | ], |
| | | 'extendedAddress' => [ |
| | | 'type' => 'text', |
| | | 'label'=> 'Extended Address', |
| | | 'hint' => 'An address extension such as an apartment number, C/O or alternative name.' |
| | | ], |
| | | 'postOfficeBoxNumber' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'PO Box Number', |
| | | ], |
| | | 'addressLocality' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Address Locality', |
| | | 'hint' => 'The locality in which the street address is, and which is in the region. For example, "Park Allen".' |
| | | ], |
| | | 'addressRegion' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Address Region (Province)', |
| | | ], |
| | | 'postalCode' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Postal Code', |
| | | 'hint' => 'The postal code. For example, T6H 4R5.' |
| | | ], |
| | | 'addressCountry' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Country', |
| | | 'hint' => 'The address country. For example, "CA".', |
| | | 'default' => 'CA' |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait advancedBookingRequirementTrait { |
| | | /** |
| | | * @var QuantitativeValue The amount of time that is required between accepting the offer and the actual usage of the resource or service. |
| | | */ |
| | | protected QuantitativeValue $advancedBookingRequirement; |
| | | |
| | | public function getAdvancedBookingRequirement():?QuantitativeValue |
| | | { |
| | | return $this->advancedBookingRequirement??null; |
| | | } |
| | | public function setAdvancedBookingRequirement(QuantitativeValue $advancedBookingRequirement):void |
| | | { |
| | | $this->advancedBookingRequirement = $advancedBookingRequirement; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait affiliationTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|array An organization that this person is affiliated with. For example, a school/university, a club, or a team. |
| | | */ |
| | | protected Organization|array $affiliation; |
| | | |
| | | public function getAffiliation():Organization|array|null |
| | | { |
| | | return $this->affiliation??null; |
| | | } |
| | | public function setAffiliation(Organization|array $affiliation):void |
| | | { |
| | | if (is_array($affiliation)) { |
| | | $affiliation =$this->classArray('affiliation', $affiliation, 'JVBase\managers\SEO\render\Thing\Organization\Organization'); |
| | | } |
| | | $this->affiliation = $affiliation; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait agentTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array The direct performer or driver of the action (animate or inanimate). E.g. John wrote a book. |
| | | */ |
| | | protected Organization|Person|array $agent; |
| | | |
| | | public function getAgent():Organization|Person|array|null |
| | | { |
| | | return $this->agent??null; |
| | | } |
| | | public function setAgent(Organization|Person|array $agent):void |
| | | { |
| | | if (is_array($agent)) { |
| | | $agent = $this->mixedArray('agent', $agent, [ |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->agent = $agent; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait aggregateElementTrait { |
| | | /** |
| | | * @var Thing Indicates a prototype of the elements in the list that is used to hold aggregate information (ratings, offers, etc.). |
| | | */ |
| | | protected Thing $aggregateElement; |
| | | |
| | | public function getAggregateElement():?Thing |
| | | { |
| | | return $this->aggregateElement??null; |
| | | } |
| | | public function setAggregateElement(Thing $aggregateElement):void |
| | | { |
| | | $this->aggregateElement = $aggregateElement; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Rating\AggregateRating; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait aggregateRatingTrait { |
| | | /** |
| | | * @var AggregateRating The overall rating, based on a collection of reviews or ratings, of the item. |
| | | */ |
| | | protected AggregateRating $aggregateRating; |
| | | |
| | | public function getAggregateRating():?AggregateRating |
| | | { |
| | | return $this->aggregateRating??null; |
| | | } |
| | | public function setAggregateRating(array|AggregateRating $aggregateRating):void |
| | | { |
| | | if (is_array($aggregateRating)){ |
| | | $aggregateRating =AggregateRating::fromArray($aggregateRating); |
| | | } |
| | | $this->aggregateRating = $aggregateRating; |
| | | } |
| | | |
| | | public function getAggregateRatingFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'group', |
| | | 'label' => 'Aggregate/Average Rating', |
| | | 'wrap' => 'details', |
| | | 'fields' => [ |
| | | 'ratingCount' => [ |
| | | 'type' => 'number', |
| | | 'label' => 'The total number of ratings (without text)', |
| | | ], |
| | | 'reviewCount' => [ |
| | | 'type' => 'number', |
| | | 'label' => 'The total number of reviews (with text)' |
| | | ], |
| | | 'bestRating' => [ |
| | | 'type' => 'number', |
| | | 'label' => 'The best rating', |
| | | 'default'=> 5, |
| | | ], |
| | | 'worstRating' => [ |
| | | 'type' => 'number', |
| | | 'label' => 'The worst rating', |
| | | 'default'=> 1, |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait alternateNameTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var string|array An alias for the item, or multiple |
| | | */ |
| | | protected string|array $alternateName; |
| | | |
| | | public function getAlternateName():string|array|null |
| | | { |
| | | return $this->alternateName??null; |
| | | } |
| | | public function setAlternateName(string|array $alternateName):void |
| | | { |
| | | if (is_array($alternateName)) { |
| | | $alternateName = $this->stringArray('alternateName', $alternateName); |
| | | if (empty($alternateName)){ |
| | | return; |
| | | } |
| | | } |
| | | $this->alternateName = $alternateName; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait alternativeHeadlineTrait { |
| | | /** |
| | | * @var string A secondary title of the CreativeWork. |
| | | */ |
| | | protected string $alternativeHeadline; |
| | | |
| | | public function getAlternativeHeadline():?string |
| | | { |
| | | return $this->alternativeHeadline??null; |
| | | } |
| | | public function setAlternativeHeadline(string $alternativeHeadline):void |
| | | { |
| | | $this->alternativeHeadline = $alternativeHeadline; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\LocationFeatureSpecification; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait amenityFeatureTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var LocationFeatureSpecification|array An amenity feature (e.g. a characteristic or service) of the Accommodation. This generic property does not make a statement about whether the feature is included in an offer for the main accommodation or available at extra costs. |
| | | */ |
| | | protected LocationFeatureSpecification|array $amenityFeature; |
| | | |
| | | public function getAmenityFeature():LocationFeatureSpecification|array|null |
| | | { |
| | | return $this->amenityFeature??null; |
| | | } |
| | | public function setAmenityFeature(LocationFeatureSpecification|array $amenityFeature):void |
| | | { |
| | | if (is_array($amenityFeature)) { |
| | | $amenityFeature = $this->classArray('amenityFeature',$amenityFeature, 'JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\LocationFeatureSpecification'); |
| | | } |
| | | $this->amenityFeature = $amenityFeature; |
| | | } |
| | | |
| | | public function getAmenityFeatureFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'repeater', |
| | | 'label' => 'Amenity Feature', |
| | | 'hint' => 'An amenity feature (e.g. a characteristic or service) of the Accommodation. This generic property does not make a statement about whether the feature is included in an offer for the main accommodation or available at extra costs.', |
| | | 'fields' => [ |
| | | |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait amountOfThisGoodTrait { |
| | | /** |
| | | * @var int|float The quantity of the goods included in the offer. |
| | | */ |
| | | protected int|float $amountOfThisGood; |
| | | |
| | | public function getAmountOfThisGood():int|float|null |
| | | { |
| | | return $this->amountOfThisGood??null; |
| | | } |
| | | public function setAmountOfThisGood(int|float $amountOfThisGood):void |
| | | { |
| | | $this->amountOfThisGood = $amountOfThisGood; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\Country; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait applicableCountryTrait { |
| | | use arrayHelper; |
| | | |
| | | /** |
| | | * @var Country|string|array A country where a particular merchant return policy applies to, for example the two-letter ISO 3166-1 alpha-2 country code. |
| | | */ |
| | | protected Country|string|array $applicableCountry; |
| | | |
| | | public function getApplicableCountry():Country|string|array|null |
| | | { |
| | | return $this->applicableCountry??null; |
| | | } |
| | | public function setApplicableCountry(Country|string|array $applicableCountry):void |
| | | { |
| | | if(is_array($applicableCountry)){ |
| | | $applicableCountry = $this->mixedArray('applicableCountry', $applicableCountry, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\Country' |
| | | ]); |
| | | } |
| | | $this->applicableCountry = $applicableCountry; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\GeoShape; |
| | | use JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\AdministrativeArea; |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait areaServedTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var AdministrativeArea|GeoShape|Place|string|array The geographic area where a service or offered item is provided. Supersedes serviceArea. |
| | | */ |
| | | protected AdministrativeArea|GeoShape|Place|string|array $areaServed; |
| | | |
| | | public function getAreaServed():AdministrativeArea|GeoShape|Place|string|array|null |
| | | { |
| | | return $this->areaServed??null; |
| | | } |
| | | public function setAreaServed(AdministrativeArea|GeoShape|Place|string|array $areaServed):void |
| | | { |
| | | if (is_array($areaServed)) { |
| | | $areaServed = $this->mixedArray('areaServed', $areaServed, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\GeoShape', |
| | | 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\AdministrativeArea', |
| | | 'JVBase\managers\SEO\render\Thing\Place\Place' |
| | | ]); |
| | | } |
| | | $this->areaServed = $areaServed; |
| | | } |
| | | public function getAreaServedFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'group', |
| | | 'wrap' => 'details', |
| | | 'label' => 'Area(s) Served', |
| | | 'fields' => [ |
| | | 'name' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Area Name', |
| | | 'hint' => 'neighbourhood, city, province, or country' |
| | | ], |
| | | 'sameAs' => [ |
| | | 'type' => 'url', |
| | | 'label' => 'Same As', |
| | | 'hint' => 'The Wikipedia page of this area' |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\MediaObject\MediaObject; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait associatedMediaTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var MediaObject|array A media object that encodes this CreativeWork. This property is a synonym for encoding. |
| | | */ |
| | | protected MediaObject|array $associatedMedia; |
| | | |
| | | public function getAssociatedMedia():MediaObject|array|null |
| | | { |
| | | return $this->associatedMedia??null; |
| | | } |
| | | public function setAssociatedMedia(MediaObject|array $associatedMedia):void |
| | | { |
| | | if (is_array($associatedMedia)) { |
| | | $associatedMedia = $this->classArray('associatedMedia', $associatedMedia, 'JVBase\managers\SEO\render\Thing\CreativeWork\MediaObject\MediaObject'); |
| | | } |
| | | $this->associatedMedia = $associatedMedia; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait attendeeTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array A person or organization attending the event. Supersedes attendees. |
| | | */ |
| | | protected Organization|Person|array $attendee; |
| | | |
| | | public function getAttendee():Organization|Person|array|null |
| | | { |
| | | return $this->attendee??null; |
| | | } |
| | | public function setAttendee(Organization|Person|array $attendee):void |
| | | { |
| | | if (is_array($attendee)) { |
| | | $attendee = $this->mixedArray('attendee', $attendee, [ |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->attendee = $attendee; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Audience; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait audienceTrait { |
| | | /** |
| | | * @var Audience An intended audience, i.e. a group for whom something was created. Supersedes serviceAudience. |
| | | */ |
| | | protected Audience $audience; |
| | | |
| | | public function getAudience():?Audience |
| | | { |
| | | return $this->audience??null; |
| | | } |
| | | public function setAudience(Audience $audience):void |
| | | { |
| | | $this->audience = $audience; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait audienceTypeTrait { |
| | | /** |
| | | * @var string The target group associated with a given audience (e.g. veterans, car owners, musicians, etc.). |
| | | */ |
| | | protected string $audienceType; |
| | | |
| | | public function getAudienceType():?string |
| | | { |
| | | return $this->audienceType??null; |
| | | } |
| | | public function setAudienceType(string $audienceType):void |
| | | { |
| | | $this->audienceType = $audienceType; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\MediaObject\AudioObject; |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\MediaObject\Clip; |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\MusicRecording; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait audioTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var AudioObject|Clip|MusicRecording|array An embedded audio object. |
| | | */ |
| | | protected AudioObject|Clip|MusicRecording|array $audio; |
| | | |
| | | public function getAudio():AudioObject|Clip|MusicRecording|array|null |
| | | { |
| | | return $this->audio??null; |
| | | } |
| | | public function setAudio(AudioObject|Clip|MusicRecording|array $audio):void |
| | | { |
| | | if (is_array($audio)) { |
| | | $audio = $this->mixedArray('audio', $audio, [ |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\MediaObject\AudioObject', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\MediaObject\Clip', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\MusicRecording' |
| | | ]); |
| | | } |
| | | $this->audio = $audio; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait auditDateTrait { |
| | | /** |
| | | * @var Date|DateTime Date when a certification was last audited. See also gs1:certificationAuditDate. |
| | | */ |
| | | protected Date|DateTime $auditDate; |
| | | |
| | | public function getAuditDate():Date|DateTime|null |
| | | { |
| | | return $this->auditDate??null; |
| | | } |
| | | public function setAuditDate(Date|DateTime $auditDate):void |
| | | { |
| | | $this->auditDate = $auditDate; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait authorTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array The author of this content or rating. Please note that author is special in that HTML 5 provides a special mechanism for indicating authorship via the rel tag. That is equivalent to this and may be used interchangeably. |
| | | */ |
| | | protected Organization|Person|array $author; |
| | | |
| | | public function getAuthor():Organization|Person|array|null |
| | | { |
| | | return $this->author??null; |
| | | } |
| | | public function setAuthor(Organization|Person|array $author):void |
| | | { |
| | | $this->author = $author; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | use JVBase\managers\SEO\render\DataType\Time; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait availabilityEndsTrait { |
| | | /** |
| | | * @var Date|DateTime|Time The end of the availability of the product or service included in the offer. |
| | | */ |
| | | protected Date|DateTime|Time $availabilityEnds; |
| | | |
| | | public function getAvailabilityEnds():Date|DateTime|Time|null |
| | | { |
| | | return $this->availabilityEnds??null; |
| | | } |
| | | public function setAvailabilityEnds(Date|DateTime|Time $availabilityEnds):void |
| | | { |
| | | $this->availabilityEnds = $availabilityEnds; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | use JVBase\managers\SEO\render\DataType\Time; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait availabilityStartsTrait { |
| | | /** |
| | | * @var Date|DateTime|Time The end of the availability of the product or service included in the offer. |
| | | */ |
| | | protected Date|DateTime|Time $availabilityStarts; |
| | | |
| | | public function getAvailabilityStarts():Date|DateTime|Time|null |
| | | { |
| | | return $this->availabilityStarts??null; |
| | | } |
| | | public function setAvailabilityStarts(Date|DateTime|Time $availabilityStarts):void |
| | | { |
| | | $this->availabilityStarts = $availabilityStarts; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\ItemAvailability; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait availabilityTrait { |
| | | /** |
| | | * @var ItemAvailability The availability of this item—for example In stock, Out of stock, Pre-order, etc. |
| | | */ |
| | | protected ItemAvailability $availability; |
| | | |
| | | public function getAvailability():?ItemAvailability |
| | | { |
| | | return $this->availability??null; |
| | | } |
| | | public function setAvailability(ItemAvailability $availability):void |
| | | { |
| | | $this->availability = $availability; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait availableAtOrFromTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Place|array The place(s) from which the offer can be obtained (e.g. store locations). |
| | | */ |
| | | protected Place|array $availableAtOrFrom; |
| | | |
| | | public function getAvailableAtOrFrom():Place|array|null |
| | | { |
| | | return $this->availableAtOrFrom??null; |
| | | } |
| | | public function setAvailableAtOrFrom(Place|array $availableAtOrFrom):void |
| | | { |
| | | if (is_array($availableAtOrFrom)) { |
| | | $availableAtOrFrom = $this->classArray('availableAtOrFrom', $availableAtOrFrom, 'JVBase\managers\SEO\render\Thing\Place\Place'); |
| | | } |
| | | $this->availableAtOrFrom = $availableAtOrFrom; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ServiceChannel; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait availableChannelTrait { |
| | | /** |
| | | * @var ServiceChannel A means of accessing the service (e.g. a phone bank, a web site, a location, etc.). |
| | | */ |
| | | protected ServiceChannel $availableChannel; |
| | | |
| | | public function getAvailableChannel():?ServiceChannel |
| | | { |
| | | return $this->availableChannel??null; |
| | | } |
| | | public function setAvailableChannel(ServiceChannel $availableChannel):void |
| | | { |
| | | $this->availableChannel = $availableChannel; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\DeliveryMethod; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait availableDeliveryMethodTrait { |
| | | /** |
| | | * @var DeliveryMethod The delivery method(s) available for this offer. |
| | | */ |
| | | protected DeliveryMethod $availableDeliveryMethod; |
| | | |
| | | public function getAvailableDeliveryMethod():?DeliveryMethod |
| | | { |
| | | return $this->availableDeliveryMethod??null; |
| | | } |
| | | public function setAvailableDeliveryMethod(DeliveryMethod $availableDeliveryMethod):void |
| | | { |
| | | $this->availableDeliveryMethod = $availableDeliveryMethod; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Language; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait availableLanguageTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Language|string|array A language someone may use with or at the item, service or place. Please use one of the language codes from the IETF BCP 47 standard. See also inLanguage. |
| | | */ |
| | | protected Language|string|array $availableLanguage; |
| | | |
| | | public function getAvailableLanguage():Language|string|array|null |
| | | { |
| | | return $this->availableLanguage??null; |
| | | } |
| | | public function setAvailableLanguage(Language|string|array $availableLanguage):void |
| | | { |
| | | if (is_array($availableLanguage)){ |
| | | $availableLanguage = $this->mixedArray('availableLanguage', $availableLanguage, ['string', 'JVBase\managers\SEO\render\Thing\Intangible\Language']); |
| | | } |
| | | $this->availableLanguage = $availableLanguage; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait awardTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var array|string An award won by or for this item. Supersedes awards. |
| | | */ |
| | | protected array|string $award; |
| | | |
| | | public function getAward():array|string|null |
| | | { |
| | | return $this->award??null; |
| | | } |
| | | public function setAward(array|string $award):void |
| | | { |
| | | if (is_array($award)){ |
| | | $award = $this->stringArray('award',$award); |
| | | } |
| | | $this->award = $award; |
| | | } |
| | | public function getAwardFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'repeater', |
| | | 'label' => 'Award(s)', |
| | | 'hint' => 'List any awards won by this Thing.', |
| | | 'fields' => [ |
| | | 'award' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Award', |
| | | 'hint' => 'Include the award name, year, and presenter (if any)' |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait bestRatingTrait { |
| | | /** |
| | | * @var int The highest value allowed in this rating system. |
| | | */ |
| | | protected int $bestRating = 5; |
| | | |
| | | public function getBestRating():?int |
| | | { |
| | | return $this->bestRating??null; |
| | | } |
| | | public function setBestRating(int $bestRating):void |
| | | { |
| | | $this->bestRating = $bestRating; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait birthDateTrait { |
| | | /** |
| | | * @var Date Date of birth. |
| | | */ |
| | | protected Date $birthDate; |
| | | |
| | | public function getBirthDate():?Date |
| | | { |
| | | return $this->birthDate??null; |
| | | } |
| | | public function setBirthDate(Date $birthDate):void |
| | | { |
| | | $this->birthDate = $birthDate; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait birthPlaceTrait { |
| | | /** |
| | | * @var Place The place where the person was born. |
| | | */ |
| | | protected Place $birthPlace; |
| | | |
| | | public function getBirthPlace():?Place |
| | | { |
| | | return $this->birthPlace??null; |
| | | } |
| | | public function setBirthPlace(Place $birthPlace):void |
| | | { |
| | | $this->birthPlace = $birthPlace; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait bitrateTrait { |
| | | /** |
| | | * @var string The bitrate of the media object. |
| | | */ |
| | | protected string $bitrate; |
| | | |
| | | public function getBitrate():?string |
| | | { |
| | | return $this->bitrate??null; |
| | | } |
| | | public function setBitrate(string $bitrate):void |
| | | { |
| | | $this->bitrate = $bitrate; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait bookingTimeTrait { |
| | | /** |
| | | * @var string The date and time the reservation was booked. |
| | | */ |
| | | protected string $bookingTime; |
| | | |
| | | public function getBookingTime():?string |
| | | { |
| | | return $this->bookingTime??null; |
| | | } |
| | | public function setBookingTime(string $bookingTime):void |
| | | { |
| | | $this->bookingTime = $bookingTime; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait boxTrait { |
| | | /** |
| | | * @var string A box is the area enclosed by the rectangle formed by two points. The first point is the lower corner, the second point is the upper corner. A box is expressed as two points separated by a space character. |
| | | */ |
| | | protected string $box; |
| | | |
| | | public function getBox():?string |
| | | { |
| | | return $this->box??null; |
| | | } |
| | | public function setBox(string $box):void |
| | | { |
| | | $this->box = $box; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait branchCodeTrait { |
| | | /** |
| | | * @var string A short textual code (also called "store code") that uniquely identifies a place of business. The code is typically assigned by the parentOrganization and used in structured URLs. |
| | | * |
| | | * For example, in the URL http://www.starbucks.co.uk/store-locator/etc/detail/3047 the code "3047" is a branchCode for a particular branch. |
| | | */ |
| | | protected string $branchCode; |
| | | |
| | | public function getBranchCode():?string |
| | | { |
| | | return $this->branchCode??null; |
| | | } |
| | | public function setBranchCode(string $branchCode):void |
| | | { |
| | | $this->branchCode = $branchCode; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Brand\Brand; |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait brandTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Brand|Organization|array The brand(s) associated with a product or service, or the brand(s) maintained by an organization or business person. |
| | | */ |
| | | protected Brand|Organization|array $brand; |
| | | |
| | | public function getBrand():Brand|Organization|array|null |
| | | { |
| | | return $this->brand??null; |
| | | } |
| | | public function setBrand(Brand|Organization|array $brand):void |
| | | { |
| | | if (is_array($brand)){ |
| | | $brand = $this->mixedArray('brand',$brand, [ |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\Brand\Brand', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization' |
| | | ]); |
| | | } |
| | | $this->brand = $brand; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ItemList\BreadcrumbList; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait breadcrumbTrait { |
| | | /** |
| | | * @var BreadcrumbList|string A set of links that can help a user understand and navigate a website hierarchy. |
| | | */ |
| | | protected BreadcrumbList|string $breadcrumb; |
| | | |
| | | public function getBreadcrumb():BreadcrumbList|string|null |
| | | { |
| | | return $this->breadcrumb??null; |
| | | } |
| | | public function setBreadcrumb(BreadcrumbList|string $breadcrumb):void |
| | | { |
| | | $this->breadcrumb = $breadcrumb; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait brokerTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array An entity that arranges for an exchange between a buyer and a seller. In most cases a broker never acquires or releases ownership of a product or service involved in an exchange. If it is not clear whether an entity is a broker, seller, or buyer, the latter two terms are preferred. Supersedes bookingAgent. |
| | | */ |
| | | protected Organization|Person|array $broker; |
| | | |
| | | public function getBroker():Organization|Person|array|null |
| | | { |
| | | return $this->broker??null; |
| | | } |
| | | public function setBroker(Organization|Person|array $broker):void |
| | | { |
| | | if (is_array($broker)) { |
| | | $broker = $this->mixedArray('broker', $broker, [ |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->broker = $broker; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\DayOfWeek; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\OpeningHoursSpecification; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait businessDaysTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var DayOfWeek|OpeningHoursSpecification|array Days of the week when the merchant typically operates, indicated via opening hours markup. |
| | | */ |
| | | protected DayOfWeek|OpeningHoursSpecification|array $businessDaysTrait; |
| | | |
| | | public function getBusinessDaysTrait():DayOfWeek|OpeningHoursSpecification|array|null |
| | | { |
| | | return $this->businessDaysTrait??null; |
| | | } |
| | | public function setBusinessDaysTrait(DayOfWeek|OpeningHoursSpecification|array $businessDaysTrait):void |
| | | { |
| | | if (is_array($businessDaysTrait)) { |
| | | $businessDaysTrait = $this->mixedArray('businessDaysTrait', $businessDaysTrait, [ |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\Enumeration\DayOfWeek', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\OpeningHoursSpecification' |
| | | ]); |
| | | } |
| | | $this->businessDaysTrait = $businessDaysTrait; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\BusinessFunction; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait businessFunctionTrait { |
| | | /** |
| | | * @var BusinessFunction The business function (e.g. sell, lease, repair, dispose) of the offer or component of a bundle (TypeAndQuantityNode). The default is http://purl.org/goodrelations/v1#Sell. |
| | | */ |
| | | protected BusinessFunction $businessFunction; |
| | | |
| | | public function getBusinessFunction():?BusinessFunction |
| | | { |
| | | return $this->businessFunction??null; |
| | | } |
| | | public function setBusinessFunction(BusinessFunction $businessFunction):void |
| | | { |
| | | $this->businessFunction = $businessFunction; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait byArtistTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Person|array The artist that performed this album or recording. |
| | | * Note: Can also be MusicGroup, not included |
| | | */ |
| | | protected Person|array $byArtist; |
| | | |
| | | public function getByArtist():Person|array|null |
| | | { |
| | | return $this->byArtist??null; |
| | | } |
| | | public function setByArtist(Person|array $byArtist):void |
| | | { |
| | | if (is_array($byArtist)) { |
| | | $byArtist = $this->classArray('byArtist', $byArtist, 'JVBase\managers\SEO\render\Thing\Person\Person'); |
| | | } |
| | | $this->byArtist = $byArtist; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\DayOfWeek; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait byDayTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var DayOfWeek|string|array Defines the day(s) of the week on which a recurring Event takes place. May be specified using either DayOfWeek, or alternatively Text conforming to iCal's syntax for byDay recurrence rules. |
| | | */ |
| | | protected DayOfWeek|string|array $byDay; |
| | | |
| | | public function getByDay():DayOfWeek|string|array|null |
| | | { |
| | | return $this->byDay??null; |
| | | } |
| | | public function setByDay(DayOfWeek|string|array $byDay):void |
| | | { |
| | | if (is_array($byDay)) { |
| | | $byDay = $this->mixedArray('byDay', $byDay,[ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\Enumeration\DayOfWeek' |
| | | ]); |
| | | } |
| | | $this->byDay = $byDay; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait byMonthDayTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var int|array Defines the month(s) of the year on which a recurring Event takes place. Specified as an Integer between 1-12. January is 1. |
| | | */ |
| | | protected int|array $byMonthDay; |
| | | |
| | | public function getByMonthDay():int|array|null |
| | | { |
| | | return $this->byMonthDay??null; |
| | | } |
| | | public function setByMonthDay(int|array $byMonthDay):void |
| | | { |
| | | if (is_array($byMonthDay)) { |
| | | $byMonthDay = $this->intArray('byMonthDay', $byMonthDay); |
| | | } else { |
| | | $byMonthDay = [$byMonthDay]; |
| | | } |
| | | $byMonthDay = array_filter($byMonthDay, |
| | | function($day) { |
| | | if ($day === 0 || $day > 31) { |
| | | error_log('[SEO] Invalid month day number: '.$day); |
| | | return false; |
| | | } |
| | | return true; |
| | | }); |
| | | if (empty($byMonthDay)){ |
| | | error_log('[SEO]No byMonthDay values remaining'); |
| | | return; |
| | | } |
| | | if (count($byMonthDay) === 1) { |
| | | $byMonthDay = $byMonthDay[0]; |
| | | } |
| | | |
| | | $this->byMonthDay = $byMonthDay; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait byMonthTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var int|array Defines the month(s) of the year on which a recurring Event takes place. Specified as an Integer between 1-12. January is 1. |
| | | */ |
| | | protected int|array $byMonth; |
| | | |
| | | public function getByMonth():int|array|null |
| | | { |
| | | return $this->byMonth??null; |
| | | } |
| | | public function setByMonth(int|array $byMonth):void |
| | | { |
| | | if (is_array($byMonth)) { |
| | | $byMonth = $this->intArray('byMonth', $byMonth); |
| | | } else { |
| | | $byMonth = [$byMonth]; |
| | | } |
| | | $byMonth = array_filter($byMonth, |
| | | function($month) { |
| | | if ($month === 0 || $month > 12) { |
| | | error_log('[SEO] Invalid month number: '.$month); |
| | | return false; |
| | | } |
| | | return true; |
| | | }); |
| | | if (empty($byMonth)){ |
| | | error_log('[SEO]No byMonth values remaining'); |
| | | return; |
| | | } |
| | | if (count($byMonth) === 1) { |
| | | $byMonth = $byMonth[0]; |
| | | } |
| | | |
| | | if ($byMonth === 0 || $byMonth > 12) { |
| | | error_log('[SEO] Invalid month number: '.$byMonth); |
| | | return; |
| | | } |
| | | $this->byMonth = $byMonth; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait byMonthWeekTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var int|array Defines the month(s) of the year on which a recurring Event takes place. Specified as an Integer between 1-12. January is 1. |
| | | */ |
| | | protected int|array $byMonthWeek; |
| | | |
| | | public function getByMonthWeek():int|array|null |
| | | { |
| | | return $this->byMonthWeek??null; |
| | | } |
| | | public function setByMonthWeek(int|array $byMonthWeek):void |
| | | { |
| | | if (is_array($byMonthWeek)) { |
| | | $byMonthWeek = $this->intArray('byMonthWeek', $byMonthWeek); |
| | | } else { |
| | | $byMonthWeek = [$byMonthWeek]; |
| | | } |
| | | $byMonthWeek = array_filter($byMonthWeek, |
| | | function($week) { |
| | | if ($week === 0 || $week > 6) { |
| | | error_log('[SEO] Invalid month number: '.$month); |
| | | return false; |
| | | } |
| | | return true; |
| | | }); |
| | | if (empty($byMonthWeek)){ |
| | | error_log('[SEO]No byMonthWeek values remaining'); |
| | | return; |
| | | } |
| | | if (count($byMonthWeek) === 1) { |
| | | $byMonthWeek = $byMonthWeek[0]; |
| | | } |
| | | |
| | | if ($byMonthWeek === 0 || $byMonthWeek > 12) { |
| | | error_log('[SEO] Invalid month number: '.$byMonthWeek); |
| | | return; |
| | | } |
| | | $this->byMonthWeek = $byMonthWeek; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait caloriesTrait { |
| | | /** |
| | | * @var int|float The number of calories. |
| | | */ |
| | | protected int|float $calories; |
| | | |
| | | public function getCalories():int|float|null |
| | | { |
| | | return $this->calories??null; |
| | | } |
| | | public function setCalories(int|float $calories):void |
| | | { |
| | | $this->calories = $calories; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait captionTrait { |
| | | /** |
| | | * @var string The caption for this object |
| | | */ |
| | | protected string $caption; |
| | | |
| | | public function getCaption():?string |
| | | { |
| | | return $this->caption??null; |
| | | } |
| | | public function setCaption(string $caption):void |
| | | { |
| | | $this->caption = $caption; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait carbohydrateContentTrait { |
| | | /** |
| | | * @var int|float The number of grams of carbohydrates |
| | | */ |
| | | protected int|float $carbohydrateContent; |
| | | |
| | | public function getCarbohydrateContent():int|float|null |
| | | { |
| | | return $this->carbohydrateContent??null; |
| | | } |
| | | public function setCarbohydrateContent(int|float $carbohydrateContent):void |
| | | { |
| | | $this->carbohydrateContent = $carbohydrateContent; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\CategoryCode; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\PhysicalActivityCategory; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait categoryTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var CategoryCode|PhysicalActivityCategory|Thing|string|array A category for the item. Greater signs or slashes can be used to informally indicate a category hierarchy. |
| | | */ |
| | | protected CategoryCode|PhysicalActivityCategory|Thing|string|array $category; |
| | | |
| | | public function getCategory():CategoryCode|PhysicalActivityCategory|Thing|string|array|null |
| | | { |
| | | return $this->category??null; |
| | | } |
| | | public function setCategory(CategoryCode|PhysicalActivityCategory|Thing|string|array $category):void |
| | | { |
| | | if (is_array($category)) { |
| | | $category = $this->mixedArray('category', $category, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Thing', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\CategoryCode', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\Enumeration\PhysicalActivityCategory' |
| | | ]); |
| | | } |
| | | $this->category = $category; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait certificationIdentificationTrait { |
| | | /** |
| | | * @var DefinedTerm|string Identifier of a certification instance (as registered with an independent certification body). Typically this identifier can be used to consult and verify the certification instance. See also gs1:certificationIdentification. |
| | | */ |
| | | protected DefinedTerm|string $certificationIdentification; |
| | | |
| | | public function getCertificationIdentification():DefinedTerm|string|null |
| | | { |
| | | return $this->certificationIdentification??null; |
| | | } |
| | | public function setCertificationIdentification(DefinedTerm|string $certificationIdentification):void |
| | | { |
| | | $this->certificationIdentification = $certificationIdentification; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Rating\Rating; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait certificationRatingTrait { |
| | | /** |
| | | * @var Rating Rating of a certification instance (as defined by an independent certification body). Typically this rating can be used to rate the level to which the requirements of the certification instance are fulfilled. See also gs1:certificationValue. |
| | | */ |
| | | protected Rating $certificationRating; |
| | | |
| | | public function getCertificationRating():?Rating |
| | | { |
| | | return $this->certificationRating??null; |
| | | } |
| | | public function setCertificationRating(Rating $certificationRating):void |
| | | { |
| | | $this->certificationRating = $certificationRating; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\CertificationStatusEnumeration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait certificationStatusTrait { |
| | | /** |
| | | * @var CertificationStatusEnumeration Indicates the current status of a certification: active or inactive. See also gs1:certificationStatus. |
| | | */ |
| | | protected CertificationStatusEnumeration $certificationStatus; |
| | | |
| | | public function getCertificationStatus():?CertificationStatusEnumeration |
| | | { |
| | | return $this->certificationStatus??null; |
| | | } |
| | | public function setCertificationStatus(CertificationStatusEnumeration $certificationStatus):void |
| | | { |
| | | $this->certificationStatus = $certificationStatus; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait characterTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Person|array Fictional person connected with a creative work. |
| | | */ |
| | | protected Person|array $character; |
| | | |
| | | public function getCharacter():Person|array|null |
| | | { |
| | | return $this->character??null; |
| | | } |
| | | public function setCharacter(Person|array $character):void |
| | | { |
| | | if (is_array($character)) { |
| | | $character = $this->classArray('character', $character, 'JVBase\managers\SEO\render\Thing\Person\Person'); |
| | | } |
| | | $this->character = $character; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait checkoutPageURLTemplateTrait { |
| | | /** |
| | | * @var string A URL template (RFC 6570) for a checkout page for an offer. This approach allows merchants to specify a URL for online checkout of the offered product, by interpolating parameters such as the logged in user ID, product ID, quantity, discount code etc. Parameter naming and standardization are not specified here. |
| | | * Example: https://www.example.com/checkout?items={VARIANT_ID_1}:{Quantity_1},{VARIANT_ID_2}:{Quantity_2}&discount={DISCOUNT_CODE}&store_id={pickup_store_id} |
| | | */ |
| | | protected string $checkoutPageURLTemplate; |
| | | |
| | | public function getCheckoutPageURLTemplate():?string |
| | | { |
| | | return $this->checkoutPageURLTemplate??null; |
| | | } |
| | | public function setCheckoutPageURLTemplate(string $checkoutPageURLTemplate):void |
| | | { |
| | | $this->checkoutPageURLTemplate = $checkoutPageURLTemplate; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait childrenTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Person|string|array A child of the person. |
| | | */ |
| | | protected Person|string|array $children; |
| | | |
| | | public function getChildren():Person|string|array|null |
| | | { |
| | | return $this->children??null; |
| | | } |
| | | public function setChildren(Person|string|array $children):void |
| | | { |
| | | if (is_array($children)) { |
| | | $children = $this->mixedArray('children', $children, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->children = $children; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait cholesterolContentTrait { |
| | | /** |
| | | * @var int|float The number of milligrams of cholesterol |
| | | */ |
| | | protected int|float $cholesterolContent; |
| | | |
| | | public function getCholesterolContent():int|float|null |
| | | { |
| | | return $this->cholesterolContent??null; |
| | | } |
| | | public function setCholesterolContent(int|float $cholesterolContent):void |
| | | { |
| | | $this->cholesterolContent = $cholesterolContent; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait circleTrait { |
| | | /** |
| | | * @var string A circle is the circular region of a specified radius centered at a specified latitude and longitude. A circle is expressed as a pair followed by a radius in meters. |
| | | */ |
| | | protected string $circle; |
| | | |
| | | public function getCircle():?string |
| | | { |
| | | return $this->circle??null; |
| | | } |
| | | public function setCircle(string $circle):void |
| | | { |
| | | $this->circle = $circle; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait citationTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var CreativeWork|string|array A citation or reference to another creative work, such as another publication, web page, scholarly article, etc. |
| | | */ |
| | | protected CreativeWork|string|array $citation; |
| | | |
| | | public function getCitation():CreativeWork|string|array|null |
| | | { |
| | | return $this->citation??null; |
| | | } |
| | | public function setCitation(CreativeWork|string|array $citation):void |
| | | { |
| | | if (is_array($citation)) { |
| | | $citation = $this->mixedArray('citation', $citation, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork' |
| | | ]); |
| | | } |
| | | $this->citation = $citation; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait clipNumberTrait { |
| | | /** |
| | | * @var int|string Position of the clip within an ordered group of clips. |
| | | */ |
| | | protected int|string $clipNumber; |
| | | |
| | | public function getClipNumber():int|string|null |
| | | { |
| | | return $this->clipNumber??null; |
| | | } |
| | | public function setClipNumber(int|string $clipNumber):void |
| | | { |
| | | $this->clipNumber = $clipNumber; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Time; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait closesTrait { |
| | | /** |
| | | * @var Time The closing hour of the place or service on the given day(s) of the week |
| | | */ |
| | | protected Time $closes; |
| | | |
| | | public function getCloses():?Time |
| | | { |
| | | return $this->closes??null; |
| | | } |
| | | public function setCloses(Time $closes):void |
| | | { |
| | | $this->closes = $closes; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait codeValueTrait { |
| | | /** |
| | | * @var string A short textual code that uniquely identifies the value. |
| | | */ |
| | | protected string $codeValue; |
| | | |
| | | public function getCodeValue():?string |
| | | { |
| | | return $this->codeValue??null; |
| | | } |
| | | public function setCodeValue(string $codeValue):void |
| | | { |
| | | $this->codeValue = $codeValue; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait colleagueTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Person|string|array A colleague of the person. Supersedes colleagues. |
| | | */ |
| | | protected Person|string|array $colleague; |
| | | |
| | | public function getColleague():Person|string|array|null |
| | | { |
| | | return $this->colleague??null; |
| | | } |
| | | public function setColleague(Person|string|array $colleague):void |
| | | { |
| | | if (is_array($colleague)) { |
| | | $colleague = $this->mixedArray('colleague', $colleague, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->colleague = $colleague; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait colorTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var array|string The color of the product. |
| | | */ |
| | | protected array|string $color; |
| | | |
| | | public function getColor():array|string|null |
| | | { |
| | | return $this->color??null; |
| | | } |
| | | public function setColor(array|string $color):void |
| | | { |
| | | if (is_array($color)) { |
| | | $color = $this->stringArray('color', $color); |
| | | } |
| | | $this->color = $color; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\Certification; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait companyRegistrationTrait { |
| | | /** |
| | | * @var Certification A companyRegistration of the item |
| | | */ |
| | | protected Certification $companyRegistration; |
| | | |
| | | public function getCompanyRegistration():?Certification |
| | | { |
| | | return $this->companyRegistration??null; |
| | | } |
| | | public function setCompanyRegistration(array|Certification $companyRegistration):void |
| | | { |
| | | if (is_array($companyRegistration)) { |
| | | $companyRegistration = Certification::fromArray($companyRegistration); |
| | | } |
| | | $this->companyRegistration = $companyRegistration; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait composerTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array The person or organization who wrote a composition, or who is the composer of a work performed at some event. |
| | | */ |
| | | protected Organization|Person|array $composer; |
| | | |
| | | public function getComposer():Organization|Person|array|null |
| | | { |
| | | return $this->composer??null; |
| | | } |
| | | public function setComposer(Organization|Person|array $composer):void |
| | | { |
| | | if (is_array($composer)) { |
| | | $composer = $this->mixedArray('composer', $composer, [ |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->composer = $composer; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\ContactPointOption; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait contactOptionTrait { |
| | | /** |
| | | * @var ContactPointOption An option available on this contact point (e.g. a toll-free number or support for hearing-impaired callers). |
| | | */ |
| | | protected ContactPointOption $contactOption; |
| | | |
| | | public function getContactOption():?ContactPointOption |
| | | { |
| | | return $this->contactOption??null; |
| | | } |
| | | public function setContactOption(ContactPointOption $contactOption):void |
| | | { |
| | | $this->contactOption = $contactOption; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\ContactPoint; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait contactPointTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var ContactPoint|array A contact point for a person or organization. Supersedes contactPoints. |
| | | */ |
| | | protected ContactPoint|array $contactPoint; |
| | | |
| | | public function getContactPoint():ContactPoint|array|null |
| | | { |
| | | return $this->contactPoint??null; |
| | | } |
| | | public function setContactPoint(ContactPoint|array $contactPoint):void |
| | | { |
| | | if (is_array($contactPoint)){ |
| | | $contactPoint = $this->classArray('contactPoint', $contactPoint, 'JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\ContactPoint'); |
| | | } |
| | | $this->contactPoint = $contactPoint; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait contactTypeTrait { |
| | | /** |
| | | * @var string A person or organization can have different contact points, for different purposes. For example, a sales contact point, a PR contact point and so on. This property is used to specify the kind of contact point. |
| | | */ |
| | | protected string $contactType; |
| | | |
| | | public function getContactType():?string |
| | | { |
| | | return $this->contactType??null; |
| | | } |
| | | public function setContactType(string $contactType):void |
| | | { |
| | | $this->contactType = $contactType; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait containedInPlaceTrait { |
| | | /** |
| | | * @var Place The basic containment relation between a place and one that contains it. Supersedes containedIn. |
| | | * Inverse property: containsPlace |
| | | */ |
| | | protected Place $containedInPlace; |
| | | |
| | | public function getContainedInPlace():?Place |
| | | { |
| | | return $this->containedInPlace??null; |
| | | } |
| | | public function setContainedInPlace(Place $containedInPlace):void |
| | | { |
| | | $this->containedInPlace = $containedInPlace; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait contentLocationTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Place|array The location depicted or described in the content. For example, the location in a photograph or painting. |
| | | */ |
| | | protected Place|array $contentLocation; |
| | | |
| | | public function getContentLocation():Place|array|null |
| | | { |
| | | return $this->contentLocation??null; |
| | | } |
| | | public function setContentLocation(Place|array $contentLocation):void |
| | | { |
| | | if (is_array($contentLocation)) { |
| | | $contentLocation = $this->classArray('contentLocation', $contentLocation, 'JVBase\managers\SEO\render\Thing\Place\Place'); |
| | | } |
| | | $this->contentLocation = $contentLocation; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait contentRatingTrait { |
| | | /** |
| | | * @var string Official rating of a piece of content—for example, 'MPAA PG-13'. |
| | | */ |
| | | protected string $contentRating; |
| | | |
| | | public function getContentRating():?string |
| | | { |
| | | return $this->contentRating??null; |
| | | } |
| | | public function setContentRating(string $contentRating):void |
| | | { |
| | | $this->contentRating = $contentRating; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait contentReferenceTimeTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var DateTime|array The specific time described by a creative work, for works (e.g. articles, video objects etc.) that emphasise a particular moment within an Event. |
| | | */ |
| | | protected DateTime|array $contentReferenceTime; |
| | | |
| | | public function getContentReferenceTime():DateTime|array|null |
| | | { |
| | | return $this->contentReferenceTime??null; |
| | | } |
| | | public function setContentReferenceTime(DateTime|array $contentReferenceTime):void |
| | | { |
| | | if (is_array($contentReferenceTime)) { |
| | | $contentReferenceTime = $this->classArray('contentReferenceTime', $contentReferenceTime, 'JVBase\managers\SEO\render\DataType\DateTime'); |
| | | } |
| | | $this->contentReferenceTime = $contentReferenceTime; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait contentSizeTrait { |
| | | /** |
| | | * @var string File size in (mega/kilo)bytes. |
| | | */ |
| | | protected string $contentSize; |
| | | |
| | | public function getContentSize():?string |
| | | { |
| | | return $this->contentSize??null; |
| | | } |
| | | public function setContentSize(string $contentSize):void |
| | | { |
| | | $this->contentSize = $contentSize; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait contentTypeTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var string|array The supported content type(s) for an EntryPoint response. |
| | | */ |
| | | protected string|array $contentType; |
| | | |
| | | public function getContentType():string|array|null |
| | | { |
| | | return $this->contentType??null; |
| | | } |
| | | public function setContentType(string|array $contentType):void |
| | | { |
| | | if (is_array($contentType)) { |
| | | $contentType = $this->stringArray('contentType', $contentType); |
| | | } |
| | | $this->contentType = $contentType; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait contentUrlTrait { |
| | | /** |
| | | * @var string Actual bytes of the media object, for example the image file or video file. |
| | | */ |
| | | protected string $contentUrl; |
| | | |
| | | public function getContentUrl():?string |
| | | { |
| | | return $this->contentUrl??null; |
| | | } |
| | | public function setContentUrl(string $contentUrl):void |
| | | { |
| | | if (!filter_var($contentUrl, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO]contentUrl is expected to be a valid url to a file.'); |
| | | return; |
| | | } |
| | | $this->contentUrl = $contentUrl; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait contributorTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array A secondary contributor to the CreativeWork or Event. |
| | | */ |
| | | protected Organization|Person|array $contributor; |
| | | |
| | | public function getContributor():Organization|Person|array|null |
| | | { |
| | | return $this->contributor??null; |
| | | } |
| | | public function setContributor(Organization|Person|array $contributor):void |
| | | { |
| | | if (is_array($contributor)) { |
| | | $contributor = $this->mixedArray('contributor', $contributor, [ |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->contributor = $contributor; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait copyrightHolderTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array The party holding the legal copyright to the CreativeWork. |
| | | */ |
| | | protected Organization|Person|array $copyrightHolder; |
| | | |
| | | public function getCopyrightHolder():Organization|Person|array|null |
| | | { |
| | | return $this->copyrightHolder??null; |
| | | } |
| | | public function setCopyrightHolder(Organization|Person|array $copyrightHolder):void |
| | | { |
| | | if (is_array($copyrightHolder)) { |
| | | $copyrightHolder = $this->mixedArray('copyrightHolder', $copyrightHolder, [ |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->copyrightHolder = $copyrightHolder; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait copyrightNoticeTrait { |
| | | /** |
| | | * @var string Text of a notice appropriate for describing the copyright aspects of this Creative Work, ideally indicating the owner of the copyright for the Work. |
| | | */ |
| | | protected string $copyrightNotice; |
| | | |
| | | public function getCopyrightNotice():?string |
| | | { |
| | | return $this->copyrightNotice??null; |
| | | } |
| | | public function setCopyrightNotice(string $copyrightNotice):void |
| | | { |
| | | $this->copyrightNotice = $copyrightNotice; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait copyrightYearTrait { |
| | | /** |
| | | * @var int The year during which the claimed copyright for the CreativeWork was first asserted. |
| | | */ |
| | | protected int $copyrightYear; |
| | | |
| | | public function getCopyrightYear():?int |
| | | { |
| | | return $this->copyrightYear??null; |
| | | } |
| | | public function setCopyrightYear(int $copyrightYear):void |
| | | { |
| | | $this->copyrightYear = $copyrightYear; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait countryOfAssemblyTrait { |
| | | /** |
| | | * @var string The place where the product was assembled. |
| | | */ |
| | | protected string $countryOfAssembly; |
| | | |
| | | public function getCountryOfAssembly():?string |
| | | { |
| | | return $this->countryOfAssembly??null; |
| | | } |
| | | public function setCountryOfAssembly(string $countryOfAssembly):void |
| | | { |
| | | $this->countryOfAssembly = $countryOfAssembly; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait countryOfOriginTrait { |
| | | /** |
| | | * @var string The country of origin of something, including products as well as creative works such as movie and TV content. |
| | | */ |
| | | protected string $countryOfOrigin; |
| | | |
| | | public function getCountryOfOrigin():?string |
| | | { |
| | | return $this->countryOfOrigin??null; |
| | | } |
| | | public function setCountryOfOrigin(string $countryOfOrigin):void |
| | | { |
| | | $this->countryOfOrigin = $countryOfOrigin; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\Country; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait countryTrait { |
| | | |
| | | /** |
| | | * @var Country|string The country. Recommended to be in 2-letter ISO 3166-1 alpha-2 format, for example "US". For backward compatibility, a 3-letter ISO 3166-1 alpha-3 country code such as "SGP" or a full country name such as "Singapore" can also be used. |
| | | */ |
| | | protected Country|string $Country; |
| | | |
| | | public function getCountry():Country|string|null |
| | | { |
| | | return $this->Country??null; |
| | | } |
| | | public function setCountry(Country|string $Country):void |
| | | { |
| | | $this->Country = $Country; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait creativeWorkStatusTrait { |
| | | /** |
| | | * @var DefinedTerm|string The status of a creative work in terms of its stage in a lifecycle. Example terms include Incomplete, Draft, Published, Obsolete. Some organizations define a set of terms for the stages of their publication lifecycle. |
| | | */ |
| | | protected DefinedTerm|string $creativeWorkStatus; |
| | | |
| | | public function getCreativeWorkStatus():DefinedTerm|string|null |
| | | { |
| | | return $this->creativeWorkStatus??null; |
| | | } |
| | | public function setCreativeWorkStatus(DefinedTerm|string $creativeWorkStatus):void |
| | | { |
| | | $this->creativeWorkStatus = $creativeWorkStatus; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait creatorTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array The creator/author of this CreativeWork. This is the same as the Author property for CreativeWork. |
| | | */ |
| | | protected Organization|Person|array $creator; |
| | | |
| | | public function getCreator():Organization|Person|array|null |
| | | { |
| | | return $this->creator??null; |
| | | } |
| | | public function setCreator(Organization|Person|array $creator):void |
| | | { |
| | | if (is_array($creator)) { |
| | | $creator = $this->mixedArray('creator', $creator, [ |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->creator = $creator; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait creditTextTrait { |
| | | /** |
| | | * @var string Text that can be used to credit person(s) and/or organization(s) associated with a published Creative Work. |
| | | */ |
| | | protected string $creditText; |
| | | |
| | | public function getCreditText():?string |
| | | { |
| | | return $this->creditText??null; |
| | | } |
| | | public function setCreditText(string $creditText):void |
| | | { |
| | | $this->creditText = $creditText; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait currenciesAcceptedTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var string|array The currency accepted. |
| | | * |
| | | * Use standard formats: ISO 4217 currency format, e.g. "USD"; Ticker symbol for cryptocurrencies, e.g. "BTC"; well known names for Local Exchange Trading Systems (LETS) and other currency types, e.g. "Ithaca HOUR". |
| | | */ |
| | | protected string|array $currenciesAccepted; |
| | | |
| | | public function getCurrenciesAccepted():string|array|null |
| | | { |
| | | return $this->currenciesAccepted??null; |
| | | } |
| | | public function setCurrenciesAccepted(string|array $currenciesAccepted):void |
| | | { |
| | | if (is_array($currenciesAccepted)) { |
| | | $currenciesAccepted = $this->stringArray('currenciesAccepted', $currenciesAccepted); |
| | | } |
| | | $this->currenciesAccepted = $currenciesAccepted; |
| | | } |
| | | |
| | | public function getCurrenciesAcceptedFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'text', |
| | | 'label' => 'Currencies Accepted', |
| | | 'hint' => 'A comma separated list of currencies (ex: CAD, USD)', |
| | | 'default' => 'CAD' |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait currencyTrait { |
| | | /** |
| | | * @var string The currency in which the monetary amount is expressed. |
| | | * |
| | | * Use standard formats: ISO 4217 currency format, e.g. "USD"; Ticker symbol for cryptocurrencies, e.g. "BTC"; well known names for Local Exchange Trading Systems (LETS) and other currency types, e.g. "Ithaca HOUR". |
| | | */ |
| | | protected string $currency; |
| | | |
| | | public function getCurrency():?string |
| | | { |
| | | return $this->currency??null; |
| | | } |
| | | public function setCurrency(string $currency):void |
| | | { |
| | | $this->currency = $currency; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Time; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait cutoffTimeTrait { |
| | | /** |
| | | * @var Time Order cutoff time allows merchants to describe the time after which they will no longer process orders received on that day. For orders processed after cutoff time, one day gets added to the delivery time estimate. This property is expected to be most typically used via the ShippingRateSettings publication pattern. The time is indicated using the ISO-8601 Time format, e.g. "23:30:00-05:00" would represent 6:30 pm Eastern Standard Time (EST) which is 5 hours behind Coordinated Universal Time (UTC). |
| | | */ |
| | | protected Time $cutoffTime; |
| | | |
| | | public function getCutoffTime():?Time |
| | | { |
| | | return $this->cutoffTime??null; |
| | | } |
| | | public function setCutoffTime(Time $cutoffTime):void |
| | | { |
| | | $this->cutoffTime = $cutoffTime; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait dateCreatedTrait { |
| | | /** |
| | | * @var Date|DateTime The date on which the CreativeWork was created or the item was added to a DataFeed. |
| | | */ |
| | | protected Date|DateTime $dateCreated; |
| | | |
| | | public function getDateCreated():Date|DateTime|null |
| | | { |
| | | return $this->dateCreated??null; |
| | | } |
| | | |
| | | /** |
| | | * @throws \DateMalformedStringException |
| | | */ |
| | | public function setDateCreated(Date|DateTime|string $dateCreated):void |
| | | { |
| | | if (is_string($dateCreated)) { |
| | | $dateCreated = new DateTime($dateCreated); |
| | | } |
| | | $this->dateCreated = $dateCreated; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait dateModifiedTrait { |
| | | /** |
| | | * @var Date|DateTime The date on which the CreativeWork was most recently modified or when the item's entry was modified within a DataFeed. |
| | | */ |
| | | protected Date|DateTime $dateModified; |
| | | |
| | | public function getDateModified():Date|DateTime|null |
| | | { |
| | | return $this->dateModified??null; |
| | | } |
| | | public function setDateModified(Date|DateTime|string $dateModified):void |
| | | { |
| | | if (is_string($dateModified)) { |
| | | $dateModified = new DateTime($dateModified); |
| | | } |
| | | $this->dateModified = $dateModified; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait datePublishedTrait { |
| | | /** |
| | | * @var Date|DateTime Date of first publication or broadcast. For example the date a CreativeWork was broadcast or a Certification was issued. |
| | | */ |
| | | protected Date|DateTime $datePublished; |
| | | |
| | | public function getDatePublished():Date|DateTime|null |
| | | { |
| | | return $this->datePublished??null; |
| | | } |
| | | public function setDatePublished(Date|DateTime|string $datePublished):void |
| | | { |
| | | if (is_string($datePublished)) { |
| | | $datePublished = new DateTime($datePublished); |
| | | } |
| | | $this->datePublished = $datePublished; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\DayOfWeek; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait dayOfWeekTrait { |
| | | /** |
| | | * @var DayOfWeek The day of the week from which these opening hours are valid |
| | | */ |
| | | protected DayOfWeek $dayOfWeek; |
| | | |
| | | public function getDayOfWeek():?DayOfWeek |
| | | { |
| | | return $this->dayOfWeek??null; |
| | | } |
| | | public function setDayOfWeek(DayOfWeek $dayOfWeek):void |
| | | { |
| | | $this->dayOfWeek = $dayOfWeek; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait deathDateTrait { |
| | | /** |
| | | * @var Date Date of death. |
| | | */ |
| | | protected Date $deathDate; |
| | | |
| | | public function getDeathDate():?Date |
| | | { |
| | | return $this->deathDate??null; |
| | | } |
| | | |
| | | /** |
| | | * @throws \DateMalformedStringException |
| | | */ |
| | | public function setDeathDate(Date|string $deathDate):void |
| | | { |
| | | if (is_string($deathDate)) { |
| | | $deathDate = new Date($deathDate); |
| | | } |
| | | $this->deathDate = $deathDate; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait deathPlaceTrait { |
| | | /** |
| | | * @var Place The place where the person was born. |
| | | */ |
| | | protected Place $deathPlace; |
| | | |
| | | public function getDeathPlace():?Place |
| | | { |
| | | return $this->deathPlace??null; |
| | | } |
| | | public function setDeathPlace(Place $deathPlace):void |
| | | { |
| | | $this->deathPlace = $deathPlace; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait deliveryLeadTimeTrait { |
| | | /** |
| | | * @var QuantitativeValue The typical delay between the receipt of the order and the goods either leaving the warehouse or being prepared for pickup, in case the delivery method is on site pickup. |
| | | */ |
| | | protected QuantitativeValue $deliveryLeadTime; |
| | | |
| | | public function getDeliveryLeadTime():?QuantitativeValue |
| | | { |
| | | return $this->deliveryLeadTime??null; |
| | | } |
| | | public function setDeliveryLeadTime(QuantitativeValue $deliveryLeadTime):void |
| | | { |
| | | $this->deliveryLeadTime = $deliveryLeadTime; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait departmentTrait { |
| | | /** |
| | | * @var Organization A relationship between an organization and a department of that organization, also described as an organization (allowing different urls, logos, opening hours). For example: a store with a pharmacy, or a bakery with a cafe. |
| | | */ |
| | | protected Organization $department; |
| | | |
| | | public function getDepartment():?Organization |
| | | { |
| | | return $this->department??null; |
| | | } |
| | | public function setDepartment(Organization|array $department):void |
| | | { |
| | | if (is_array($department)){ |
| | | $department = Organization::fromArray($department); |
| | | } |
| | | $this->department = $department; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Quantity\Distance; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait depthTrait { |
| | | /** |
| | | * @var Distance|QuantitativeValue The depth of the item. |
| | | */ |
| | | protected Distance|QuantitativeValue $depth; |
| | | |
| | | public function getDepth():Distance|QuantitativeValue|null |
| | | { |
| | | return $this->depth??null; |
| | | } |
| | | public function setDepth(Distance|QuantitativeValue $depth):void |
| | | { |
| | | $this->depth = $depth; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait descriptionTrait { |
| | | /** |
| | | * @var string A description of the item |
| | | */ |
| | | protected string $description; |
| | | |
| | | public function getDescription():?string |
| | | { |
| | | return $this->description??null; |
| | | } |
| | | public function setDescription(string $description):void |
| | | { |
| | | $this->description = $description; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait directorTrait { |
| | | /** |
| | | * @var Organization|Person A director of e.g. TV, radio, movie, video gaming etc. content, or of an event. Directors can be associated with individual items or with a series, episode, clip. Supersedes directors. |
| | | */ |
| | | protected Organization|Person $director; |
| | | |
| | | public function getDirector():Organization|Person|null |
| | | { |
| | | return $this->director??null; |
| | | } |
| | | public function setDirector(Organization|Person $director):void |
| | | { |
| | | $this->director = $director; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait disambiguatingDescriptionTrait { |
| | | /** |
| | | * @var string A sub-property of description. A short description of the item used to disambiguate from other, similar items. |
| | | */ |
| | | protected string $disambiguatingDescription; |
| | | |
| | | public function getDisambiguatingDescription():?string |
| | | { |
| | | return $this->disambiguatingDescription??null; |
| | | } |
| | | public function setDisambiguatingDescription(string $disambiguatingDescription):void |
| | | { |
| | | $this->disambiguatingDescription = $disambiguatingDescription; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait discussionUrlTrait { |
| | | /** |
| | | * @var string A link to the page containing the comments of the CreativeWork. |
| | | */ |
| | | protected string $discussionUrl; |
| | | |
| | | public function getDiscussionUrl():?string |
| | | { |
| | | return $this->discussionUrl??null; |
| | | } |
| | | public function setDiscussionUrl(string $discussionUrl):void |
| | | { |
| | | if (!filter_var($discussionUrl, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO] Discussion Url is intended to be a valid URL'); |
| | | return; |
| | | } |
| | | $this->discussionUrl = $discussionUrl; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait displayLocationTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Place|array The location at which an item can be viewed or experienced in-person. |
| | | */ |
| | | protected Place|array $displayLocation; |
| | | |
| | | public function getDisplayLocation():Place|array|null |
| | | { |
| | | return $this->displayLocation??null; |
| | | } |
| | | public function setDisplayLocation(Place|array $displayLocation):void |
| | | { |
| | | if (is_array($displayLocation)){ |
| | | $displayLocation = $this->classArray('displayLocation', $displayLocation, 'JVBase\managers\SEO\render\Thing\Place\Place'); |
| | | } |
| | | $this->displayLocation = $displayLocation; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait dissolutionDateTrait { |
| | | /** |
| | | * @var Date The date that this organization was dissolved. |
| | | */ |
| | | protected Date $dissolutionDate; |
| | | |
| | | public function getDissolutionDate():?Date |
| | | { |
| | | return $this->dissolutionDate??null; |
| | | } |
| | | public function setDissolutionDate(Date|string $dissolutionDate):void |
| | | { |
| | | if (is_string($dissolutionDate)){ |
| | | $dissolutionDate = new Date($dissolutionDate); |
| | | } |
| | | $this->dissolutionDate = $dissolutionDate; |
| | | } |
| | | public function getDissolutionDateFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'date', |
| | | 'label' => 'Dissolution Date', |
| | | 'hint' => 'IMPORTANT: Do not fill this out, unless your business has actually closed.' |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | use JVBase\managers\SEO\render\DataType\Time; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait doorTimeTrait { |
| | | /** |
| | | * @var DateTime|Time The time admission will commence. |
| | | */ |
| | | protected DateTime|Time $doorTime; |
| | | |
| | | public function getDoorTime():DateTime|Time|null |
| | | { |
| | | return $this->doorTime??null; |
| | | } |
| | | public function setDoorTime(DateTime|Time $doorTime):void |
| | | { |
| | | $this->doorTime = $doorTime; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait dunsTrait { |
| | | /** |
| | | * @var string The Dun & Bradstreet DUNS number for identifying an organization or business person. |
| | | */ |
| | | protected string $duns; |
| | | |
| | | public function getDuns():?string |
| | | { |
| | | return $this->duns??null; |
| | | } |
| | | public function setDuns(string $duns):void |
| | | { |
| | | $this->duns = $duns; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Quantity\DurationOfWarranty; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait durationOfWarrantyTrait { |
| | | /** |
| | | * @var QuantitativeValue The duration of the warranty promise. Common unitCode values are ANN for year, MON for months, or DAY for days. |
| | | */ |
| | | protected QuantitativeValue $durationOfWarranty; |
| | | |
| | | public function getDurationOfWarranty():?QuantitativeValue |
| | | { |
| | | return $this->durationOfWarranty??null; |
| | | } |
| | | public function setDurationOfWarranty(QuantitativeValue $durationOfWarranty):void |
| | | { |
| | | $this->durationOfWarranty = $durationOfWarranty; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Quantity\Duration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait durationTrait { |
| | | /** |
| | | * @var Duration The duration of the item (movie, audio recording, event, etc.) in ISO 8601 duration format. |
| | | */ |
| | | protected Duration $duration; |
| | | |
| | | public function getDuration():?Duration |
| | | { |
| | | return $this->duration??null; |
| | | } |
| | | public function setDuration(Duration $duration):void |
| | | { |
| | | $this->duration = $duration; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait editorTrait { |
| | | /** |
| | | * @var Person Specifies the Person who edited the CreativeWork. |
| | | */ |
| | | protected Person $editor; |
| | | |
| | | public function getEditor():?Person |
| | | { |
| | | return $this->editor??null; |
| | | } |
| | | public function setEditor(Person $editor):void |
| | | { |
| | | $this->editor = $editor; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\EducationalOccupationalCredential; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait educationRequirementsTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var EducationalOccupationalCredential|string|array Educational background needed for the position or Occupation. |
| | | */ |
| | | protected EducationalOccupationalCredential|string|array $educationRequirements; |
| | | |
| | | public function getEducationRequirements():EducationalOccupationalCredential|string|array|null |
| | | { |
| | | return $this->educationRequirements??null; |
| | | } |
| | | public function setEducationRequirements(EducationalOccupationalCredential|string|array $educationRequirements):void |
| | | { |
| | | if (is_array($educationRequirements)) { |
| | | $educationRequirements = $this->mixedArray('educationRequirements', $educationRequirements, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\EducationalOccupationalCredential', |
| | | ]); |
| | | } |
| | | $this->educationRequirements = $educationRequirements; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait elevationTrait { |
| | | /** |
| | | * @var int|float|string The elevation of a location (WGS 84). Values may be of the form 'NUMBER UNIT_OF_MEASUREMENT' (e.g., '1,000 m', '3,200 ft') while numbers alone should be assumed to be a value in meters. |
| | | */ |
| | | protected int|float|string $elevation; |
| | | |
| | | public function getElevation():int|float|string|null |
| | | { |
| | | return $this->elevation??null; |
| | | } |
| | | public function setElevation(int|float|string $elevation):void |
| | | { |
| | | $this->elevation = $elevation; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\BusinessEntityType; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait eligibleCustomerTypeTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var BusinessEntityType|array The type(s) of customers for which the given offer is valid. |
| | | */ |
| | | protected BusinessEntityType|array $eligibleCustomerType; |
| | | |
| | | public function getEligibleCustomerType():BusinessEntityType|array|null |
| | | { |
| | | return $this->eligibleCustomerType??null; |
| | | } |
| | | public function setEligibleCustomerType(BusinessEntityType|array $eligibleCustomerType):void |
| | | { |
| | | if (is_array($eligibleCustomerType)) { |
| | | $eligibleCustomerType = $this->classArray('eligibleCustomerType', $eligibleCustomerType, 'JVBase\managers\SEO\render\Thing\Intangible\Enumeration\BusinessEntityType'); |
| | | } |
| | | $this->eligibleCustomerType = $eligibleCustomerType; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait eligibleDurationTrait { |
| | | /** |
| | | * @var QuantitativeValue The duration for which the given offer is valid. |
| | | */ |
| | | protected QuantitativeValue $eligibleDuration; |
| | | |
| | | public function getEligibleDuration():?QuantitativeValue |
| | | { |
| | | return $this->eligibleDuration??null; |
| | | } |
| | | public function setEligibleDuration(QuantitativeValue $eligibleDuration):void |
| | | { |
| | | $this->eligibleDuration = $eligibleDuration; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait eligibleQuantityTrait { |
| | | /** |
| | | * @var QuantitativeValue The duration for which the given offer is valid. |
| | | */ |
| | | protected QuantitativeValue $eligibleQuantity; |
| | | |
| | | public function getEligibleQuantity():?QuantitativeValue |
| | | { |
| | | return $this->eligibleQuantity??null; |
| | | } |
| | | public function setEligibleQuantity(QuantitativeValue $eligibleQuantity):void |
| | | { |
| | | $this->eligibleQuantity = $eligibleQuantity; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\GeoShape; |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait eligibleRegionTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var GeoShape|Place|string|array The ISO 3166-1 (ISO 3166-1 alpha-2) or ISO 3166-2 code, the place, or the GeoShape for the geo-political region(s) for which the offer or delivery charge specification is valid. |
| | | */ |
| | | protected GeoShape|Place|string|array $eligibleRegion; |
| | | |
| | | public function getEligibleRegion():GeoShape|Place|string|array|null |
| | | { |
| | | return $this->eligibleRegion??null; |
| | | } |
| | | public function setEligibleRegion(GeoShape|Place|string|array $eligibleRegion):void |
| | | { |
| | | if (is_array($eligibleRegion)) { |
| | | $eligibleRegion = $this->mixedArray('eligibleRegion', $eligibleRegion, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\GeoShape', |
| | | 'JVBase\managers\SEO\render\Thing\Place\Place' |
| | | ]); |
| | | } |
| | | $this->eligibleRegion = $eligibleRegion; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\PriceSpecification; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait eligibleTransactionVolumeTrait { |
| | | /** |
| | | * @var PriceSpecification The transaction volume, in a monetary unit, for which the offer or price specification is valid, e.g. for indicating a minimal purchasing volume, to express free shipping above a certain order volume, or to limit the acceptance of credit cards to purchases to a certain minimal amount. |
| | | */ |
| | | protected PriceSpecification $eligibleTransactionVolume; |
| | | |
| | | public function getEligibleTransactionVolume():?PriceSpecification |
| | | { |
| | | return $this->eligibleTransactionVolume??null; |
| | | } |
| | | public function setEligibleTransactionVolume(PriceSpecification $eligibleTransactionVolume):void |
| | | { |
| | | $this->eligibleTransactionVolume = $eligibleTransactionVolume; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait emailTrait { |
| | | /** |
| | | * @var string Email address |
| | | */ |
| | | protected string $email; |
| | | |
| | | public function getEmail():?string |
| | | { |
| | | return $this->email??null; |
| | | } |
| | | public function setEmail(string $email):void |
| | | { |
| | | if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { |
| | | error_log('[SEO] Email is not valid'); |
| | | return; |
| | | } |
| | | $this->email = $email; |
| | | } |
| | | public function getEmailFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'email', |
| | | 'label' => 'Email', |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait embedURLTrait { |
| | | /** |
| | | * @var string A URL pointing to a player for a specific video. In general, this is the information in the src element of an embed tag and should not be the same as the content of the loc tag. |
| | | */ |
| | | protected string $embedURL; |
| | | |
| | | public function getEmbedURL():?string |
| | | { |
| | | return $this->embedURL??null; |
| | | } |
| | | public function setEmbedURL(string $embedURL):void |
| | | { |
| | | if (!filter_var($embedURL, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO]embedURL is intended to be a valid URL: '.$embedURL); |
| | | return; |
| | | } |
| | | $this->embedURL = $embedURL; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait embeddedTextCaptionTrait { |
| | | /** |
| | | * @var string Represents textual captioning from a MediaObject, e.g. text of a 'meme'. |
| | | */ |
| | | protected string $embeddedTextCaption; |
| | | |
| | | public function getEmbeddedTextCaption():?string |
| | | { |
| | | return $this->embeddedTextCaption??null; |
| | | } |
| | | public function setEmbeddedTextCaption(string $embeddedTextCaption):void |
| | | { |
| | | $this->embeddedTextCaption = $embeddedTextCaption; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait employeeTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Person Someone working for this organization. Supersedes employees. |
| | | */ |
| | | protected Person $employee; |
| | | |
| | | public function getEmployee():?Person |
| | | { |
| | | return $this->employee??null; |
| | | } |
| | | |
| | | /** |
| | | * @param Person|array $employee a Person or an array of Person objects} |
| | | * @return void |
| | | */ |
| | | public function setEmployee(Person|array $employee):void |
| | | { |
| | | if (is_array($employee)) { |
| | | $employee = $this->classArray('employee', $employee, 'JVBase\managers\SEO\render\Thing\Person\Person'); |
| | | } |
| | | $this->employee = $employee; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait encodingFormatTrait { |
| | | /** |
| | | * @var string Media type typically expressed using a MIME format (see IANA site and MDN reference), e.g. application/zip for a SoftwareApplication binary, audio/mpeg for .mp3 etc. |
| | | * |
| | | * In cases where a CreativeWork has several media type representations, encoding can be used to indicate each MediaObject alongside particular encodingFormat information. |
| | | * |
| | | * Unregistered or niche encoding and file formats can be indicated instead via the most appropriate URL, e.g. defining Web page or a Wikipedia/Wikidata entry. Supersedes fileFormat. |
| | | */ |
| | | protected string $encodingFormat; |
| | | |
| | | public function getEncodingFormat():?string |
| | | { |
| | | return $this->encodingFormat??null; |
| | | } |
| | | public function setEncodingFormat(string $encodingFormat):void |
| | | { |
| | | $this->encodingFormat = $encodingFormat; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\MediaObject\MediaObject; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait encodingTrait { |
| | | /** |
| | | * @var MediaObject A media object that encodes this CreativeWork. This property is a synonym for associatedMedia. Supersedes encodings. |
| | | * Inverse property: encodesCreativeWork |
| | | */ |
| | | protected MediaObject $encoding; |
| | | |
| | | public function getEncoding():?MediaObject |
| | | { |
| | | return $this->encoding??null; |
| | | } |
| | | public function setEncoding(MediaObject $encoding):void |
| | | { |
| | | $this->encoding = $encoding; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait encodingTypeTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var string|array The supported encoding type(s) for an EntryPoint request. |
| | | */ |
| | | protected string|array $encodingType; |
| | | |
| | | public function getEncodingType():string|array|null |
| | | { |
| | | return $this->encodingType??null; |
| | | } |
| | | public function setEncodingType(string|array $encodingType):void |
| | | { |
| | | if (is_array($encodingType)) { |
| | | $encodingType = $this->stringArray('encodingType', $encodingType); |
| | | } |
| | | $this->encodingType = $encodingType; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait endDateTrait { |
| | | /** |
| | | * @var Date|DateTime The end date and time of the item (in ISO 8601 date format). |
| | | */ |
| | | protected Date|DateTime $endDate; |
| | | |
| | | public function getEndDate():Date|DateTime|null |
| | | { |
| | | return $this->endDate??null; |
| | | } |
| | | public function setEndDate(Date|DateTime $endDate):void |
| | | { |
| | | $this->endDate = $endDate; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait endOffsetTrait { |
| | | /** |
| | | * @var int|float The end time of the clip expressed as the number of seconds from the beginning of the work. |
| | | */ |
| | | protected int|float $endOffset; |
| | | |
| | | public function getEndOffset():int|float|null |
| | | { |
| | | return $this->endOffset??null; |
| | | } |
| | | public function setEndOffset(int|float $endOffset):void |
| | | { |
| | | $this->endOffset = $endOffset; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | use JVBase\managers\SEO\render\DataType\Time; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait endTimeTrait { |
| | | /** |
| | | * @var Time|DateTime The endTime of something. For a reserved event or service (e.g. FoodEstablishmentReservation), the time that it is expected to end. For actions that span a period of time, when the action was performed. E.g. John wrote a book from January to December. For media, including audio and video, it's the time offset of the end of a clip within a larger file. |
| | | * |
| | | * Note that Event uses startDate/endDate instead of startTime/endTime, even when describing dates with times. This situation may be clarified in future revisions. |
| | | */ |
| | | protected Time|DateTime $endTime; |
| | | |
| | | public function getEndTime():Time|DateTime|null |
| | | { |
| | | return $this->endTime??null; |
| | | } |
| | | public function setEndTime(Time|DateTime $endTime):void |
| | | { |
| | | $this->endTime = $endTime; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait errorTrait { |
| | | /** |
| | | * @var Thing For failed actions, more information on the cause of the failure. Consider using the Error type. |
| | | */ |
| | | protected Thing $error; |
| | | |
| | | public function getError():?Thing |
| | | { |
| | | return $this->error??null; |
| | | } |
| | | public function setError(Thing $error):void |
| | | { |
| | | $this->error = $error; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\MonetaryAmount; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait estimateCostTrait { |
| | | /** |
| | | * @var MonetaryAmount|string The estimated cost of the supply or supplies consumed when performing instructions. |
| | | */ |
| | | protected MonetaryAmount|string $estimateCost; |
| | | |
| | | public function getEstimateCost():MonetaryAmount|string|null |
| | | { |
| | | return $this->estimateCost??null; |
| | | } |
| | | public function setEstimateCost(MonetaryAmount|string $estimateCost):void |
| | | { |
| | | $this->estimateCost = $estimateCost; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait ethicsPolicyTrait { |
| | | /** |
| | | * @var CreativeWork|string Statement about ethics policy, e.g. of a NewsMediaOrganization regarding journalistic and publishing practices, or of a Restaurant, a page describing food source policies. In the case of a NewsMediaOrganization, an ethicsPolicy is typically a statement describing the personal, organizational, and corporate standards of behavior expected by the organization. |
| | | */ |
| | | protected CreativeWork|string $ethicsPolicy; |
| | | |
| | | public function getEthicsPolicy():CreativeWork|string|null |
| | | { |
| | | return $this->ethicsPolicy??null; |
| | | } |
| | | public function setEthicsPolicy(CreativeWork|string $ethicsPolicy):void |
| | | { |
| | | if (is_string($ethicsPolicy)) { |
| | | if(!filter_var($ethicsPolicy, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO] ethicsPolicy should be a valid URL'); |
| | | return; |
| | | } |
| | | } |
| | | $this->ethicsPolicy = $ethicsPolicy; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Event\Event; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait eventTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Event|array Upcoming or past event associated with this place, organization, or action. Supersedes events. |
| | | */ |
| | | protected Event|array $event; |
| | | |
| | | public function getEvent():Event|array|null |
| | | { |
| | | return $this->event??null; |
| | | } |
| | | public function setEvent(Event|array $event):void |
| | | { |
| | | if(is_array($event)){ |
| | | $event = $this->classArray('event', $event, 'JVBase\managers\SEO\render\Thing\Event\Event'); |
| | | } |
| | | $this->event = $event; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait exampleOfWorkTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var CreativeWork|array A creative work that this work is an example/instance/realization/derivation of. |
| | | * Inverse property: workExample |
| | | */ |
| | | protected CreativeWork|array $exampleOfWork; |
| | | |
| | | public function getExampleOfWork():CreativeWork|array|null |
| | | { |
| | | return $this->exampleOfWork??null; |
| | | } |
| | | public function setExampleOfWork(CreativeWork|array $exampleOfWork):void |
| | | { |
| | | if (is_array($exampleOfWork)) { |
| | | $exampleOfWork = $this->classArray('exampleOfWork', $exampleOfWork, 'JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork'); |
| | | } |
| | | $this->exampleOfWork = $exampleOfWork; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait exceptDateTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Date|DateTime|array The end date and time of the item (in ISO 8601 date format). |
| | | */ |
| | | protected Date|DateTime|array $exceptDate; |
| | | |
| | | public function getExceptDate():Date|DateTime|array|null |
| | | { |
| | | return $this->exceptDate??null; |
| | | } |
| | | public function setExceptDate(Date|DateTime|array $exceptDate):void |
| | | { |
| | | if (is_array($exceptDate)) { |
| | | $exceptDate = $this->mixedArray('exceptDate', $exceptDate, [ |
| | | 'JVBase\managers\SEO\render\DataType\Date', |
| | | 'JVBase\managers\SEO\render\DataType\DateTime' |
| | | ]); |
| | | } |
| | | $this->exceptDate = $exceptDate; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\PropertyValue; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait exifDataTrait { |
| | | /** |
| | | * @var string|PropertyValue exif data for this object |
| | | */ |
| | | protected string|PropertyValue $exifData; |
| | | |
| | | public function getExifData():string|PropertyValue|null |
| | | { |
| | | return $this->exifData??null; |
| | | } |
| | | public function setExifData(string|PropertyValue $exifData):void |
| | | { |
| | | $this->exifData = $exifData; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\OccupationalExperienceRequirements; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait experienceRequirementsTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var OccupationalExperienceRequirements|string|array ExperienceRequirements of skills and experience needed for the position or Occupation. |
| | | */ |
| | | protected OccupationalExperienceRequirements|string|array $experienceRequirements; |
| | | |
| | | public function getExperienceRequirements():OccupationalExperienceRequirements|string|array|null |
| | | { |
| | | return $this->experienceRequirements??null; |
| | | } |
| | | public function setExperienceRequirements(OccupationalExperienceRequirements|string|array $experienceRequirements):void |
| | | { |
| | | if (is_array($experienceRequirements)) { |
| | | $experienceRequirements = $this->mixedArray('experienceRequirements', $experienceRequirements, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\OccupationalExperienceRequirements', |
| | | ]); |
| | | } |
| | | $this->experienceRequirements = $experienceRequirements; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait expiresTrait { |
| | | /** |
| | | * @var Date|DateTime Date the content expires and is no longer useful or available. For example a VideoObject or NewsArticle whose availability or relevance is time-limited, a ClaimReview fact check whose publisher wants to indicate that it may no longer be relevant (or helpful to highlight) after some date, or a Certification the validity has expired. |
| | | */ |
| | | protected Date|DateTime $expires; |
| | | |
| | | public function getExpires():Date|DateTime|null |
| | | { |
| | | return $this->expires??null; |
| | | } |
| | | public function setExpires(Date|DateTime $expires):void |
| | | { |
| | | $this->expires = $expires; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait extendedAddressTrait { |
| | | /** |
| | | * @var string An address extension such as an apartment number, C/O or alternative name. |
| | | */ |
| | | protected string $extendedAddress; |
| | | |
| | | public function getExtendedAddress():?string |
| | | { |
| | | return $this->extendedAddress??null; |
| | | } |
| | | public function setExtendedAddress(string $extendedAddress):void |
| | | { |
| | | $this->extendedAddress = $extendedAddress; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait familyNameTrait { |
| | | /** |
| | | * @var string Family name. In the U.S., the last name of a Person. |
| | | */ |
| | | protected string $familyName; |
| | | |
| | | public function getFamilyName():?string |
| | | { |
| | | return $this->familyName??null; |
| | | } |
| | | public function setFamilyName(string $familyName):void |
| | | { |
| | | $this->familyName = $familyName; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait fatContentTrait { |
| | | /** |
| | | * @var int|float The number of fatContent. |
| | | */ |
| | | protected int|float $fatContent; |
| | | |
| | | public function getFatContent():int|float|null |
| | | { |
| | | return $this->fatContent??null; |
| | | } |
| | | public function setFatContent(int|float $fatContent):void |
| | | { |
| | | $this->fatContent = $fatContent; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\meta\Sanitizer; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait faxNumberTrait { |
| | | /** |
| | | * @var string The fax number |
| | | */ |
| | | protected string $faxNumber; |
| | | |
| | | public function getFaxNumber():?string |
| | | { |
| | | return $this->faxNumber??null; |
| | | } |
| | | public function setFaxNumber(string $faxNumber):void |
| | | { |
| | | if (Sanitizer::sanitizePhone($faxNumber) === '') { |
| | | error_log('[SEO] FaxNumber is not valid'); |
| | | return; |
| | | } |
| | | $this->faxNumber = $faxNumber; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait fiberContentTrait { |
| | | /** |
| | | * @var int|float The number of grams of fiber |
| | | */ |
| | | protected int|float $fiberContent; |
| | | |
| | | public function getFiberContent():int|float|null |
| | | { |
| | | return $this->fiberContent??null; |
| | | } |
| | | public function setFiberContent(int|float $fiberContent):void |
| | | { |
| | | $this->fiberContent = $fiberContent; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait followsTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Person|string|array The most generic uni-directional social relation. |
| | | */ |
| | | protected Person|string|array $follows; |
| | | |
| | | public function getFollows():Person|string|array|null |
| | | { |
| | | return $this->follows??null; |
| | | } |
| | | public function setFollows(Person|string|array $follows):void |
| | | { |
| | | if (is_array($follows)) { |
| | | $follows = $this->mixedArray('follows', $follows, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->follows = $follows; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait founderTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array A person or organization who founded this organization. Supersedes founders. |
| | | */ |
| | | protected Organization|Person|array $founder; |
| | | |
| | | public function getFounder():Organization|Person|array|null |
| | | { |
| | | return $this->founder??null; |
| | | } |
| | | public function setFounder(Organization|Person|array $founder):void |
| | | { |
| | | if (is_array($founder)) { |
| | | $founder = $this->mixedArray('founder', $founder, ['JVBase\managers\SEO\render\Thing\Organization\Organization', 'JVBase\managers\SEO\render\Thing\Person\Person']); |
| | | } |
| | | $this->founder = $founder; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait foundingDateTrait { |
| | | /** |
| | | * @var Date A foundingDate of the item |
| | | */ |
| | | protected Date $foundingDate; |
| | | |
| | | public function getFoundingDate():?Date |
| | | { |
| | | return $this->foundingDate??null; |
| | | } |
| | | |
| | | /** |
| | | * @throws \DateMalformedStringException |
| | | */ |
| | | public function setFoundingDate(Date|string $foundingDate):void |
| | | { |
| | | if (is_string($foundingDate)) { |
| | | $foundingDate = new Date($foundingDate); |
| | | } |
| | | $this->foundingDate = $foundingDate; |
| | | } |
| | | public function getFoundingDateFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'date', |
| | | 'label' => 'Founding Date' |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait foundingLocationTrait { |
| | | /** |
| | | * @var Place The place where the Organization was founded. |
| | | */ |
| | | protected Place $foundingLocation; |
| | | |
| | | public function getFoundingLocation():?Place |
| | | { |
| | | return $this->foundingLocation??null; |
| | | } |
| | | public function setFoundingLocation(Place $foundingLocation):void |
| | | { |
| | | $this->foundingLocation = $foundingLocation; |
| | | } |
| | | |
| | | public function getFoundingLocationFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'group', |
| | | 'label' => 'Founding Location', |
| | | 'fields' => [ |
| | | 'name' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'City Name' |
| | | ], |
| | | 'sameAs' => [ |
| | | 'type' => 'url', |
| | | 'label' => 'Same as', |
| | | 'hint' => 'Wikipedia page of neighbourhood/city/province/country' |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | use JVBase\managers\SEO\render\Thing\Event\Event; |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Thing\Product\Product; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait fundedItemTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var CreativeWork|Event|Organization|Person|Product|array Indicates something directly or indirectly funded or sponsored through a Grant. See also ownershipFundingInfo. |
| | | * Inverse property: funding |
| | | */ |
| | | protected CreativeWork|Event|Organization|Person|Product|array $fundedItem; |
| | | |
| | | public function getFundedItem():CreativeWork|Event|Organization|Person|Product|array|null |
| | | { |
| | | return $this->fundedItem??null; |
| | | } |
| | | public function setFundedItem(CreativeWork|Event|Organization|Person|Product|array $fundedItem):void |
| | | { |
| | | if (is_array($fundedItem)){ |
| | | $fundedItem = $this->mixedArray('fundedItem', $fundedItem, [ |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork', |
| | | 'JVBase\managers\SEO\render\Thing\Event\Event', |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person', |
| | | 'JVBase\managers\SEO\render\Thing\Product\Product' |
| | | ]); |
| | | } |
| | | $this->fundedItem = $fundedItem; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait funderTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array A person or organization that supports (sponsors) something through some kind of financial contribution. |
| | | */ |
| | | protected Organization|Person|array $funder; |
| | | |
| | | public function getFunder():Organization|Person|array|null |
| | | { |
| | | return $this->funder??null; |
| | | } |
| | | public function setFunder(Organization|Person|array $funder):void |
| | | { |
| | | if (is_array($funder)){ |
| | | $funder = $this->mixedArray('funder', $funder, ['JVBase\managers\SEO\render\Thing\Organization\Organization', 'JVBase\managers\SEO\render\Thing\Person\Person']); |
| | | } |
| | | $this->funder = $funder; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Grant; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait fundingTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Grant|array A Grant that directly or indirectly provide funding or sponsorship for this item. See also ownershipFundingInfo. |
| | | * Inverse property: fundedItem |
| | | */ |
| | | protected Grant|array $funding; |
| | | |
| | | public function getFunding():Grant|array|null |
| | | { |
| | | return $this->funding??null; |
| | | } |
| | | public function setFunding(Grant|array $funding):void |
| | | { |
| | | if (is_array($funding)){ |
| | | $funding = $this->classArray('funding', $funding, 'JVBase\managers\SEO\render\Thing\Intangible\Grant'); |
| | | } |
| | | $this->funding = $funding; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait genreTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var DefinedTerm|string|array Genre of the creative work, broadcast channel or group. |
| | | */ |
| | | protected DefinedTerm|string|array $genre; |
| | | |
| | | public function getGenre():DefinedTerm|string|array|null |
| | | { |
| | | return $this->genre??null; |
| | | } |
| | | public function setGenre(DefinedTerm|string|array $genre):void |
| | | { |
| | | if (is_array($genre)) { |
| | | $genre = $this->mixedArray('genre', $genre, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm' |
| | | ]); |
| | | } |
| | | $this->genre = $genre; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\GeoCoordinates; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\GeoShape; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait geoTrait { |
| | | /** |
| | | * @var GeoCoordinates|GeoShape The geo coordinates of the place. |
| | | */ |
| | | protected GeoCoordinates|GeoShape $geo; |
| | | |
| | | public function getGeo():GeoCoordinates|GeoShape|null |
| | | { |
| | | return $this->geo??null; |
| | | } |
| | | public function setGeo(GeoCoordinates|GeoShape $geo):void |
| | | { |
| | | $this->geo = $geo; |
| | | } |
| | | public function getGeoFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'group', |
| | | 'wrap' => 'details', |
| | | 'label' => 'Coordinates', |
| | | 'fields' => [ |
| | | 'latitude' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Latitude', |
| | | 'hint' => 'The latitude of a location. For example 37.42242' |
| | | ], |
| | | 'longitude' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Longitude', |
| | | 'hint' => 'The longitude of a location. For example -122.08585' |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\AdministrativeArea; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait geographicAreaTrait { |
| | | /** |
| | | * @var AdministrativeArea The geographic area associated with the audience. |
| | | */ |
| | | protected AdministrativeArea $geographicArea; |
| | | |
| | | public function getGeographicArea():?AdministrativeArea |
| | | { |
| | | return $this->geographicArea??null; |
| | | } |
| | | public function setGeographicArea(AdministrativeArea $geographicArea):void |
| | | { |
| | | $this->geographicArea = $geographicArea; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait givenNameTrait { |
| | | /** |
| | | * @var string Given name. In the U.S., the first name of a Person. |
| | | */ |
| | | protected string $givenName; |
| | | |
| | | public function getGivenName():?string |
| | | { |
| | | return $this->givenName??null; |
| | | } |
| | | public function setGivenName(string $givenName):void |
| | | { |
| | | $this->givenName = $givenName; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait globalLocationNumberTrait { |
| | | /** |
| | | * @var string A globalLocationNumber of the item |
| | | */ |
| | | protected string $globalLocationNumber; |
| | | |
| | | public function getGlobalLocationNumber():?string |
| | | { |
| | | return $this->globalLocationNumber??null; |
| | | } |
| | | public function setGlobalLocationNumber(string $globalLocationNumber):void |
| | | { |
| | | $this->globalLocationNumber = $globalLocationNumber; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait gtinTrait { |
| | | /** |
| | | * @var string A Global Trade Item Number (GTIN). GTINs identify trade items, including products and services, using numeric identification codes. |
| | | * |
| | | * A correct gtin value should be a valid GTIN, which means that it should be an all-numeric string of either 8, 12, 13 or 14 digits, or a "GS1 Digital Link" URL based on such a string. The numeric component should also have a valid GS1 check digit and meet the other rules for valid GTINs. See also GS1's GTIN Summary and Wikipedia for more details. Left-padding of the gtin values is not required or encouraged. The gtin property generalizes the earlier gtin8, gtin12, gtin13, and gtin14 properties. |
| | | * |
| | | * The GS1 digital link specifications expresses GTINs as URLs (URIs, IRIs, etc.). Digital Links should be populated into the hasGS1DigitalLink attribute. |
| | | * |
| | | * Note also that this is a definition for how to include GTINs in Schema.org data, and not a definition of GTINs in general - see the GS1 documentation for authoritative details. |
| | | */ |
| | | protected string $gtin; |
| | | |
| | | public function getGtin():?string |
| | | { |
| | | return $this->gtin??null; |
| | | } |
| | | public function setGtin(string $gtin):void |
| | | { |
| | | $this->gtin = $gtin; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\AdultOrientedEnumeration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasAdultConsiderationTrait { |
| | | /** |
| | | * @var AdultOrientedEnumeration Used to tag an item to be intended or suitable for consumption or use by adults only. |
| | | */ |
| | | protected AdultOrientedEnumeration $hasAdultConsideration; |
| | | |
| | | public function getHasAdultConsideration():?AdultOrientedEnumeration |
| | | { |
| | | return $this->hasAdultConsideration??null; |
| | | } |
| | | public function setHasAdultConsideration(AdultOrientedEnumeration $hasAdultConsideration):void |
| | | { |
| | | $this->hasAdultConsideration = $hasAdultConsideration; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\CategoryCode; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasCategoryCodeTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var CategoryCode|array A Category code contained in this code set. |
| | | */ |
| | | protected CategoryCode|array $hasCategoryCode; |
| | | |
| | | public function getHasCategoryCode():CategoryCode|array|null |
| | | { |
| | | return $this->hasCategoryCode??null; |
| | | } |
| | | public function setHasCategoryCode(CategoryCode|array $hasCategoryCode):void |
| | | { |
| | | if (is_array($hasCategoryCode)) { |
| | | $hasCategoryCode = $this->classArray('hasCategoryCode', $hasCategoryCode, 'JVBase\managers\SEO\render\Thing\Intangible\CategoryCode'); |
| | | } |
| | | $this->hasCategoryCode = $hasCategoryCode; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\Certification; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasCertificationTrait { |
| | | use arrayHelper; |
| | | |
| | | /** |
| | | * @var Certification|array Certification information about a product, organization, service, place, or person. |
| | | */ |
| | | protected Certification|array $hasCertification; |
| | | |
| | | public function getHasCertification():Certification|array|null |
| | | { |
| | | return $this->hasCertification??null; |
| | | } |
| | | public function setHasCertification(Certification|array $hasCertification):void |
| | | { |
| | | if (is_array($hasCertification)){ |
| | | $hasCertification = $this->classArray('hasCertification', $hasCertification, 'JVBase\managers\SEO\render\Thing\CreativeWork\Certification'); |
| | | } |
| | | $this->hasCertification = $hasCertification; |
| | | } |
| | | |
| | | public function getHasCertificationFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'repeater', |
| | | 'label' => 'Has Certification', |
| | | 'fields' => [ |
| | | |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\EducationalOccupationalCredential; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasCredentialTrait { |
| | | /** |
| | | * @var EducationalOccupationalCredential A credential awarded to the Person or Organization. |
| | | */ |
| | | protected EducationalOccupationalCredential $hasCredential; |
| | | |
| | | public function getHasCredential():?EducationalOccupationalCredential |
| | | { |
| | | return $this->hasCredential??null; |
| | | } |
| | | public function setHasCredential(EducationalOccupationalCredential $hasCredential):void |
| | | { |
| | | $this->hasCredential = $hasCredential; |
| | | } |
| | | |
| | | public function getHasCredentialFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'repeater', |
| | | 'label' => 'Has Credential', |
| | | 'fields' => [ |
| | | |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasDefinedTermTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var DefinedTerm|array A Defined Term contained in this term set. |
| | | */ |
| | | protected DefinedTerm|array $hasDefinedTerm; |
| | | |
| | | public function getHasDefinedTerm():DefinedTerm|array|null |
| | | { |
| | | return $this->hasDefinedTerm??null; |
| | | } |
| | | public function setHasDefinedTerm(DefinedTerm|array $hasDefinedTerm):void |
| | | { |
| | | if (is_array($hasDefinedTerm)) { |
| | | $hasDefinedTerm = $this->classArray('hasDefinedTerm', $hasDefinedTerm, 'JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm'); |
| | | } |
| | | $this->hasDefinedTerm = $hasDefinedTerm; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasDriveThroughServiceTrait { |
| | | /** |
| | | * @var bool Indicates whether some facility (e.g. FoodEstablishment, CovidTestingFacility) offers a service that can be used by driving through in a car. In the case of CovidTestingFacility such facilities could potentially help with social distancing from other potentially-infected users. |
| | | */ |
| | | protected bool $hasDriveThroughService; |
| | | |
| | | public function getHasDriveThroughService():?bool |
| | | { |
| | | return $this->hasDriveThroughService??null; |
| | | } |
| | | public function setHasDriveThroughService(bool $hasDriveThroughService):void |
| | | { |
| | | $this->hasDriveThroughService = $hasDriveThroughService; |
| | | } |
| | | |
| | | public function getHasDriveThroughServiceFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'true_false', |
| | | 'label' => 'Has Drive Through Service', |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasMapTrait { |
| | | /** |
| | | * @var string A hasMap of the item |
| | | */ |
| | | protected string $hasMap; |
| | | |
| | | public function getHasMap():?string |
| | | { |
| | | return $this->hasMap??null; |
| | | } |
| | | public function setHasMap(string $hasMap):void |
| | | { |
| | | if (!filter_var($hasMap, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO]Invalid map url: '.$hasMap); |
| | | } |
| | | $this->hasMap = $hasMap; |
| | | } |
| | | |
| | | public function getHasMapFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'url', |
| | | 'label' => 'Has Map', |
| | | 'hint' => 'A link to the Google Map location, if available' |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasMeasurementTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var QuantitativeValue|array A measurement of an item, For example, the inseam of pants, the wheel size of a bicycle, the gauge of a screw, or the carbon footprint measured for certification by an authority. Usually an exact measurement, but can also be a range of measurements for adjustable products, for example belts and ski bindings. |
| | | */ |
| | | protected QuantitativeValue|array $hasMeasurement; |
| | | |
| | | public function getHasMeasurement():QuantitativeValue|array|null |
| | | { |
| | | return $this->hasMeasurement??null; |
| | | } |
| | | public function setHasMeasurement(QuantitativeValue|array $hasMeasurement):void |
| | | { |
| | | if (is_array($hasMeasurement)){ |
| | | $hasMeasurement = $this->classArray('hasMeasurement', $hasMeasurement, 'JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue'); |
| | | } |
| | | $this->hasMeasurement = $hasMeasurement; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\MenuItem; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasMenuItemTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var MenuItem|array A food or drink item contained in a menu or menu section. |
| | | */ |
| | | protected MenuItem|array $hasMenuItem; |
| | | |
| | | public function getHasMenuItem():MenuItem|array|null |
| | | { |
| | | return $this->hasMenuItem??null; |
| | | } |
| | | public function setHasMenuItem(MenuItem|array $hasMenuItem):void |
| | | { |
| | | if (is_array($hasMenuItem)) { |
| | | $hasMenuItem = $this->classArray('hasMenuItem', $hasMenuItem, 'JVBase\managers\SEO\render\Thing\Intangible\MenuItem'); |
| | | } |
| | | $this->hasMenuItem = $hasMenuItem; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\MenuSection; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasMenuSectionTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var MenuSection|array A subgrouping of the menu (by dishes, course, serving time period, etc.). |
| | | */ |
| | | protected MenuSection|array $hasMenuSection; |
| | | |
| | | public function getHasMenuSection():MenuSection|array|null |
| | | { |
| | | return $this->hasMenuSection??null; |
| | | } |
| | | public function setHasMenuSection(MenuSection|array $hasMenuSection):void |
| | | { |
| | | if (is_array($hasMenuSection)) { |
| | | $hasMenuSection = $this->classArray('hasMenuSection', $hasMenuSection, 'JVBase\managers\SEO\render\Thing\CreativeWork\MenuSection'); |
| | | } |
| | | $this->hasMenuSection = $hasMenuSection; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\Menu; |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\MenuSection; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasMenuTrait { |
| | | /** |
| | | * @var Menu|string Either the actual menu as a structured representation, as text, or a URL of the menu. |
| | | * Supersedes menu. |
| | | */ |
| | | protected Menu|string $hasMenu; |
| | | |
| | | public function getHasMenu():Menu|string|null |
| | | { |
| | | return $this->hasMenu??null; |
| | | } |
| | | public function setHasMenu(Menu|string $hasMenu):void |
| | | { |
| | | if (is_string($hasMenu)) { |
| | | if (!filter_var($hasMenu, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO]HasMenu intended to be a url pointing to the menu, or a Menu object.'); |
| | | return; |
| | | } |
| | | } |
| | | $this->hasMenu = $hasMenu; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\MerchantReturnPolicy; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasMerchantReturnPolicyTrait { |
| | | /** |
| | | * @var MerchantReturnPolicy Specifies a MerchantReturnPolicy that may be applicable. Supersedes hasProductReturnPolicy. |
| | | */ |
| | | protected MerchantReturnPolicy $hasMerchantReturnPolicy; |
| | | |
| | | public function getHasMerchantReturnPolicy():?MerchantReturnPolicy |
| | | { |
| | | return $this->hasMerchantReturnPolicy??null; |
| | | } |
| | | public function setHasMerchantReturnPolicy(MerchantReturnPolicy $hasMerchantReturnPolicy):void |
| | | { |
| | | $this->hasMerchantReturnPolicy = $hasMerchantReturnPolicy; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Occupation; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasOccupationTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Occupation|array The Person's occupation. For past professions, use Role for expressing dates. |
| | | */ |
| | | protected Occupation|array $hasOccupation; |
| | | |
| | | public function getHasOccupation():Occupation|array|null |
| | | { |
| | | return $this->hasOccupation??null; |
| | | } |
| | | public function setHasOccupation(Occupation|array $hasOccupation):void |
| | | { |
| | | if (is_array($hasOccupation)) { |
| | | $hasOccupation = $this->classArray('hasOccupation', $hasOccupation, 'JVBase\managers\SEO\render\Thing\Intangible\Occupation'); |
| | | } |
| | | $this->hasOccupation = $hasOccupation; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\OfferCatalog; |
| | | use JVBase\registrar\Registrar; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasOfferCatalogTrait { |
| | | /** |
| | | * @var OfferCatalog Indicates an OfferCatalog listing for this Organization, Person, or Service. |
| | | */ |
| | | protected OfferCatalog $hasOfferCatalog; |
| | | |
| | | public function getHasOfferCatalog():?OfferCatalog |
| | | { |
| | | return $this->hasOfferCatalog??null; |
| | | } |
| | | public function setHasOfferCatalog(OfferCatalog $hasOfferCatalog):void |
| | | { |
| | | $this->hasOfferCatalog = $hasOfferCatalog; |
| | | } |
| | | |
| | | public function getHasOfferCatalogFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'group', |
| | | 'label' => 'Offer Catalog', |
| | | 'wrap' => 'details', |
| | | 'fields' => [ |
| | | 'generate' => [ |
| | | 'type' => 'true_false', |
| | | 'label' => 'Generate from Content type?' |
| | | ], |
| | | 'content_type' => [ |
| | | 'type' => 'checkbox', |
| | | 'label' => 'Select Type to generate from', |
| | | 'options' => Registrar::getRegistered(), |
| | | 'condition' => [ |
| | | 'field' => 'generate', |
| | | 'value' => 1, |
| | | 'operator' => '==' |
| | | ] |
| | | ], |
| | | 'offer_catalog' => [ |
| | | 'type' => 'repeater', |
| | | 'label' => 'Manually Enter Offer Catalog', |
| | | 'condition' => [ |
| | | 'field' => 'generate', |
| | | 'value' => 1, |
| | | 'operator' => '!=' |
| | | ], |
| | | 'fields' => [ |
| | | 'type' => [ |
| | | 'type' => 'select', |
| | | 'label' => 'Type', |
| | | 'options' => [ |
| | | 'product' => 'Product', |
| | | 'service' => 'Service' |
| | | ] |
| | | ], |
| | | 'name' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Name', |
| | | ], |
| | | 'description' => [ |
| | | 'type' => 'textarea', |
| | | 'label' => 'Description' |
| | | ] |
| | | ] |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasPOSTrait { |
| | | /** |
| | | * @var Place Points-of-Sales operated by the organization or person. |
| | | */ |
| | | protected Place $hasPOS; |
| | | |
| | | public function getHasPOS():?Place |
| | | { |
| | | return $this->hasPOS??null; |
| | | } |
| | | public function setHasPOS(Place $hasPOS):void |
| | | { |
| | | $this->hasPOS = $hasPOS; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasPartTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var CreativeWork|array Indicates an item or CreativeWork that is part of this item, or CreativeWork (in some sense). |
| | | * Inverse property: isPartOf |
| | | */ |
| | | protected CreativeWork|array $hasPart; |
| | | |
| | | public function getHasPart():CreativeWork|array|null |
| | | { |
| | | return $this->hasPart??null; |
| | | } |
| | | public function setHasPart(CreativeWork|array $hasPart):void |
| | | { |
| | | if (is_array($hasPart)) { |
| | | $hasPart = $this->classArray('hasPart', $hasPart, 'JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork'); |
| | | } |
| | | $this->hasPart = $hasPart; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Product\Product; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hasVariantTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Product|array Indicates a Product that is a member of this ProductGroup (or ProductModel). |
| | | * Inverse property: isVariantOf |
| | | */ |
| | | protected Product|array $hasVariant; |
| | | |
| | | public function getHasVariant():Product|array|null |
| | | { |
| | | return $this->hasVariant??null; |
| | | } |
| | | public function setHasVariant(Product|array $hasVariant):void |
| | | { |
| | | if (is_array($hasVariant)) { |
| | | $hasVariant = $this->classArray('hasVariant', $hasVariant, 'JVBase\managers\SEO\render\Thing\Product\Product'); |
| | | } |
| | | $this->hasVariant = $hasVariant; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait headlineTrait { |
| | | /** |
| | | * @var string Headline of the article. |
| | | */ |
| | | protected string $headline; |
| | | |
| | | public function getHeadline():?string |
| | | { |
| | | return $this->headline??null; |
| | | } |
| | | public function setHeadline(string $headline):void |
| | | { |
| | | $this->headline = $headline; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Quantity\Distance; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait heightTrait { |
| | | /** |
| | | * @var Distance|QuantitativeValue The height of the item. |
| | | */ |
| | | protected Distance|QuantitativeValue $height; |
| | | |
| | | public function getHeight():Distance|QuantitativeValue|null |
| | | { |
| | | return $this->height??null; |
| | | } |
| | | public function setHeight(Distance|QuantitativeValue $height):void |
| | | { |
| | | $this->height = $height; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait highPriceTrait { |
| | | /** |
| | | * @var int|float The highest price of all offers available. |
| | | * |
| | | * Usage guidelines: |
| | | * |
| | | * Use values from 0123456789 (Unicode 'DIGIT ZERO' (U+0030) to 'DIGIT NINE' (U+0039)) rather than superficially similar Unicode symbols. |
| | | * Use '.' (Unicode 'FULL STOP' (U+002E)) rather than ',' to indicate a decimal point. Avoid using these symbols as a readability separator. |
| | | */ |
| | | protected int|float $highPrice; |
| | | |
| | | public function getHighPrice():int|float|null |
| | | { |
| | | return $this->highPrice??null; |
| | | } |
| | | public function setHighPrice(int|float $highPrice):void |
| | | { |
| | | $this->highPrice = $highPrice; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ContactPoint\PostalAddress; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\ContactPoint; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\VirtualHomeLocation; |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait homeLocationTrait { |
| | | /** |
| | | * @var ContactPoint|Place A contact location for a person's residence. |
| | | */ |
| | | protected ContactPoint|Place $homeLocation; |
| | | |
| | | public function getHomeLocation():ContactPoint|Place|null |
| | | { |
| | | return $this->homeLocation??null; |
| | | } |
| | | public function setHomeLocation(ContactPoint|Place $homeLocation):void |
| | | { |
| | | $this->homeLocation = $homeLocation; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait honorificPrefixTrait { |
| | | /** |
| | | * @var string An honorific prefix preceding a Person's name such as Dr/Mrs/Mr. |
| | | */ |
| | | protected string $honorificPrefix; |
| | | |
| | | public function getHonorificPrefix():?string |
| | | { |
| | | return $this->honorificPrefix??null; |
| | | } |
| | | public function setHonorificPrefix(string $honorificPrefix):void |
| | | { |
| | | $this->honorificPrefix = $honorificPrefix; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait honorificSuffixTrait { |
| | | /** |
| | | * @var string An honorific suffix following a Person's name such as M.D./PhD/MSCSW. |
| | | */ |
| | | protected string $honorificSuffix; |
| | | |
| | | public function getHonorificSuffix():?string |
| | | { |
| | | return $this->honorificSuffix??null; |
| | | } |
| | | public function setHonorificSuffix(string $honorificSuffix):void |
| | | { |
| | | $this->honorificSuffix = $honorificSuffix; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\OpeningHoursSpecification; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait hoursAvailableTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var OpeningHoursSpecification The hours during which this service or contact is available. |
| | | */ |
| | | protected OpeningHoursSpecification $hoursAvailable; |
| | | |
| | | public function getHoursAvailable():?OpeningHoursSpecification |
| | | { |
| | | return $this->hoursAvailable??null; |
| | | } |
| | | public function setHoursAvailable(OpeningHoursSpecification $hoursAvailable):void |
| | | { |
| | | $this->hoursAvailable = $hoursAvailable; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait httpMethodTrait { |
| | | /** |
| | | * @var string An HTTP method that specifies the appropriate HTTP method for a request to an HTTP EntryPoint. Values are capitalized strings as used in HTTP. |
| | | */ |
| | | protected string $httpMethod; |
| | | |
| | | public function getHttpMethod():?string |
| | | { |
| | | return $this->httpMethod??null; |
| | | } |
| | | public function setHttpMethod(string $httpMethod):void |
| | | { |
| | | $this->httpMethod = $httpMethod; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\MediaObject\ImageObject; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait imageTrait { |
| | | /** |
| | | * @var string|ImageObject Can be a URL, or a fully described ImageObject |
| | | */ |
| | | protected string|ImageObject $image; |
| | | |
| | | public function getImage():?string |
| | | { |
| | | return $this->image??null; |
| | | } |
| | | public function setImage(string|ImageObject $image):void |
| | | { |
| | | $this->image = $image; |
| | | } |
| | | |
| | | public function getImageFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'upload', |
| | | 'multiple' => false, |
| | | 'label' => 'Image', |
| | | 'hint' => 'An image of the Item.' |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CategoryCodeSet; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait inCodeSetTrait { |
| | | /** |
| | | * @var CategoryCodeSet|string A CategoryCodeSet that contains this category code. |
| | | */ |
| | | protected CategoryCodeSet|string $inCodeSet; |
| | | |
| | | public function getInCodeSet():CategoryCodeSet|string|null |
| | | { |
| | | return $this->inCodeSet??null; |
| | | } |
| | | public function setInCodeSet(CategoryCodeSet|string $inCodeSet):void |
| | | { |
| | | $this->inCodeSet = $inCodeSet; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\DefinedTermSet; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait inDefinedTermSetTrait { |
| | | /** |
| | | * @var DefinedTermSet|string A DefinedTermSet that contains this term. |
| | | */ |
| | | protected DefinedTermSet|string $inDefinedTermSet; |
| | | |
| | | public function getInDefinedTermSet():DefinedTermSet|string|null |
| | | { |
| | | return $this->inDefinedTermSet??null; |
| | | } |
| | | public function setInDefinedTermSet(DefinedTermSet|string $inDefinedTermSet):void |
| | | { |
| | | $this->inDefinedTermSet = $inDefinedTermSet; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait inGroupProductWithIDTrait { |
| | | /** |
| | | * @var string Indicates the productGroupID for a ProductGroup that this product isVariantOf. |
| | | */ |
| | | protected string $inGroupProductWithID; |
| | | |
| | | public function getInGroupProductWithID():?string |
| | | { |
| | | return $this->inGroupProductWithID??null; |
| | | } |
| | | public function setInGroupProductWithID(string $inGroupProductWithID):void |
| | | { |
| | | $this->inGroupProductWithID = $inGroupProductWithID; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Language; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait inLanguageTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Language|string|array The language of the content or performance or used in an action. Please use one of the language codes from the IETF BCP 47 standard. See also availableLanguage. Supersedes language. |
| | | */ |
| | | protected Language|string|array $inLanguage; |
| | | |
| | | public function getInLanguage():Language|string|array|null |
| | | { |
| | | return $this->inLanguage??null; |
| | | } |
| | | public function setInLanguage(Language|string|array $inLanguage):void |
| | | { |
| | | if (is_array($inLanguage)) { |
| | | $inLanguage = $this->mixedArray('inLanguage', $inLanguage, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\Language' |
| | | ]); |
| | | } |
| | | $this->inLanguage = $inLanguage; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait inStoreReturnsOfferedTrait { |
| | | /** |
| | | * @var bool Are in-store returns offered? (For more advanced return methods use the returnMethod property.) |
| | | */ |
| | | protected bool $inStoreReturnsOffered; |
| | | |
| | | public function getInStoreReturnsOffered():?bool |
| | | { |
| | | return $this->inStoreReturnsOffered??null; |
| | | } |
| | | public function setInStoreReturnsOffered(bool $inStoreReturnsOffered):void |
| | | { |
| | | $this->inStoreReturnsOffered = $inStoreReturnsOffered; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\TypeAndQuantityNode; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait includesObjectTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var TypeAndQuantityNode|array This links to a node or nodes indicating the exact quantity of the products included in an Offer or ProductCollection. |
| | | */ |
| | | protected TypeAndQuantityNode|array $includesObject; |
| | | |
| | | public function getIncludesObject():TypeAndQuantityNode|array|null |
| | | { |
| | | return $this->includesObject??null; |
| | | } |
| | | public function setIncludesObject(TypeAndQuantityNode|array $includesObject):void |
| | | { |
| | | if (is_array($includesObject)) { |
| | | $includesObject = $this->classArray('includesObject', $includesObject, 'JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\TypeAndQuantityNode'); |
| | | } |
| | | $this->includesObject = $includesObject; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\GeoShape; |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait ineligibleLocationTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var GeoShape|Place|string|array The ISO 3166-1 (ISO 3166-1 alpha-2) or ISO 3166-2 code, the place, or the GeoShape for the geo-political region(s) for which the offer or delivery charge specification is not valid, e.g. a region where the transaction is not allowed. |
| | | */ |
| | | protected GeoShape|Place|string|array $ineligibleLocation; |
| | | |
| | | public function getIneligibleLocation():GeoShape|Place|string|array|null |
| | | { |
| | | return $this->ineligibleLocation??null; |
| | | } |
| | | public function setIneligibleLocation(GeoShape|Place|string|array $ineligibleLocation):void |
| | | { |
| | | if (is_array($ineligibleLocation)) { |
| | | $ineligibleLocation = $this->mixedArray('ineligibleLocation', $ineligibleLocation, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\GeoShape', |
| | | 'JVBase\managers\SEO\render\Thing\Place\Place' |
| | | ]); |
| | | } |
| | | $this->ineligibleLocation = $ineligibleLocation; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\GeoShape; |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait ineligibleRegionTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var GeoShape|Place|string|array The ISO 3166-1 (ISO 3166-1 alpha-2) or ISO 3166-2 code, the place, or the GeoShape for the geo-political region(s) for which the offer or delivery charge specification is not valid, e.g. a region where the transaction is not allowed. |
| | | */ |
| | | protected GeoShape|Place|string|array $ineligibleRegion; |
| | | |
| | | public function getIneligibleRegion():GeoShape|Place|string|array|null |
| | | { |
| | | return $this->ineligibleRegion??null; |
| | | } |
| | | public function setIneligibleRegion(GeoShape|Place|string|array $ineligibleRegion):void |
| | | { |
| | | if (is_array($ineligibleRegion)) { |
| | | $ineligibleRegion = $this->mixedArray('ineligibleRegion', $ineligibleRegion, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\GeoShape', |
| | | 'JVBase\managers\SEO\render\Thing\Place\Place' |
| | | ]); |
| | | } |
| | | $this->ineligibleRegion = $ineligibleRegion; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait instrumentTrait { |
| | | /** |
| | | * @var Thing The object that helped the agent perform the action. E.g. John wrote a book with a pen. |
| | | */ |
| | | protected Thing $instrument; |
| | | |
| | | public function getInstrument():?Thing |
| | | { |
| | | return $this->instrument??null; |
| | | } |
| | | public function setInstrument(Thing $instrument):void |
| | | { |
| | | $this->instrument = $instrument; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\WebSite; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait interactionServiceTrait { |
| | | /** |
| | | * @var WebSite The WebSite or SoftwareApplication where the interactions took place. Also accepts SoftwareApplication (not included) |
| | | */ |
| | | protected WebSite $interactionService; |
| | | |
| | | public function getInteractionService():?WebSite |
| | | { |
| | | return $this->interactionService??null; |
| | | } |
| | | public function setInteractionService(WebSite $interactionService):void |
| | | { |
| | | $this->interactionService = $interactionService; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\InteractionCounter; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait interactionStatisticTrait { |
| | | /** |
| | | * @var InteractionCounter The number of interactions for the CreativeWork using the WebSite or SoftwareApplication. The most specific child type of InteractionCounter should be used. Supersedes interactionCount. |
| | | */ |
| | | protected InteractionCounter $interactionStatistic; |
| | | |
| | | public function getInteractionStatistic():?InteractionCounter |
| | | { |
| | | return $this->interactionStatistic??null; |
| | | } |
| | | public function setInteractionStatistic(InteractionCounter $interactionStatistic):void |
| | | { |
| | | $this->interactionStatistic = $interactionStatistic; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Action; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait interactionTypeTrait { |
| | | /** |
| | | * @var Action The Action representing the type of interaction. For up votes, +1s, etc. use LikeAction. For down votes use DislikeAction. Otherwise, use the most specific Action. |
| | | */ |
| | | protected Action $interactionType; |
| | | |
| | | public function getInteractionType():?Action |
| | | { |
| | | return $this->interactionType??null; |
| | | } |
| | | public function setInteractionType(Action $interactionType):void |
| | | { |
| | | $this->interactionType = $interactionType; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait inventoryLevelTrait { |
| | | /** |
| | | * @var QuantitativeValue The current approximate inventory level for the item or items. |
| | | */ |
| | | protected QuantitativeValue $inventoryLevel; |
| | | |
| | | public function getInventoryLevel():?QuantitativeValue |
| | | { |
| | | return $this->inventoryLevel??null; |
| | | } |
| | | public function setInventoryLevel(QuantitativeValue $inventoryLevel):void |
| | | { |
| | | $this->inventoryLevel = $inventoryLevel; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait isAccessibleForFreeTrait { |
| | | /** |
| | | * @var bool A flag to signal that the item, event, or place is accessible for free. Supersedes free. |
| | | */ |
| | | protected bool $isAccessibleForFree; |
| | | |
| | | public function getIsAccessibleForFree():?bool |
| | | { |
| | | return $this->isAccessibleForFree??null; |
| | | } |
| | | public function setIsAccessibleForFree(bool $isAccessibleForFree):void |
| | | { |
| | | $this->isAccessibleForFree = $isAccessibleForFree; |
| | | } |
| | | |
| | | public function getIsAccessibleForFreeFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'true_false', |
| | | 'label' => 'Is accessible for Free', |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Product\Product; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait isAccessoryOrSparePartForTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Product|array A pointer to another product (or multiple products) for which this product is an accessory or spare part. |
| | | */ |
| | | protected Product|array $isAccessoryOrSparePartFor; |
| | | |
| | | public function getIsAccessoryOrSparePartFor():Product|array|null |
| | | { |
| | | return $this->isAccessoryOrSparePartFor??null; |
| | | } |
| | | public function setIsAccessoryOrSparePartFor(Product|array $isAccessoryOrSparePartFor):void |
| | | { |
| | | if (is_array($isAccessoryOrSparePartFor)) { |
| | | $isAccessoryOrSparePartFor = $this->classArray('isAccessoryOrSparePartFor', $isAccessoryOrSparePartFor, 'JVBase\managers\SEO\render\Thing\Product\Product'); |
| | | } |
| | | $this->isAccessoryOrSparePartFor = $isAccessoryOrSparePartFor; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | use JVBase\managers\SEO\render\Thing\Product\Product; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait isBasedOnTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var CreativeWork|Product|string|array A resource from which this work is derived or from which it is a modification or adaptation. Supersedes isBasedOnUrl. |
| | | */ |
| | | protected CreativeWork|Product|string|array $isBasedOn; |
| | | |
| | | public function getIsBasedOn():CreativeWork|Product|string|array|null |
| | | { |
| | | return $this->isBasedOn??null; |
| | | } |
| | | public function setIsBasedOn(CreativeWork|Product|string|array $isBasedOn):void |
| | | { |
| | | if (is_array($isBasedOn)) { |
| | | $isBasedOn = $this->mixedArray('isBasedOn', $isBasedOn, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork', |
| | | 'JVBase\managers\SEO\render\Thing\Product\Product' |
| | | ]); |
| | | } |
| | | $this->isBasedOn = $isBasedOn; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Product\Product; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait isConsumableForTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Product|array A pointer to another product (or multiple products) for which this product is an accessory or spare part. |
| | | */ |
| | | protected Product|array $isConsumableFor; |
| | | |
| | | public function getIsConsumableFor():Product|array|null |
| | | { |
| | | return $this->isConsumableFor??null; |
| | | } |
| | | public function setIsConsumableFor(Product|array $isConsumableFor):void |
| | | { |
| | | if (is_array($isConsumableFor)) { |
| | | $isConsumableFor = $this->classArray('isConsumableFor', $isConsumableFor, 'JVBase\managers\SEO\render\Thing\Product\Product'); |
| | | } |
| | | $this->isConsumableFor = $isConsumableFor; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait isFamilyFriendlyTrait { |
| | | /** |
| | | * @var bool Indicates whether this content is family friendly. |
| | | */ |
| | | protected bool $isFamilyFriendly; |
| | | |
| | | public function getIsFamilyFriendly():?bool |
| | | { |
| | | return $this->isFamilyFriendly??null; |
| | | } |
| | | public function setIsFamilyFriendly(bool $isFamilyFriendly):void |
| | | { |
| | | $this->isFamilyFriendly = $isFamilyFriendly; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait isPartOfTrait { |
| | | /** |
| | | * @var CreativeWork|string Indicates an item or CreativeWork that this item, or CreativeWork (in some sense), is part of. |
| | | * Inverse property: hasPart |
| | | */ |
| | | protected CreativeWork|string $isPartOf; |
| | | |
| | | public function getIsPartOf():CreativeWork|string|null |
| | | { |
| | | return $this->isPartOf??null; |
| | | } |
| | | public function setIsPartOf(CreativeWork|string $isPartOf):void |
| | | { |
| | | $this->isPartOf = $isPartOf; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Service; |
| | | use JVBase\managers\SEO\render\Thing\Product\Product; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait isRelatedToTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Product|Service|array A pointer to another, somehow related product (or multiple products). |
| | | */ |
| | | protected Product|Service|array $isRelatedTo; |
| | | |
| | | public function getIsRelatedTo():Product|Service|array|null |
| | | { |
| | | return $this->isRelatedTo??null; |
| | | } |
| | | public function setIsRelatedTo(Product|Service|array $isRelatedTo):void |
| | | { |
| | | if (is_array($isRelatedTo)) { |
| | | $isRelatedTo = $this->mixedArray('isRelatedTo', $isRelatedTo, [ |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\Service', |
| | | 'JVBase\managers\SEO\render\Thing\Product\Product' |
| | | ]); |
| | | } |
| | | $this->isRelatedTo = $isRelatedTo; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Service; |
| | | use JVBase\managers\SEO\render\Thing\Product\Product; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait isSimilarToTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Product|Service|array A pointer to another, somehow related product (or multiple products). |
| | | */ |
| | | protected Product|Service|array $isSimilarTo; |
| | | |
| | | public function getIsSimilarTo():Product|Service|array|null |
| | | { |
| | | return $this->isSimilarTo??null; |
| | | } |
| | | public function setIsSimilarTo(Product|Service|array $isSimilarTo):void |
| | | { |
| | | if (is_array($isSimilarTo)) { |
| | | $isSimilarTo = $this->mixedArray('isSimilarTo', $isSimilarTo, [ |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\Service', |
| | | 'JVBase\managers\SEO\render\Thing\Product\Product' |
| | | ]); |
| | | } |
| | | $this->isSimilarTo = $isSimilarTo; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Service; |
| | | use JVBase\managers\SEO\render\Thing\Product\Product; |
| | | use JVBase\managers\SEO\render\Thing\Product\ProductGroup; |
| | | use JVBase\managers\SEO\render\Thing\Product\ProductModel; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait isVariantOfTrait { |
| | | /** |
| | | * @var ProductGroup|ProductModel Indicates the kind of product that this is a variant of. In the case of ProductModel, this is a pointer (from a ProductModel) to a base product from which this product is a variant. It is safe to infer that the variant inherits all product features from the base model, unless defined locally. This is not transitive. In the case of a ProductGroup, the group description also serves as a template, representing a set of Products that vary on explicitly defined, specific dimensions only (so it defines both a set of variants, as well as which values distinguish amongst those variants). When used with ProductGroup, this property can apply to any Product included in the group. |
| | | */ |
| | | protected ProductGroup|ProductModel $isVariantOf; |
| | | |
| | | public function getIsVariantOf():ProductGroup|ProductModel|null |
| | | { |
| | | return $this->isVariantOf??null; |
| | | } |
| | | public function setIsVariantOf(ProductGroup|ProductModel $isVariantOf):void |
| | | { |
| | | $this->isVariantOf = $isVariantOf; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait issnTrait { |
| | | /** |
| | | * @var string The International Standard Serial Number (ISSN) that identifies this serial publication. You can repeat this property to identify different formats of, or the linking ISSN (ISSN-L) for, this serial publication. |
| | | */ |
| | | protected string $issn; |
| | | |
| | | public function getIssn():?string |
| | | { |
| | | return $this->issn??null; |
| | | } |
| | | public function setIssn(string $issn):void |
| | | { |
| | | $this->issn = $issn; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait issuedByTrait { |
| | | /** |
| | | * @var Organization The organization issuing the item, for example a Permit, Ticket, or Certification. |
| | | */ |
| | | protected Organization $issuedBy; |
| | | |
| | | public function getIssuedBy():?Organization |
| | | { |
| | | return $this->issuedBy??null; |
| | | } |
| | | public function setIssuedBy(Organization $issuedBy):void |
| | | { |
| | | $this->issuedBy = $issuedBy; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\OfferItemCondition; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait itemConditionTrait { |
| | | /** |
| | | * @var OfferItemCondition A predefined value from OfferItemCondition specifying the condition of the product or service, or the products or services included in the offer. Also used for product return policies to specify the condition of products accepted for returns. |
| | | */ |
| | | protected OfferItemCondition $itemCondition; |
| | | |
| | | public function getItemCondition():?OfferItemCondition |
| | | { |
| | | return $this->itemCondition??null; |
| | | } |
| | | public function setItemCondition(OfferItemCondition $itemCondition):void |
| | | { |
| | | $this->itemCondition = $itemCondition; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ListItem; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait itemListElementTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var ListItem|Thing|string|array Text values are best if the elements in the list are plain strings. Existing entities are best for a simple, unordered list of existing things in your data. ListItem is used with ordered lists when you want to provide additional context about the element in that list or when the same item might be in different places in different lists. |
| | | */ |
| | | protected ListItem|Thing|string|array $itemListElement; |
| | | |
| | | public function getItemListElement():ListItem|Thing|string|array|null |
| | | { |
| | | return $this->itemListElement??null; |
| | | } |
| | | public function setItemListElement(ListItem|Thing|string|array $itemListElement):void |
| | | { |
| | | if (is_array($itemListElement)) { |
| | | $itemListElement = $this->mixedArray('itemListElement', $itemListElement, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\ListItem', |
| | | 'JVBase\managers\SEO\render\Thing\Thing' |
| | | ]); |
| | | } |
| | | $this->itemListElement = $itemListElement; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\ItemListOrderType; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait itemListOrderTrait { |
| | | /** |
| | | * @var ItemListOrderType|string Type of ordering (e.g. Ascending, Descending, Unordered). |
| | | */ |
| | | protected ItemListOrderType|string $itemListOrder; |
| | | |
| | | public function getItemListOrder():ItemListOrderType|string|null |
| | | { |
| | | return $this->itemListOrder??null; |
| | | } |
| | | public function setItemListOrder(ItemListOrderType|string $itemListOrder):void |
| | | { |
| | | $this->itemListOrder = $itemListOrder; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | use JVBase\managers\SEO\render\Thing\Event\Event; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\AggregateOffer; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\MenuItem; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Service; |
| | | use JVBase\managers\SEO\render\Thing\Product\Product; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait itemOfferedTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var AggregateOffer|CreativeWork|Event|MenuItem|Product|Service|array An item being offered (or demanded). The transactional nature of the offer or demand is documented using businessFunction, e.g. sell, lease etc. While several common expected types are listed explicitly in this definition, others can be used. Using a second type, such as Product or a subtype of Product, can clarify the nature of the offer. |
| | | */ |
| | | protected AggregateOffer|CreativeWork|Event|MenuItem|Product|Service|array $itemOffered; |
| | | |
| | | public function getItemOffered():AggregateOffer|CreativeWork|Event|MenuItem|Product|Service|array|null |
| | | { |
| | | return $this->itemOffered??null; |
| | | } |
| | | public function setItemOffered(AggregateOffer|CreativeWork|Event|MenuItem|Product|Service|array $itemOffered):void |
| | | { |
| | | if (is_array($itemOffered)) { |
| | | $itemOffered = $this->mixedArray('itemOffered', $itemOffered, [ |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork', |
| | | 'JVBase\managers\SEO\render\Thing\Event\Event', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\AggregateOffer', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\MenuItem', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\Service', |
| | | 'JVBase\managers\SEO\render\Thing\Product\Product' |
| | | ]); |
| | | } |
| | | $this->itemOffered = $itemOffered; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait itemReviewedTrait { |
| | | /** |
| | | * @var Thing The item that is being reviewed/rated. |
| | | */ |
| | | protected Thing $itemReviewed; |
| | | |
| | | public function getItemReviewed():?Thing |
| | | { |
| | | return $this->itemReviewed??null; |
| | | } |
| | | public function setItemReviewed(Thing $itemReviewed):void |
| | | { |
| | | $this->itemReviewed = $itemReviewed; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait itemTrait { |
| | | /** |
| | | * @var Thing An entity represented by an entry in a list or data feed (e.g. an 'artist' in a list of 'artists'). |
| | | */ |
| | | protected Thing $item; |
| | | |
| | | public function getItem():?Thing |
| | | { |
| | | return $this->item??null; |
| | | } |
| | | public function setItem(Thing $item):void |
| | | { |
| | | $this->item = $item; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait jobTitleTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var DefinedTerm|string|array The job title of the person (for example, Financial Manager). |
| | | */ |
| | | protected DefinedTerm|string|array $jobTitle; |
| | | |
| | | public function getJobTitle():DefinedTerm|string|array|null |
| | | { |
| | | return $this->jobTitle??null; |
| | | } |
| | | public function setJobTitle(DefinedTerm|string|array $jobTitle):void |
| | | { |
| | | if (is_array($jobTitle)) { |
| | | $jobTitle = $this->mixedArray('jobTitle', $jobTitle, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm' |
| | | ]); |
| | | } |
| | | $this->jobTitle = $jobTitle; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait keywordsTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var DefinedTerm|string|array Keywords or tags used to describe some item. Multiple textual entries in a keywords list are typically delimited by commas, or by repeating the property. |
| | | */ |
| | | protected DefinedTerm|string|array $keywords; |
| | | |
| | | public function getKeywords():DefinedTerm|string|array|null |
| | | { |
| | | return $this->keywords??null; |
| | | } |
| | | public function setKeywords(DefinedTerm|string|array $keywords):void |
| | | { |
| | | if (is_array($keywords)){ |
| | | $keywords = $this->mixedArray('keywords', $keywords, ['string', 'JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm']); |
| | | } |
| | | $this->keywords = $keywords; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait knowsAboutTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Thing|string|array Of a Person, and less typically of an Organization, to indicate a topic that is known about - suggesting possible expertise but not implying it. We do not distinguish skill levels here, or relate this to educational content, events, objectives or JobPosting descriptions. |
| | | */ |
| | | protected Thing|string|array $knowsAbout; |
| | | |
| | | public function getKnowsAbout():Thing|string|array|null |
| | | { |
| | | return $this->knowsAbout??null; |
| | | } |
| | | public function setKnowsAbout(Thing|string|array $knowsAbout):void |
| | | { |
| | | if (is_array($knowsAbout)){ |
| | | $knowsAbout = $this->mixedArray('knowsAbout', $knowsAbout, ['string', 'JVBase\managers\SEO\render\Thing\Thing']); |
| | | } |
| | | $this->knowsAbout = $knowsAbout; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Language; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait knowsLanguageTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Language|string|array Of a Person, and less typically of an Organization, to indicate a known language. We do not distinguish skill levels or reading/writing/speaking/signing here. Use language codes from the IETF BCP 47 standard. |
| | | */ |
| | | protected Language|string|array $knowsLanguage; |
| | | |
| | | public function getKnowsLanguage():Language|string|array|null |
| | | { |
| | | return $this->knowsLanguage??null; |
| | | } |
| | | public function setKnowsLanguage(Language|string|array $knowsLanguage):void |
| | | { |
| | | if (is_array($knowsLanguage)){ |
| | | $knowsLanguage = $this->mixedArray('knowsLanguage', $knowsLanguage, ['string', 'JVBase\managers\SEO\render\Thing\Intangible\Language']); |
| | | } |
| | | $this->knowsLanguage = $knowsLanguage; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait knowsTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Person|string|array The most generic bi-directional social/work relation. |
| | | */ |
| | | protected Person|string|array $knows; |
| | | |
| | | public function getKnows():Person|string|array|null |
| | | { |
| | | return $this->knows??null; |
| | | } |
| | | public function setKnows(Person|string|array $knows):void |
| | | { |
| | | if (is_array($knows)) { |
| | | $knows = $this->mixedArray('knows', $knows, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->knows = $knows; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Language; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait languageTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Language|string|array The language of the content or performance or used in an action. Please use one of the language codes from the IETF BCP 47 standard. See also availableLanguage. Supersedes language. |
| | | */ |
| | | protected Language|string|array $language; |
| | | |
| | | public function getLanguage():Language|string|array|null |
| | | { |
| | | return $this->language??null; |
| | | } |
| | | public function setLanguage(Language|string|array $language):void |
| | | { |
| | | if (is_array($language)){ |
| | | $language = $this->mixedArray('language', $language, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\Language' |
| | | ]); |
| | | } |
| | | $this->language = $language; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait lastReviewedTrait { |
| | | /** |
| | | * @var Date Date on which the content on this web page was last reviewed for accuracy and/or completeness. |
| | | */ |
| | | protected Date $lastReviewed; |
| | | |
| | | public function getLastReviewed():?Date |
| | | { |
| | | return $this->lastReviewed??null; |
| | | } |
| | | public function setLastReviewed(Date $lastReviewed):void |
| | | { |
| | | $this->lastReviewed = $lastReviewed; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait latitudeTrait { |
| | | /** |
| | | * @var string|float The latitude of a location. For example 37.42242 (WGS 84). |
| | | */ |
| | | protected string|float $latitude; |
| | | |
| | | public function getLatitude():string|float|null |
| | | { |
| | | return $this->latitude??null; |
| | | } |
| | | public function setLatitude(string|float $latitude):void |
| | | { |
| | | $this->latitude = $latitude; |
| | | } |
| | | |
| | | public function getLatitudeFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'text', |
| | | 'label' => 'Latitude', |
| | | 'hint' => 'The latitude of a location. For example 37.42242' |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ContactPoint\PostalAddress; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait legalAddressTrait { |
| | | /** |
| | | * @var PostalAddress The legal address of an organization which acts as the officially registered address used for legal and tax purposes. The legal address can be different from the place of operations of a business and other addresses can be part of an organization. |
| | | */ |
| | | protected PostalAddress $legalAddress; |
| | | |
| | | public function getLegalAddress():?PostalAddress |
| | | { |
| | | return $this->legalAddress??null; |
| | | } |
| | | public function setLegalAddress(PostalAddress $legalAddress):void |
| | | { |
| | | $this->legalAddress = $legalAddress; |
| | | } |
| | | |
| | | public function getLegalAddressFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'group', |
| | | 'label' => 'Address', |
| | | 'wrap' => 'details', |
| | | 'fields' => [ |
| | | 'streetAddress' => [ |
| | | 'type' => 'text', |
| | | 'label'=> 'Street Address', |
| | | 'hint' => 'The street address. For example, "6551 111 St NW"' |
| | | ], |
| | | 'extendedAddress' => [ |
| | | 'type' => 'text', |
| | | 'label'=> 'Extended Address', |
| | | 'hint' => 'An address extension such as an apartment number, C/O or alternative name.' |
| | | ], |
| | | 'postOfficeBoxNumber' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'PO Box Number', |
| | | ], |
| | | 'addressLocality' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Address Locality', |
| | | 'hint' => 'The locality in which the street address is, and which is in the region. For example, "Park Allen".' |
| | | ], |
| | | 'addressRegion' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Address Region (Province)', |
| | | ], |
| | | 'postalCode' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Postal Code', |
| | | 'hint' => 'The postal code. For example, T6H 4R5.' |
| | | ], |
| | | 'addressCountry' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Country', |
| | | 'hint' => 'The address country. For example, "CA".', |
| | | 'default' => 'CA' |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait legalNameTrait { |
| | | /** |
| | | * @var string The official name of the organization, e.g. the registered company name. |
| | | */ |
| | | protected string $legalName; |
| | | |
| | | public function getLegalName():?string |
| | | { |
| | | return $this->legalName??null; |
| | | } |
| | | public function setLegalName(string $legalName):void |
| | | { |
| | | $this->legalName = $legalName; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait legalRepresentativeTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Person|array One or multiple persons who represent this organization legally such as CEO or sole administrator. |
| | | */ |
| | | protected Person|array $legalRepresentative; |
| | | |
| | | public function getLegalRepresentative():Person|array|null |
| | | { |
| | | return $this->legalRepresentative??null; |
| | | } |
| | | public function setLegalRepresentative(Person|array $legalRepresentative):void |
| | | { |
| | | if (is_array($legalRepresentative)){ |
| | | $legalRepresentative = $this->classArray('legalRepresentative', $legalRepresentative, 'JVBase\managers\SEO\render\Thing\Person\Person'); |
| | | } |
| | | $this->legalRepresentative = $legalRepresentative; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait licenseTrait { |
| | | /** |
| | | * @var CreativeWork|string A license document that applies to this content, typically indicated by URL. |
| | | */ |
| | | protected CreativeWork|string $license; |
| | | |
| | | public function getLicense():CreativeWork|string|null |
| | | { |
| | | return $this->license??null; |
| | | } |
| | | public function setLicense(CreativeWork|string $license):void |
| | | { |
| | | if (is_string($license) && !filter_var($license, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO] License is expected to be a valid URL'); |
| | | return; |
| | | } |
| | | $this->license = $license; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Event\Event; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait lifeEventTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Event|array A life event like baptism, communions, Bar Mitzvahs, Aqiqah, Namakarana, Miyamairi, burial, .... |
| | | */ |
| | | protected Event|array $lifeEvent; |
| | | |
| | | public function getLifeEvent():Event|array|null |
| | | { |
| | | return $this->lifeEvent??null; |
| | | } |
| | | public function setLifeEvent(Event|array $lifeEvent):void |
| | | { |
| | | if(is_array($lifeEvent)){ |
| | | $lifeEvent = $this->classArray('lifeEvent', $lifeEvent, 'JVBase\managers\SEO\render\Thing\Event\Event'); |
| | | } |
| | | $this->lifeEvent = $lifeEvent; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait lineTrait { |
| | | /** |
| | | * @var string A line is a point-to-point path consisting of two or more points. A line is expressed as a series of two or more point objects separated by space. |
| | | */ |
| | | protected string $line; |
| | | |
| | | public function getLine():?string |
| | | { |
| | | return $this->line??null; |
| | | } |
| | | public function setLine(string $line):void |
| | | { |
| | | $this->line = $line; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait locationCreatedTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Place|array The location where the CreativeWork was created, which may not be the same as the location depicted in the CreativeWork. |
| | | */ |
| | | protected Place|array $locationCreated; |
| | | |
| | | public function getLocationCreated():Place|array|null |
| | | { |
| | | return $this->locationCreated??null; |
| | | } |
| | | public function setLocationCreated(Place|array $locationCreated):void |
| | | { |
| | | if (is_array($locationCreated)) { |
| | | $locationCreated = $this->classArray('locationCreated', $locationCreated, 'JVBase\managers\SEO\render\Thing\Place\Place'); |
| | | } |
| | | $this->locationCreated = $locationCreated; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ContactPoint\PostalAddress; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\VirtualLocation; |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait locationTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Place|PostalAddress|VirtualLocation|string|array The location of, for example, where an event is happening, where an organization is located, or where an action takes place. |
| | | */ |
| | | protected Place|PostalAddress|VirtualLocation|string|array $location; |
| | | |
| | | public function getLocation():Place|PostalAddress|VirtualLocation|string|array|null |
| | | { |
| | | return $this->location??null; |
| | | } |
| | | public function setLocation(Place|PostalAddress|VirtualLocation|string|array $location):void |
| | | { |
| | | if (is_array($location)){ |
| | | $location = $this->mixedArray('location', $location, [ |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\ContactPoint\PostalAddress', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\VirtualLocation', |
| | | 'JVBase\managers\SEO\render\Thing\Place\Place', |
| | | 'string' |
| | | ]); |
| | | } |
| | | $this->location = $location; |
| | | } |
| | | |
| | | |
| | | public function getLocationFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'group', |
| | | 'wrap' => 'details', |
| | | 'label' => 'Address', |
| | | 'fields' => [ |
| | | 'streetAddress' => [ |
| | | 'type' => 'text', |
| | | 'label'=> 'Street Address', |
| | | 'hint' => 'The street address. For example, "6551 111 St NW"' |
| | | ], |
| | | 'extendedAddress' => [ |
| | | 'type' => 'text', |
| | | 'label'=> 'Extended Address', |
| | | 'hint' => 'An address extension such as an apartment number, C/O or alternative name.' |
| | | ], |
| | | 'postOfficeBoxNumber' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'PO Box Number', |
| | | ], |
| | | 'addressLocality' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Address Locality', |
| | | 'hint' => 'The locality in which the street address is, and which is in the region. For example, "Park Allen".' |
| | | ], |
| | | 'addressRegion' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Address Region (Province)', |
| | | ], |
| | | 'postalCode' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Postal Code', |
| | | 'hint' => 'The postal code. For example, T6H 4R5.' |
| | | ], |
| | | 'addressCountry' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Country', |
| | | 'hint' => 'The address country. For example, "CA".', |
| | | 'default' => 'CA' |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\MediaObject\ImageObject; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait logoTrait { |
| | | /** |
| | | * @var string|ImageObject Can be a URL, or a fully described ImageObject |
| | | */ |
| | | protected string|ImageObject $logo; |
| | | |
| | | public function getLogo():?string |
| | | { |
| | | return $this->logo??null; |
| | | } |
| | | public function setLogo(string|ImageObject $logo):void |
| | | { |
| | | $this->logo = $logo; |
| | | } |
| | | |
| | | public function getLogoFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'upload', |
| | | 'multiple' => false, |
| | | 'label' => 'Logo', |
| | | 'hint' => 'An associated logo.' |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait longitudeTrait { |
| | | /** |
| | | * @var string|float The longitude of a location. For example 37.42242 (WGS 84). |
| | | */ |
| | | protected string|float $longitude; |
| | | |
| | | public function getLongitude():string|float|null |
| | | { |
| | | return $this->longitude??null; |
| | | } |
| | | public function setLongitude(string|float $longitude):void |
| | | { |
| | | $this->longitude = $longitude; |
| | | } |
| | | |
| | | public function getLongitudeFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'text', |
| | | 'label' => 'Longitude', |
| | | 'hint' => 'The longitude of a location. For example -122.08585' |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait lowPriceTrait { |
| | | /** |
| | | * @var int|float The lowest price of all offers available. |
| | | * |
| | | * Usage guidelines: |
| | | * |
| | | * Use values from 0123456789 (Unicode 'DIGIT ZERO' (U+0030) to 'DIGIT NINE' (U+0039)) rather than superficially similar Unicode symbols. |
| | | * Use '.' (Unicode 'FULL STOP' (U+002E)) rather than ',' to indicate a decimal point. Avoid using these symbols as a readability separator. |
| | | */ |
| | | protected int|float $lowPrice; |
| | | |
| | | public function getLowPrice():int|float|null |
| | | { |
| | | return $this->lowPrice??null; |
| | | } |
| | | public function setLowPrice(int|float $lowPrice):void |
| | | { |
| | | $this->lowPrice = $lowPrice; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait mainEntityOfPageTrait { |
| | | /** |
| | | * @var CreativeWork|string Indicates page (or other CreativeWork) for which this thing is the main entity being described. |
| | | * Inverse property of mainEntity |
| | | */ |
| | | protected CreativeWork|string $mainEntityOfPage; |
| | | |
| | | public function getMainEntityOfPage():CreativeWork|string|null |
| | | { |
| | | return $this->mainEntityOfPage??null; |
| | | } |
| | | public function setMainEntityOfPage(CreativeWork|string $mainEntityOfPage):void |
| | | { |
| | | $this->mainEntityOfPage = $mainEntityOfPage; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait mainEntityTrait { |
| | | /** |
| | | * @var Thing Indicates the primary entity described in some page or other CreativeWork. |
| | | * Inverse property: mainEntityOfPage |
| | | */ |
| | | protected Thing $mainEntity; |
| | | |
| | | public function getMainEntity():?Thing |
| | | { |
| | | return $this->mainEntity??null; |
| | | } |
| | | public function setMainEntity(Thing $mainEntity):void |
| | | { |
| | | $this->mainEntity = $mainEntity; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait maintainerTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array A maintainer of a Dataset, software package (SoftwareApplication), or other Project. A maintainer is a Person or Organization that manages contributions to, and/or publication of, some (typically complex) artifact. It is common for distributions of software and data to be based on "upstream" sources. When maintainer is applied to a specific version of something e.g. a particular version or packaging of a Dataset, it is always possible that the upstream source has a different maintainer. The isBasedOn property can be used to indicate such relationships between datasets to make the different maintenance roles clear. Similarly in the case of software, a package may have dedicated maintainers working on integration into software distributions such as Ubuntu, as well as upstream maintainers of the underlying work. |
| | | */ |
| | | protected Organization|Person|array $maintainer; |
| | | |
| | | public function getMaintainer():Organization|Person|array|null |
| | | { |
| | | return $this->maintainer??null; |
| | | } |
| | | public function setMaintainer(Organization|Person|array $maintainer):void |
| | | { |
| | | if (is_array($maintainer)) { |
| | | $maintainer = $this->mixedArray('maintainer', $maintainer, [ |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->maintainer = $maintainer; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Offer; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait makesOfferTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Offer|array A makesOffer of the item |
| | | */ |
| | | protected Offer|array $makesOffer; |
| | | |
| | | public function getMakesOffer():Offer|array|null |
| | | { |
| | | return $this->makesOffer??null; |
| | | } |
| | | public function setMakesOffer(Offer|array $makesOffer):void |
| | | { |
| | | if (is_array($makesOffer)) { |
| | | $makesOffer = $this->classArray('makesOffer', $makesOffer, 'JVBase\managers\SEO\render\Thing\Intangible\Offer'); |
| | | } |
| | | $this->makesOffer = $makesOffer; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait manufacturerTrait { |
| | | /** |
| | | * @var Organization The manufacturer of the product. |
| | | */ |
| | | protected Organization $manufacturer; |
| | | |
| | | public function getManufacturer():?Organization |
| | | { |
| | | return $this->manufacturer??null; |
| | | } |
| | | public function setManufacturer(Organization $manufacturer):void |
| | | { |
| | | $this->manufacturer = $manufacturer; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait materialExtentTrait { |
| | | /** |
| | | * @var QuantitativeValue|string The quantity of the materials being described or an expression of the physical space they occupy. |
| | | */ |
| | | protected QuantitativeValue|string $materialExtent; |
| | | |
| | | public function getMaterialExtent():QuantitativeValue|string|null |
| | | { |
| | | return $this->materialExtent??null; |
| | | } |
| | | public function setMaterialExtent(QuantitativeValue|string $materialExtent):void |
| | | { |
| | | $this->materialExtent = $materialExtent; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Product\Product; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait materialTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Product|string|array A material that something is made from, e.g. leather, wool, cotton, paper. |
| | | */ |
| | | protected Product|string|array $material; |
| | | |
| | | public function getMaterial():Product|string|array|null |
| | | { |
| | | return $this->material??null; |
| | | } |
| | | public function setMaterial(Product|string|array $material):void |
| | | { |
| | | if (is_array($material)) { |
| | | $material = $this->mixedArray('material', $material, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Product\Product' |
| | | ]); |
| | | } |
| | | $this->material = $material; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait maxPriceTrait { |
| | | /** |
| | | * @var int|float The highest price if the price is a range. |
| | | */ |
| | | protected int|float $maxPrice; |
| | | |
| | | public function getMaxPrice():int|float|null |
| | | { |
| | | return $this->maxPrice??null; |
| | | } |
| | | public function setMaxPrice(int|float $maxPrice):void |
| | | { |
| | | $this->maxPrice = $maxPrice; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait maxValueTrait { |
| | | /** |
| | | * @var int|float|string The upper value of some characteristic or property |
| | | */ |
| | | protected int|float|string $maxValue; |
| | | |
| | | public function getMaxValue():int|float|string|null |
| | | { |
| | | return $this->maxValue??null; |
| | | } |
| | | public function setMaxValue(int|float|string $maxValue):void |
| | | { |
| | | $this->maxValue = $maxValue; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait maximumAttendeeCapacityTrait { |
| | | /** |
| | | * @var int The total number of individuals that may attend an event or venue. |
| | | */ |
| | | protected int $maximumAttendeeCapacity; |
| | | |
| | | public function getMaximumAttendeeCapacity():?int |
| | | { |
| | | return $this->maximumAttendeeCapacity??null; |
| | | } |
| | | public function setMaximumAttendeeCapacity(int $maximumAttendeeCapacity):void |
| | | { |
| | | $this->maximumAttendeeCapacity = $maximumAttendeeCapacity; |
| | | } |
| | | |
| | | public function getMaximumAttendeeCapacityFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'number', |
| | | 'label' => 'Maximum Attendee Capacity', |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait maximumPhysicalAttendeeCapacityTrait { |
| | | /** |
| | | * @var int The maximum physical attendee capacity of an Event whose eventAttendanceMode is OfflineEventAttendanceMode (or the offline aspects, in the case of a MixedEventAttendanceMode). |
| | | */ |
| | | protected int $maximumPhysicalAttendeeCapacity; |
| | | |
| | | public function getMaximumPhysicalAttendeeCapacity():?int |
| | | { |
| | | return $this->maximumPhysicalAttendeeCapacity??null; |
| | | } |
| | | public function setMaximumPhysicalAttendeeCapacity(int $maximumPhysicalAttendeeCapacity):void |
| | | { |
| | | $this->maximumPhysicalAttendeeCapacity = $maximumPhysicalAttendeeCapacity; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait maximumVirtualAttendeeCapacityTrait { |
| | | /** |
| | | * @var int The maximum virtual attendee capacity of an Event whose eventAttendanceMode is OnlineEventAttendanceMode (or the online aspects, in the case of a MixedEventAttendanceMode). |
| | | */ |
| | | protected int $maximumVirtualAttendeeCapacity; |
| | | |
| | | public function getMaximumVirtualAttendeeCapacity():?int |
| | | { |
| | | return $this->maximumVirtualAttendeeCapacity??null; |
| | | } |
| | | public function setMaximumVirtualAttendeeCapacity(int $maximumVirtualAttendeeCapacity):void |
| | | { |
| | | $this->maximumVirtualAttendeeCapacity = $maximumVirtualAttendeeCapacity; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait memberOfTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|array An Organization (or ProgramMembership) to which this Person or Organization belongs. |
| | | * Inverse property: member |
| | | */ |
| | | protected Organization|array $memberOf; |
| | | |
| | | public function getMemberOf():Organization|array|null |
| | | { |
| | | return $this->memberOf??null; |
| | | } |
| | | public function setMemberOf(Organization|array $memberOf):void |
| | | { |
| | | if (is_array($memberOf)) |
| | | { |
| | | $memberOf = $this->classArray('memberOf', $memberOf, 'JVBase\managers\SEO\render\Thing\Organization\Organization'); |
| | | } |
| | | $this->memberOf = $memberOf; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait memberTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array A member of an Organization or a ProgramMembership. Organizations can be members of organizations; ProgramMembership is typically for individuals. Supersedes members, musicGroupMember. |
| | | * Inverse property: memberOf |
| | | */ |
| | | protected Organization|Person|array $member; |
| | | |
| | | public function getMember():Organization|Person|array|null |
| | | { |
| | | return $this->member??null; |
| | | } |
| | | public function setMember(Organization|Person|array $member):void |
| | | { |
| | | if (is_array($member)) { |
| | | $member = $this->mixedArray('member', $member, [ |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->member = $member; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait membershipPointsEarnedTrait { |
| | | /** |
| | | * @var QuantitativeValue|int|float The number of membership points earned by the member. If necessary, the unitText can be used to express the units the points are issued in. (E.g. stars, miles, etc.) |
| | | */ |
| | | protected QuantitativeValue|int|float $membershipPointsEarned; |
| | | |
| | | public function getMembershipPointsEarned():QuantitativeValue|int|float|null |
| | | { |
| | | return $this->membershipPointsEarned??null; |
| | | } |
| | | public function setMembershipPointsEarned(QuantitativeValue|int|float $membershipPointsEarned):void |
| | | { |
| | | $this->membershipPointsEarned = $membershipPointsEarned; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait mentionsTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Thing|array Indicates that the CreativeWork contains a reference to, but is not necessarily about a concept. |
| | | */ |
| | | protected Thing|array $mentions; |
| | | |
| | | public function getMentions():Thing|array|null |
| | | { |
| | | return $this->mentions??null; |
| | | } |
| | | public function setMentions(Thing|array $mentions):void |
| | | { |
| | | if (is_array($mentions)) { |
| | | $mentions = $this->classArray('mentions', $mentions, 'JVBase\managers\SEO\render\Thing\Thing'); |
| | | } |
| | | $this->mentions = $mentions; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\MenuSection; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\MenuItem; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait menuAddOnTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var MenuItem|MenuSection|array Additional menu item(s) such as a side dish of salad or side order of fries that can be added to this menu item. Additionally it can be a menu section containing allowed add-on menu items for this menu item. |
| | | */ |
| | | protected MenuItem|MenuSection|array $menuAddOn; |
| | | |
| | | public function getMenuAddOn():MenuItem|MenuSection|array|null |
| | | { |
| | | return $this->menuAddOn??null; |
| | | } |
| | | public function setMenuAddOn(MenuItem|MenuSection|array $menuAddOn):void |
| | | { |
| | | if (is_array($menuAddOn)) { |
| | | $menuAddOn = $this->mixedArray('menuAddOn', $menuAddOn, [ |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\MenuSection', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\MenuItem' |
| | | ]); |
| | | } |
| | | $this->menuAddOn = $menuAddOn; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | use JVBase\managers\SEO\render\DataType\DateTime; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait merchantReturnDaysTrait { |
| | | /** |
| | | * @var Date|DateTime|int Specifies either a fixed return date or the number of days (from the delivery date) that a product can be returned. Used when the returnPolicyCategory property is specified as MerchantReturnFiniteReturnWindow. Supersedes productReturnDays. |
| | | */ |
| | | protected Date|DateTime|int $merchantReturnDays; |
| | | |
| | | public function getMerchantReturnDays():Date|DateTime|int|null |
| | | { |
| | | return $this->merchantReturnDays??null; |
| | | } |
| | | public function setMerchantReturnDays(Date|DateTime|int $merchantReturnDays):void |
| | | { |
| | | $this->merchantReturnDays = $merchantReturnDays; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait merchantReturnLinkTrait { |
| | | /** |
| | | * @var string Specifies a Web page or service by URL, for product returns. Supersedes productReturnLink. |
| | | */ |
| | | protected string $merchantReturnLink; |
| | | |
| | | public function getMerchantReturnLink():?string |
| | | { |
| | | return $this->merchantReturnLink??null; |
| | | } |
| | | public function setMerchantReturnLink(string $merchantReturnLink):void |
| | | { |
| | | if (!filter_var($merchantReturnLink, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO]MerchantReturnLink is expected to be a valid url.'); |
| | | return; |
| | | } |
| | | $this->merchantReturnLink = $merchantReturnLink; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait minPriceTrait { |
| | | /** |
| | | * @var int|float The lowest price if the price is a range. |
| | | */ |
| | | protected int|float $minPrice; |
| | | |
| | | public function getMinPrice():int|float|null |
| | | { |
| | | return $this->minPrice??null; |
| | | } |
| | | public function setMinPrice(int|float $minPrice):void |
| | | { |
| | | $this->minPrice = $minPrice; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait minValueTrait { |
| | | /** |
| | | * @var int|float|string The lower value of some characteristic or property |
| | | */ |
| | | protected int|float|string $minValue; |
| | | |
| | | public function getMinValue():int|float|string|null |
| | | { |
| | | return $this->minValue??null; |
| | | } |
| | | public function setMinValue(int|float|string $minValue):void |
| | | { |
| | | $this->minValue = $minValue; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait mobileUrlTrait { |
| | | /** |
| | | * @var string The mobileUrl property is provided for specific situations in which data consumers need to determine whether one of several provided URLs is a dedicated 'mobile site'. |
| | | * |
| | | * To discourage over-use, and reflecting intial usecases, the property is expected only on Product and Offer, rather than Thing. The general trend in web technology is towards responsive design in which content can be flexibly adapted to a wide range of browsing environments. Pages and sites referenced with the long-established url property should ideally also be usable on a wide variety of devices, including mobile phones. In most cases, it would be pointless and counter productive to attempt to update all url markup to use mobileUrl for more mobile-oriented pages. The property is intended for the case when items (primarily Product and Offer) have extra URLs hosted on an additional "mobile site" alongside the main one. It should not be taken as an endorsement of this publication style. |
| | | */ |
| | | protected string $url; |
| | | |
| | | public function getUrl():?string |
| | | { |
| | | return $this->url??null; |
| | | } |
| | | public function setUrl(string $url):void |
| | | { |
| | | if (!filter_var($url, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO]Not a valid url: '.$url); |
| | | return; |
| | | } |
| | | $this->url = $url; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait monthsOfExperienceTrait { |
| | | /** |
| | | * @var int Indicates the minimal number of months of experience required for a position. |
| | | */ |
| | | protected int $monthsOfExperience; |
| | | |
| | | public function getMonthsOfExperience():?int |
| | | { |
| | | return $this->monthsOfExperience??null; |
| | | } |
| | | public function setMonthsOfExperience(int $monthsOfExperience):void |
| | | { |
| | | $this->monthsOfExperience = $monthsOfExperience; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait musicByTrait { |
| | | /** |
| | | * @var Person The composer of the soundtrack. |
| | | * Note: can also be MusicGroup, not included |
| | | */ |
| | | protected Person $musicBy; |
| | | |
| | | public function getMusicBy():?Person |
| | | { |
| | | return $this->musicBy??null; |
| | | } |
| | | public function setMusicBy(Person $musicBy):void |
| | | { |
| | | $this->musicBy = $musicBy; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait naicsTrait { |
| | | /** |
| | | * @var string The North American Industry Classification System (NAICS) code for a particular organization or business person. |
| | | */ |
| | | protected string $naics; |
| | | |
| | | public function getNaics():?string |
| | | { |
| | | return $this->naics??null; |
| | | } |
| | | public function setNaics(string $naics):void |
| | | { |
| | | $this->naics = $naics; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait nameTrait { |
| | | /** |
| | | * @var string A name of the item |
| | | */ |
| | | protected string $name; |
| | | |
| | | public function getName():?string |
| | | { |
| | | return $this->name??null; |
| | | } |
| | | public function setName(string $name):void |
| | | { |
| | | $this->name = $name; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\Country; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait nationalityTrait { |
| | | /** |
| | | * @var Country|string The place where the product was assembled. |
| | | */ |
| | | protected Country|string $nationality; |
| | | |
| | | public function getNationality():Country|string|null |
| | | { |
| | | return $this->nationality??null; |
| | | } |
| | | public function setNationality(Country|string $nationality):void |
| | | { |
| | | $this->nationality = $nationality; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ItemList\ItemList; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ListItem; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait negativeNotesTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var ItemList|ListItem|string|array Provides negative considerations regarding something, most typically in pro/con lists for reviews (alongside positiveNotes). For symmetry |
| | | * |
| | | * In the case of a Review, the property describes the itemReviewed from the perspective of the review; in the case of a Product, the product itself is being described. Since product negativeNotess tend to emphasise positive claims, it may be relatively unusual to find negativeNotes used in this way. Nevertheless for the sake of symmetry, negativeNotes can be used on Product. |
| | | * |
| | | * The property values can be expressed either as unstructured text (repeated as necessary), or if ordered, as a list (in which case the most negative is at the beginning of the list). |
| | | */ |
| | | protected ItemList|ListItem|string|array $negativeNotes; |
| | | |
| | | public function getNegativeNotes():ItemList|ListItem|string|array|null |
| | | { |
| | | return $this->negativeNotes??null; |
| | | } |
| | | public function setNegativeNotes(ItemList|ListItem|string|array $negativeNotes):void |
| | | { |
| | | if (is_array($negativeNotes)) { |
| | | $negativeNotes = $this->stringArray('negativeNotes', $negativeNotes); |
| | | } |
| | | $this->negativeNotes = $negativeNotes; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ListItem; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait nextItemTrait { |
| | | /** |
| | | * @var ListItem A link to the ListItem that follows the current one. |
| | | */ |
| | | protected ListItem $nextItem; |
| | | |
| | | public function getNextItem():?ListItem |
| | | { |
| | | return $this->nextItem??null; |
| | | } |
| | | public function setNextItem(ListItem $nextItem):void |
| | | { |
| | | $this->nextItem = $nextItem; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait numberOfEmployeesTrait { |
| | | /** |
| | | * @var QuantitativeValue The number of employees in an organization, e.g. business. |
| | | */ |
| | | protected QuantitativeValue $numberOfEmployees; |
| | | |
| | | public function getNumberOfEmployees():?QuantitativeValue |
| | | { |
| | | return $this->numberOfEmployees??null; |
| | | } |
| | | public function setNumberOfEmployees(QuantitativeValue $numberOfEmployees):void |
| | | { |
| | | $this->numberOfEmployees = $numberOfEmployees; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait numberOfItemsTrait { |
| | | /** |
| | | * @var int The number of items in an ItemList. Note that some numberOfItemss might not fully describe all items in a list (e.g., multi-page pagination); in such cases, the numberOfItems would be for the entire list. |
| | | */ |
| | | protected int $numberOfItems; |
| | | |
| | | public function getNumberOfItems():?int |
| | | { |
| | | return $this->numberOfItems??null; |
| | | } |
| | | public function setNumberOfItems(int $numberOfItems):void |
| | | { |
| | | $this->numberOfItems = $numberOfItems; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\NutritionalInformation; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait nutritionTrait { |
| | | /** |
| | | * @var NutritionalInformation Nutrition information about the recipe or menu item. |
| | | */ |
| | | protected NutritionalInformation $nutrition; |
| | | |
| | | public function getNutrition():?NutritionalInformation |
| | | { |
| | | return $this->nutrition??null; |
| | | } |
| | | public function setNutrition(NutritionalInformation $nutrition):void |
| | | { |
| | | $this->nutrition = $nutrition; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait objectTrait { |
| | | /** |
| | | * @var Thing The object upon which the action is carried out, whose state is kept intact or changed. Also known as the semantic roles patient, affected or undergoer (which change their state) or theme (which doesn't). E.g. John read a book. |
| | | */ |
| | | protected Thing $object; |
| | | |
| | | public function getObject():?Thing |
| | | { |
| | | return $this->object??null; |
| | | } |
| | | public function setObject(Thing $object):void |
| | | { |
| | | $this->object = $object; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\AdministrativeArea; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait occupationLocationTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var AdministrativeArea|array The region/country for which this occupational occupationLocation is appropriate. Note that educational requirements and qualifications can vary between jurisdictions. |
| | | */ |
| | | protected AdministrativeArea|array $occupationLocation; |
| | | |
| | | public function getOccupationLocation():AdministrativeArea|array|null |
| | | { |
| | | return $this->occupationLocation??null; |
| | | } |
| | | public function setOccupationLocation(AdministrativeArea|array $occupationLocation):void |
| | | { |
| | | if (is_array($occupationLocation)) { |
| | | $occupationLocation = $this->classArray('occupationLocation', $occupationLocation, 'JVBase\managers\SEO\render\Thing\Place\AdministrativeArea\AdministrativeArea'); |
| | | } |
| | | $this->occupationLocation = $occupationLocation; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\CategoryCode; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\PhysicalActivityCategory; |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait occupationalCategoryTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var CategoryCode|Thing|string|array A category describing the job, preferably using a term from a taxonomy such as BLS O*NET-SOC, ISCO-08 or similar, with the property repeated for each applicable value. Ideally the taxonomy should be identified, and both the textual label and formal code for the category should be provided. |
| | | * |
| | | * Note: for historical reasons, any textual label and formal code provided as a literal may be assumed to be from O*NET-SOC. |
| | | */ |
| | | protected CategoryCode|Thing|string|array $occupationalCategory; |
| | | |
| | | public function getOccupationalCategory():CategoryCode|Thing|string|array|null |
| | | { |
| | | return $this->occupationalCategory??null; |
| | | } |
| | | public function setOccupationalCategory(CategoryCode|Thing|string|array $occupationalCategory):void |
| | | { |
| | | if (is_array($occupationalCategory)) { |
| | | $occupationalCategory = $this->mixedArray('occupationalCategory', $occupationalCategory, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Thing', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\CategoryCode' |
| | | ]); |
| | | } |
| | | $this->occupationalCategory = $occupationalCategory; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait offerCountTrait { |
| | | /** |
| | | * @var int The number of offers for the product. |
| | | */ |
| | | protected int $offerCount; |
| | | |
| | | public function getOfferCount():?int |
| | | { |
| | | return $this->offerCount??null; |
| | | } |
| | | public function setOfferCount(int $offerCount):void |
| | | { |
| | | $this->offerCount = $offerCount; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait offeredByTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Person|Organization|array A pointer to the organization or person making the offer. |
| | | * Inverse property: makesOffer |
| | | */ |
| | | protected Person|Organization|array $offeredBy; |
| | | |
| | | public function getOfferedBy():Person|Organization|array|null |
| | | { |
| | | return $this->offeredBy??null; |
| | | } |
| | | public function setOfferedBy(Person|Organization|array $offeredBy):void |
| | | { |
| | | if (is_array($offeredBy)) { |
| | | $offeredBy = $this->mixedArray('offeredBy', $offeredBy,[ |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->offeredBy = $offeredBy; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Demand; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Offer; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait offersTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Demand|Offer|array An offer to provide this item—for example, an offer to sell a product, rent the DVD of a movie, perform a service, or give away tickets to an event. Use businessFunction to indicate the kind of transaction offered, i.e. sell, lease, etc. This property can also be used to describe a Demand. While this property is listed as expected on a number of common types, it can be used in others. In that case, using a second type, such as Product or a subtype of Product, can clarify the nature of the offer. |
| | | * Inverse property: itemOffered |
| | | */ |
| | | protected Demand|Offer|array $offers; |
| | | |
| | | public function getOffers():Demand|Offer|array|null |
| | | { |
| | | return $this->offers??null; |
| | | } |
| | | public function setOffers(Demand|Offer|array $offers):void |
| | | { |
| | | if (is_array($offers)) { |
| | | $offers = $this->mixedArray('offers', $offers,[ |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\Demand', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\Offer' |
| | | ]); |
| | | } |
| | | $this->offers = $offers; |
| | | } |
| | | public function getOpeningHoursFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'repeater', |
| | | 'label' => 'Opening Hours', |
| | | 'fields' => [ |
| | | 'dayOfWeek' => [ |
| | | 'type' => 'radio', |
| | | 'label' => 'Day(s) of Week', |
| | | 'options' => [ |
| | | 'Mo' => 'Monday', |
| | | 'Tu' => 'Tuesday', |
| | | 'We' => 'Wednesday', |
| | | 'Th' => 'Thursday', |
| | | 'Fr' => 'Friday', |
| | | 'Sa' => 'Saturday', |
| | | 'Su' => 'Sunday' |
| | | ] |
| | | ], |
| | | 'opens' => [ |
| | | 'type' => 'time', |
| | | 'label' => 'Opens At', |
| | | ], |
| | | 'closes' => [ |
| | | 'type' => 'time', |
| | | 'label' => 'Closes At', |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\OpeningHoursSpecification; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait openingHoursSpecificationTrait { |
| | | /** |
| | | * @var OpeningHoursSpecification The opening hours of a certain place. |
| | | */ |
| | | protected OpeningHoursSpecification $openingHoursSpecification; |
| | | |
| | | public function getOpeningHoursSpecification():?OpeningHoursSpecification |
| | | { |
| | | return $this->openingHoursSpecification??null; |
| | | } |
| | | public function setOpeningHoursSpecification(OpeningHoursSpecification $openingHoursSpecification):void |
| | | { |
| | | $this->openingHoursSpecification = $openingHoursSpecification; |
| | | } |
| | | |
| | | public function getOpeningHoursSpecificationFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'repeater', |
| | | 'label' => 'Opening Hours', |
| | | 'fields' => [ |
| | | 'dayOfWeek' => [ |
| | | 'type' => 'radio', |
| | | 'label' => 'Day(s) of Week', |
| | | 'options' => [ |
| | | 'Mo' => 'Monday', |
| | | 'Tu' => 'Tuesday', |
| | | 'We' => 'Wednesday', |
| | | 'Th' => 'Thursday', |
| | | 'Fr' => 'Friday', |
| | | 'Sa' => 'Saturday', |
| | | 'Su' => 'Sunday' |
| | | ] |
| | | ], |
| | | 'opens' => [ |
| | | 'type' => 'time', |
| | | 'label' => 'Opens At', |
| | | ], |
| | | 'closes' => [ |
| | | 'type' => 'time', |
| | | 'label' => 'Closes At', |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait openingHoursTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var array|string The general opening hours for a business. Opening hours can be specified as a weekly time range, starting with days, then times per day. Multiple days can be listed with commas ',' separating each day. Day or time ranges are specified using a hyphen '-'. |
| | | * |
| | | * Days are specified using the following two-letter combinations: Mo, Tu, We, Th, Fr, Sa, Su. |
| | | * Times are specified using 24:00 format. For example, 3pm is specified as 15:00, 10am as 10:00. |
| | | * Here is an example: <time itemprop="openingHours" datetime="Tu,Th 16:00-20:00">Tuesdays and Thursdays 4-8pm</time>. |
| | | * If a business is open 7 days a week, then it can be specified as <time itemprop="openingHours" datetime="Mo-Su">Monday through Sunday, all day</time>. |
| | | */ |
| | | protected array|string $openingHours; |
| | | |
| | | public function getOpeningHours():array|string|null |
| | | { |
| | | return $this->openingHours??null; |
| | | } |
| | | public function setOpeningHours(array|string $openingHours):void |
| | | { |
| | | if (is_array($openingHours)) { |
| | | $openingHours = $this->stringArray('openingHours', $openingHours); |
| | | } |
| | | $this->openingHours = $openingHours; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Time; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait opensTrait { |
| | | /** |
| | | * @var Time The opening hour of the place or service on the given day(s) of the week |
| | | */ |
| | | protected Time $opens; |
| | | |
| | | public function getOpens():?Time |
| | | { |
| | | return $this->opens??null; |
| | | } |
| | | public function setOpens(Time $opens):void |
| | | { |
| | | $this->opens = $opens; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait organizerTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array An organizer of an Event. |
| | | */ |
| | | protected Organization|Person|array $organizer; |
| | | |
| | | public function getOrganizer():Organization|Person|array|null |
| | | { |
| | | return $this->organizer??null; |
| | | } |
| | | public function setOrganizer(Organization|Person|array $organizer):void |
| | | { |
| | | if (is_array($organizer)) { |
| | | $organizer = $this->mixedArray('organizer', $organizer, [ |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->organizer = $organizer; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait ownerTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|string|array A person or organization who owns this Thing. |
| | | * Inverse property: owns |
| | | */ |
| | | protected Organization|Person|string|array $owner; |
| | | |
| | | public function getOwner():Organization|Person|array|string|null |
| | | { |
| | | return $this->owner??null; |
| | | } |
| | | public function setOwner(Organization|Person|array|string $owner):void |
| | | { |
| | | if (is_array($owner)) { |
| | | $owner = $this->mixedArray('owner', $owner, ['JVBase\managers\SEO\render\Thing\Organization\Organization','JVBase\managers\SEO\render\Thing\Person\Person','string']); |
| | | if (empty($owner)){ |
| | | return; |
| | | } |
| | | } |
| | | $this->owner = $owner; |
| | | } |
| | | |
| | | public function getOwnerFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'repeater', |
| | | 'label' => 'Owner', |
| | | 'hint' => 'A person or Organization that owns this Thing.', |
| | | 'fields' => [ |
| | | 'name' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Name', |
| | | ], |
| | | 'url' => [ |
| | | 'type' => 'url', |
| | | 'label' => 'URL' |
| | | ], |
| | | 'email' => [ |
| | | 'type' => 'email', |
| | | 'label' => 'Email' |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\WebPage\AboutPage; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait ownershipFundInfoTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var AboutPage|CreativeWork|string|array A ownershipFundingInfo of the item |
| | | */ |
| | | protected AboutPage|CreativeWork|string|array $ownershipFundingInfo; |
| | | |
| | | public function getOwnershipFundingInfo():AboutPage|CreativeWork|string|array|null |
| | | { |
| | | return $this->ownershipFundingInfo??null; |
| | | } |
| | | public function setOwnershipFundingInfo(AboutPage|CreativeWork|string|array $ownershipFundingInfo):void |
| | | { |
| | | if (is_array($ownershipFundingInfo)) { |
| | | $ownershipFundingInfo = $this->mixedArray('ownershipFundingInfo', $ownershipFundingInfo, [ |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\WebPage\AboutPage' |
| | | ]); |
| | | } |
| | | $this->ownershipFundingInfo = $ownershipFundingInfo; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait ownsTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Thing|array Things owned by the organization or person. |
| | | * Inverse property: owner |
| | | */ |
| | | protected Thing|array $owns; |
| | | |
| | | public function getOwns():Thing|array|null |
| | | { |
| | | return $this->owns??null; |
| | | } |
| | | public function setOwns(Thing|array $owns):void |
| | | { |
| | | if (is_array($owns)) { |
| | | $owns = $this->classArray('owns', $owns, 'JVBase\managers\SEO\render\Thing\Thing'); |
| | | } |
| | | $this->owns = $owns; |
| | | } |
| | | |
| | | public function getOwnsFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'group', |
| | | 'wrap' => 'details', |
| | | 'label' => 'Owns', |
| | | 'fields' => [ |
| | | 'name' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Name of Thing.' |
| | | ], |
| | | 'url' => [ |
| | | 'type' => 'url', |
| | | 'label' => 'URL of where to find Thing.' |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait parentOrganizationTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|array The larger organization that this organization is a subOrganization of, if any. Supersedes branchOf. |
| | | * Inverse property: subOrganization |
| | | */ |
| | | protected Organization|array $parentOrganization; |
| | | |
| | | public function getParentOrganization():Organization|array|null |
| | | { |
| | | return $this->parentOrganization??null; |
| | | } |
| | | public function setParentOrganization(Organization|array $parentOrganization):void |
| | | { |
| | | if (is_array($this->parentOrganization)) { |
| | | $parentOrganization = $this->classArray('parentOrganization', $parentOrganization, 'JVBase\managers\SEO\render\Thing\Organization\Organization'); |
| | | } |
| | | $this->parentOrganization = $parentOrganization; |
| | | } |
| | | |
| | | public function getParentOrganizationFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'group', |
| | | 'wrap' => 'details', |
| | | 'label' => 'Parent Organization', |
| | | 'fields' => [ |
| | | 'name' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Name of Thing.' |
| | | ], |
| | | 'url' => [ |
| | | 'type' => 'url', |
| | | 'label' => 'URL of where to find Thing.' |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait parentTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Person|string|array A parent of this person. Supersedes parents. |
| | | */ |
| | | protected Person|string|array $parent; |
| | | |
| | | public function getParent():Person|string|array|null |
| | | { |
| | | return $this->parent??null; |
| | | } |
| | | public function setParent(Person|string|array $parent):void |
| | | { |
| | | if (is_array($parent)) { |
| | | $parent = $this->mixedArray('parent', $parent, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->parent = $parent; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait participantTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|string|array A person or organization who owns this Thing. |
| | | * Inverse property: owns |
| | | */ |
| | | protected Organization|Person|string|array $participant; |
| | | |
| | | public function getParticipant():Organization|Person|array|string|null |
| | | { |
| | | return $this->participant??null; |
| | | } |
| | | public function setParticipant(Organization|Person|array|string $participant):void |
| | | { |
| | | if (is_array($participant)) { |
| | | $participant = $this->mixedArray('participant', $participant, ['JVBase\managers\SEO\render\Thing\Organization\Organization','JVBase\managers\SEO\render\Thing\Person\Person','string']); |
| | | if (empty($participant)){ |
| | | return; |
| | | } |
| | | } |
| | | $this->participant = $participant; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait partySizeTrait { |
| | | /** |
| | | * @var int Number of people the reservation should accommodate. |
| | | */ |
| | | protected int $partySize; |
| | | |
| | | public function getPartySize():?int |
| | | { |
| | | return $this->partySize??null; |
| | | } |
| | | public function setPartySize(int $partySize):void |
| | | { |
| | | $this->partySize = $partySize; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait patternTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var DefinedTerm|string|array A pattern that something has, for example 'polka dot', 'striped', 'Canadian flag'. Values are typically expressed as text, although links to controlled value schemes are also supported. |
| | | */ |
| | | protected DefinedTerm|string|array $pattern; |
| | | |
| | | public function getPattern():DefinedTerm|string|array|null |
| | | { |
| | | return $this->pattern??null; |
| | | } |
| | | public function setPattern(DefinedTerm|string|array $pattern):void |
| | | { |
| | | if (is_array($pattern)) { |
| | | $pattern = $this->mixedArray('pattern', $pattern, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm' |
| | | ]); |
| | | } |
| | | $this->pattern = $pattern; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait paymentAcceptedTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var array|string Cash, Credit Card, Cryptocurrency, Local Exchange Tradings System, etc. |
| | | */ |
| | | protected array|string $paymentAccepted; |
| | | |
| | | public function getPaymentAccepted():array|string|null |
| | | { |
| | | return $this->paymentAccepted??null; |
| | | } |
| | | public function setPaymentAccepted(array|string $paymentAccepted):void |
| | | { |
| | | if (is_array($paymentAccepted)) { |
| | | $paymentAccepted = $this->stringArray('paymentAccepted', $paymentAccepted); |
| | | } |
| | | $this->paymentAccepted = $paymentAccepted; |
| | | } |
| | | |
| | | public function getPaymentAcceptedFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'string', |
| | | 'label' => 'Payment Accepted', |
| | | 'hint' => 'A comma separated list of payment accepted, example: Cash, Credit Card, Cryptocurrency, Local Exchange Tradings System, etc.' |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait paymentMethodTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var array|string The payment method(s) that are accepted in general by an organization, or for some specific demand or offer. |
| | | */ |
| | | protected array|string $paymentMethod; |
| | | |
| | | protected array $mappedMethods = [ |
| | | 'banktransfer' => 'http://purl.org/goodrelations/v1#ByBankTransferInAdvance', |
| | | 'invoice' => 'http://purl.org/goodrelations/v1#ByInvoice', |
| | | 'cash' => 'http://purl.org/goodrelations/v1#Cash', |
| | | 'check' => 'http://purl.org/goodrelations/v1#CheckInAdvance', |
| | | 'cod' => 'http://purl.org/goodrelations/v1#COD', |
| | | 'directdebit' => 'http://purl.org/goodrelations/v1#DirectDebit', |
| | | 'google' => 'http://purl.org/goodrelations/v1#GoogleCheckout', |
| | | 'paypal' => 'http://purl.org/goodrelations/v1#PayPal', |
| | | 'payswarm' => 'http://purl.org/goodrelations/v1#PaySwarm', |
| | | 'amex' => 'http://purl.org/goodrelations/v1#AmericanExpress', |
| | | 'dinersclub' => 'http://purl.org/goodrelations/v1#DinersClub', |
| | | 'discover' => 'http://purl.org/goodrelations/v1#Discover', |
| | | 'mastercard' => 'http://purl.org/goodrelations/v1#MasterCard', |
| | | 'visa' => 'http://purl.org/goodrelations/v1#VISA', |
| | | 'jcb' => 'http://purl.org/goodrelations/v1#JCB' |
| | | ]; |
| | | |
| | | public function getPaymentMethod():array|string|null |
| | | { |
| | | return $this->paymentMethod??null; |
| | | } |
| | | public function setPaymentMethod(array|string $paymentMethod):void |
| | | { |
| | | if (!is_array($paymentMethod)) { |
| | | $paymentMethod = [$paymentMethod]; |
| | | } |
| | | $paymentMethod = $this->testAllowed('paymentMethod', $this->mappedMethods, $paymentMethod); |
| | | if (empty($paymentMethod)) { |
| | | return; |
| | | } |
| | | if (count($paymentMethod) === 1) { |
| | | $paymentMethod = $paymentMethod[0]; |
| | | } |
| | | $this->paymentMethod = $paymentMethod; |
| | | } |
| | | |
| | | public function formatPaymentMethod():array|null |
| | | { |
| | | if (!isset($this->paymentMethod)) { |
| | | return null; |
| | | } |
| | | if (is_array($this->paymentMethod)) { |
| | | return array_map(function($method) { |
| | | return ['@id' => $method]; |
| | | }, $this->paymentMethod); |
| | | } else { |
| | | return ['@id' => $this->paymentMethod]; |
| | | } |
| | | } |
| | | |
| | | public function getPaymentMethodFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'checkbox', |
| | | 'label' => 'Payment Methods', |
| | | 'options' => array_keys($this->mappedMethods) |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Quantity\Duration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait performTimeTrait { |
| | | /** |
| | | * @var Duration The length of time it takes to perform instructions or a direction (not including time to prepare the supplies), in ISO 8601 duration format. |
| | | */ |
| | | protected Duration $performTime; |
| | | |
| | | public function getPerformTime():?Duration |
| | | { |
| | | return $this->performTime??null; |
| | | } |
| | | public function setPerformTime(Duration $performTime):void |
| | | { |
| | | $this->performTime = $performTime; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Event\Event; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait performerInTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Event|array Event(s) that this person is a performer or participant in. |
| | | */ |
| | | protected Event|array $performerIn; |
| | | |
| | | public function getPerformerIn():Event|array|null |
| | | { |
| | | return $this->performerIn??null; |
| | | } |
| | | public function setPerformerIn(Event|array $performerIn):void |
| | | { |
| | | if (is_array($performerIn)) { |
| | | $performerIn = $this->classArray('performerIn', $performerIn, 'JVBase\managers\SEO\render\Thing\Event\Event'); |
| | | } |
| | | $this->performerIn = $performerIn; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait performerTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array A performer at the event—for example, a presenter, musician, musical group or actor. Supersedes performers. |
| | | */ |
| | | protected Organization|Person|array $performer; |
| | | |
| | | public function getPerformer():Organization|Person|array|null |
| | | { |
| | | return $this->performer??null; |
| | | } |
| | | public function setPerformer(Organization|Person|array $performer):void |
| | | { |
| | | $this->performer = $performer; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\MediaObject\ImageObject; |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\Photograph; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait photoTrait { |
| | | /** |
| | | * @var ImageObject|Photograph A photograph of this place. Supersedes photos. |
| | | */ |
| | | protected ImageObject|Photograph $photo; |
| | | |
| | | public function getPhoto():ImageObject|Photograph|null |
| | | { |
| | | return $this->photo??null; |
| | | } |
| | | public function setPhoto(ImageObject|Photograph $photo):void |
| | | { |
| | | $this->photo = $photo; |
| | | } |
| | | |
| | | public function getPhotoFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'upload', |
| | | 'multiple' => false, |
| | | 'label' => 'Photo', |
| | | 'hint' => 'A photograph of this place.' |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait polygonTrait { |
| | | /** |
| | | * @var string A polygon is the area enclosed by a point-to-point path for which the starting and ending points are the same. A polygon is expressed as a series of four or more space delimited points where the first and final points are identical. |
| | | */ |
| | | protected string $polygon; |
| | | |
| | | public function getPolygon():?string |
| | | { |
| | | return $this->polygon??null; |
| | | } |
| | | public function setPolygon(string $polygon):void |
| | | { |
| | | $this->polygon = $polygon; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait positionTrait { |
| | | /** |
| | | * @var int|string The position of an item in a series or sequence of items. |
| | | */ |
| | | protected int|string $position; |
| | | |
| | | public function getPosition():int|string|null |
| | | { |
| | | return $this->position??null; |
| | | } |
| | | public function setPosition(int|string $position):void |
| | | { |
| | | $this->position = $position; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ItemList\ItemList; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ListItem; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait positiveNotesTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var ItemList|ListItem|string|array Provides positive considerations regarding something, most typically in pro/con lists for reviews (alongside positiveNotes). For symmetry |
| | | * |
| | | * In the case of a Review, the property describes the itemReviewed from the perspective of the review; in the case of a Product, the product itself is being described. Since product positiveNotess tend to emphasise positive claims, it may be relatively unusual to find positiveNotes used in this way. Nevertheless for the sake of symmetry, positiveNotes can be used on Product. |
| | | * |
| | | * The property values can be expressed either as unstructured text (repeated as necessary), or if ordered, as a list (in which case the most positive is at the beginning of the list). |
| | | */ |
| | | protected ItemList|ListItem|string|array $positiveNotes; |
| | | |
| | | public function getPositiveNotes():ItemList|ListItem|string|array|null |
| | | { |
| | | return $this->positiveNotes??null; |
| | | } |
| | | public function setPositiveNotes(ItemList|ListItem|string|array $positiveNotes):void |
| | | { |
| | | if (is_array($positiveNotes)) { |
| | | $positiveNotes = $this->stringArray('positiveNotes', $positiveNotes); |
| | | } |
| | | $this->positiveNotes = $positiveNotes; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait postOfficeBoxNumberTrait { |
| | | /** |
| | | * @var string The post office box number for PO box addresses. |
| | | */ |
| | | protected string $postOfficeBoxNumber; |
| | | |
| | | public function getPostOfficeBoxNumber():?string |
| | | { |
| | | return $this->postOfficeBoxNumber??null; |
| | | } |
| | | public function setPostOfficeBoxNumber(string $postOfficeBoxNumber):void |
| | | { |
| | | $this->postOfficeBoxNumber = $postOfficeBoxNumber; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ContactPoint\PostalAddress; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait postalAddressTrait { |
| | | /** |
| | | * @var PostalAddress|string Physical address of the item. |
| | | */ |
| | | protected PostalAddress|string $postalAddress; |
| | | |
| | | public function getPostalAddress():PostalAddress|string|null |
| | | { |
| | | return $this->postalAddress??null; |
| | | } |
| | | public function setPostalAddress(PostalAddress|string $postalAddress):void |
| | | { |
| | | $this->postalAddress = $postalAddress; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait postalCodeTrait { |
| | | /** |
| | | * @var string The postal code. For example, 94043. |
| | | */ |
| | | protected string $postalCode; |
| | | |
| | | public function getPostalCode():?string |
| | | { |
| | | return $this->postalCode??null; |
| | | } |
| | | public function setPostalCode(string $postalCode):void |
| | | { |
| | | $this->postalCode = $postalCode; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Action; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait potentialActionTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Action|array Indicates a potential Action, which describes an idealized action in which this thing would play an 'object' role. |
| | | */ |
| | | protected Action|array $potentialAction; |
| | | |
| | | public function getPotentialAction():Action|array|null |
| | | { |
| | | return $this->potentialAction??null; |
| | | } |
| | | public function setPotentialAction(Action|array $potentialAction):void |
| | | { |
| | | if (is_array($potentialAction)) { |
| | | $potentialAction = $this->classArray('potentialAction', $potentialAction, 'JVBase\managers\SEO\render\Thing\Action'); |
| | | if (empty($potentialAction)) { |
| | | return; |
| | | } |
| | | } |
| | | $this->potentialAction = $potentialAction; |
| | | } |
| | | |
| | | public function getPotentialActionFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'repeater', |
| | | 'label' => 'Potential Action', |
| | | 'fields' => [ |
| | | 'type' => [ |
| | | 'type' => 'select', |
| | | 'label' => 'Action Type', |
| | | 'options' => [ |
| | | 'AchieveAction' => 'Achieve Action', |
| | | 'LoseAction' => ' - Lose Action', |
| | | 'TieAction' => ' - Tie Action', |
| | | 'WinAction' => ' - Win Action', |
| | | 'AssessAction' => 'Assess Action', |
| | | 'ChooseAction' => ' - Choose Action', |
| | | 'IgnoreAction' => ' - Ignore Action', |
| | | 'ReactAction' => ' - React Action', |
| | | 'ReviewAction' => ' - Review Action', |
| | | 'ConsumeAction' => 'Consume Action', |
| | | 'DrinkAction' => ' - Drink Action', |
| | | 'EatAction' => ' - Eat Action', |
| | | 'InstallAction' => ' - Install Action', |
| | | 'ListenAction' => ' - Listen Action', |
| | | 'PlayGameAction' => ' - PlayGame Action', |
| | | 'ReadAction' => ' - Read Action', |
| | | 'UseAction' => ' - Use Action', |
| | | 'ViewAction' => ' - View Action', |
| | | 'WatchAction' => ' - Watch Action', |
| | | 'ControlAction' => 'Control Action', |
| | | 'ActivateAction' => ' - Activate Action', |
| | | 'AuthenticateAction' => ' - Authenticate Action', |
| | | 'DeactivateAction' => ' - Deactivate Action', |
| | | 'LoginAction' => ' - Login Action', |
| | | 'ResetPasswordAction' => ' - ResetPassword Action', |
| | | 'ResumeAction' => ' - Resume Action', |
| | | 'SuspendAction' => ' - Suspend Action', |
| | | 'CreateAction' => 'Create Action', |
| | | 'CookAction' => ' - Cook Action', |
| | | 'DrawAction' => ' - Draw Action', |
| | | 'FilmAction' => ' - Film Action', |
| | | 'PaintAction' => ' - Paint Action', |
| | | 'PhotographAction' => ' - Photograph Action', |
| | | 'WriteAction' => ' - Write Action', |
| | | 'FindAction' => 'Find Action', |
| | | 'CheckAction' => ' - Check Action', |
| | | 'DiscoverAction' => ' - Discover Action', |
| | | 'TrackAction' => ' - Track Action', |
| | | 'InteractAction'=> 'Interact Action', |
| | | 'BefriendAction'=> ' - Befriend Action', |
| | | 'CommunicateAction'=> ' - Communicate Action', |
| | | 'Follow Action'=> ' - Follow Action', |
| | | 'JoinAction'=> ' - Join Action', |
| | | 'LeaveAction'=> ' - Leave Action', |
| | | 'MarryAction'=> ' - Marry Action', |
| | | 'RegisterAction'=> ' - Register Action', |
| | | 'SubscribeAction'=> ' - Subscribe Action', |
| | | 'UnRegisterAction'=> ' - Unregister Action', |
| | | 'MoveAction' => 'Move Action', |
| | | 'ArriveAction' => ' - Arrive Action', |
| | | 'DepartAction' => ' - Depart Action', |
| | | 'TravelAction' => ' - Travel Action', |
| | | 'OrganizeAction'=> 'Organize Action', |
| | | 'AllocateAction'=> ' - Allocate Action', |
| | | 'ApplyAction'=> ' - Apply Action', |
| | | 'BookmarkAction'=> ' - Bookmark Action', |
| | | 'PlanAction'=> ' - Plan Action', |
| | | 'PlayAction' => 'Play Action', |
| | | 'ExerciseAction' => ' - Exercise Action', |
| | | 'PerformAction' => ' - Perform Action', |
| | | 'SearchAction' => 'Search Action', |
| | | 'SeekToAction' => 'Seek To Action', |
| | | 'TradeAction' => 'Trade Action', |
| | | 'BuyAction' => ' - Buy Action', |
| | | 'OrderAction' => ' - Order Action', |
| | | 'PayAction' => ' - Pay Action', |
| | | 'PreOrderAction' => ' - PreOrder Action', |
| | | 'QuoteAction' => ' - Quote Action', |
| | | 'RentAction' => ' - Rent Action', |
| | | 'SellAction' => ' - Sell Action', |
| | | 'TipAction' => ' - Tip Action', |
| | | 'TransferAction'=> 'Transfer Action', |
| | | 'BorrowAction'=> ' - Borrow Action', |
| | | 'DonateAction'=> ' - Donate Action', |
| | | 'DownloadAction'=> ' - Download Action', |
| | | 'GiveAction'=> ' - Give Action', |
| | | 'LendAction'=> ' - Lend Action', |
| | | 'MoneyAction'=> ' - Money Transfer', |
| | | 'ReceiveAction'=> ' - Receive Action', |
| | | 'ReturnAction'=> ' - Return Action', |
| | | 'SendAction'=> ' - Send Action', |
| | | 'TakeAction'=> ' - Take Action', |
| | | 'UpdateAction' => 'Update Action', |
| | | 'AddAction' => ' - Add Action', |
| | | 'DeleteAction' => ' - Delete Action', |
| | | 'ReplaceAction' => ' - Replace Action', |
| | | ] |
| | | ], |
| | | 'name' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Name', |
| | | 'required' => true, |
| | | 'hint' => 'Example: "Search", "Contact Us"' |
| | | ], |
| | | 'target' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Target', |
| | | 'required' => true, |
| | | 'hint' => 'The URL where this action takes place.' |
| | | ], |
| | | 'description' => [ |
| | | 'type' => 'textarea', |
| | | 'label' => 'Description', |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Product\ProductModel; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait predecessorOfTrait { |
| | | /** |
| | | * @var ProductModel A pointer from a previous, often discontinued variant of the product to its newer variant. |
| | | */ |
| | | protected ProductModel $predecessorOf; |
| | | |
| | | public function getPredecessorOf():?ProductModel |
| | | { |
| | | return $this->predecessorOf??null; |
| | | } |
| | | public function setPredecessorOf(ProductModel $predecessorOf):void |
| | | { |
| | | $this->predecessorOf = $predecessorOf; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Quantity\Duration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait prepTimeTrait { |
| | | /** |
| | | * @var Duration The length of time it takes to prepare the items to be used in instructions or a direction, in ISO 8601 duration format. |
| | | */ |
| | | protected Duration $prepTime; |
| | | |
| | | public function getPrepTime():?Duration |
| | | { |
| | | return $this->prepTime??null; |
| | | } |
| | | public function setPrepTime(Duration $prepTime):void |
| | | { |
| | | $this->prepTime = $prepTime; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ListItem; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait previousItemTrait { |
| | | /** |
| | | * @var ListItem A link to the ListItem that precedes the current one. |
| | | */ |
| | | protected ListItem $previousItem; |
| | | |
| | | public function getPreviousItem():?ListItem |
| | | { |
| | | return $this->previousItem??null; |
| | | } |
| | | public function setPreviousItem(ListItem $previousItem):void |
| | | { |
| | | $this->previousItem = $previousItem; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait previousStartDateTrait { |
| | | /** |
| | | * @var Date Used in conjunction with eventStatus for rescheduled or cancelled events. This property contains the previously scheduled start date. For rescheduled events, the startDate property should be used for the newly scheduled start date. In the (rare) case of an event that has been postponed and rescheduled multiple times, this field may be repeated. |
| | | */ |
| | | protected Date $previousStartDate; |
| | | |
| | | public function getPreviousStartDate():?Date |
| | | { |
| | | return $this->previousStartDate??null; |
| | | } |
| | | public function setPreviousStartDate(Date $previousStartDate):void |
| | | { |
| | | $this->previousStartDate = $previousStartDate; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait priceCurrencyTrait { |
| | | /** |
| | | * @var string The currency of the price, or a price component when attached to PriceSpecification and its subtypes. |
| | | * |
| | | * Use standard formats: ISO 4217 currency format, e.g. "USD"; Ticker symbol for cryptocurrencies, e.g. "BTC"; well known names for Local Exchange Trading Systems (LETS) and other currency types, e.g. "Ithaca HOUR". |
| | | */ |
| | | protected string $priceCurrency; |
| | | |
| | | public function getPriceCurrency():?string |
| | | { |
| | | return $this->priceCurrency??null; |
| | | } |
| | | public function setPriceCurrency(string $priceCurrency):void |
| | | { |
| | | $this->priceCurrency = $priceCurrency; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait priceRangeTrait { |
| | | /** |
| | | * @var string The price range of the business, for example $$$. |
| | | */ |
| | | protected string $priceRange; |
| | | |
| | | public function getPriceRange():?string |
| | | { |
| | | return $this->priceRange??null; |
| | | } |
| | | public function setPriceRange(string $priceRange):void |
| | | { |
| | | $this->priceRange = $priceRange; |
| | | } |
| | | |
| | | public function getPriceRangeFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'text', |
| | | 'label' => 'Price Range', |
| | | 'hint' => '$ - $$$$, in comparison to similar products or services in the industry' |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\PriceSpecification; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait priceSpecificationTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var PriceSpecification|array One or more detailed price specifications, indicating the unit price and delivery or payment charges. |
| | | */ |
| | | protected PriceSpecification|array $priceSpecification; |
| | | |
| | | public function getPriceSpecification():PriceSpecification|array|null |
| | | { |
| | | return $this->priceSpecification??null; |
| | | } |
| | | public function setPriceSpecification(PriceSpecification|array $priceSpecification):void |
| | | { |
| | | if (is_array($priceSpecification)) { |
| | | $priceSpecification = $this->classArray('priceSpecification', $priceSpecification, 'JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\PriceSpecification'); |
| | | } |
| | | $this->priceSpecification = $priceSpecification; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait priceTrait { |
| | | /** |
| | | * @var int|float|string The offer price of a product, or of a price component when attached to PriceSpecification and its subtypes. |
| | | * |
| | | * Usage guidelines: |
| | | * |
| | | * Use the priceCurrency property (with standard formats: ISO 4217 currency format, e.g. "USD"; Ticker symbol for cryptocurrencies, e.g. "BTC"; well known names for Local Exchange Trading Systems (LETS) and other currency types, e.g. "Ithaca HOUR") instead of including ambiguous symbols such as '$' in the value. |
| | | * Use '.' (Unicode 'FULL STOP' (U+002E)) rather than ',' to indicate a decimal point. Avoid using these symbols as a readability separator. |
| | | * Note that both RDFa and Microdata syntax allow the use of a "content=" attribute for publishing simple machine-readable values alongside more human-friendly formatting. |
| | | * Use values from 0123456789 (Unicode 'DIGIT ZERO' (U+0030) to 'DIGIT NINE' (U+0039)) rather than superficially similar Unicode symbols. |
| | | */ |
| | | protected int|float|string $price; |
| | | |
| | | public function getPrice():int|float|string|null |
| | | { |
| | | return $this->price??null; |
| | | } |
| | | public function setPrice(int|float|string $price):void |
| | | { |
| | | $this->price = $price; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait priceValidUntilTrait { |
| | | /** |
| | | * @var Date The date after which the price is no longer available. |
| | | */ |
| | | protected Date $priceValidUntil; |
| | | |
| | | public function getPriceValidUntil():?Date |
| | | { |
| | | return $this->priceValidUntil??null; |
| | | } |
| | | public function setPriceValidUntil(Date $priceValidUntil):void |
| | | { |
| | | $this->priceValidUntil = $priceValidUntil; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\MediaObject\ImageObject; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait primaryImageOfPageTrait { |
| | | /** |
| | | * @var ImageObject Indicates the main image on the page. |
| | | */ |
| | | protected ImageObject $primaryImageOfPage; |
| | | |
| | | public function getPrimaryImageOfPage():?ImageObject |
| | | { |
| | | return $this->primaryImageOfPage??null; |
| | | } |
| | | public function setPrimaryImageOfPage(ImageObject $primaryImageOfPage):void |
| | | { |
| | | $this->primaryImageOfPage = $primaryImageOfPage; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Quantity\Duration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait processingTimeTrait { |
| | | /** |
| | | * @var Duration Estimated processing time for the service using this channel. |
| | | */ |
| | | protected Duration $processingTime; |
| | | |
| | | public function getProcessingTime():?Duration |
| | | { |
| | | return $this->processingTime??null; |
| | | } |
| | | public function setProcessingTime(Duration $processingTime):void |
| | | { |
| | | $this->processingTime = $processingTime; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait producerTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array The person or organization who produced the work (e.g. music album, movie, TV/radio series etc.). |
| | | */ |
| | | protected Organization|Person|array $producer; |
| | | |
| | | public function getProducer():Organization|Person|array|null |
| | | { |
| | | return $this->producer??null; |
| | | } |
| | | public function setProducer(Organization|Person|array $producer):void |
| | | { |
| | | if (is_array($producer)) { |
| | | $producer = $this->mixedArray('producer', $producer, [ |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->producer = $producer; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait productGroupIDTrait { |
| | | /** |
| | | * @var string Indicates a textual identifier for a ProductGroup. |
| | | */ |
| | | protected string $productGroupID; |
| | | |
| | | public function getProductGroupID():?string |
| | | { |
| | | return $this->productGroupID??null; |
| | | } |
| | | public function setProductGroupID(string $productGroupID):void |
| | | { |
| | | $this->productGroupID = $productGroupID; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait productIDTrait { |
| | | /** |
| | | * @var string The product identifier, such as ISBN. For example: meta itemprop="productID" content="isbn:123-456-789". |
| | | */ |
| | | protected string $productID; |
| | | |
| | | public function getProductID():?string |
| | | { |
| | | return $this->productID??null; |
| | | } |
| | | public function setProductID(string $productID):void |
| | | { |
| | | $this->productID = $productID; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Product\Product; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait productSupportedTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Product|string|array The product or service this support contact point is related to (such as product support for a particular product line). This can be a specific product or product line (e.g. "iPhone") or a general category of products or services (e.g. "smartphones"). |
| | | */ |
| | | protected Product|string|array $productSupported; |
| | | |
| | | public function getProductSupported():Product|string|array|null |
| | | { |
| | | return $this->productSupported??null; |
| | | } |
| | | public function setProductSupported(Product|string|array $productSupported):void |
| | | { |
| | | if (is_array($productSupported)) { |
| | | $productSupported = $this->mixedArray('productSupported', $productSupported, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Product\Product' |
| | | ]); |
| | | } |
| | | $this->productSupported = $productSupported; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\DefinedTerm; |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\StructuredValue; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait pronounsTrait { |
| | | /** |
| | | * @var DefinedTerm|StructuredValue|string A short string listing or describing pronouns for a person. Typically the person concerned is the best authority as pronouns are a critical part of personal identity and expression. Publishers and consumers of this information are reminded to treat this data responsibly, take country-specific laws related to gender expression into account, and be wary of out-of-date data and drawing unwarranted inferences about the person being described. |
| | | * |
| | | * In English, formulations such as "they/them", "she/her", and "he/him" are commonly used online and can also be used here. We do not intend to enumerate all possible micro-syntaxes in all languages. More structured and well-defined external values for pronouns can be referenced using the StructuredValue or DefinedTerm values. |
| | | */ |
| | | protected DefinedTerm|StructuredValue|string $pronouns; |
| | | |
| | | public function getPronouns():DefinedTerm|StructuredValue|string|null |
| | | { |
| | | return $this->pronouns??null; |
| | | } |
| | | public function setPronouns(DefinedTerm|StructuredValue|string $pronouns):void |
| | | { |
| | | $this->pronouns = $pronouns; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait propertyIDTrait { |
| | | /** |
| | | * @var string A commonly used identifier for the characteristic represented by the property, e.g. a manufacturer or a standard code for a property. |
| | | * For our use case, the @id of a defined item elsewhere on this site |
| | | */ |
| | | protected string $propertyID; |
| | | |
| | | public function getPropertyID():?string |
| | | { |
| | | return $this->propertyID??null; |
| | | } |
| | | public function setPropertyID(string $propertyID):void |
| | | { |
| | | $this->propertyID = $propertyID; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait proteinContentTrait { |
| | | /** |
| | | * @var int|float The number of proteinContent. |
| | | */ |
| | | protected int|float $proteinContent; |
| | | |
| | | public function getProteinContent():int|float|null |
| | | { |
| | | return $this->proteinContent??null; |
| | | } |
| | | public function setProteinContent(int|float $proteinContent):void |
| | | { |
| | | $this->proteinContent = $proteinContent; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait providerMobilityTrait { |
| | | /** |
| | | * @var string Indicates the mobility of a provided service (e.g. 'static', 'dynamic'). |
| | | */ |
| | | protected string $providerMobility; |
| | | |
| | | public function getProviderMobility():?string |
| | | { |
| | | return $this->providerMobility??null; |
| | | } |
| | | public function setProviderMobility(string $providerMobility):void |
| | | { |
| | | $this->providerMobility = $providerMobility; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait providerTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|string|array The service provider, service operator, or service performer; the goods producer. Another party (a seller) may offer those services or goods on behalf of the provider. A provider may also serve as the seller. Supersedes carrier. |
| | | */ |
| | | protected Organization|Person|string|array $provider; |
| | | |
| | | public function getProvider():Organization|Person|array|string|null |
| | | { |
| | | return $this->provider??null; |
| | | } |
| | | public function setProvider(Organization|Person|array|string $provider):void |
| | | { |
| | | if (is_array($provider)) { |
| | | $provider = $this->mixedArray('provider', $provider, ['JVBase\managers\SEO\render\Thing\Organization\Organization','JVBase\managers\SEO\render\Thing\Person\Person','string']); |
| | | if (empty($provider)){ |
| | | return; |
| | | } |
| | | } |
| | | $this->provider = $provider; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Service; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait providesServiceTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Service|array The service provided by this channel. |
| | | */ |
| | | protected Service|array $providesService; |
| | | |
| | | public function getProvidesService():Service|array|null |
| | | { |
| | | return $this->providesService??null; |
| | | } |
| | | public function setProvidesService(Service|array $providesService):void |
| | | { |
| | | if (is_array($providesService)){ |
| | | $providesService = $this->classArray('providesService', $providesService, 'JVBase\managers\SEO\render\Thing\Intangible\Service'); |
| | | } |
| | | $this->providesService = $providesService; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait publicAccessTrait { |
| | | /** |
| | | * @var bool A flag to signal that the item, event, or place is accessible for free. Supersedes free. |
| | | */ |
| | | protected bool $publicAccess; |
| | | |
| | | public function getPublicAccess():?bool |
| | | { |
| | | return $this->publicAccess??null; |
| | | } |
| | | public function setPublicAccess(bool $publicAccess):void |
| | | { |
| | | $this->publicAccess = $publicAccess; |
| | | } |
| | | |
| | | public function getPublicAccessFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'true_false', |
| | | 'label' => 'Publicly Accessible', |
| | | 'hint' => 'A flag to signal that the Place is open to public visitors.' |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait publisherImprintTrait { |
| | | /** |
| | | * @var Organization The publishing division which published the comic. |
| | | */ |
| | | protected Organization $publisherImprint; |
| | | |
| | | public function getPublisherImprint():?Organization |
| | | { |
| | | return $this->publisherImprint??null; |
| | | } |
| | | public function setPublisherImprint(Organization $publisherImprint):void |
| | | { |
| | | $this->publisherImprint = $publisherImprint; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait publisherTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array The publisher of the article in question. |
| | | */ |
| | | protected Organization|Person|array $publisher; |
| | | |
| | | public function getPublisher():Organization|Person|array|null |
| | | { |
| | | return $this->publisher??null; |
| | | } |
| | | public function setPublisher(Organization|Person|array $publisher):void |
| | | { |
| | | if (is_array($publisher)) { |
| | | $publisher = $this->mixedArray('publisher', $publisher, [ |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->publisher = $publisher; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait publishingPrinciplesTrait { |
| | | /** |
| | | * @var CreativeWork|string The publishingPrinciples property indicates (typically via URL) a document describing the editorial principles of an Organization (or individual, e.g. a Person writing a blog) that relate to their activities as a publisher, e.g. ethics or diversity policies. When applied to a CreativeWork (e.g. NewsArticle) the principles are those of the party primarily responsible for the creation of the CreativeWork. |
| | | * |
| | | * While such policies are most typically expressed in natural language, sometimes related information (e.g. indicating a funder) can be expressed using schema.org terminology. |
| | | */ |
| | | protected CreativeWork|string $publishingPrinciples; |
| | | |
| | | public function getPublishingPrinciples():CreativeWork|string|null |
| | | { |
| | | return $this->publishingPrinciples??null; |
| | | } |
| | | public function setPublishingPrinciples(CreativeWork|string $publishingPrinciples):void |
| | | { |
| | | if (is_string($publishingPrinciples) && !filter_var($publishingPrinciples, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO] Publishing Principles should be a valid URL: '.$publishingPrinciples); |
| | | return; |
| | | } |
| | | $this->publishingPrinciples = $publishingPrinciples; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\EducationalOccupationalCredential; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait qualificationsTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var EducationalOccupationalCredential|string|array Specific qualifications required for this role or Occupation. |
| | | */ |
| | | protected EducationalOccupationalCredential|string|array $qualifications; |
| | | |
| | | public function getQualifications():EducationalOccupationalCredential|string|array|null |
| | | { |
| | | return $this->qualifications??null; |
| | | } |
| | | public function setQualifications(EducationalOccupationalCredential|string|array $qualifications):void |
| | | { |
| | | if (is_array($qualifications)) { |
| | | $qualifications = $this->mixedArray('qualifications', $qualifications, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\CreativeWork\EducationalOccupationalCredential', |
| | | ]); |
| | | } |
| | | $this->qualifications = $qualifications; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait ratingCountTrait { |
| | | /** |
| | | * @var int The count of total number of ratings. |
| | | */ |
| | | protected int $ratingCount; |
| | | |
| | | public function getRatingCount():?int |
| | | { |
| | | return $this->ratingCount??null; |
| | | } |
| | | public function setRatingCount(int $ratingCount):void |
| | | { |
| | | $this->ratingCount = $ratingCount; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait ratingValueTrait { |
| | | /** |
| | | * @var int The rating for the content |
| | | */ |
| | | protected int $ratingValue; |
| | | |
| | | public function getRatingValue():?int |
| | | { |
| | | return $this->ratingValue??null; |
| | | } |
| | | public function setRatingValue(int $ratingValue):void |
| | | { |
| | | $this->ratingValue = $ratingValue; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Event\Event; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait recordedAtTrait { |
| | | /** |
| | | * @var Event The Event where the CreativeWork was recorded. The CreativeWork may capture all or part of the event. |
| | | * Inverse property: recordedIn |
| | | */ |
| | | protected Event $recordedAt; |
| | | |
| | | public function getRecordedAt():?Event |
| | | { |
| | | return $this->recordedAt??null; |
| | | } |
| | | public function setRecordedAt(Event $recordedAt):void |
| | | { |
| | | $this->recordedAt = $recordedAt; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait recordedInTrait { |
| | | /** |
| | | * @var CreativeWork The CreativeWork that captured all or part of this Event. |
| | | * Inverse property: recordedAt |
| | | */ |
| | | protected CreativeWork $recordedIn; |
| | | |
| | | public function getRecordedIn():?CreativeWork |
| | | { |
| | | return $this->recordedIn??null; |
| | | } |
| | | public function setRecordedIn(CreativeWork $recordedIn):void |
| | | { |
| | | $this->recordedIn = $recordedIn; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\RefundTypeEnumeration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait refundTypeTrait { |
| | | /** |
| | | * @var RefundTypeEnumeration A refund type, from an enumerated list. |
| | | */ |
| | | protected RefundTypeEnumeration $refundType; |
| | | |
| | | public function getRefundType():?RefundTypeEnumeration |
| | | { |
| | | return $this->refundType??null; |
| | | } |
| | | public function setRefundType(RefundTypeEnumeration $refundType):void |
| | | { |
| | | $this->refundType = $refundType; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\GeoShape; |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait regionsAllowedTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var GeoShape|Place|string|array The ISO 3166-1 (ISO 3166-1 alpha-2) or ISO 3166-2 code, the place, or the GeoShape for the geo-political region(s) for which the offer or delivery charge specification is not valid, e.g. a region where the transaction is not allowed. |
| | | */ |
| | | protected GeoShape|Place|string|array $regionsAllowed; |
| | | |
| | | public function getRegionsAllowed():GeoShape|Place|string|array|null |
| | | { |
| | | return $this->regionsAllowed??null; |
| | | } |
| | | public function setRegionsAllowed(GeoShape|Place|string|array $regionsAllowed):void |
| | | { |
| | | if (is_array($regionsAllowed)) { |
| | | $regionsAllowed = $this->mixedArray('regionsAllowed', $regionsAllowed, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\GeoShape', |
| | | 'JVBase\managers\SEO\render\Thing\Place\Place' |
| | | ]); |
| | | } |
| | | $this->regionsAllowed = $regionsAllowed; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait relatedLinkTrait { |
| | | /** |
| | | * @var string A relatedLink of the item |
| | | */ |
| | | protected string $relatedLink; |
| | | |
| | | public function getRelatedLink():?string |
| | | { |
| | | return $this->relatedLink??null; |
| | | } |
| | | public function setRelatedLink(string $relatedLink):void |
| | | { |
| | | $this->relatedLink = $relatedLink; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait relatedToTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Person|string|array The most generic familial relation. |
| | | */ |
| | | protected Person|string|array $relatedTo; |
| | | |
| | | public function getRelatedTo():Person|string|array|null |
| | | { |
| | | return $this->relatedTo??null; |
| | | } |
| | | public function setRelatedTo(Person|string|array $relatedTo):void |
| | | { |
| | | if (is_array($relatedTo)) { |
| | | $relatedTo = $this->mixedArray('relatedTo', $relatedTo, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->relatedTo = $relatedTo; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait releaseDateTrait { |
| | | /** |
| | | * @var Date The release date of a product or product model. This can be used to distinguish the exact variant of a product. |
| | | */ |
| | | protected Date $releaseDate; |
| | | |
| | | public function getReleaseDate():?Date |
| | | { |
| | | return $this->releaseDate??null; |
| | | } |
| | | public function setReleaseDate(Date $releaseDate):void |
| | | { |
| | | $this->releaseDate = $releaseDate; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait remainingAttendeeCapacityTrait { |
| | | /** |
| | | * @var int The number of attendee places for an event that remain unallocated. |
| | | */ |
| | | protected int $remainingAttendeeCapacity; |
| | | |
| | | public function getRemainingAttendeeCapacity():?int |
| | | { |
| | | return $this->remainingAttendeeCapacity??null; |
| | | } |
| | | public function setRemainingAttendeeCapacity(int $remainingAttendeeCapacity):void |
| | | { |
| | | $this->remainingAttendeeCapacity = $remainingAttendeeCapacity; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait repeatCountTrait { |
| | | /** |
| | | * @var int Defines the number of times a recurring Event will take place. |
| | | */ |
| | | protected int $repeatCount; |
| | | |
| | | public function getRepeatCount():?int |
| | | { |
| | | return $this->repeatCount??null; |
| | | } |
| | | public function setRepeatCount(int $repeatCount):void |
| | | { |
| | | $this->repeatCount = $repeatCount; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Quantity\Duration; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait repeatFrequencyTrait { |
| | | /** |
| | | * @var Duration|string Defines the frequency at which Events will occur according to a schedule Schedule. The intervals between events should be defined as a Duration of time. |
| | | */ |
| | | protected Duration|string $repeatFrequency; |
| | | |
| | | public function getRepeatFrequency():Duration|string|null |
| | | { |
| | | return $this->repeatFrequency??null; |
| | | } |
| | | public function setRepeatFrequency(Duration|string $repeatFrequency):void |
| | | { |
| | | $this->repeatFrequency = $repeatFrequency; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait representativeOfPageTrait { |
| | | /** |
| | | * @var bool Whether the image represents the content of the page |
| | | */ |
| | | protected bool $representativeOfPage; |
| | | |
| | | public function getRepresentativeOfPage():?bool |
| | | { |
| | | return $this->representativeOfPage??null; |
| | | } |
| | | public function setRepresentativeOfPage(bool $representativeOfPage):void |
| | | { |
| | | $this->representativeOfPage = $representativeOfPage; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\QuantitativeValue; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait requiredQuantityTrait { |
| | | /** |
| | | * @var QuantitativeValue|float|int|string The required quantity of the item(s). |
| | | */ |
| | | protected QuantitativeValue|float|int|string $requiredQuantity; |
| | | |
| | | public function getRequiredQuantity():QuantitativeValue|float|int|string|null |
| | | { |
| | | return $this->requiredQuantity??null; |
| | | } |
| | | public function setRequiredQuantity(QuantitativeValue|float|int|string $requiredQuantity):void |
| | | { |
| | | $this->requiredQuantity = $requiredQuantity; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait reservationForTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Thing|array The thing -- flight, event, restaurant, etc. being reserved. |
| | | */ |
| | | protected Thing|array $reservationFor; |
| | | |
| | | public function getReservationFor():Thing|array|null |
| | | { |
| | | return $this->reservationFor??null; |
| | | } |
| | | public function setReservationFor(Thing|array $reservationFor):void |
| | | { |
| | | if (is_array($reservationFor)) { |
| | | $reservationFor = $this->classArray('reservationFor', $reservationFor, 'JVBase\managers\SEO\render\Thing\Thing'); |
| | | } |
| | | $this->reservationFor = $reservationFor; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait reservationIdTrait { |
| | | /** |
| | | * @var string A reservationId of the item |
| | | */ |
| | | protected string $reservationId; |
| | | |
| | | public function getReservationId():?string |
| | | { |
| | | return $this->reservationId??null; |
| | | } |
| | | public function setReservationId(string $reservationId):void |
| | | { |
| | | $this->reservationId = $reservationId; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait responsibilitiesTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var string|array Responsibilities associated with this role or Occupation. |
| | | */ |
| | | protected string|array $responsibilities; |
| | | |
| | | public function getResponsibilities():string|array|null |
| | | { |
| | | return $this->responsibilities??null; |
| | | } |
| | | public function setResponsibilities(string|array $responsibilities):void |
| | | { |
| | | if (is_array($responsibilities)) { |
| | | $responsibilities = $this->stringArray('responsibilities', $responsibilities); |
| | | } |
| | | $this->responsibilities = $responsibilities; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait resultTrait { |
| | | /** |
| | | * @var Thing The result produced in the action. E.g. John wrote a book. |
| | | */ |
| | | protected Thing $result; |
| | | |
| | | public function getResult():?Thing |
| | | { |
| | | return $this->result??null; |
| | | } |
| | | public function setResult(Thing $result):void |
| | | { |
| | | $this->result = $result; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait reviewBodyTrait { |
| | | /** |
| | | * @var string The actual body of the review. |
| | | */ |
| | | protected string $reviewBody; |
| | | |
| | | public function getReviewBody():?string |
| | | { |
| | | return $this->reviewBody??null; |
| | | } |
| | | public function setReviewBody(string $reviewBody):void |
| | | { |
| | | $this->reviewBody = $reviewBody; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait reviewCountTrait { |
| | | /** |
| | | * @var int The count of total number of reviews. |
| | | */ |
| | | protected int $reviewCount; |
| | | |
| | | public function getReviewCount():?int |
| | | { |
| | | return $this->reviewCount??null; |
| | | } |
| | | public function setReviewCount(int $reviewCount):void |
| | | { |
| | | $this->reviewCount = $reviewCount; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Rating\Rating; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait reviewRatingTrait { |
| | | /** |
| | | * @var Rating The rating given in this review. Note that reviews can themselves be rated. The reviewRating applies to rating given by the review. The aggregateRating property applies to the review itself, as a creative work. |
| | | */ |
| | | protected Rating $reviewRating; |
| | | |
| | | public function getReviewRating():?Rating |
| | | { |
| | | return $this->reviewRating??null; |
| | | } |
| | | public function setReviewRating(Rating $reviewRating):void |
| | | { |
| | | $this->reviewRating = $reviewRating; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\Review; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait reviewTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Review|array A review of the item. Supersedes reviews. |
| | | */ |
| | | protected Review|array $review; |
| | | |
| | | public function getReview():Review|array|null |
| | | { |
| | | return $this->review??null; |
| | | } |
| | | public function setReview(Review|array $review):void |
| | | { |
| | | if (is_array($review)) { |
| | | $review = $this->classArray('review', $review, 'JVBase\managers\SEO\render\Thing\CreativeWork\Review'); |
| | | } |
| | | $this->review = $review; |
| | | } |
| | | |
| | | public function getReviewFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'repeater', |
| | | 'label' => 'Review(s)', |
| | | 'hint' => 'Share some relevant reviews you\'d like to highlight', |
| | | 'fields' => [ |
| | | 'author' => [ |
| | | 'type' => 'text', |
| | | 'label' => 'Author', |
| | | ], |
| | | 'reviewRating' => [ |
| | | 'type' => 'group', |
| | | 'label' => 'Review Rating', |
| | | 'fields'=> [ |
| | | 'ratingValue' => [ |
| | | 'type' => 'number', |
| | | 'label' => 'Rating', |
| | | ], |
| | | 'bestRating' => [ |
| | | 'type' => 'number', |
| | | 'label' => 'Worst Value', |
| | | 'default' => 5 |
| | | ], |
| | | 'worstRating' => [ |
| | | 'type' => 'number', |
| | | 'label' => 'Worst Value', |
| | | 'default' => 1 |
| | | ] |
| | | ] |
| | | ], |
| | | 'reviewBody' => [ |
| | | 'type' => 'textarea', |
| | | 'label' => 'Review Text' |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait reviewedByTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Organization|Person|array People or organizations that have reviewed the content on this web page for accuracy and/or completeness. |
| | | */ |
| | | protected Organization|Person|array $reviewedBy; |
| | | |
| | | public function getReviewedBy():Organization|Person|array|null |
| | | { |
| | | return $this->reviewedBy??null; |
| | | } |
| | | public function setReviewedBy(Organization|Person|array $reviewedBy):void |
| | | { |
| | | if (is_array($reviewedBy)) { |
| | | $reviewedBy = $this->mixedArray('reviewedBy', $reviewedBy, [ |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->reviewedBy = $reviewedBy; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait sameAsTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var array|string URL of a reference Web page that unambiguously indicates the item's identity. E.g. the URL of the item's Wikipedia page, Wikidata entry, or official website. |
| | | */ |
| | | protected array|string $sameAs; |
| | | |
| | | public function getSameAs():array|string|null |
| | | { |
| | | return $this->sameAs??null; |
| | | } |
| | | public function setSameAs(string|array $sameAs):void |
| | | { |
| | | if (is_array($sameAs)) { |
| | | $sameAs = $this->urlArray('sameAs', $sameAs); |
| | | if (empty($sameAs)) { |
| | | return; |
| | | } |
| | | } elseif (!filter_var($sameAs, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO]Invalid sameAs; not a URL: '.$sameAs); |
| | | return; |
| | | } |
| | | $this->sameAs = $sameAs; |
| | | } |
| | | |
| | | public function getSameAsFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'repeater', |
| | | 'label' => 'Same As', |
| | | 'hint' => 'List your social media presence or other links', |
| | | 'fields' => [ |
| | | 'url' => [ |
| | | 'type' => 'url', |
| | | 'label' => 'URL', |
| | | ] |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait saturatedFatContentTrait { |
| | | /** |
| | | * @var int|float The number of saturatedFatContent. |
| | | */ |
| | | protected int|float $saturatedFatContent; |
| | | |
| | | public function getSaturatedFatContent():int|float|null |
| | | { |
| | | return $this->saturatedFatContent??null; |
| | | } |
| | | public function setSaturatedFatContent(int|float $saturatedFatContent):void |
| | | { |
| | | $this->saturatedFatContent = $saturatedFatContent; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait scheduleTimezoneTrait { |
| | | /** |
| | | * @var string Indicates the timezone for which the time(s) indicated in the Schedule are given. The value provided should be among those listed in the IANA Time Zone Database. |
| | | */ |
| | | protected string $scheduleTimezone; |
| | | |
| | | public function getScheduleTimezone():?string |
| | | { |
| | | return $this->scheduleTimezone??null; |
| | | } |
| | | public function setScheduleTimezone(string $scheduleTimezone):void |
| | | { |
| | | $this->scheduleTimezone = $scheduleTimezone; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\DataType\Date; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait sdDatePublishedTrait { |
| | | /** |
| | | * @var Date Indicates the date on which the current structured data was generated / published. Typically used alongside sdPublisher. |
| | | */ |
| | | protected Date $sdDatePublished; |
| | | |
| | | public function getSdDatePublished():?Date |
| | | { |
| | | return $this->sdDatePublished??null; |
| | | } |
| | | public function setSdDatePublished(Date $sdDatePublished):void |
| | | { |
| | | $this->sdDatePublished = $sdDatePublished; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\CreativeWork\CreativeWork; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait sdLicenseTrait { |
| | | /** |
| | | * @var CreativeWork|string A license document that applies to this structured data, typically indicated by URL. |
| | | */ |
| | | protected CreativeWork|string $sdLicense; |
| | | |
| | | public function getSdLicense():CreativeWork|string|null |
| | | { |
| | | return $this->sdLicense??null; |
| | | } |
| | | public function setSdLicense(CreativeWork|string $sdLicense):void |
| | | { |
| | | if (is_string($sdLicense) && !filter_var($sdLicense, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO]sdLicense is meant to be a URL: '.$sdLicense); |
| | | return; |
| | | } |
| | | $this->sdLicense = $sdLicense; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait sdPublisherTrait { |
| | | /** |
| | | * @var Organization|Person Indicates the party responsible for generating and publishing the current structured data markup, typically in cases where the structured data is derived automatically from existing published content but published on a different site. For example, student projects and open data initiatives often re-publish existing content with more explicitly structured metadata. The sdPublisher property helps make such practices more explicit. |
| | | */ |
| | | protected Organization|Person $sdPublisher; |
| | | |
| | | public function getSdPublisher():Organization|Person|null |
| | | { |
| | | return $this->sdPublisher??null; |
| | | } |
| | | public function setSdPublisher(Organization|Person $sdPublisher):void |
| | | { |
| | | $this->sdPublisher = $sdPublisher; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Demand; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait seeksTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Demand|array A pointer to products or services sought by the organization or person (demand). |
| | | */ |
| | | protected Demand|array $seeks; |
| | | |
| | | public function getSeeks():Demand|array|null |
| | | { |
| | | return $this->seeks??null; |
| | | } |
| | | public function setSeeks(Demand|array $seeks):void |
| | | { |
| | | if(is_array($seeks)){ |
| | | $seeks = $this->classArray('seeks', $seeks, 'JVBase\managers\SEO\render\Thing\Intangible\Demand'); |
| | | } |
| | | $this->seeks = $seeks; |
| | | } |
| | | |
| | | public function getSeeksFieldConfig():array |
| | | { |
| | | return [ |
| | | 'type' => 'repeater', |
| | | 'label' => 'Seeks', |
| | | 'fields'=> [ |
| | | |
| | | ] |
| | | ]; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Organization\Organization; |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait sellerTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Person|Organization|array An entity which offers (sells / leases / lends / loans) the services / goods. A seller may also be a provider. Supersedes merchant, vendor. |
| | | */ |
| | | protected Person|Organization|array $seller; |
| | | |
| | | public function getSeller():Person|Organization|array|null |
| | | { |
| | | return $this->seller??null; |
| | | } |
| | | public function setSeller(Person|Organization|array $seller):void |
| | | { |
| | | if (is_array($seller)) { |
| | | $seller = $this->mixedArray('seller', $seller, [ |
| | | 'JVBase\managers\SEO\render\Thing\Organization\Organization', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->seller = $seller; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait serialNumberTrait { |
| | | /** |
| | | * @var string The serial number or any alphanumeric identifier of a particular product. When attached to an offer, it is a shortcut for the serial number of the product included in the offer. |
| | | */ |
| | | protected string $serialNumber; |
| | | |
| | | public function getSerialNumber():?string |
| | | { |
| | | return $this->serialNumber??null; |
| | | } |
| | | public function setSerialNumber(string $serialNumber):void |
| | | { |
| | | $this->serialNumber = $serialNumber; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait servesCuisineTrait { |
| | | /** |
| | | * @var string The cuisine of the restaurant. |
| | | */ |
| | | protected string $servesCuisine; |
| | | |
| | | public function getServesCuisine():?string |
| | | { |
| | | return $this->servesCuisine??null; |
| | | } |
| | | public function setServesCuisine(string $servesCuisine):void |
| | | { |
| | | $this->servesCuisine = $servesCuisine; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Place\Place; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait serviceLocationTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Place|array The location (e.g. civic structure, local business, etc.) where a person can go to access the service. |
| | | */ |
| | | protected Place|array $serviceLocation; |
| | | |
| | | public function getServiceLocation():Place|array|null |
| | | { |
| | | return $this->serviceLocation??null; |
| | | } |
| | | public function setServiceLocation(Place|array $serviceLocation):void |
| | | { |
| | | if (is_array($serviceLocation)) { |
| | | $serviceLocation = $this->classArray('serviceLocation', $serviceLocation, 'JVBase\managers\SEO\render\Thing\Place\Place'); |
| | | } |
| | | $this->serviceLocation = $serviceLocation; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Thing; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait serviceOutputTrait { |
| | | use ArrayHelper; |
| | | /** |
| | | * @var Thing|array The tangible thing generated by the service, e.g. a passport, permit, etc. Supersedes produces. |
| | | */ |
| | | protected Thing|array $serviceOutput; |
| | | |
| | | public function getServiceOutput():Thing|array|null |
| | | { |
| | | return $this->serviceOutput??null; |
| | | } |
| | | public function setServiceOutput(Thing|array $serviceOutput):void |
| | | { |
| | | if (is_array($serviceOutput)) { |
| | | $serviceOutput = $this->classArray('serviceOutput', $serviceOutput, 'JVBase\managers\SEO\render\Thing\Thing'); |
| | | } |
| | | $this->serviceOutput = $serviceOutput; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\ContactPoint; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait servicePhoneTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var ContactPoint|array The phone number to use to access the service. |
| | | */ |
| | | protected ContactPoint|array $servicePhone; |
| | | |
| | | public function getServicePhone():ContactPoint|array|null |
| | | { |
| | | return $this->servicePhone??null; |
| | | } |
| | | public function setServicePhone(ContactPoint|array $servicePhone):void |
| | | { |
| | | if (is_array($servicePhone)){ |
| | | $servicePhone = $this->classArray('servicePhone', $servicePhone, 'JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\ContactPoint'); |
| | | } |
| | | $this->servicePhone = $servicePhone; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\ContactPoint\PostalAddress; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait servicePostalAddressTrait { |
| | | /** |
| | | * @var PostalAddress The address for accessing the service by mail. |
| | | */ |
| | | protected PostalAddress $servicePostalAddress; |
| | | |
| | | public function getServicePostalAddress():?PostalAddress |
| | | { |
| | | return $this->servicePostalAddress??null; |
| | | } |
| | | public function setServicePostalAddress(PostalAddress $servicePostalAddress):void |
| | | { |
| | | $this->servicePostalAddress = $servicePostalAddress; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\ContactPoint; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait serviceSmsNumberTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var ContactPoint|array The number to access the service by text message. |
| | | */ |
| | | protected ContactPoint|array $serviceSmsNumber; |
| | | |
| | | public function getServiceSmsNumber():ContactPoint|array|null |
| | | { |
| | | return $this->serviceSmsNumber??null; |
| | | } |
| | | public function setServiceSmsNumber(ContactPoint|array $serviceSmsNumber):void |
| | | { |
| | | if (is_array($serviceSmsNumber)){ |
| | | $serviceSmsNumber = $this->classArray('serviceSmsNumber', $serviceSmsNumber, 'JVBase\managers\SEO\render\Thing\Intangible\StructuredValue\ContactPoint'); |
| | | } |
| | | $this->serviceSmsNumber = $serviceSmsNumber; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Intangible\Enumeration\GovernmentBenefitsType; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait serviceTypeTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var GovernmentBenefitsType|string|array The type of service being offered, e.g. veterans' benefits, emergency relief, etc. |
| | | */ |
| | | protected GovernmentBenefitsType|string|array $serviceType; |
| | | |
| | | public function getServiceType():GovernmentBenefitsType|string|array|null |
| | | { |
| | | return $this->serviceType??null; |
| | | } |
| | | public function setServiceType(GovernmentBenefitsType|string|array $serviceType):void |
| | | { |
| | | if (is_array($serviceType)) { |
| | | $serviceType = $this->mixedArray('serviceType', $serviceType, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Intangible\Enumeration\GovernmentBenefitsType' |
| | | ]); |
| | | } |
| | | $this->serviceType = $serviceType; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait serviceUrlTrait { |
| | | /** |
| | | * @var string URL of the item. |
| | | */ |
| | | protected string $serviceUrl; |
| | | |
| | | public function getServiceUrl():?string |
| | | { |
| | | return $this->serviceUrl??null; |
| | | } |
| | | public function setServiceUrl(string $serviceUrl):void |
| | | { |
| | | if (!filter_var($serviceUrl, FILTER_VALIDATE_URL)) { |
| | | error_log('[SEO]Not a valid serviceUrl: '.$serviceUrl); |
| | | return; |
| | | } |
| | | $this->serviceUrl = $serviceUrl; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait servingSizeTrait { |
| | | /** |
| | | * @var string The serving size, in terms of the number of volume or mass |
| | | */ |
| | | protected string $servingSize; |
| | | |
| | | public function getServingSize():?string |
| | | { |
| | | return $this->servingSize??null; |
| | | } |
| | | public function setServingSize(string $servingSize):void |
| | | { |
| | | $this->servingSize = $servingSize; |
| | | } |
| | | } |
| New file |
| | |
| | | <?php |
| | | namespace JVBase\managers\SEO\render\Traits\_Properties; |
| | | |
| | | use JVBase\managers\SEO\render\Thing\Person\Person; |
| | | use JVBase\managers\SEO\render\Traits\_Helpers\arrayHelper; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | | } |
| | | trait siblingTrait { |
| | | use arrayHelper; |
| | | /** |
| | | * @var Person|string|array A sibling of the person. Supersedes siblings. |
| | | */ |
| | | protected Person|string|array $sibling; |
| | | |
| | | public function getSibling():Person|string|array|null |
| | | { |
| | | return $this->sibling??null; |
| | | } |
| | | public function setSibling(Person|string|array $sibling):void |
| | | { |
| | | if (is_array($sibling)) { |
| | | $sibling = $this->mixedArray('sibling', $sibling, [ |
| | | 'string', |
| | | 'JVBase\managers\SEO\render\Thing\Person\Person' |
| | | ]); |
| | | } |
| | | $this->sibling = $sibling; |
| | | } |
| | | } |
| inc/managers/SEO/render/Traits/_Properties/significantLinkTrait.php
inc/managers/SEO/render/Traits/_Properties/sizeTrait.php
inc/managers/SEO/render/Traits/_Properties/skillsTrait.php
inc/managers/SEO/render/Traits/_Properties/skuTrait.php
inc/managers/SEO/render/Traits/_Properties/sloganTrait.php
inc/managers/SEO/render/Traits/_Properties/smokingAllowedTrait.php
inc/managers/SEO/render/Traits/_Properties/sodiumContentTrait.php
inc/managers/SEO/render/Traits/_Properties/sourceOrganizationTrait.php
inc/managers/SEO/render/Traits/_Properties/spatialCoverageTrait.php
inc/managers/SEO/render/Traits/_Properties/spatialTrait.php
inc/managers/SEO/render/Traits/_Properties/specialOpeningHoursTrait.php
inc/managers/SEO/render/Traits/_Properties/sponsorTrait.php
inc/managers/SEO/render/Traits/_Properties/spouseTrait.php
inc/managers/SEO/render/Traits/_Properties/starRatingTrait.php
inc/managers/SEO/render/Traits/_Properties/startDateTrait.php
inc/managers/SEO/render/Traits/_Properties/startOffsetTrait.php
inc/managers/SEO/render/Traits/_Properties/startTimeTrait.php
inc/managers/SEO/render/Traits/_Properties/streetAddressTrait.php
inc/managers/SEO/render/Traits/_Properties/subEventTrait.php
inc/managers/SEO/render/Traits/_Properties/subOrganizationTrait.php
inc/managers/SEO/render/Traits/_Properties/subjectOfTrait.php
inc/managers/SEO/render/Traits/_Properties/successorOfTrait.php
inc/managers/SEO/render/Traits/_Properties/sugarContentTrait.php
inc/managers/SEO/render/Traits/_Properties/suitableForDietTrait.php
inc/managers/SEO/render/Traits/_Properties/superEventTrait.php
inc/managers/SEO/render/Traits/_Properties/targetTrait.php
inc/managers/SEO/render/Traits/_Properties/taxIDTrait.php
inc/managers/SEO/render/Traits/_Properties/teachesTrait.php
inc/managers/SEO/render/Traits/_Properties/telephoneTrait.php
inc/managers/SEO/render/Traits/_Properties/temporalCoverageTrait.php
inc/managers/SEO/render/Traits/_Properties/termCodeTrait.php
inc/managers/SEO/render/Traits/_Properties/termsOfServiceTrait.php
inc/managers/SEO/render/Traits/_Properties/textTrait.php
inc/managers/SEO/render/Traits/_Properties/thumbnailTrait.php
inc/managers/SEO/render/Traits/_Properties/thumbnailUrlTrait.php
inc/managers/SEO/render/Traits/_Properties/timeRequiredTrait.php
inc/managers/SEO/render/Traits/_Properties/totalPriceTrait.php
inc/managers/SEO/render/Traits/_Properties/totalTimeTrait.php
inc/managers/SEO/render/Traits/_Properties/transFatContentTrait.php
inc/managers/SEO/render/Traits/_Properties/transcriptTrait.php
inc/managers/SEO/render/Traits/_Properties/translationOfWorkTrait.php
inc/managers/SEO/render/Traits/_Properties/translatorTrait.php
inc/managers/SEO/render/Traits/_Properties/typeOfGoodTrait.php
inc/managers/SEO/render/Traits/_Properties/typicalAgeRangeTrait.php
inc/managers/SEO/render/Traits/_Properties/unitCodeTrait.php
inc/managers/SEO/render/Traits/_Properties/unitTextTrait.php
inc/managers/SEO/render/Traits/_Properties/unsaturatedFatContentTrait.php
inc/managers/SEO/render/Traits/_Properties/urlTemplateTrait.php
inc/managers/SEO/render/Traits/_Properties/urlTrait.php
inc/managers/SEO/render/Traits/_Properties/userInteractionCountTrait.php
inc/managers/SEO/render/Traits/_Properties/validFromTrait.php
inc/managers/SEO/render/Traits/_Properties/validInTrait.php
inc/managers/SEO/render/Traits/_Properties/validThroughTrait.php
inc/managers/SEO/render/Traits/_Properties/valueReferenceTrait.php
inc/managers/SEO/render/Traits/_Properties/valueTrait.php
inc/managers/SEO/render/Traits/_Properties/variesByTrait.php
inc/managers/SEO/render/Traits/_Properties/versionTrait.php
inc/managers/SEO/render/Traits/_Properties/videoFrameSizeTrait.php
inc/managers/SEO/render/Traits/_Properties/videoQualityTrait.php
inc/managers/SEO/render/Traits/_Properties/videoTrait.php
inc/managers/SEO/render/Traits/_Properties/warrantyScopeTrait.php
inc/managers/SEO/render/Traits/_Properties/warrantyTrait.php
inc/managers/SEO/render/Traits/_Properties/weightTrait.php
inc/managers/SEO/render/Traits/_Properties/widthTrait.php
inc/managers/SEO/render/Traits/_Properties/wordCountTrait.php
inc/managers/SEO/render/Traits/_Properties/workExampleTrait.php
inc/managers/SEO/render/Traits/_Properties/workFeaturedTrait.php
inc/managers/SEO/render/Traits/_Properties/workPerformedTrait.php
inc/managers/SEO/render/Traits/_Properties/workTranslationTrait.php
inc/managers/SEO/render/Traits/_Properties/worksAtTrait.php
inc/managers/SEO/render/Traits/_Properties/worksForTrait.php
inc/managers/SEO/render/Traits/_Properties/worstRatingTrait.php
inc/managers/SEO/render/Traits/_setup.php
inc/managers/SEO/render/_setup.php
inc/managers/SEO/render/seo/_setup.php
inc/managers/SEO/schemas/resolvers/PersonResolver.php
inc/managers/SEO/schemas/resolvers/VisualArtworkResolver.php
inc/managers/_setup.php
inc/managers/queue/Queue.php
inc/managers/queue/executors/ContentExecutor.php
inc/managers/queue/executors/ContentTermExecutor.php
inc/managers/queue/executors/UploadExecutor.php
inc/meta/Form.php
inc/meta/Meta.php
inc/meta/MetaManager.php
inc/meta/MetaTypeManager.php
inc/meta/Sanitizer.php
inc/registrar/Fields.php
inc/registrar/Labels.php
inc/registrar/Posts.php
inc/registrar/Registrar.php
inc/registrar/Terms.php
inc/registrar/Users.php
inc/registrar/_setup.php
inc/registrar/config/Breadcrumbs.php
inc/registrar/config/Config.php
inc/registrar/config/Dashboard.php
inc/registrar/config/Directory.php
inc/registrar/config/Feed.php
inc/registrar/config/Integration.php
inc/registrar/config/Management.php
inc/registrar/config/Responses.php
inc/registrar/config/SEO.php
inc/registrar/config/Section.php
inc/registrar/config/TrackChanges.php
inc/registrar/config/Verification.php
inc/registrar/config/seo/Archive.php
inc/registrar/config/seo/Helpers.php
inc/registrar/config/seo/Meta.php
inc/registrar/config/seo/Resolver.php
inc/registrar/config/seo/Schema.php
inc/registrar/config/seo/_setup.php
inc/registrar/fields/Calendar.php
inc/registrar/fields/Field.php
inc/registrar/fields/GroupedField.php
inc/registrar/fields/OptionsField.php
inc/registrar/fields/TaxonomyField.php
inc/registrar/fields/Upload.php
inc/registrar/helpers/AddIntegrationFields.php
inc/registrar/helpers/MakeCalendarType.php
inc/registrar/helpers/MakeTrackChanges.php
inc/registrar/helpers/MakeVerification.php
inc/registry/CheckCustomTables.php
inc/registry/TaxonomyRegistrar.php
inc/registry/_setup.php
inc/registry/providers/IntegrationFieldProvider.php
inc/rest/Rest.php
inc/rest/RestRouteManager.php
inc/rest/_setup.php
inc/rest/routes/ApprovalRoutes.php
inc/rest/routes/ContentRoutes.php
inc/rest/routes/ContentTermsRoutes.php
inc/rest/routes/FavouritesRoutes.php
inc/rest/routes/FeedRoutes.php
inc/rest/routes/LoginRoutes.php
inc/rest/routes/NewsRoutes.php
inc/rest/routes/NotificationsRoutes.php
inc/rest/routes/OptionsRoutes.php
inc/rest/routes/SEORoutes.php
inc/rest/routes/ShopRoutes.php
inc/rest/routes/UploadRoutes.php
inc/rest/routes/VoteRoutes.php
inc/ui/CRUDSkeleton.php
inc/utility/Checker.php
inc/utility/Validator.php
jvb.php
lists.php (deleted)
src/feed/render.php
src/fields/block.json
src/fields/edit.js
src/fields/editor.scss
src/fields/index.js
src/fields/index.php
src/fields/render.php
src/fields/save.js
src/fields/style.scss
src/fields/view.js
src/list/block.json (deleted)
src/list/edit.js (deleted)
src/list/editor.scss (deleted)
src/list/render.php (deleted)
src/list/style.scss (deleted)
src/summary/render.php |