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);
$mainConfig = JVB_CONTENT[$content]??false;
if ($mainConfig && array_key_exists('feed', $mainConfig) && array_key_exists('config', $mainConfig['feed'])){
$config = array_merge($config, $mainConfig['feed']['config']);
} else {
$config['content'] = $content;
$config['icon'] = JVB_CONTENT[$content]['icon']??[jvbLogoIcon()];
}
if (is_singular()) {
$config['source'] = $type->ID;
}
$config['taxonomies'] = $this->getTaxonomies([$content]);
} elseif (is_tax()) {
$content = jvbNoBase($type->taxonomy);
$mainConfig = JVB_TAXONOMY[$content]??false;
if ($mainConfig) {
$config['content'] = $mainConfig['for_content'];
$config['context'] = $content; // ← ADD THIS
$config['taxonomies'] = $this->getTaxonomies($mainConfig['for_content']);
if (array_key_exists('feed', $mainConfig) && array_key_exists('config', $mainConfig['feed'])){
$config = array_merge($config, $mainConfig['feed']['config']);
}
}
$config['source'] = $type->term_id;
}
if (!is_array($config['content'])) {
$config['content'] = [$config['content']];
}
return $config;
}
/**
* Get taxonomies for given content types
* Uses Checker instead of globals
*/
protected function getTaxonomies(array $content): array
{
$checker = Checker::getInstance();
$taxonomies = [];
foreach ($content as $contentType) {
$contentTaxonomies = $checker->getTaxonomiesForContent($contentType);
$contentTaxonomies = array_filter($contentTaxonomies, function($taxonomy) {
return array_key_exists('show_feed', JVB_TAXONOMY[$taxonomy]) && JVB_TAXONOMY[$taxonomy]['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();
?>
Try tweaking those filters a bit.