<?php
namespace DgoraWcas\Engines\WordPressNative;
use DgoraWcas\Post;
use DgoraWcas\Product;
use DgoraWcas\Helpers;
use DgoraWcas\ProductVariation;
// Exit if accessed directly
if ( !defined( 'ABSPATH' ) ) {
exit;
}
class DetailsBox {
public function __construct() {
if ( defined( 'DGWT_WCAS_WC_AJAX_ENDPOINT' ) ) {
// Searched result details ajax action
if ( DGWT_WCAS_WC_AJAX_ENDPOINT ) {
add_action( 'wc_ajax_' . DGWT_WCAS_RESULT_DETAILS_ACTION, array($this, 'getResultDetails') );
} else {
add_action( 'wp_ajax_nopriv_' . DGWT_WCAS_RESULT_DETAILS_ACTION, array($this, 'getResultDetails') );
add_action( 'wp_ajax_' . DGWT_WCAS_RESULT_DETAILS_ACTION, array($this, 'getResultDetails') );
}
}
}
/**
* Get searched result details
*/
public function getResultDetails() {
if ( !defined( 'DGWT_WCAS_AJAX_DETAILS_PANEL' ) ) {
define( 'DGWT_WCAS_AJAX_DETAILS_PANEL', true );
}
$output = array();
$items = array();
if ( !empty( $_POST['items'] ) && is_array( $_POST['items'] ) ) {
foreach ( $_POST['items'] as $item ) {
if ( empty( $item['objectID'] ) ) {
continue;
}
$suggestionValue = '';
$postType = '';
$postID = 0;
$variationID = 0;
$termID = 0;
$taxonomy = '';
// Suggestion value
if ( !empty( $item['value'] ) ) {
$suggestionValue = sanitize_text_field( $item['value'] );
}
$objectID = sanitize_text_field( $item['objectID'] );
$parts = explode( '__', $objectID );
$type = ( !empty( $parts[0] ) ? sanitize_key( $parts[0] ) : '' );
if ( $type === 'taxonomy' ) {
$termID = ( !empty( $parts[1] ) ? absint( $parts[1] ) : 0 );
$taxonomy = ( !empty( $parts[2] ) ? sanitize_key( $parts[2] ) : '' );
} elseif ( $type === 'product' ) {
$postType = $type;
$postID = ( !empty( $parts[1] ) ? absint( $parts[1] ) : 0 );
} elseif ( $type === 'product_variation' ) {
$postType = $type;
$postID = ( !empty( $parts[1] ) ? absint( $parts[1] ) : 0 );
$variationID = ( !empty( $parts[2] ) ? absint( $parts[2] ) : 0 );
} elseif ( $type === 'post' ) {
$postType = ( !empty( $parts[2] ) ? $parts[2] : 0 );
$postID = ( !empty( $parts[1] ) ? absint( $parts[1] ) : 0 );
}
// Get product details
if ( !empty( $postID ) && !empty( $postType ) && in_array( $postType, array('product', 'product_variation') ) ) {
if ( $postType === 'product_variation' ) {
$productDetails = $this->getProductDetails( $postID, $variationID );
} else {
$productDetails = $this->getProductDetails( $postID );
}
$items[] = array(
'objectID' => $objectID,
'html' => $productDetails['html'],
'price' => $productDetails['price'],
);
}
// Get taxonomy details
if ( !empty( $termID ) && !empty( $taxonomy ) ) {
$items[] = array(
'objectID' => $objectID,
'html' => $this->getTaxonomyDetails( $termID, $taxonomy, $suggestionValue ),
);
}
}
$output['items'] = $items;
echo json_encode( apply_filters( 'dgwt/wcas/suggestion_details/output', $output ) );
die;
}
}
/**
* Prepare products details to the ajax output
*
* @param int $productID
* @param int $variationID
*
* @return array
*/
private function getProductDetails( $productID, $variationID = 0 ) {
if ( $variationID ) {
$product = new ProductVariation($variationID);
$type = 'product_variation';
} else {
$product = new Product($productID);
$type = 'product';
}
$details = array(
'html' => '',
'price' => '',
);
if ( !$product->isCorrect() ) {
return $details;
}
$thumbSize = apply_filters( 'dgwt/wcas/suggestion_details/product/thumb_size', 'woocommerce_thumbnail' );
$responsiveImages = apply_filters( 'dgwt/wcas/suggestion_details/responsive_images', true );
$wooProduct = $product->getWooObject();
$vars = array(
'ID' => $product->getID(),
'name' => $product->getName(),
'desc' => $product->getDescription( 'details-panel' ),
'link' => apply_filters( "dgwt/wcas/suggestion_details/{$type}/url", $product->getPermalink(), $product ),
'imageSrc' => $product->getThumbnailSrc( $thumbSize ),
'imageSrcset' => ( $responsiveImages ? $product->getThumbnailSrcset( $thumbSize ) : '' ),
'imageSizes' => ( $responsiveImages ? $product->getThumbnailSizes( $thumbSize ) : '' ),
'sku' => $product->getSKU(),
'reviewCount' => $product->getReviewCount(),
'ratingHtml' => $product->getRatingHtml(),
'priceHtml' => $product->getPriceHTML(),
'showQuantity' => false,
'stockAvailability' => $product->getStockAvailability(),
'attributes' => array(),
'wooObject' => $product->getWooObject(),
);
if ( $variationID ) {
$vars['attributes'] = $product->getVariationAttributes();
}
if ( ($product->isType( 'simple' ) || $product->isType( 'variation' )) && $wooProduct->is_purchasable() && $wooProduct->is_in_stock() && !$wooProduct->is_sold_individually() && apply_filters( 'dgwt/wcas/suggestion_details/show_quantity', true ) ) {
$vars['showQuantity'] = true;
}
$vars = (object) apply_filters(
'dgwt/wcas/suggestion_details/product/vars',
$vars,
$productID,
$product
);
$file = ( $variationID ? 'product-variation' : 'product' );
ob_start();
Helpers::loadTemplate( 'details-panel/' . $file . '.php', $vars );
$details['html'] = ob_get_clean();
if ( $variationID ) {
$details['html'] = apply_filters(
'dgwt/wcas/suggestion_details/product_variation/html',
$details['html'],
$variationID,
$product
);
} else {
$details['html'] = apply_filters(
'dgwt/wcas/suggestion_details/product/html',
$details['html'],
$productID,
$product
);
}
$details['price'] = $vars->priceHtml;
return $details;
}
/**
* Prepare category details to the ajax output
*
* @param int $termID
* @param string taxonomy
* @param string $termName Suggestion value
*
* @return string HTML
*/
private function getTaxonomyDetails( $termID, $taxonomy, $termName ) {
$html = '';
$title = '';
ob_start();
$queryArgs = $this->getProductsQueryArgs( $termID, $taxonomy );
$products = new \WP_Query($queryArgs);
if ( $products->have_posts() ) {
$limit = $queryArgs['posts_per_page'];
$totalProducts = absint( $products->found_posts );
$showMore = ( $limit > 0 && $totalProducts > 0 && $totalProducts - $limit > 0 ? true : false );
// Details panel title
$title .= '<span class="dgwt-wcas-datails-title">';
$title .= '<span class="dgwt-wcas-details-title-tax">';
$title .= Helpers::getLabel( 'tax_' . $taxonomy ) . ': ';
$title .= '</span>';
$title .= esc_html( wp_unslash( $termName ) );
$title .= '</span>';
$title = apply_filters(
'dgwt/wcas/suggestion_details/taxonomy/headline',
$title,
$termID,
$taxonomy,
$termName
);
echo '<div class="dgwt-wcas-details-inner dgwt-wcas-details-inner-taxonomy dgwt-wcas-details-space">';
do_action( 'dgwt/wcas/details_panel/term_products/container_before' );
echo '<div class="dgwt-wcas-products-in-cat">';
echo ( !empty( $title ) ? $title : '' );
$thumbSize = apply_filters( 'dgwt/wcas/suggestion_details/term_products/thumb_size', DGWT_WCAS()->setup->getThumbnailSize() );
$responsiveImages = apply_filters( 'dgwt/wcas/suggestion_details/responsive_images', true );
while ( $products->have_posts() ) {
$products->the_post();
$product = new Product(get_the_ID());
if ( $product->isValid() ) {
$vars = array(
'ID' => $product->getID(),
'name' => $product->getName(),
'link' => apply_filters( 'dgwt/wcas/suggestion_details/term_product/url', $product->getPermalink(), $product ),
'imageSrc' => $product->getThumbnailSrc( $thumbSize ),
'imageSrcset' => ( $responsiveImages ? $product->getThumbnailSrcset( $thumbSize ) : '' ),
'imageSizes' => ( $responsiveImages ? $product->getThumbnailSizes( $thumbSize ) : '' ),
'reviewCount' => $product->getReviewCount(),
'ratingHtml' => $product->getRatingHtml(),
'priceHtml' => $product->getPriceHTML(),
'wooObject' => $product->getWooObject(),
);
$vars = (object) apply_filters(
'dgwt/wcas/suggestion_details/term_products/vars',
$vars,
$product->getID(),
$product
);
Helpers::loadTemplate( 'details-panel/term-product.php', $vars );
}
}
echo '</div>';
if ( $showMore ) {
$showMoreUrl = get_term_link( $termID, $taxonomy );
$showMoreUrl = apply_filters( 'dgwt/wcas/suggestion_details/term_products/show_more_url', $showMoreUrl, get_term( $termID, $taxonomy ) );
echo '<a class="dgwt-wcas-details-more-products" href="' . esc_url( $showMoreUrl ) . '">' . esc_html( Helpers::getLabel( 'show_more_details' ) ) . ' (' . $totalProducts . ')</a>';
}
do_action( 'dgwt/wcas/details_panel/term_products/container_after' );
echo '</div>';
}
wp_reset_postdata();
$html = ob_get_clean();
return apply_filters(
'dgwt/wcas/suggestion_details/term/html',
$html,
$termID,
$taxonomy
);
}
/**
* Get query vars for products that should be displayed in the daxonomy details box
*
* @param int $termID
* @param string $taxonomy
*
* @return array
*/
private function getProductsQueryArgs( $termID, $taxonomy ) {
$productVisibilityTermIds = wc_get_product_visibility_term_ids();
$queryArgs = array(
'posts_per_page' => apply_filters( 'dgwt/wcas/suggestion_details/taxonomy/limit', 4 ),
'post_status' => 'publish',
'post_type' => 'product',
'no_found_rows' => false,
'order' => 'desc',
'orderby' => 'meta_value_num',
'meta_key' => 'total_sales',
'tax_query' => array(),
);
// Visibility
$queryArgs['tax_query'][] = array(
'taxonomy' => 'product_visibility',
'field' => 'term_taxonomy_id',
'terms' => $productVisibilityTermIds['exclude-from-search'],
'operator' => 'NOT IN',
);
// Out of stock
if ( 'yes' === get_option( 'woocommerce_manage_stock' ) && DGWT_WCAS()->settings->getOption( 'exclude_out_of_stock' ) === 'on' ) {
$queryArgs['tax_query'][] = array(
'taxonomy' => 'product_visibility',
'field' => 'term_taxonomy_id',
'terms' => $productVisibilityTermIds['outofstock'],
'operator' => 'NOT IN',
);
}
// Search with specific category
$queryArgs['tax_query'][] = array(
'taxonomy' => $taxonomy,
'field' => 'id',
'terms' => $termID,
'include_children' => true,
);
return apply_filters(
'dgwt/wcas/suggestion_details/taxonomy/products_query_args',
$queryArgs,
$termID,
$taxonomy
);
}
}