Jake Vanderwerf
5 days ago 0dfe1d8afafc59c4a5559c498342668d5a58d6ef
inc/registrar/helpers/MakeCalendarType.php
@@ -4,6 +4,7 @@
use JVBase\meta\Meta;
use JVBase\registrar\Registrar;
use WP_Post;
use WP_Query;
if (!defined('ABSPATH')) {
   exit;
@@ -13,6 +14,7 @@
   protected string $slug;
   protected string $postType;
   private Registrar $registrar;
   protected string $hook;
   public function __construct(string $slug, Registrar $registrar) {
      $this->slug = $slug;
      $this->postType = jvbCheckBase($slug);
@@ -23,6 +25,9 @@
      add_filter('post_type_archive_link', [$this, 'handlePostTypeArchiveLinks'], 15, 2);
      add_filter('query_vars', [$this, 'addQueryVars']);
      add_action('init', [$this, 'addCalendarRewrites']);
      $this->hook = BASE.'mark_'.$this->slug.'_passed';
      add_action($this->hook, [$this, 'markPassed']);
   }
@@ -47,15 +52,15 @@
         ],
         'date_start' => [
            'type'      => 'date',
            'label'     => __('Date', 'jvb'),
            'label'     => 'Date',
         ],
         'time_start' => [
            'type'      => 'time',
            'label'     => __('Time Start', 'jvb'),
            'label'     => 'Time Start',
         ],
         'time_end' => [
            'type'      => 'time',
            'label'     => __('Time End', 'jvb'),
            'label'     => 'Time End',
         ],
         'make_multiple' => [
            'type'      => 'true_false',
@@ -64,7 +69,7 @@
         ],
         'date_end' => [
            'type'      => 'date',
            'label'     => __('Date End', 'jvb'),
            'label'     => 'Date End',
            'condition' => [
               'field' => 'make_multiple',
               'operator' => '==',
@@ -73,22 +78,22 @@
         ],
         'past' => [
            'type'      => 'true_false',
            'label'     => __('Past Event', 'jvb'),
            'label'     => 'Past Event',
            'hidden'    => true,
         ],
         'year' => [
            'type'      => 'number',
            'label'     => __('Year', 'jvb'),
            'label'     => 'Year',
            'hidden'    => true,
         ],
         'month' => [
            'type'      => 'number',
            'label'     => __('Month', 'jvb'),
            'label'     => 'Month',
            'hidden'    => true,
         ],
         'day' => [
            'type'      => 'number',
            'label'     => __('Day', 'jvb'),
            'label'     => 'Day',
            'hidden'    => true,
         ],
         'schedule' => [
@@ -121,7 +126,7 @@
         ],
         'max_participants' => [
            'type'      => 'number',
            'label'     => __('Maximum Participants', 'jvb'),
            'label'     => 'Maximum Participants',
         ],
         'is_free' => [
            'type' => 'true_false',
@@ -300,12 +305,8 @@
         foreach ($values as $key => $value) {
            if (!empty($value)) {
               $url = str_replace("%e$key%", $value, $url);
            }
         }
         $doubleCheck = ['eyear', 'emonth', 'eday'];
         foreach ($doubleCheck as $check) {
            if (str_contains($url, $check)) {
               $url = str_replace("/%e$check%", '', $url);
            } else {
               $url = str_replace("/%e$key%", '', $url);
            }
         }
      }
@@ -328,10 +329,106 @@
      return $vars;
   }
   protected function scheduleMarkPassed():void
   {
      if (!wp_next_scheduled($this->hook)) {
         $time = strtotime('tomorrow at 12:01am');
         wp_schedule_event($time, 'daily', $this->hook);
      }
   }
      public function markPassed():void
      {
         $now = date('Y-m-d');
         $items = new WP_Query([
            'post_type'       => $this->postType,
            'posts_per_page'  => -1,
            'post_status'     => 'publish',
            'meta_query'      => [
               'relation'  => 'AND',
               [
                  'key' => BASE.'past',
                  'value'  => '1',
                  'compare'=> '!='
               ],
               [
                  'key' => BASE.'date_start',
                  'value'  => $now,
                  'compare'   => '<',
                  'type'   => 'DATETIME'
               ]
            ],
            'fields' => 'ids',
         ]);
         if ($items->have_posts()) {
            foreach ($items->posts as $ID) {
               $meta = Meta::forPost($ID);
               $meta->set('past', '1');
            }
         }
      }
   public function addCalendarRewrites():void
   {
      $this->scheduleMarkPassed();
      add_rewrite_tag('%eyear%', '([^&]+)');
      add_rewrite_tag('%emonth%', '([^&]+)');
      add_rewrite_tag('%eday%', '([^&]+)');
      $registrar = Registrar::getInstance($this->slug);
      $base = $registrar->registrar->rewrite['slug']??$this->slug;
      // Adds the rewrite rule to capture URLs with year, month, and day.
      add_rewrite_rule(
         '^'.$base.'/([0-9]{4})/([0-9]{2})/([0-9]{2})/?$',
         'index.php?post_type='.$this->postType.'&eyear=$matches[1]&emonth=$matches[2]&eday=$matches[3]',
         'top'
      );
         add_rewrite_rule(
            '^'.$base.'/([0-9]{4})/([0-9]{2})/([0-9]{2})/page/([0-9-]+)/?$',
            'index.php?post_type='.$this->postType.'&eyear=$matches[1]&emonth=$matches[2]&eday=$matches[3]&paged=$matches[4]',
            'top'
         );
      // Adds the rewrite rule to capture URLs with year, month only.
      add_rewrite_rule(
         '^'.$base.'/([0-9]{4})/([0-9]{2})/?$',
         'index.php?post_type='.$this->postType.'&eyear=$matches[1]&emonth=$matches[2]',
         'top'
      );
         add_rewrite_rule(
            '^'.$base.'/([0-9]{4})/([0-9]{2})/page/([0-9-]+)/?$',
            'index.php?post_type='.$this->postType.'&eyear=$matches[1]&emonth=$matches[2]&paged=$matches[3]',
            'top'
         );
      // Adds the rewrite rule to capture URLs with year only.
      add_rewrite_rule(
         '^'.$base.'/([0-9]{4})/?$',
         'index.php?post_type='.$this->postType.'&eyear=$matches[1]',
         'top'
      );
         add_rewrite_rule(
            '^'.$base.'/([0-9]{4})/page/([0-9-]+)/?$',
            'index.php?post_type='.$this->postType.'&eyear=$matches[1]&paged=$matches[2]',
            'top'
         );
      // Adds the rewrite rule for all events
      add_rewrite_rule(
         '^'.$base.'/?$',
         'index.php?post_type='.$this->postType,
         'top'
      );
         add_rewrite_rule(
            '^'.$base.'/page/([0-9-]+)/?$',
            'index.php?post_type='.$this->postType.'&paged=$matches[1]',
            'top'
         );
      add_rewrite_rule(
         "^{$base}/([^/]+)/?$",
         "index.php?post_type={$this->postType}&name=\$matches[1]",
         'top'
      );
   }
}