setIcon('arrows-left-right') ->make([ 'rewrite' => [ 'slug' => 'before-and-after', 'with_front' => false, ], 'taxonomies' => [ 'age', 'body_part', 'goal', 'number', 'person', 'skin_type', 'style', 'theme', 'timeline', ] ]) ->setAll([ 'show_directory', 'show_feed', 'hide_children', 'is_timeline', 'add_image_column' ]); $breadcrumb = $progress->config('breadcrumbs'); $breadcrumb->setTitle('Before & Afters'); //$directory = $progress->getConfig('directory'); } function altr_progress_fields():void { if (!class_exists('JVBase\registrar\Registrar')) { return; } $progress = Registrar::getInstance('progress'); $breadcrumbs = $progress->config('breadcrumbs'); $breadcrumbs->setCrumb(['project', 'form']); $fields = $progress->fields(); $fields->modifyField('post_title', 'for_all', true); $fields->modifyField('post_status', 'for_all', true); $fields->modifyField('post_date', 'for_all', true); $fields->modifyField('post_thumbnail', 'for_all', true); $fields->addField('person', [ 'type' => 'selector', 'subtype' => 'taxonomy', 'taxonomy' => 'person', 'label' => 'Person', 'quickEdit' => true, 'createNew' => true, 'section' => 'progression', 'hint' => 'Not public, just to make it easier to find', ]); $fields->addField('body_part', [ 'type' => 'selector', 'subtype' => 'taxonomy', 'taxonomy' => 'body_part', 'label' => 'Body Part', 'quickEdit' => true, 'createNew' => true, 'section' => 'progression', ]); $fields->addField('goal', [ 'type' => 'selector', 'subtype' => 'taxonomy', 'taxonomy' => 'goal', 'label' => 'Goal', 'quickEdit' => true, 'createNew' => true, 'section' => 'progression', ]); $fields->addField('timeline', [ 'type' => 'selector', 'subtype' => 'taxonomy', 'taxonomy' => 'timeline', 'label' => 'Timeline', 'quickEdit' => true, 'for_all' => true, 'createNew' => true, 'section' => 'progression', ]); $fields->addField('style', [ 'type' => 'selector', 'subtype' => 'taxonomy', 'taxonomy' => 'style', 'label' => 'Tattoo Style', 'quickEdit' => true, 'createNew' => true, 'section' => 'progression', ]); $fields->addField('theme', [ 'type' => 'selector', 'subtype' => 'taxonomy', 'taxonomy' => 'theme', 'label' => 'Tattoo Theme', 'quickEdit' => true, 'createNew' => true, 'section' => 'progression', ]); $fields->addField('skin_type', [ 'type' => 'selector', 'subtype' => 'taxonomy', 'taxonomy' => 'skin_type', 'label' => 'Skin Type', 'quickEdit' => true, 'createNew' => true, 'section' => 'progression', ]); $fields->addField('age', [ 'type' => 'selector', 'subtype' => 'taxonomy', 'taxonomy' => 'age', 'label' => 'Age of Tattoo', 'quickEdit' => true, 'createNew' => true, 'section' => 'progression', ]); $fields->addField('number', [ 'type' => 'text', 'subtype' => 'number', 'label' => 'Number of Treatments', 'quickEdit' => true, 'for_all' => true, 'section' => 'progression', ]); $fields->modifyField('post_content', 'for_all', true); $fields->modifyField('post_content', 'label', 'About this Timeline Point'); $fields->addField('last_date', [ 'type' => 'text', 'subtype' => 'number', 'label' => 'Last Date', 'hidden' => true, ]); $fields->addField('is_update', [ 'type' => 'true_false', 'label' => 'Is Update', 'hint' => 'If this point is not another treatment, but just an update in the progress', 'for_all' => true, ]); $feed = $progress->config('feed'); $feed->setCustomOrder([ [ 'slug' => 'number', 'label' => 'Number of Treatments', 'icon' => 'hash-straight', 'for' => 'progress' ] ] ); $feed->setFields([ 'post_title', 'post_date', 'post_modified', 'post_excerpt', 'goal', 'body_part', 'skin_type', 'age', 'style', 'theme', ]); // $directory = $progress->config('directory'); // $directory->setDirectoryExtra([ // 'goal', // 'skin_type', // 'age' // ]); } function altr_progressTitleAlts():array { return [ ': Before & After Laser Tattoo Removal', ': Before & After Tattoo Removal', ': Tattoo Removal Progress', ': Tattoo Removal Results', ': Before & After', ]; } function altr_progress_schema():array { return [ 'type' => 'JVBase\inc\managers\SEO\render\Thing\CreativeWork\WebPage\CollectionPage\ImageGallery', 'name' => '{{post_title}} | Before and After Laser Tattoo Removal', 'description' => '{{post_excerpt}}', 'temporalCoverage' => '{{post_date}}/{{last_date}}', 'additionalProperty'=> [ ['id'=> 'number-of-sessions','name' => 'Number of sessions', 'value' => '{{number}}'], ['id' => 'treatment-area','name' => 'Treatment area', 'value' => '{{body_part.name}}'], ['id' => 'tattoo-style','name' => 'Tattoo style', 'value' => '{{style.name}}'], ['id' => 'skin-type','name' => 'Skin type', 'value' => '{{skin_type.name}}'], ['id' => 'goal','name' => 'Goal', 'value' => '{{goal.name}}'], ], ]; } function altr_build_singular_progress_schema(int $ID):array { $schema = []; $work = new Report(); $meta = Meta::forPost($ID); $title = $meta->get('post_title'); $id = 'case-study-'.sanitize_title($title); $work->setId($id); $work->setName($meta->get('post_title'). ' | Before & After Tattoo Removal'); $work->setDescription($meta->get('post_excerpt')); $procedure = new MedicalProcedure(); $procedure->setId('laser-tattoo-removal'); $procedure->setName('Laser Tattoo Removal'); if (!empty($meta->get('body_part'))) { $parts = array_map('absint', explode(',', $meta->get('body_part'))); $parts = array_filter(array_map(function($ID) { $term = get_term($ID, BASE.'body_part'); if ($term && !is_wp_error($term)) { return $term->name; } return false; }, $parts)); $location = jvbCommaList($parts); $procedure->setBodyLocation($location); } $work->setAbout($procedure); $fields = ['goal', 'style', 'theme','skin_type', 'age']; $keywords = ['laser tattoo removal', 'PicoWay',]; foreach ($fields as $tax) { $terms = $meta->get($tax); if (!empty($terms)) { $terms = array_map('absint', explode(',', $terms)); $terms = array_filter(array_map(function($ID) use ($tax) { $term = get_term($ID, BASE.$tax); if ($term && !is_wp_error($term)) { $base = match ($tax) { 'skin_type' => 'FitzPatrick Type ', 'age' => 'removing a ', default => '' }; $suffix = $tax === 'age' ? ' old tattoo' : ''; $value = $term->name === 'Complete Removal' ? 'Complete Tattoo Removal' : $term->name; return $base.$value.$suffix; } return false; }, $terms)); $keywords = array_merge($keywords, $terms); } } $work->setKeywords($keywords); //Setup the various parts; $observations = []; $gallery = new ImageGallery(); $gallery->setId($id.'-gallery'); $gallery->setName('Before & After Photo Gallery'); $galleryItems = []; //Grab the children and set the parent at the front $points = get_children(['post_parent' => $ID, 'orderby' => 'date', 'order' => 'ASC', 'post_status' => 'publish', 'fields' => 'ids']); array_unshift($points, $ID); $temporalCoverage = date('Y-m-d', strtotime($meta->get('post_date'))); $base = sanitize_title($meta->get('post_title')); $last = array_key_last($points); foreach ($points as $index => $point) { $pointMeta = Meta::forPost($point); // $observation = new \JVBase\inc\managers\SEO\render\Thing\Intangible\Observation(); $image = Resolver::imgIDToSchema($pointMeta->get('post_thumbnail')); $id = $index === 0 ? '-before-tattoo-removal' : '-treatment-'.$index; // $observation->setId($base.'-observation'.$id); $image->setId($base . $id); $name = $index === 0 ? 'Before Laser Tattoo Removal' : 'After Treatment '.$index; $image->setName($name); $description = $pointMeta->get('post_excerpt'); $timeline = $pointMeta->get('timeline'); if (!empty($timeline)) { $time = array_map('absint', explode(',', $timeline)); $time = array_filter(array_map(function($ID) { $term = get_term($ID, BASE.'timeline'); return $term->name??false; }, $time)); $time = jvbCommaList($time); $description .= 'Photo taken '.$time.' after treatment '.$index; } $image->setDescription($description); $image->setDateCreated($pointMeta->get('post_date')); $galleryItems[] = $image; if ((int)$index === (int)$last) { $temporalCoverage .= '/'. date('Y-m-d', strtotime($pointMeta->get('post_date'))); } } $hasPart= []; if (!empty ($galleryItems)) { $gallery->setImage($galleryItems); $schema[] = $gallery->outputSchema(); $hasPart[] = ['@id' => $gallery->getId()]; } //Set the temporal coverage (date start/date end) $work->setTemporalCoverage($temporalCoverage); $work->setCreator(SchemaHelper::reference('organization')); $output = $work->outputSchema(); if (!empty($hasPart)) { $output['hasPart'] = $hasPart; } array_unshift($schema, $output); return $schema; } function altr_build_singular_progress_schema_reference(int $ID):Report { $work = new Report(); $meta = Meta::forPost($ID); $url = get_the_permalink($ID); $title = $meta->get('post_title'); $id = 'case-study-'.sanitize_title($title); $work->setId($url.'/#'.$id); $work->setUrl($url); $work->setName($title.' | Before & After Tattoo Removal'); $points = get_children(['post_parent' => $ID, 'orderby' => 'date', 'order' => 'ASC', 'post_status' => 'publish', 'fields' => 'ids']); $description = 'A '; $themes = $meta->get('theme'); if (!empty($themes)) { $description .= jvbCommaList(array_filter(array_map(function($ID) { $term = get_term($ID, BASE.'theme'); return $term->name??false; }, explode(',', $themes)))).' '; } $style = $meta->get('style'); if (!empty($style)) { $description .= jvbCommaList(array_filter(array_map(function($ID) { $term = get_term($ID, BASE.'theme'); return $term->name??false; }, explode(',', $style)))).' '; } $description .= 'tattoo before any laser tattoo removal treatments, and after '.count($points).' treatments.'; $work->setDescription($description); $last = $points[array_key_last($points)]; $lastMeta = Meta::forPost($last); $temporalCoverage = date('Y-m-d', strtotime($meta->get('post_date'))).'/'. date('Y-m-d', strtotime($lastMeta->get('post_date'))); $work->setTemporalCoverage($temporalCoverage); return $work; } function altr_progress_meta():array { return[ 'title' => '{{post_title}}', 'description' => 'See this {{style.name}} {{theme.name}} {{age.name}}-old tattoo before and after {{number}} laser tattoo removal treatments on the {{body_part.name}}.', ]; } function altr_progress_archive(array $defaults):array { return array_merge($defaults, [ 'name' => 'Tattoos Before and After Laser Tattoo Removal', ]); } function altr_progress_reference_schema(array $defaults):array { return $defaults; } //function altr_progress():array //{ // return [ // 'singular' => 'Before & After', // 'plural' => 'Before & Afters', // 'dash_title' => 'Progress', // 'dash_description' => 'Manage your before and after posts', // 'breadcrumb' => 'Before & Afters', // 'capability_type' => ['progress', 'progress'], // 'hide_children' => true, // 'is_timeline' => true, // 'show_feed' => true, // 'show_directory'=> true, // 'directory_extra'=> ['goal', 'skin-type','age'], // 'hierarchical' => true, // 'icon' => 'arrows-left-right', // 'rewrite' => [ // 'slug' => 'before-and-after', // 'with_front' => false, // ], // 'sections' => [ // 'progression' => [ // 'label' => 'Progression', // ] // ], // 'custom_order' => [ // 'number' => [ // 'label' => 'Number of Treatments', // 'icon' => 'hash-straight', // 'for' => 'progress', // ] // ], // 'seo' => [ // 'schema' => [ // 'type' => 'BeforeAfter', // 'name' => '{{post_title}}', // 'description' => '{{post_excerpt}}', // 'temporalCoverage' => '{{post_date}}/{{last_date}}', // 'additionalProperty' => [ // ['name' => 'Number of sessions', 'value' => '{{number.name}}'], // ['name' => 'Treatment area', 'value' => '{{body-part.name}}'], // ['name' => 'Tattoo style', 'value' => '{{style.name}}'], // ['name' => 'Skin type', 'value' => '{{skin-type.name}}'], // ['name' => 'Goal', 'value' => '{{goal.name}}'], // ], // 'associatedMedia' => '{{timeline_photos}}', // ], // 'meta' => [ // 'title' => '{{style.name}} {{theme.name}} Tattoo – Before & After {{number}} Laser Removal Sessions', // 'description' => 'See this {{style.name}} {{theme.name}} {{age.name}}-old tattoo before and after {{number}} laser tattoo removal treatments on the {{body_part.name}}.', // ], // 'archive' => [ // 'type' => 'CollectionPage', // 'name' => 'Tattoos Before and After Laser Tattoo Removal', // ], // ], // 'feed' => [ // 'single' => [ // 'pre_title' => 'Before & After Laser Tattoo Removal', // ], // 'archive' => [ // // ], // 'config' => [ // 'is_gallery' => false, // 'content' => 'progress', // 'context' => 'progress', // 'id' => [], // 'class' => [], // ] // ], // 'fields' => [ // 'post_title' => [ // 'type' => 'text', // 'label' => 'Title', // 'quickEdit' => true, // 'section' => 'progression', // 'for_all' => true, // ], // 'post_status' => [ // 'type' => 'radio', // 'label' => 'Status', // 'options' => [ // 'publish' => 'Show', // 'draft' => 'Hide', // 'trash' => 'Scrap', // 'delete' => 'Permanently Delete' // ], // 'for_all' => true, // ], // 'post_date' => [ // 'type' => 'date', // 'label' => 'Date', // 'for_all' => true, // ], // 'post_thumbnail' => [ // 'type' => 'upload', // 'label' => 'Image', // 'quickEdit' => true, // 'section' => 'progression', // 'for_all' => true, // ], // 'person' => [ // 'type' => 'taxonomy', // 'taxonomy' => 'person', // 'autocomplete' => true, // 'label' => 'Person', // 'quickEdit' => true, // 'createNew' => true, // 'section' => 'progression', // 'hint' => 'Not public, just to make it easier to find' // ], // 'body-part' => [ // 'type' => 'taxonomy', // 'taxonomy' => 'body-part', // 'label' => 'Body Part', // 'autocomplete' => true, // 'quickEdit' => true, // 'createNew' => true, // 'section' => 'progression' // ], // 'goal' => [ // 'type' => 'taxonomy', // 'taxonomy' => 'goal', // 'autocomplete' => true, // 'label' => 'Goal', // 'quickEdit' => true, // 'createNew' => true, // 'section' => 'progression' // ], // 'timeline' => [ // 'type' => 'taxonomy', // 'taxonomy' => 'timeline', // 'autocomplete' => true, // 'label' => 'Timeline', // 'quickEdit' => true, // 'createNew' => true, // 'section' => 'progression', // 'for_all' => true, // 'hidden' => true, // ], // 'style' => [ // 'type' => 'taxonomy', // 'taxonomy' => 'style', // 'autocomplete' => true, // 'label' => 'Tattoo Style', // 'quickEdit' => true, // 'createNew' => true, // 'section' => 'progression' // ], // 'theme' => [ // 'type' => 'taxonomy', // 'taxonomy' => 'theme', // 'autocomplete' => true, // 'label' => 'Tattoo Theme', // 'quickEdit' => true, // 'createNew' => true, // 'section' => 'progression' // ], // 'skin-type' => [ // 'type' => 'taxonomy', // 'taxonomy' => 'skin-type', // 'label' => 'Skin Type', // 'autocomplete' => true, // 'quickEdit' => true, // 'createNew' => true, // 'section' => 'progression' // ], // 'age' => [ // 'type' => 'taxonomy', // 'taxonomy' => 'age', // 'autocomplete' => true, // 'label' => 'Age of Tattoo', // 'quickEdit' => true, // 'createNew' => true, // 'section' => 'progression' // ], // 'number' => [ // 'type' => 'text', // 'subtype' => 'number', // 'label' => 'Number of Treatments', // 'quickEdit' => true, // 'section' => 'progression', // 'for_all' => true, // 'hidden' => true, //auto calculated // ], // 'post_content' => [ // 'type' => 'textarea', // 'quill' => true, // 'label' => 'Notes', // 'section' => 'progression', // 'for_all' => true, // ], // 'last_date' => [ // 'type' => 'number', // 'label' => 'Last Date', // 'hidden' => true, // 'default' => 0, // 'for_all' => true, // ] // ], // 'upload_title' => 'Upload Before & Afters', // ]; //} function altr_render_progress_field_post_modified(?int $ID = null, bool $isTemplate = false):string { $points = is_null($ID) ? [] : jvbTimelinePoints($ID, BASE.'progress'); $value = ''; if (!empty($points)){ $last = $points[array_key_last($points)]; $lastMeta = Meta::forPost($last); $value = $lastMeta->get('post_date'); } return $isTemplate || !empty($value) ? sprintf( '
Started:
Last treated:
Total Treatments: