Jake Vanderwerf
5 days ago a9b3b28d001941921aa70d37fdc87c758a163a44
inc/registrar/config/seo/Schema.php
@@ -23,6 +23,7 @@
   protected array $properties = [];
   protected array $referenceProperties = [];
   protected array $extras = [];
   protected array $defaultReference = [
      'name'   => '{{post_title}}',
      'url' => '{{post_permalink}}',
@@ -67,6 +68,8 @@
         }
         $this->defaultArchive['description'] = '{{registrar.'.$slug.'.description}}';
      }
      $this->extras = apply_filters(BASE.ucfirst($slug).'Extras', []);
      $this->initFilters();
      $this->registerHooks();
   }
@@ -90,49 +93,8 @@
      add_action('wp_head', [$this, 'outputSchema'], 1);
      add_filter('the_seo_framework_schema_graph_data', [$this, 'filterTSFSchema'], 10, 2);
      add_filter('the_seo_framework_title_from_custom_field', [$this, 'filterTSFOGTitle'], 10, 2);
      $this->maybeExcludeSingles();
   }
      protected function maybeExcludeSingles(): void
      {
         $exclude = $this->cache->remember(
            'excludeSingles',
            function () {
               $exclude = [];
               $registrar = Registrar::getInstance($this->slug);
               if ($registrar && $registrar->hasFeature('hide_single')) {
                  $exclude = $this->excludeSingle();
               }
               if ($registrar && $registrar->hasFeature('is_timeline')) {
                  $exclude = array_merge($exclude, $this->excludeTimeline());
               }
               return $exclude;
            }
         );
         if (!empty($exclude)) {
            add_filter('the_seo_framework_sitemap_exclude_ids', $exclude);
         }
      }
      protected function excludeSingle():array
      {
         return get_posts([
            'post_type'    => jvbCheckBase($this->slug),
            'posts_per_page'=> -1,
            'fields'    => 'ids',
            'post_status'  => 'publish',
         ]);
      }
      protected function excludeTimeline():array
      {
         return get_posts([
            'post_type'    => jvbCheckBase($this->slug),
            'posts_per_page'=> -1,
            'fields'    => 'ids',
            'post_status'  => 'publish',
            'post_parent__not_in'   => [0], // Only get posts with a parent
         ]);
      }
   public function filterTSFSchema(array $graph, ?array $args):array
   {
      $based = jvbCheckBase($this->slug);
@@ -181,8 +143,9 @@
               $config = $this->getConfig();
               $class = JVB()->schemaHelper()::classFromConfig($config, $meta);
               $class->setAuthor(JVB()->seo()->getCreator(true));
               $class = apply_filters('jvb_single_'.$this->slug.'_schema_output', $class, $ID);
               return $class->outputSchema();
            }
         );
@@ -273,7 +236,7 @@
               $class->setIsPartOf(get_home_url().'/#website');
               $itemList = new render\Thing\Intangible\ItemList\ItemList();
               $items = new WP_Query([
                  'post_type'    => jvbCheckBase($this->slug),
                  'post_type'    => $registrar->getBased(),
                  'posts_per_page'=> 25,
                  'post_status'  => 'publish',
                  'fields'    => 'ids'
@@ -294,7 +257,11 @@
               $class->setMainEntity($itemList);
               $schema = $class->outputSchema();
               error_log('Generated archive schema: '.print_r($schema, true));
               if (JVB_TESTING) {
//                error_log('Generated archive schema: '.print_r($schema, true));
               }
               return $schema;
            }
         );
@@ -309,6 +276,13 @@
      $cached = $this->referenceCache->remember(
         $ID,
         function () use ($ID, $type) {
            $postType = get_post_type($ID);
            $function = BASE.'build_singular_'.jvbNoBase($postType).'_schema_reference';
            if (function_exists($function)) {
               return $function($ID);
            }
            switch ($type) {
               case 'post':
                  $meta = Meta::forPost($ID);
@@ -325,7 +299,10 @@
            }
            $config = $this->getConfig();
            $class = JVB()->schemaHelper()::classFromConfig($config, $meta);
            $class->delete('about');
            if ($class) {
               $class->delete('about');
            }
            switch ($type) {
               case 'post':
@@ -399,7 +376,7 @@
         $config['type'] = $this->defaultSchema['type'];
         update_option(BASE.ucfirst($this->slug).'Schema', $config);
      }
      $class = $this->getConfig()['type'];
      $class = $config['type'];
      if (!class_exists($class)) {
         error_log('[SEO]Schema::defineReference Class not found: '.$class);
         return;
@@ -436,10 +413,10 @@
      if (is_singular($based)){
         $config = $this->getConfig('meta');
         $meta = Meta::forPost(get_the_ID());
         $title = Resolver::resolve($config['name']??$config['title'], $meta);
         $title = Resolver::resolve($config['name']??$config['title']??'', $meta);
      } elseif (is_post_type_archive($based) ) {
         $config = $this->getConfig('archive');
         $title = $config['name'];
         $title = Resolver::resolve($config['name'], null);
      } elseif (is_tax($based)) {
         $config = $this->getConfig('archive');
         $meta = Meta::forTerm(get_queried_object_id());
@@ -469,6 +446,7 @@
            'type'   => 'JVBase\inc\managers\SEO\render\Thing\CreativeWork\Comment\Answer',
            'text'   => wp_strip_all_tags(str_replace("\n", '', $meta->get('post_content'))),
         ],
         'answerCount'  => 1,
      ];
      $question = SchemaHelper::classFromConfig($question);
      $page->setMainEntity($question);
@@ -655,4 +633,20 @@
      $page->setMainEntity($termset);
      return $page->outputSchema();
   }
   public function extra():array
   {
      if (empty($this->extras)) {
         return [];
      }
      $out = [];
      foreach ($this->extras as $config) {
         $schema = SchemaHelper::classFromConfig($config);
         $output = $schema->outputSchema();
         if (!empty($output)) {
            $out[] = $output;
         }
      }
      return $out;
   }
}