| | |
| | | use JVBase\meta\Meta; |
| | | use JVBase\registrar\Registrar; |
| | | use WP_Post; |
| | | use WP_Query; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | |
| | | class MakeCalendarType { |
| | | protected string $slug; |
| | | protected string $postType; |
| | | protected Registrar $registrar; |
| | | private Registrar $registrar; |
| | | protected string $hook; |
| | | public function __construct(string $slug, Registrar $registrar) { |
| | | $this->slug = $slug; |
| | | $this->postType = jvbCheckBase($slug); |
| | |
| | | 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']); |
| | | } |
| | | |
| | | |
| | | public function __debugInfo() { |
| | | $vars = get_object_vars($this); |
| | | unset($vars['registrar']); |
| | | return $vars; |
| | | } |
| | | |
| | | protected function addCalendarFields():void |
| | |
| | | ], |
| | | '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', |
| | |
| | | ], |
| | | 'date_end' => [ |
| | | 'type' => 'date', |
| | | 'label' => __('Date End', 'jvb'), |
| | | 'label' => 'Date End', |
| | | 'condition' => [ |
| | | 'field' => 'make_multiple', |
| | | 'operator' => '==', |
| | |
| | | ], |
| | | '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' => [ |
| | |
| | | ], |
| | | 'max_participants' => [ |
| | | 'type' => 'number', |
| | | 'label' => __('Maximum Participants', 'jvb'), |
| | | 'label' => 'Maximum Participants', |
| | | ], |
| | | 'is_free' => [ |
| | | 'type' => 'true_false', |
| | |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | |
| | | 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' |
| | | ); |
| | | |
| | | } |
| | | } |