Jake Vanderwerf
2026-04-15 c4aa5cdb5e90ad4b420e22772797d16980232a2b
inc/managers/SEO/render/SchemaOutput.php
@@ -1,13 +1,11 @@
<?php
namespace JVBase\managers\SEO\render;
use JVBase\inc\managers\SEO\render\Thing\Intangible\ItemList\OfferCatalog;
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\meta\Meta;
use JVBase\registrar\config\seo\Resolver;
use JVBase\registrar\Registrar;
@@ -25,8 +23,9 @@
   {
      $schema = [];
      $schema[] = $this->buildWebsiteSchema(false);
      if (is_front_page()) {
         $schema[] = $this->buildWebsiteSchema(true);
         $test = $this->buildOrganizationSchema();
         if (!empty($test)) {
            $schema[] = $test;
@@ -35,17 +34,17 @@
      if (is_singular($this->types)) {
         $type = get_post_type();
         $registrar = Registrar::getInstance($type);
         if ($registrar && !empty($registrar->getConfig('seo')['schema']??[])) {
         if ($registrar) {
            $seo = $registrar->getSEO();
            $schema[] = $seo->schema()->outputSingularSchema();
         }
      }elseif (is_post_type_archive($this->types)) {
         error_log('It is a post type archive');
         $type = get_queried_object();
         $type = $type->name;
         $registrar = Registrar::getInstance($type);
         if ($registrar && !empty($registrar->getConfig('seo')['schema']??[])) {
         if ($registrar) {
            $seo = $registrar->getSEO();
            $schema[] =$seo->schema()->outputArchiveSchema();
         }
@@ -53,7 +52,7 @@
         $type = get_queried_object();
         $type = jvbNoBase($type->taxonomy);
         $registrar = Registrar::getInstance($type);
         if ($registrar && !empty($registrar->getConfig('seo')['schema']??[])) {
         if ($registrar ) {
            $seo = $registrar->getSEO();
            error_log('SEO: '.print_r($seo->schema(), true));
            $schema[] = $seo->schema()->outputArchiveSchema();
@@ -66,12 +65,15 @@
      if (is_page($isContent)){
         $type = get_post_meta(get_the_id(), BASE.'for_type', true);
         error_log('Type: '.print_r($type, true));
         if (!empty($type)) {
         $registrar = Registrar::getInstance($type);
         if ($registrar) {
            $schema[] = $registrar->getSEO()->schema()->outputContentTaxArchiveSchema();
         }
      }
      }
      $breadcrumbs = $this->buildBreadcrumbs();
@@ -80,6 +82,7 @@
      }
      if (!empty($schema)) {
         if (!is_front_page()) {
         $website = JVB()->schemaHelper()::schema('website');
         if (!empty($website)) {
            if (JVB_TESTING) {
@@ -93,6 +96,8 @@
            );
            array_unshift($schema, $website);
         }
         }
         $schema = [
            '@context'     => 'https://schema.org',
            '@graph'    => $schema
@@ -113,8 +118,8 @@
      if (!$website->getName() || empty($website->getName())){
         $website->setName(get_bloginfo('name'));
      }
      if(!$website->getCreator() || empty($website->getCreator())) {
         $website->setCreator($this->getCreator());
      if(!$website->getCreator() || empty($website->getCreator(true))) {
         $website->setCreator($this->getCreator(true));
      }
      return $website->outputSchema();
   }
@@ -125,9 +130,17 @@
      if (empty($schema)) {
         return;
      }
//    $encoded =  wp_json_encode($schema, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
//    $encoded =  wp_json_encode($schema, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT, 1024);
      $encoded = wp_json_encode($schema, JSON_UNESCAPED_SLASHES, 512);
      if ($encoded === false) {
         error_log('wp_json_encode failed: ' . json_last_error_msg());
         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 $encoded;
      echo "\n" . '</script>' . "\n";
      echo "\n" . '<!-- / SEO Schema by JakeVan -->'."\n";
   }
@@ -185,7 +198,6 @@
      return Cache::for('websiteSchema')->remember(
         'full',
         function () use ($storedWebsite) {
            error_log('StoredWebsite: '.print_r($storedWebsite, true));
            $website = JVB()->schemaHelper()::classFromConfig($storedWebsite);
            if (!$website->getName() || empty($website->getName())) {
               $website->setName(get_bloginfo('name'));
@@ -217,26 +229,26 @@
   }
   public function getCreator(bool $reference = false):LocalBusiness
   public function getCreator(bool $reference = false, bool $jakeVan = false):LocalBusiness
   {
      if (JVB_TESTING){
         Cache::for('JakeVanCreator')->flush();
      }
      if ($reference) {
      if ($reference && $jakeVan) {
         return Cache::for('JakeVanCreator')->remember(
            'reference',
            function () {
               $creator = new LocalBusiness();
               $creator->setId('jakevan');
               $creator->setName('JakeVan');
               $creator->setAlternateName('Jake Vanderwerf');
               $creator->setUrl('https://jakevan.ca/');
               $creator->setDescription('Let\'s bring your idea to life.');
               return $creator;
            }
         );
      }
      if ($jakeVan) {
      return Cache::for('JakeVanCreator')->remember(
         'full',
         function () {
@@ -283,6 +295,13 @@
         }
      );
   }
      if ($reference) {
         return $this->getOptionSchemaReference('organization');
      }
      $config = JVB()->schemaHelper()::schema('organization');
      return JVB()->schemaHelper()::classFromConfig($config);
   }
   public function getOptionSchemaReference(string $option):mixed
   {
@@ -294,8 +313,8 @@
         error_log('Attempted to get schema reference for: '.$option.', but it does not exist');
         return null;
      }
      $action = BASE.ucfirst($option).'Schema';
      $stored = JVB()->schemaHelper()::reference($action);
      $stored = JVB()->schemaHelper()::reference($option);
      if (empty($stored)){
         error_log('Attempted to get schema reference for: '.$option.', but defaults not set.');
@@ -308,7 +327,7 @@
      }
      $class = new $type();
      unset($stored['type']);
      $minimal = apply_filters($action.'Reference', ['name', 'url', 'sameAs', 'logo']);
      $minimal = apply_filters(BASE.'OrganizationReference', ['name', 'url', 'sameAs', 'logo']);
      foreach ($minimal as $property) {
         $method = 'set'.ucfirst($property);
@@ -316,6 +335,7 @@
         if (!$value) {continue;}
         if (str_contains($value, '{{')) {
            $meta = null;
            $value = Resolver::resolve($property, $value);
         }
         $class->$method($value);
@@ -326,6 +346,7 @@
   public function buildOrganizationSchema():array
   {
      $config = JVB()->schemaHelper()::schema('organization');
      $class = JVB()->schemaHelper()::classFromConfig($config);
      return ($class)? $class->outputSchema() : [];
   }