*/
class BetterDocs_Elementor
{
public static $pro_active;
/**
* Short Description. (use period)
*
* Long Description.
*
* @since 1.3.0
*/
public static function init()
{
self::$pro_active = is_plugin_active('betterdocs-pro/betterdocs-pro.php');
add_action('elementor/editor/before_enqueue_scripts', [__CLASS__, 'editor_enqueue_scripts']);
if (is_plugin_active('betterdocs/betterdocs.php')) {
add_action('elementor/documents/register', [__CLASS__, 'register_singel_documents_page']);
add_action('elementor/documents/register', [__CLASS__, 'register_doc_category_archive']);
add_filter('elementor/theme/need_override_location', [__CLASS__, 'theme_template_include'], 10, 2);
add_action('betterdocs/elementor/widgets/query', [__CLASS__, 'betterdocs_query'], 10, 2);
add_action('elementor/widgets/register', [__CLASS__, 'register_basic_widgets']);
add_action('elementor/elements/categories_registered', [__CLASS__, 'register_widget_categories']);
add_filter('elementor/editor/localize_settings', [__CLASS__, 'promote_pro_elements']);
add_action('wp_enqueue_scripts', [__CLASS__, 'editor_load_asset']);
add_action('elementor/init', [__CLASS__, 'load_basic_widgets']);
if (is_plugin_active('elementor-pro/elementor-pro.php')) {
add_action('elementor/widgets/widgets_registered', [__CLASS__, 'register_theme_builder_widgets']);
add_action('elementor/init', [__CLASS__, 'load_theme_builder_widgets']);
add_action('elementor/theme/register_conditions', [__CLASS__, 'register_conditions']);
}
}
add_action('init', [__CLASS__, '_betterdocs_init'], -999);
}
/**
*
* Mange all widget for single docs
*
* @return string[]
* @since 1.3.0
*/
public static function get_basic_widget_list()
{
$widget_arr = [
'betterdocs-elementor-search-form' => 'BetterDocs_Elementor_Search_Form',
'betterdocs-elementor-category-grid' => 'BetterDocs_Elementor_Category_Grid',
'betterdocs-elementor-category-box' => 'BetterDocs_Elementor_Category_Box'
];
return $widget_arr;
}
/**
*
* Mange all widget for single docs
*
* @return string[]
* @since 1.3.0
*/
public static function get_theme_builder_widget_list()
{
$widget_arr = [
'betterdocs-elementor-breadcrumbs' => 'BetterDocs_Elementor_Breadcrumbs',
'betterdocs-elementor-title' => 'BetterDocs_Elementor_Title',
'betterdocs-elementor-content' => 'BetterDocs_Elementor_Content',
'betterdocs-elementor-sidebar' => 'BetterDocs_Elementor_Sidebar',
'betterdocs-elementor-navigation' => 'BetterDocs_Elementor_Navigation',
'betterdocs-elementor-doc-share' => 'BetterDocs_Elementor_Doc_Share',
'betterdocs-elementor-feedback' => 'BetterDocs_Elementor_Feedback',
'betterdocs-elementor-doc-date' => 'BetterDocs_Elementor_Doc_Date',
'betterdocs-elementor-toc' => 'BetterDocs_Elementor_Toc',
'betterdocs-elementor-category-archive-list' => 'BetterDocs_Category_Archive_List'
];
return $widget_arr;
}
/**
*
* Load asset for elementor icon
*
* @since 1.3.0
*/
public static function editor_enqueue_scripts()
{
wp_enqueue_style(
'betterdocs-el-icon',
BETTERDOCS_ADMIN_URL . 'assets/css/betterdocs-el-icon.css',
false,
BETTERDOCS_VERSION
);
}
public static function editor_load_asset()
{
if (BetterDocs_Helper::is_templates() == true) {
wp_enqueue_style(
'betterdocs-el-edit',
BETTERDOCS_ADMIN_URL . 'assets/css/betterdocs-el-edit.css',
false,
BETTERDOCS_VERSION
);
wp_enqueue_script(
'betterdocs-el-promotion',
BETTERDOCS_ADMIN_URL . 'assets/js/promotion.js',
['jquery'],
BETTERDOCS_VERSION,
true
);
if (!self::$pro_active) {
wp_enqueue_script(
'betterdocs-el-editor',
BETTERDOCS_ADMIN_URL . 'assets/js/betterdocs-el-editor.js',
['jquery'],
BETTERDOCS_VERSION,
true
);
}
}
}
public static function load_basic_widgets()
{
require_once BETTERDOCS_DIR_PATH . 'includes/elementor/template-query.php';
// load widget file
foreach (self::get_basic_widget_list() as $key => $value) {
require_once BETTERDOCS_DIR_PATH . "includes/elementor/widgets/basic/$key.php";
}
}
public static function load_theme_builder_widgets()
{
require_once BETTERDOCS_DIR_PATH . 'includes/elementor/template-query.php';
require_once BETTERDOCS_DIR_PATH . 'includes/elementor/betterdocs-single-docs.php';
require_once BETTERDOCS_DIR_PATH . 'includes/elementor/betterdocs-doc-archive.php';
require_once BETTERDOCS_DIR_PATH . 'includes/elementor/betterdocs-archive-condition.php';
require_once BETTERDOCS_DIR_PATH . 'includes/elementor/docs-page.php';
self::_register_tag();
//load widget file
foreach (self::get_theme_builder_widget_list() as $key => $value) {
require_once BETTERDOCS_DIR_PATH . "includes/elementor/widgets/$key.php";
}
}
public static function register_singel_documents_page($documents_manager)
{
if (class_exists('BetterDocs_Single_Docs')) {
$documents_manager->register_document_type('docs', BetterDocs_Single_Docs::get_class_full_name());
}
}
public static function register_doc_category_archive($documents_manager)
{
if (class_exists('Betterdocs_Doc_Archive')) {
$documents_manager->register_document_type('doc-archive', Betterdocs_Doc_Archive::get_class_full_name());
}
}
/**
* @param Conditions_Manager $conditions_manager
*/
public static function register_conditions($conditions_manager)
{
$betterdocs_condition = new Betterdocs_Archive_Condition();
$conditions_manager->get_condition('general')->register_sub_condition($betterdocs_condition);
}
public static function theme_template_include($need_override_location, $location)
{
if (is_singular(['docs']) && 'single' === $location) {
$need_override_location = true;
}
return $need_override_location;
}
public static function register_basic_widgets($widgets_manager)
{
foreach (self::get_basic_widget_list() as $value) {
if (class_exists($value)) {
//error_log( print_r(self::get_basic_widget_list(), TRUE) );
$widgets_manager->register_widget_type(new $value);
}
}
}
public static function register_widget_categories($elements_manager)
{
$elements_manager->add_category(
'betterdocs-elements',
[
'title' => __('BetterDocs', 'betterdocs'),
'icon' => 'font',
], 1);
}
public static function register_theme_builder_widgets($widgets_manager)
{
foreach (self::get_theme_builder_widget_list() as $value) {
if (class_exists($value)) {
$widgets_manager->register_widget_type(new $value);
}
}
}
public static function _register_tag()
{
require_once BETTERDOCS_DIR_PATH . 'includes/elementor/widgets/betterdocs-elementor-title-tag.php';
$module = Plugin::elementor()->dynamic_tags;
$module->register_tag(new BetterDocs_Elementor_Title_Tag());
}
public static function promote_pro_elements($config)
{
if (is_plugin_active('betterdocs-pro/betterdocs-pro.php')) {
return $config;
}
$promotion_widgets = [];
if (isset($config['promotionWidgets'])) {
$promotion_widgets = $config['promotionWidgets'];
}
$combine_array = array_merge($promotion_widgets, [
[
'name' => 'betterdocs-elementor-reactions',
'title' => __('Doc Reactions', 'betterdocs'),
'icon' => 'betterdocs-icon-Reactions',
'categories' => '["betterdocs-elements"]',
],
[
'name' => 'betterdocs-multiple-kb',
'title' => __('BetterDocs Multiple KB', 'betterdocs'),
'icon' => 'betterdocs-icon-category-box',
'categories' => '["docs-archive"]',
],
]);
$config['promotionWidgets'] = $combine_array;
return $config;
}
public static function _betterdocs_init()
{
add_action('elementor/init', array(__CLASS__, 'register_bd_template_instance'), 20);
if (defined('Elementor\Api::LIBRARY_OPTION_KEY')) {
add_filter('option_' . Elementor\Api::LIBRARY_OPTION_KEY, array(__CLASS__, 'prepend_categories'));
}
add_action('elementor/ajax/register_actions', array(__CLASS__, 'modified_ajax_action'), 20);
}
public static function register_bd_template_instance()
{
require_once BETTERDOCS_DIR_PATH . 'includes/elementor/betterdocs-template-source.php';
$elementor = Elementor\Plugin::instance();
$elementor->templates_manager->register_source('BetterDocs_Template_Source');
}
public static function modified_ajax_action($ajax)
{
if (!isset($_REQUEST['actions'])) {
return;
}
$actions = json_decode(stripslashes($_REQUEST['actions']), true);
$data = false;
foreach ($actions as $id => $action_data) {
if (!isset($action_data['get_template_data'])) {
$data = $action_data;
}
}
if (!$data) {
return;
}
if (!isset($data['data'])) {
return;
}
$data = $data['data'];
if (empty($data['template_id'])) {
return;
}
if (false === strpos($data['template_id'], 'betterdocs_')) {
return;
}
$ajax->register_ajax_action('get_template_data', array(__CLASS__, 'get_bd_template_data'));
}
public static function prepend_categories($library_data)
{
$categories = self::get_template_categories();
if (!empty($categories)) {
$library_data['types_data']['block']['categories'] = array_merge($categories, $library_data['types_data']['block']['categories']);
}
return $library_data;
}
public static function get_template_categories()
{
return [
'Single Docs', 'Docs Archive'
];
}
public static function get_bd_template_data($args)
{
$source = Elementor\Plugin::instance()->templates_manager->get_source('betterdocs-templates');
return $source->get_data($args);
}
/**
* Include a file with variables
*
* @param $file_path
* @param $variables
*
* @return string
* @since 4.2.2
*/
public static function include_with_variable( $file_path, $variables = [])
{
if (file_exists($file_path)) {
extract($variables);
ob_start();
include $file_path;
return ob_get_clean();
}
return '';
}
public static function get_multiple_kb_terms($prettify = false, $term_id = true)
{
$args = [
'taxonomy' => 'knowledge_base',
'hide_empty' => true,
'parent' => 0,
];
$terms = get_terms($args);
if (is_wp_error($terms)) {
return [];
}
if ($prettify) {
$pretty_taxonomies = [];
foreach ($terms as $term) {
$pretty_taxonomies[$term_id ? $term->term_id : $term->slug] = $term->name;
}
return $pretty_taxonomies;
}
return $terms;
}
public static function get_betterdocs_multiple_kb_status()
{
if (\BetterDocs_DB::get_settings('multiple_kb') == 1) {
return 'true';
}
return '';
}
/**
* POst Orderby Options
*
* @return array
*/
public static function get_post_orderby_options()
{
$orderby = array(
'ID' => 'Post ID',
'author' => 'Post Author',
'title' => 'Title',
'date' => 'Date',
'modified' => 'Last Modified Date',
'parent' => 'Parent Id',
'rand' => 'Random',
'comment_count' => 'Comment Count',
'menu_order' => 'Menu Order',
'betterdocs_order' => 'BetterDocs Order',
);
return $orderby;
}
/**
* Get Post Categories
*
* @return array
*/
public static function get_terms_list($taxonomy = 'category', $key = 'term_id')
{
$options = [];
$terms = get_terms([
'taxonomy' => $taxonomy,
'hide_empty' => true,
]);
if (!empty($terms) && !is_wp_error($terms)) {
foreach ($terms as $term) {
$options[$term->{$key}] = $term->name;
}
}
return $options;
}
/**
* Query Controls
*
*/
public static function betterdocs_query($wb, $taxonomy)
{
$wb->start_controls_section(
'eael_section_post__filters',
[
'label' => __('Query', 'betterdocs'),
]
);
$default_multiple_kb = self::get_betterdocs_multiple_kb_status();
if ($default_multiple_kb && $taxonomy != 'knowledge_base') {
$multiple_kb_terms = self::get_multiple_kb_terms(true, false);
$default_slug = count($multiple_kb_terms) > 0 ? array_keys($multiple_kb_terms)[0] : '';
$wb->add_control(
'selected_knowledge_base',
[
'label' => __('Knowledge Bases', 'betterdocs'),
'label_block' => true,
'type' => Controls_Manager::SELECT2,
'options' => $multiple_kb_terms,
'multiple' => false,
'default' => '',
'select2options' => [
'placeholder' => __('All Knowledge Base', 'betterdocs'),
'allowClear' => true,
]
]
);
}
if ($wb->get_name() === 'betterdocs-category-grid') {
$wb->add_control(
'grid_query_heading',
[
'label' => __('Category Grid', 'betterdocs'),
'type' => Controls_Manager::HEADING,
]
);
}
$wb->add_control(
'include',
[
'label' => __('Include', 'betterdocs'),
'label_block' => true,
'type' => Controls_Manager::SELECT2,
'options' => self::get_terms_list($taxonomy, 'term_id'),
'multiple' => true,
'default' => [],
]
);
$wb->add_control(
'exclude',
[
'label' => __('Exclude', 'betterdocs'),
'type' => Controls_Manager::SELECT2,
'options' => self::get_terms_list($taxonomy, 'term_id'),
'label_block' => true,
'post_type' => '',
'multiple' => true,
]
);
if ($wb->get_name() === 'betterdocs-category-grid') {
$wb->add_control(
'grid_per_page',
[
'label' => __('Grid Per Page', 'betterdocs'),
'type' => Controls_Manager::NUMBER,
'default' => '8',
]
);
} else {
$wb->add_control(
'box_per_page',
[
'label' => __('Box Per Page', 'betterdocs'),
'type' => Controls_Manager::NUMBER,
'default' => '8',
]
);
}
$wb->add_control(
'offset',
[
'label' => __('Offset', 'betterdocs'),
'type' => Controls_Manager::NUMBER,
'default' => '0',
]
);
$wb->add_control(
'orderby',
[
'label' => __('Order By', 'betterdocs'),
'type' => Controls_Manager::SELECT,
'options' => [
'none' => __('No order', 'betterdocs'),
'name' => __('Name', 'betterdocs'),
'slug' => __('Slug', 'betterdocs'),
'term_group' => __('Term Group', 'betterdocs'),
'term_id' => __('Term ID', 'betterdocs'),
'id' => __('ID', 'betterdocs'),
'description' => __('Description', 'betterdocs'),
'parent' => __('Parent', 'betterdocs'),
'betterdocs_order' => __('BetterDocs Order', 'betterdocs'),
],
'default' => 'name',
]
);
$wb->add_control(
'order',
[
'label' => __('Order', 'betterdocs'),
'type' => Controls_Manager::SELECT,
'options' => [
'ASC' => 'Ascending',
'DESC' => 'Descending',
],
'default' => 'asc',
]
);
if ($wb->get_name() === 'betterdocs-category-grid') {
$wb->add_control(
'grid_posts_query_heading',
[
'label' => __('Grid List Posts', 'betterdocs'),
'type' => Controls_Manager::HEADING,
'separator' => 'before',
]
);
$wb->add_control(
'post_per_page',
[
'label' => __('Post Per Page', 'betterdocs'),
'type' => Controls_Manager::NUMBER,
'default' => '6',
]
);
$wb->add_control(
'post_orderby',
[
'label' => __('Order By', 'betterdocs'),
'type' => Controls_Manager::SELECT,
'options' => self::get_post_orderby_options(),
'default' => 'date',
]
);
$wb->add_control(
'post_order',
[
'label' => __('Order', 'betterdocs'),
'type' => Controls_Manager::SELECT,
'options' => [
'asc' => 'Ascending',
'desc' => 'Descending',
],
'default' => 'desc',
]
);
$wb->add_control(
'nested_subcategory',
[
'label' => __('Enable Nested Subcategory', 'betterdocs'),
'type' => Controls_Manager::SWITCHER,
'label_on' => __('Yes', 'betterdocs'),
'label_off' => __('No', 'betterdocs'),
'return_value' => 'true',
'default' => false,
]
);
$wb->add_control(
'post_per_subcat',
[
'label' => __('Post Per Subcategory', 'betterdocs'),
'type' => Controls_Manager::NUMBER,
'default' => '6',
'condition' => [
'nested_subcategory' => 'true'
]
]
);
}
if ($wb->get_name() === 'betterdocs-category-box') {
$wb->add_control(
'nested_subcategory',
[
'label' => __('Nested Subcategory', 'betterdocs'),
'type' => Controls_Manager::SWITCHER,
'label_on' => __('Yes', 'betterdocs'),
'label_off' => __('No', 'betterdocs'),
'return_value' => 'true',
'default' => false,
]
);
}
if($wb->get_name() === 'betterdocs-tab-view-list') {
$wb->add_control(
'tab_posts_query_heading',
[
'label' => __('Tab List Posts', 'betterdocs'),
'type' => Controls_Manager::HEADING,
'separator' => 'before',
]
);
$wb->add_control(
'post_per_tab',
[
'label' => __('Posts Per Tab', 'betterdocs'),
'type' => Controls_Manager::NUMBER,
'default' => '10'
]
);
$wb->add_control(
'tab_list_posts_orderby',
[
'label' => __('Posts Order By', 'betterdocs'),
'type' => Controls_Manager::SELECT,
'options' => [
'name' => __('Name', 'betterdocs'),
'slug' => __('Slug', 'betterdocs'),
'term_group' => __('Term Group', 'betterdocs'),
'term_id' => __('Term ID', 'betterdocs'),
'id' => __('ID', 'betterdocs'),
'description' => __('Description', 'betterdocs'),
'parent' => __('Parent', 'betterdocs'),
'betterdocs_order' => __('BetterDocs Order', 'betterdocs'),
],
'default' => 'name',
]
);
$wb->add_control(
'tab_list_order',
[
'label' => __('Order', 'betterdocs'),
'type' => Controls_Manager::SELECT,
'options' => [
'ASC' => 'Ascending',
'DESC' => 'Descending',
],
'default' => 'ASC',
]
);
$wb->add_control(
'nested_subcategory_tab_list',
[
'label' => __('Nested Subcategory', 'betterdocs'),
'type' => Controls_Manager::SWITCHER,
'label_on' => __('Yes', 'betterdocs'),
'label_off' => __('No', 'betterdocs'),
'return_value' => 'true',
'default' => 'true',
]
);
$wb->add_control(
'nested_posts_per_page',
[
'label' => __('Posts Per Page', 'betterdocs'),
'type' => Controls_Manager::NUMBER,
'default' => '-1',
'condition' => [
'nested_subcategory_tab_list' => 'true'
]
]
);
$wb->add_control(
'nested_sub_cat_order',
[
'label' => __('Nested Posts Order', 'betterdocs'),
'type' => Controls_Manager::SELECT,
'options' => [
'ASC' => 'Ascending',
'DESC' => 'Descending',
],
'default' => 'ASC',
'condition' => [
'nested_subcategory_tab_list' => 'true'
]
]
);
$wb->add_control(
'nested_sub_cat_orderby',
[
'label' => __('Nested Posts Order By', 'betterdocs'),
'type' => Controls_Manager::SELECT,
'options' => [
'none' => __('No order', 'betterdocs'),
'name' => __('Name', 'betterdocs'),
'slug' => __('Slug', 'betterdocs'),
'term_group' => __('Term Group', 'betterdocs'),
'term_id' => __('Term ID', 'betterdocs'),
'id' => __('ID', 'betterdocs'),
'description' => __('Description', 'betterdocs'),
'parent' => __('Parent', 'betterdocs'),
'betterdocs_order' => __('BetterDocs Order', 'betterdocs'),
],
'default' => 'name',
'condition' => [
'nested_subcategory_tab_list' => 'true'
]
]
);
}
$wb->end_controls_section();
}
public function nested_subcategory($term_id, $settings, $multiple_kb) {
$html='';
$sub_categories = BetterDocs_Helper::child_taxonomy_terms($term_id, $multiple_kb, $settings['orderby'], $settings['order'], '');
if ($sub_categories) {
foreach ($sub_categories as $sub_category) {
$html .= '';
if (isset($settings['nested_list_title_closed_icon']['value']['url']) && !empty($settings['nested_list_title_closed_icon']['value']['url'])) {
$html .= '';
} else {
$html .= '';
}
if (isset($settings['nested_list_title_open_icon']['value']['url']) && !empty($settings['nested_list_title_open_icon']['value']['url'])) {
$html .= '
';
} else {
$html .= '';
}
$html .= '' . $sub_category->name . '';
$html .= '