name;
}
public function get_unique_id() {
return $this->unique_id;
}
/**
* Check if the block can be enabled.
*
* @return bool
*/
public function can_enable() {
return true;
}
/**
* Register scripts and styles for the block.
*/
public function register_scripts() {
// The styles are already registered in Scripts.php blocks() method
// This method is called to ensure the block is properly initialized
}
/**
* Get default attributes for the block.
*
* @return array
*/
public function get_default_attributes() {
return [
'blockId' => '',
'categories' => [],
'includeCategories' => '',
'excludeCategories' => '',
'gridPerPage' => 9,
'orderBy' => 'doc_category_order',
'order' => 'asc',
'layout' => 'layout-3',
'showTitle' => true,
'titleTag' => 'h2',
'showIcon' => true,
'categoryIcon' => 'folder',
'categoryTitleLink' => true,
'gridColumns' => 4,
'gridSpace' => 48,
'selectKB' => '',
'postsPerPage' => 5,
'postsOrderBy' => 'betterdocs_order',
'postsOrder' => 'asc',
];
}
/**
* Render method required by Block class.
*
* @param array $attributes Block attributes.
* @param string $content Block content.
* @return void
*/
public function render( $attributes, $content ) {
$attributes = &$this->attributes;
echo '
';
$this->views( 'layouts/base' );
echo '
';
}
public function view_params() {
$attributes = &$this->attributes;
// Sanitize the layout attribute to prevent path traversal (LFI).
$attributes['layout'] = sanitize_file_name( $attributes['layout'] );
$terms_object = [
'taxonomy' => 'doc_category',
'order' => $attributes['order'],
'orderby' => $attributes['orderBy'],
'number' => isset( $attributes['gridPerPage'] ) ? $attributes['gridPerPage'] : 9,
'hide_empty' => true // Hide empty categories on frontend
];
if ( 'doc_category_order' === $attributes['orderBy'] ) {
$terms_object['meta_key'] = 'doc_category_order';
$terms_object['orderby'] = 'meta_value_num';
}
$includes = $this->string_to_array( $attributes['includeCategories'] );
$excludes = $this->string_to_array( $attributes['excludeCategories'] );
if ( ! empty( $includes ) ) {
$terms_object['include'] = array_diff( $includes, (array) $excludes );
}
if ( ! empty( $excludes ) ) {
$terms_object['exclude'] = $excludes;
}
$_wrapper_classes = [
'betterdocs-category-grid-three-wrapper',
'betterdocs-blocks-grid'
];
$layout_class = ( $attributes['layout'] === 'default' ) ? 'layout-1' : $attributes['layout'];
$_inner_wrapper_classes = [
'betterdocs-category-grid-inner-wrapper',
'layout-flex',
'docs-col-4',
$layout_class,
'betterdocs-column-' . ($attributes['gridColumnsRange'] ?? 3),
];
$wrapper_attr = [
'class' => $_wrapper_classes
];
$inner_wrapper_attr = [
'class' => $_inner_wrapper_classes,
'data-column_desktop' => $attributes['gridColumnsRange'] ?? 3,
'data-column_space_desktop' => $attributes['gridSpaceRange'] ?? 48,
];
$docs_query = [
'orderby' => isset( $attributes['postsOrderBy'] ) ? $attributes['postsOrderBy'] : 'betterdocs_order',
'order' => isset( $attributes['postsOrder'] ) ? $attributes['postsOrder'] : 'asc',
'posts_per_page' => isset( $attributes['postsPerPage'] ) ? $attributes['postsPerPage'] : 5,
];
$default_multiple_kb = betterdocs()->settings->get( 'multiple_kb' );
$select_kb = isset( $attributes['selectKB'] ) ? $attributes['selectKB'] : '';
if ( is_string( $select_kb ) && $select_kb !== '' ) {
$decoded = json_decode( $select_kb, true );
$select_kb = is_array( $decoded ) ? $decoded : [];
}
$kb_slug = is_array( $select_kb ) && isset( $select_kb['value'] ) ? $select_kb['value'] : '';
if ( is_tax( 'knowledge_base' ) && $default_multiple_kb == 1 ) {
$object = get_queried_object();
$kb_slug = $object->slug;
}
if ( ! empty( $kb_slug ) && $default_multiple_kb == 1 ) {
$terms_object['meta_query'] = [
'relation' => 'OR',
[
'key' => 'doc_category_knowledge_base',
'value' => $kb_slug,
'compare' => 'LIKE'
]
];
}
/**
* Add This Attribute When Using Outside Betterdocs Templates Only
*/
if ( $default_multiple_kb == 1 && ( ! empty( $kb_slug ) ) && ( ! betterdocs()->helper->is_templates() ) ) {
$inner_wrapper_attr['data-mkb-slug'] = $kb_slug;
}
return [
'wrapper_attr' => $wrapper_attr,
'inner_wrapper_attr' => $inner_wrapper_attr,
'terms_query_args' => betterdocs()->query->terms_query( $terms_object ),
'docs_query_args' => $docs_query,
'widget_type' => 'category-grid',
'layout' => $attributes['layout'],
'multiple_knowledge_base' => ( $default_multiple_kb && ! empty( $kb_slug ) ) ? true : false,
'kb_slug' => $kb_slug,
'layout_type' => 'block',
'show_title' => $attributes['showTitle'],
'title_tag' => $attributes['titleTag'],
'show_icon' => $attributes['showIcon'],
'category_icon' => $attributes['categoryIcon'],
'category_title_link' => $attributes['categoryTitleLink'],
'show_count' => false,
'show_header' => true,
'show_list' => true,
];
}
}