HEX
Server: nginx/1.24.0
System: Linux webserver 6.8.0-59-generic #61-Ubuntu SMP PREEMPT_DYNAMIC Fri Apr 11 23:16:11 UTC 2025 x86_64
User: wpuser (1002)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /opt/wpsites/datainsightnow.com/wp-content/plugins/essential-blocks/includes/API/Product.php
<?php

namespace EssentialBlocks\API;

use WP_Error;
use WP_Query;
use EssentialBlocks\Utils\Helper;

class Product extends Base {
    private $sampleData = [];
    /**
     * Register REST Routes
     *
     * @return void
     */
    public function register() {
        $this->get(
            'products',
            [
                'args'     => [
                    'order_by'   => [],
                    'order'      => [],
                    'per_page'   => [],
                    'offset'     => [],
                    'categories' => [],
                    'tags'       => []
                ],
                'callback' => [$this, 'get_products']
            ]
        );
    }

    public static function __callStatic( $name, $arguments = [] ) {
        if ( method_exists( __CLASS__, $name ) ) {
            return static::get_instance()->$name( $arguments );
        }
    }

    /**
     * Get a list of WooCommerce products
     *
     * @param mixed $request
     * @param mixed $local
     * @return array|false|string|WP_Error
     *
     * @suppress PHP0417
     */
    public function get_products( $request, $local = false ) {
        $data       = [];
        $query_data = ! empty( $request->get_param( 'query_data' ) ) ? json_decode( $request->get_param( 'query_data' ) ) : [];
        $query_data = ( is_object( $query_data ) || is_array( $query_data ) ) ? (array) $query_data : [];
        $pageNumber = (int) sanitize_text_field( $request['pageNumber'] ) - 1;

        $_is_frontend = true;

        if ( ! rest_sanitize_boolean( $request->get_param( 'is_frontend' ) ) ) {
            $_is_frontend = false;
            $query_data   = $request->get_params();
        }

        if ( isset( $query_data['per_page'] ) && isset( $query_data['offset'] ) ) {
            $query_data['offset'] = (int) $query_data['offset'] + ( (int) $query_data['per_page'] * (int) $pageNumber );
        }

        $loop = new WP_Query( $this->query_builder( $query_data ) );

        $attributes = $_is_frontend ? json_decode( $request->get_param( 'attributes' ) ) : [];
        $attributes = ( is_object( $attributes ) || is_array( $attributes ) ) ? (array) $attributes : [];

        $isCustomCartBtn  = isset( $attributes['isCustomCartBtn'] ) ? $attributes['isCustomCartBtn'] : false;
        $simpleCartText   = isset( $attributes['simpleCartText'] ) ? $attributes['simpleCartText'] : 'Buy Now';
        $variableCartText = isset( $attributes['variableCartText'] ) ? $attributes['variableCartText'] : 'Select Options';
        $groupedCartText  = isset( $attributes['groupedCartText'] ) ? $attributes['groupedCartText'] : 'View Products';
        $externalCartText = isset( $attributes['externalCartText'] ) ? $attributes['externalCartText'] : 'Buy Now';
        $defaultCartText  = isset( $attributes['defaultCartText'] ) ? $attributes['defaultCartText'] : 'Read More';

        $this->sampleData = [
            $simpleCartText,
            $variableCartText,
            $groupedCartText,
            $externalCartText,
            $defaultCartText
        ];
        if ( $_is_frontend && $isCustomCartBtn ) {
            // change the cart button text according to editor change
            add_filter( 'woocommerce_product_add_to_cart_text', [$this, 'eb_change_cart_button_text'], 10, 1 );
        }

        if ( $loop->have_posts() ) {
            if ( $_is_frontend ) {
                ob_start();
            }
            while ( $loop->have_posts() ) {
                $loop->the_post();

                $products = [];
                $post_id  = get_the_ID();
                $product  = wc_get_product( $post_id );

                $products['id']               = $post_id;
                $products['title']            = get_the_title();
                $products['permalink']        = get_permalink();
                $products['excerpt']          = wp_strip_all_tags( get_the_content() );
                $products['excerpt_full']     = wp_strip_all_tags( get_the_excerpt() );
                $products['time']             = get_the_date();
                $products['price']            = $product->get_price();
                $products['price_sale']       = $product->get_sale_price();
                $products['price_regular']    = $product->get_regular_price();
                $products['discount']         = ( $products['price_sale'] && $products['price_regular'] ) ? round(  ( $products['price_regular'] - $products['price_sale'] ) / $products['price_regular'] * 100 ) . '%' : '';
                $products['sale']             = $product->is_on_sale();
                $products['price_html']       = $product->get_price_html();
                $products['stock']            = $product->get_stock_status();
                $products['featured']         = $product->is_featured();
                $products['rating_count']     = $product->get_rating_count();
                $products['rating_average']   = $product->get_average_rating();
                $products['add_to_cart_url']  = $product->add_to_cart_url();
                $products['add_to_cart_text'] = $product->add_to_cart_text();
                $products['type']             = $product->get_type();

                // image
                if ( has_post_thumbnail() ) {
                    $thumb_id    = get_post_thumbnail_id( $post_id );
                    $image_sizes = get_intermediate_image_sizes();
                    $image_src   = [];
                    foreach ( $image_sizes as $key => $value ) {
                        $image_src[$value] = wp_get_attachment_image_src( $thumb_id, $value, false )[0];
                    }
                    $products['image'] = $image_src;
                }

                // tag
                $tag = get_the_terms( $post_id, ( isset( $request['tag'] ) ? esc_attr( $request['tag'] ) : 'product_tag' ) );
                if ( ! empty( $tag ) ) {
                    $all_tag = [];
                    foreach ( $tag as $val ) {
                        $all_tag[] = [
                            'term_id' => $val->term_id,
                            'slug'    => $val->slug,
                            'name'    => $val->name,
                            'url'     => get_term_link( $val->term_id )
                        ];
                    }
                    $products['tag'] = $all_tag;
                }

                // cat
                $cat = get_the_terms( $post_id, ( isset( $request['cat'] ) ? esc_attr( $request['cat'] ) : 'product_cat' ) );
                if ( ! empty( $cat ) ) {
                    $all_cats = [];
                    foreach ( $cat as $val ) {
                        $all_cats[] = [
                            'term_id' => $val->term_id,
                            'slug'    => $val->slug,
                            'name'    => $val->name,
                            'url'     => get_term_link( $val->term_id )
                        ];
                    }
                    $products['category'] = $all_cats;
                }
                $data[] = $products;

                if ( $_is_frontend ) {
                    $_params = array_merge(
                        $attributes,
                        ['product' => wc_get_product( (int) $products['id'] )]
                    );

                    Helper::views( 'woocommerce/single-product', $_params );
                }
            }
            // wp_reset_query();
            wp_reset_postdata();

            if ( $_is_frontend && $isCustomCartBtn ) {
                // remove our own callback from filter
                remove_filter( 'woocommerce_product_add_to_cart_text', [$this, 'eb_change_cart_button_text'], 10 );
            }

            return $_is_frontend ? ob_get_clean() : $data;
        } else {
            return false;
        }
    }

