| | |
| | | if (!defined('ABSPATH')) { |
| | | exit; // Exit if accessed directly |
| | | } |
| | | |
| | | /** |
| | | * Feed block render callback |
| | | * |
| | | * @param array $attributes Block attributes. |
| | | * @param string $content Block content. |
| | | * @param WP_Block $block Block instance. |
| | | * @return string Rendered block type output. |
| | | */ |
| | | function jvbRenderFeedBlock($attributes, $content = '', $block = null) |
| | | { |
| | | |
| | | ob_start(); |
| | | // Get block settings |
| | | global $jvb_taxonomy_for; |
| | | global $jvb_everything; |
| | | $context = ''; |
| | | |
| | | $taxonomies = []; |
| | | |
| | | foreach ($jvb_taxonomy_for as $tax => $for) { |
| | | if (array_intersect($for, $attributes['contentTypes'])) { |
| | | $taxonomies[] = $tax; |
| | | } |
| | | } |
| | | |
| | | $settings = [ |
| | | 'content' => $attributes['contentTypes'][0] ?? 'tattoo', |
| | | 'contentTypes' => $attributes['contentTypes'], |
| | | 'taxonomies' => $taxonomies, |
| | | 'defaultOrder' => $attributes['defaultOrder'], |
| | | 'itemsPerPage' => $attributes['itemsPerPage'], |
| | | ]; |
| | | |
| | | $isGallery = false; |
| | | if ($attributes['inheritQuery']) { |
| | | $obj = get_queried_object(); |
| | | $taxonomies = $contentTypes = []; |
| | | if (is_singular()) { |
| | | switch ($obj->post_type) { |
| | | case BASE.'artist': |
| | | case BASE.'partner': |
| | | $contentTypes = jvbGetUserContentTypes(get_the_ID()); |
| | | break; |
| | | } |
| | | |
| | | if ($obj->post_type == BASE.'artist') { |
| | | $isGallery = true; |
| | | $context = 'artist'; |
| | | $name = get_post_meta($obj->id, 'jvb_first_name', true); |
| | | $feed_data['title'] = ($name== '') ? $obj->post_title : $name; |
| | | } elseif ($obj->post_type == BASE.'partner') { |
| | | $context = 'partner'; |
| | | $feed_data['title'] = 'Offers:'; |
| | | } |
| | | $type = 'post'; |
| | | } elseif (is_tax('jvb_shop')) { |
| | | $context = 'shop'; |
| | | $feed_data['title'] = 'At the Shop:'; |
| | | $contentTypes = [ |
| | | 'artist', |
| | | 'tattoo', |
| | | 'piercing', |
| | | // 'event' |
| | | ]; |
| | | $type = 'term'; |
| | | } elseif (is_tax()) { |
| | | $context = str_replace(BASE, '', $obj->taxonomy); |
| | | |
| | | foreach ($jvb_taxonomy_for as $tax => $for) { |
| | | if ($context === $tax) { |
| | | $contentTypes = $for['types']; |
| | | } |
| | | } |
| | | $type = 'term'; |
| | | $context = 'taxonomy:'.$context; |
| | | } |
| | | jvbDump($settings); |
| | | jvbDump($contentTypes); |
| | | if (empty($contentTypes)) { |
| | | return; |
| | | } |
| | | foreach ($contentTypes as $index => $type) { |
| | | $contentTypes[$index] = str_replace(BASE, '', $type); |
| | | } |
| | | foreach ($jvb_taxonomy_for as $tax => $for) { |
| | | if (array_intersect($for, $contentTypes)) { |
| | | $taxonomies[] = $tax; |
| | | } |
| | | } |
| | | |
| | | $feed_data = [ |
| | | 'content' => $contentTypes[0], |
| | | 'contentTypes' => $contentTypes, |
| | | 'taxonomies' => $taxonomies, |
| | | 'context' => $context, |
| | | ]; |
| | | if ($isGallery) { |
| | | $feed_data['isGallery'] = true; |
| | | } |
| | | |
| | | $settings = array_merge($settings, $feed_data); |
| | | $title = !array_key_exists('title', $settings) ? '' : '<h2 id="work">'.$feed_data['title'].'</h2>'; |
| | | |
| | | } else { |
| | | $title = $attributes['title'] ? "<h2>{$attributes['title']}</h2>" : ''; |
| | | } |
| | | |
| | | $many = count($settings['contentTypes']) > 1; |
| | | $work = is_singular(BASE.'artist') ? ' id="work"' : ''; |
| | | |
| | | $source = get_queried_object_id(); |
| | | global $jvb_feed; |
| | | |
| | | if (empty($settings['contentTypes'])) { |
| | | return; |
| | | } |
| | | ?> |
| | | |
| | | <section <?= $work ?> class="feed-block" |
| | | data-source="<?= get_queried_object_id(); ?>"<?= ($context !== '') ? ' |
| | | data-context="'.$context.'"' : '' ?><?= ($isGallery) ? ' data-gallery="true"' : ''?>> |
| | | <?= $title ?> |
| | | |
| | | <form class="feed-filters"> |
| | | <?= (!$many) ? '' : '<details>' ?> |
| | | <?php if ($many) : ?> |
| | | <summary class="row btw"> |
| | | <div class="type-filter label"> |
| | | <span>SHOW:</span> |
| | | </div> |
| | | <?php |
| | | foreach ($settings['contentTypes'] as $i => $type) : |
| | | $checked = $i === 0 ? ' checked' : ''; |
| | | |
| | | $label = $jvb_everything[$type]['plural']; |
| | | ?> |
| | | <div class="type-filter"> |
| | | <input type="radio" |
| | | id="filter-<?= esc_attr($type) ?>" |
| | | class="btn" |
| | | name="content" |
| | | value="<?= esc_attr($type) ?>" |
| | | <?= $checked ?>> |
| | | <label for="filter-<?= esc_attr($type) ?>" title="Show <?= $label ?>"> |
| | | <?= jvbIcon($type, ['title'=> $label]) ?> |
| | | <span class="label"><?= $label ?></span> |
| | | </label> |
| | | </div> |
| | | <?php endforeach; ?> |
| | | <?php endif; ?> |
| | | |
| | | <?php if (is_user_logged_in()) : ?> |
| | | <div class="type-filter favourites-toggle"> |
| | | <input type="checkbox" id="favourites_only" class="btn" name="favourites_only"> |
| | | <label for="favourites_only" title="Show Favourites"> |
| | | <?= jvbIcon('heart', ['title' =>'Favourites']) ?> |
| | | <span class="label">Favourites</span> |
| | | </label> |
| | | </div> |
| | | <?php endif; ?> |
| | | |
| | | <?php if ($many) { |
| | | echo '</summary>'; |
| | | } ?> |
| | | |
| | | <div class="filters"> |
| | | <div class="filter-group"> |
| | | <div class="type-filter label"> |
| | | <span>FILTER:</span> |
| | | </div> |
| | | |
| | | <?php foreach ($jvb_taxonomy_for as $tax => $items) : |
| | | $label = $jvb_everything[$tax]['plural']; |
| | | $hidden = !in_array($tax, $settings['taxonomies']) ? ' hidden' : ''; |
| | | |
| | | $tax = new JVBase\Forms\TaxonomySelector( |
| | | $tax, |
| | | BASE.$tax, |
| | | [ |
| | | 'label' => $label, |
| | | 'types' => $items, |
| | | 'hidden'=> $hidden |
| | | ] |
| | | ); |
| | | echo $tax->renderFeed(); |
| | | endforeach; ?> |
| | | </div> |
| | | <div class="selected-items-section"> |
| | | <div class="selected-items"></div> |
| | | <div class="filter-actions"> |
| | | <?= jvbRenderToggleTextField('match', 'Match', 'Filters', 'ALL', 'ANY', true) ?> |
| | | <button type="button" class="clear-filters row" hidden> |
| | | <?= jvbIcon('close', ['title' => 'Clear']) ?> |
| | | Clear All Filters |
| | | </button> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="order-options"> |
| | | <div class="order-by"> |
| | | <span class="type-filter label">ORDER:</span> |
| | | <div class="radio-group-label"> |
| | | <input type="radio" id="order-title" class="btn" name="orderby" value="title" data-for="artist,shop" hidden> |
| | | <label for="order-title" title="Order by Name"> |
| | | <?= jvbIcon('alphabetical') ?> |
| | | <span class="label">Name</span> |
| | | </label> |
| | | |
| | | <input type="radio" id="order-date" class="btn" name="orderby" value="date" checked> |
| | | <label for="order-date" title="Order by Date"> |
| | | <?= jvbIcon('calendar', ['title'=>'Date']) ?> |
| | | <span class="label">Date</span> |
| | | </label> |
| | | |
| | | <input type="radio" id="order-random" class="btn" name="orderby" value="random"> |
| | | <label for="order-random" title="Random Order"> |
| | | <?= jvbIcon('random') ?> |
| | | <span class="label">Random</span> |
| | | </label> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="order-direction radio-group-label" data-for-order="date,title"> |
| | | <input type="radio" id="order-desc" class="btn" name="order" value="desc" checked> |
| | | <label for="order-desc" title="Newest First"> |
| | | <?= jvbIcon('desc') ?> |
| | | </label> |
| | | |
| | | <input type="radio" id="order-asc" class="btn" name="order" value="asc"> |
| | | <label for="order-asc" title="Oldest First"> |
| | | <?= jvbIcon('asc') ?> |
| | | </label> |
| | | </div> |
| | | </div> |
| | | <?= (!$many) ? '' : '</details>' ?> |
| | | </form> |
| | | |
| | | <div class="feed-grid"></div> |
| | | |
| | | |
| | | </section> |
| | | <?= jvbGetFeedItemTemplate(); ?> |
| | | <?= jvbGetFeedArtistTemplate(); ?> |
| | | <?php |
| | | return ob_get_clean(); |
| | | } |