cache = Cache::for('feed_block', WEEK_IN_SECONDS);
if (JVB_TESTING) {
$this->cache->flush();
}
add_action('init', [$this, 'registerBlock']);
}
public function registerBlock()
{
register_block_type($this->path, [
'render_callback' => [$this, 'render']
]);
}
protected function buildParams(array $attributes): array
{
if (!jvbCheck('inheritQuery', $attributes)) {
return [
'title' => $attributes['title'],
'content' => $attributes['contentTypes'],
'taxonomies' => $this->getTaxonomies($attributes['contentTypes'])
];
}
$config = [
'is_gallery' => false,
'content' => '',
'taxonomies' => []
];
$type = get_queried_object();
if (is_post_type_archive() || is_singular()) {
$content = is_singular() ? jvbNoBase($type->post_type) : jvbNoBase($type->name);
$registrar = Registrar::getInstance($content)??false;
if ($registrar) {
$config = array_merge($config, $registrar->getConfig('feed'));
} else {
$config['content'] = $content;
$config['icon'] = jvbDefaultIcon();
}
if (is_singular()) {
$config['source'] = $type->ID;
}
$config['taxonomies'] = $this->getTaxonomies([$content]);
} elseif (is_tax()) {
$content = jvbNoBase($type->taxonomy);
$registrar = Registrar::getInstance($content)??false;
if ($registrar) {
$config['content'] = $registrar->registrar->for;
$config['context'] = $content;
$config['taxonomies'] = $this->getTaxonomies($registrar->registrar->for);
if (!empty($registrar->getConfig('feed'))){
$config = array_merge($config, $registrar->getConfig('feed'));
}
}
$config['source'] = $type->term_id;
}
if (!is_array($config['content'])) {
$config['content'] = [$config['content']];
}
return $config;
}
/**
* Get taxonomies for given content types
*/
protected function getTaxonomies(array $content): array
{
$taxonomies = [];
foreach ($content as $contentType) {
$registrar = Registrar::getInstance($contentType);
if (!$registrar) {
continue;
}
$contentTaxonomies = $registrar->registrar->taxonomies;
$contentTaxonomies = array_filter($contentTaxonomies, function($taxonomy) {
return Registrar::getInstance($taxonomy)?->hasFeature('show_feed');
});
$taxonomies = array_merge($taxonomies, $contentTaxonomies);
}
return array_unique($taxonomies);
}
public function render(array $attributes, string $content, WP_Block $block)
{
$this->config = $this->buildParams($attributes);
return $this->cache->remember(
$this->cache->generateKey($this->config),
function() {
return $this->renderBlock();
}
);
}
protected function getContext():string|bool
{
return array_key_exists('context', $this->config)?$this->config['context']:false;
}
protected function getIDS():array|bool
{
return (array_key_exists('ids', $this->config) && !empty($this->config['ids'])) ? $this->config['ids'] : false;
}
protected function getClasses():array|bool
{
return array_key_exists('classes', $this->config) && !empty($this->config['classes']) ? $this->config['classes'] : false;
}
protected function getSource():string|bool
{
return array_key_exists('source', $this->config) ? $this->config['source'] : false;
}
protected function getIcon():string|bool
{
return array_key_exists('icon', $this->config) ? $this->config['icon'] : false;
}
protected function isGallery():bool
{
return (array_key_exists('is_gallery', $this->config) && $this->config['is_gallery']);
}
protected function getContent():array|bool
{
return (array_key_exists('content', $this->config) && !empty ($this->config['content'])) ? $this->config['content'] : false;
}
protected function renderBlock(): string
{
if (is_post_type_archive(BASE.'directory')) {
return '';
}
$ids = ($this->getIDS()) ? ' id="'.implode(' ',$this->getIDS()).'"' : '';
$classes = ($this->getClasses()) ? ' class="'.implode(' ',$this->getClasses()).'"' : '';
$source = ($this->getSource()) ? ' data-source="'.$this->getSource().'"' : '';
$context = ($this->getContext()) ? ' data-context="'.$this->getContext().'"' : '';
$icons = ($this->getIcon()) ? ' data-icon="'.$this->getIcon().'"' : ' data-icon="'.jvbLogoIcon().'"';
$gallery = $this->isGallery() ? ' data-gallery' : '';
$content = ($this->getContent()) ? ' data-content="'.implode(',',$this->getContent()).'"' : '';
ob_start();
?>
Filters
getContext()?>
= CRUDSkeleton::searchFilter(); ?>
= CRUDSkeleton::viewFilter(['grid', 'list']); ?>
getContent() as $i => $type) :
$checked = $i === 0 ? ' checked' : '';
$label = $feedContent[$type]['plural'] ?? ucfirst($type);
?>
>
$label) {
$active = $i === 0 ? ' class="active"' : '';
?>
config['taxonomies'])) {
?>
Try tweaking those filters a bit.