    /**
     * API Query Builder
     */
    public static function query_builder( $attr ) {

        $query_args = [
            'post_status'    => 'publish',
            'post_type'      => 'product',
            'posts_per_page' => isset( $attr['per_page'] ) ? $attr['per_page'] : 10,
            'orderby'        => isset( $attr['orderby'] ) ? $attr['orderby'] : 'date',
            'order'          => isset( $attr['order'] ) ? $attr['order'] : 'desc',
            'offset'         => isset( $attr['offset'] ) ? $attr['offset'] : 0
        ];

        if ( isset( $attr['orderby'] ) ) {
            switch ( $attr['orderby'] ) {
                case 'price':
                    $query_args['meta_key'] = '_price';
                    $query_args['orderby']  = 'meta_value_num';
                    break;
                case 'popular':
                    $query_args['meta_key'] = 'total_sales';
                    $query_args['orderby']  = 'meta_value_num';
                    $query_args['order']    = 'desc';
                    break;
                case 'rating';
                    $query_args['meta_key'] = '_wc_average_rating';
                    $query_args['orderby']  = 'meta_value_num';
                    break;
                default:
                    $query_args['orderby'] = $attr['orderby'];
                    break;
            }
        }

        if ( ! empty( $attr['tag'] ) ) {
            $query_args['tax_query']   = ['relation' => 'OR'];
            $query_args['tax_query'][] = [
                [
                    'taxonomy' => 'product_tag',
                    'field'    => 'term_id',
                    'terms'    => explode( ',', $attr['tag'] )
                ]
            ];
        }

        if ( ! empty( $attr['category'] ) ) {
            $query_args['tax_query'][] = [
                [
                    'taxonomy' => 'product_cat',
                    'field'    => 'term_id',
                    'terms'    => explode( ',', $attr['category'] )
                ]
            ];
        }

        return $query_args;
    }

    public function eb_change_cart_button_text( $text ) {
        global $product;

        list( $simpleCartText, $variableCartText, $groupedCartText, $externalCartText, $defaultCartText ) = $this->sampleData;

        $product_type = $product->get_type();

        $product_types = [
            'external' => $externalCartText,
            'grouped'  => $groupedCartText,
            'simple'   => $simpleCartText,
            'variable' => $variableCartText
        ];

        return isset( $product_types[$product_type] ) ?
        esc_html( $product_types[$product_type] ):
        esc_html( $defaultCartText );
    }
}