'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 { ?>