Current File : /home/digitaw/www/wp-content/plugins/folders/includes/tree.class.php
<?php
/**
 * Class Folders Tree
 *
 * @author  : Premio <contact@premio.io>
 * @license : GPL2
 * */

if (! defined('ABSPATH')) {
    exit;
}

class WCP_Tree
{


    /**
     * Define the core functionality to shoe taxonomies
     *
     * @since 1.0.0
     */
    public function __construct()
    {

    }//end __construct()


    /**
     * Get tree data into taxonomies (Root Folder)
     *
     * @since  1.0.0
     * @access public
     * @return $categories
     */
    public static function get_full_tree_data($postType, $orderBy="", $order="")
    {
        $isAjax = (defined('DOING_AJAX') && DOING_AJAX) ? 1 : 0;
        $type   = filter_input(INPUT_GET, $postType);
        if ((isset($type) && !empty($type)) || ! $isAjax) {
            update_option("selected_".$postType."_folder", "");
        }

        return self::get_folder_category_data($postType, 0, 0, $orderBy, $order);

    }//end get_full_tree_data()


    /**
     * Get tree data into taxonomies (Child Folder)
     *
     * @since  1.0.0
     * @access public
     * @return $categories
     */
    public static function get_folder_category_data($postType, $parent=0, $parentStatus=0, $orderBy="", $order="")
    {

        $arg = [
            'taxonomy'              => $postType,
            'hide_empty'            => false,
            'parent'                => $parent,
            'hierarchical'          => false,
            'update_count_callback' => '_update_generic_term_count',
        ];
        if (!empty($orderBy) && !empty($order)) {
            $arg['orderby'] = $orderBy;
            $arg['order']   = $order;
        } else {
            $arg['orderby']    = 'meta_value_num';
            $arg['order']      = 'ASC';
            $arg['meta_query'] = [
                [
                    'key'  => 'wcp_custom_order',
                    'type' => 'NUMERIC',
                ],
            ];
        }

        $terms = get_terms($arg);
        
        // Check if get_terms returned an error
        if (is_wp_error($terms)) {
            return ''; // Skip processing if taxonomy is invalid
        }
    

        $string        = "";
        $sticky_string = "";
        $child         = 0;
        $isAjax        = (defined('DOING_AJAX') && DOING_AJAX) ? 1 : 0;
        if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
            $child = count($terms);
            foreach ($terms as $key => $term) {
                if (!empty($orderBy) && !empty($order)) {
                    update_term_meta($term->term_id, "wcp_custom_order", ($key + 1));
                }

                $status = get_term_meta($term->term_id, "is_active", true);
                $return = self::get_folder_category_data($postType, $term->term_id, $status, $orderBy, $order);
                $type   = filter_input(INPUT_GET, $postType);
                if ($postType == "attachment") {
                    if (isset($type) && $type == $term->slug) {
                        update_option("selected_".$postType."_folder", $term->term_id);
                    }

                    if (!isset($type) && $isAjax) {
                        $termId = get_option("selected_".$postType."_folder");
                    }
                } else {
                    if (isset($type) && $type == $term->slug) {
                        update_option("selected_".$postType."_folder", $term->term_id);
                    }

                    if (!isset($type) && $isAjax) {
                        $termId = get_option("selected_".$postType."_folder");
                    }
                }

                $count = ($term->trash_count != 0) ? $term->trash_count : 0;

                // Free/Pro URL Change
                $nonce     = wp_create_nonce('wcp_folder_term_'.$term->term_id);

                $folder_info    = get_term_meta($term->term_id, "folder_info", true);
                $folder_info = shortcode_atts([
                    'is_sticky' => 0,
                    'is_high'   => 0,
                    'is_locked' => 0,
                    'is_active' => 0,
                ], $folder_info);

                $status = intval($folder_info['is_high']);
                $is_active = intval($folder_info['is_active']);
                $is_sticky = intval($folder_info['is_sticky']);

                $class     = "";
                if ($is_sticky == 1) {
                    $class .= " is-sticky";
                }

                if ($status == 1) {
                    $class .= " is-high";
                }

                if ($is_active == 1) {
                    $class .= " jstree-open";
                }

                $string .= "<li id='".esc_attr($term->term_id)."' class='".esc_attr($class)."' data-slug='".esc_attr($term->slug)."' data-nonce='".esc_attr($nonce)."' data-folder='".esc_attr($term->term_id)."' data-child='".esc_attr($child)."' data-count='".esc_attr($count)."' data-parent='".esc_attr($parent)."'>
                                ".esc_attr($term->name)."
                                <ul>".$return['string']."</ul>
                            </li>";

                $sticky_string .= $return['sticky_string'];
            }//end foreach
        }//end if

        return [
            'string'        => $string,
            'sticky_string' => $sticky_string,
            'child'         => $child,
        ];

    }//end get_folder_category_data()


    /**
     * Get option data into taxonomies (Parent Folder)
     *
     * @since  1.0.0
     * @access public
     * @return $categories
     */
    public static function get_option_data_for_select($postType)
    {
        $string  = "<option value='0'>".esc_html__("Parent Folder", "folders")."</option>";
        $string .= self::get_folder_option_data($postType, 0, '');
        return $string;

    }//end get_option_data_for_select()


    /**
     * Get option data into taxonomies (Child Folder)
     *
     * @since  1.0.0
     * @access public
     * @return $categories
     */
    public static function get_folder_option_data($postType, $parent=0, $space="")
    {
        $terms = get_terms(
            [
                'taxonomy'     => $postType,
                'hide_empty'   => false,
                'parent'       => $parent,
                'orderby'      => 'meta_value_num',
                'order'        => 'ASC',
                'hierarchical' => false,
                'meta_query'   => [
                    [
                        'key'  => 'wcp_custom_order',
                        'type' => 'NUMERIC',
                    ],
                ],
            ]
        );

        $selected_term = get_option("selected_".$postType."_folder");

        $string = "";
        if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){
            foreach ($terms as $term) {
                if(isset($term->term_id) && isset($term->name)) {
                    $selected = ($selected_term == $term->term_id) ? "selected" : "";
                    $string .= "<option " . esc_attr($selected) . " value='" . esc_attr($term->term_id) . "'>" . esc_attr($space) . esc_attr($term->name) . "</option>";
                    $string .= self::get_folder_option_data($postType, $term->term_id, trim($space) . "- ");
                }
            }
        }

        return $string;

    }//end get_folder_option_data()


}//end class