Your IP : 18.219.107.243
<?php
//////////////////////////////////////////////////////////////
//===========================================================
// class.php
//===========================================================
// KKART
// Inspired by the DESIRE to be the BEST OF ALL
// ----------------------------------------------------------
// Started by: Pulkit Gupta
// Date: 23rd Jan 2017
// Time: 23:00 hrs
// Site: http://kkart.com/wordpress (KKART)
// ----------------------------------------------------------
// Please Read the Terms of use at http://kkart.com/tos
// ----------------------------------------------------------
//===========================================================
// (c)Kkart Team
//===========================================================
//////////////////////////////////////////////////////////////
// Are we being accessed directly ?
if(!defined('KKART_VERSION')) {
exit('Hacking Attempt !');
}
// Setup for open body props
/*function kkart_setup_open_props(&$el, $fname){
global $post;
if(!pagelayer_is_live() && $post->post_type != 'kkart_product'){
return;
}
// The default class
$el['classes'][] = 'kkart-open-props';
$el['attr'][] = 'data-props-fields="'.$fname.'"';
$el['attr'][] = 'title="Open body props"';
}*/
// Price handler
function pagelayer_sc_kkart_price(&$el){
global $post;
$currency = get_kkart_currency_symbol();
if(pagelayer_is_live_template()){
$el['atts']['currency'] = $currency;
$el['atts']['regular_price'] = 20;
$el['atts']['sale_price'] = 10;
$el['atts']['show_reg_price'] = true;
$el['atts']['show_sale_price'] = true;
return;
}
//TODO check price for variants product
$product = kkart_get_product();
if(empty($product)){
return;
}
if($product->is_type('variable')){
if(pagelayer_is_live()){
$el['atts']['show_var_price'] = false;
}else{
$regularPriceMin = kkart_price($product->get_variation_regular_price()); // Min regular price
$salePriceMin = kkart_price($product->get_variation_sale_price()); // Min sale price
$priceMin = kkart_price($product->get_variation_price()); // Min price
// Max variation price
$regularPriceMax = kkart_price($product->get_variation_regular_price('max')); // Max regular price
$salePriceMax = kkart_price($product->get_variation_sale_price('max')); // Max sale price
$priceMax = kkart_price($product->get_variation_price('max')); // Max price
$el['atts']['show_var_price'] = $salePriceMin ? true : false;
$el['atts']['reg_var_price_min'] = $salePriceMin;
$el['atts']['reg_var_price_max'] = $regularPriceMax;
if( $salePriceMin == $regularPriceMax ){
$el['atts']['reg_var_price_max'] = '';
}
}
}
$regular_price = $product->get_regular_price();
$sale_price = $product->get_sale_price();
$show_reg_price = true;
$show_sale_price = true;
// This is for schedule
if(!$product->is_on_sale()) {
$show_reg_price = false;
$sale_price = 0;
}
if(empty($regular_price)){
if(pagelayer_is_live()){
$regular_price = '0';
}else{
$show_sale_price = false;
$show_reg_price = false;
}
}
if(empty($sale_price)){
if(pagelayer_is_live()){
$sale_price = '0';
}else{
$sale_price = $regular_price;
$regular_price = '';
$show_reg_price = false;
}
}
$el['atts']['currency'] = $currency;
$el['atts']['regular_price'] = $regular_price;
$el['atts']['sale_price'] = $sale_price;
$el['atts']['show_reg_price'] = $show_reg_price;
$el['atts']['show_sale_price'] = $show_sale_price;
}
// Image gallery handler
function pagelayer_sc_kkart_img_gallery(&$el){
global $product;
$product = kkart_get_product();
$ids = array();
$urls = [];
$all_urls = [];
$links = [];
$titles = [];
$img = [];
// Make the image URL
$gallery_html = [];
$primary_image = '';
$size = $el['atts']['size'];
$inc = 0;
if ( !empty( $product ) ) {
$image_id = $product->get_image_id();
$attachment_ids = $product->get_gallery_image_ids();
$ids = array_merge([$image_id], $attachment_ids);
}
// If there is no gallery images
if(empty($image_id)){
if(pagelayer_is_live() && !empty( $product )){
$urls = pagelayer_image(0);
$primary_image = '<img class="kkart-product-pimage kkart-upload-gallery-handler" src="'.$urls['url'].'">';
}else{
$ids = array(0);
}
}
if(pagelayer_is_live_template()){
// TO add five default images
// Added dammy id's to set default images
$ids = array(1.1,1.2,1.3,1.4,1.5);
}
foreach($ids as $k => $v){
$active_class = "";
$image = pagelayer_image($v);
//pagelayer_print($image);
if($inc == 0 && empty($primary_image)){
$active_class = "kkart-product-active";
$primary_image = '<img class="kkart-product-pimage" src="'.$image['url'].'" title="'.$image['title'].'" alt="'.$image['alt'].'">';
}
$final_urls[$v] = empty($image[$size.'-url']) ? @$image['url'] : $image[$size.'-url'];
$urls['i'.$v] = @$image['url'];
$links['i'.$v] = @$image['link'];
$titles['i'.$v] = @$image['title'];
foreach($image as $kk => $vv){
$si = strstr($kk, '-url', true);
if(!empty($si)){
$all_urls['i'.$v][$si] = $vv;
}
}
// If there is only one image then don't need to show gallary
if(count($ids) > 1){
$gallery_html[] = '<li class="kkart-gallery-item"><a data-href="'.$image['url'].'" href="javascript:void(0);" class="kkart-ele-link"> <img class="kkart-product-gimage '.$active_class.'" src="'.$final_urls[$v].'" title="'.$image['title'].'" alt="'.$image['title'].'"> </a></li>';
}
$inc++;
}
//pagelayer_print($urls);
//pagelayer_print($final_urls);
//pagelayer_print($all_urls);
if(pagelayer_is_live() && !empty($image_id)){
$image = pagelayer_image(0);
$gallery_html[] = '<li class="kkart-gallery-item"><a data-href="'.$image['url'].'" href="javascript:void(0);" class="kkart-ele-link"><img class="kkart-product-gimage kkart-upload-gallery-handler" src="'.$image['url'].'"></a></li>';
}
// Make the TMP vars
if(!empty($urls)){
$el['tmp']['ids-urls'] = json_encode($urls);
$el['tmp']['ids-all-urls'] = json_encode($all_urls);
$el['tmp']['ids-all-links'] = json_encode($links);
$el['tmp']['ids-all-titles'] = json_encode($titles);
$el['atts']['gallery_html'] = implode('', $gallery_html);
$el['atts']['primary_image'] = $primary_image;
}
$el['attr'][] = 'kkart-gallary-ids="'. implode(',', $ids) .'"';
}
// Add to cart handler
function pagelayer_sc_kkart_add_to_cart(&$el){
global $product;
$product = kkart_get_product();
if(pagelayer_is_live()){
$el['atts']['kkart_cart_form'] = '<form class="kkart-add-to-cart-form" method="post" enctype="multipart/form-data">
<div class="kkart-product-quantity-holder">';
if(!empty($el['atts']['show_quantity'])){
$el['atts']['kkart_cart_form'] .= '<div class="kkart-product-quantity">
<i class="fas fa-minus kkart-minus"></i>
<input type="number" class="kkart-quantity-input" min="1" name="quantity" value="1">
<i class="fas fa-plus kkart-plus"></i>
</div>';
}
$el['atts']['kkart_cart_form'] .= '</div>
<button class="kkart-cart-btn-holder" type="submit" name="add-to-cart" value="">';
if(!empty($el['atts']['cart_icon'])){
$el['atts']['kkart_cart_form'] .= '<i class="'. $el['atts']['cart_icon'].' kkart-cart-btn-icon"></i>';
}
if(!empty($el['atts']['cart_text'])){
$el['atts']['kkart_cart_form'] .= '<span class="kkart-cart-btn-text">'. $el['atts']['cart_text'] .'</span>';
}
if(!empty($el['atts']['cart_icon'])){
$el['atts']['kkart_cart_form'] .= '<i class="'. $el['atts']['cart_icon'].' kkart-cart-btn-icon"></i>';
}
$el['atts']['kkart_cart_form'] .= '</button>
</form>';
return;
}
if(!$product){
return;
}
ob_start();
do_action( 'kkart_' . $product->get_type() . '_add_to_cart', $el );
$form = ob_get_clean();
if ( ! $form ) {
$el['atts']['kkart_cart_form'] = '';
return '';
}
$el['atts']['kkart_cart_form'] = $form;
}
// Cart variable details handler
function kkart_sc_cart_variable(&$el){
global $product, $cart_item_key, $cart_item;
if(pagelayer_is_live()){
$el['atts']['variable_meta'] = '<div class="kkart-variations">
<div class="kkart-variation-holder">
<strong class="variation-color">color:</strong>
<span class="variation-color">Red</span>
</div>
<div class="kkart-variation-holder">
<strong class="variation-size">size:</strong>
<span class="variation-size">S</span>
</div>
</div>';
return;
}
//TODO check price for variants product
$product = kkart_get_product();
if(empty($product) || !$product->is_type('variable') ){
$el['atts']['variable_meta'] = '';
return;
}
// Meta data.
$el['atts']['variable_meta'] = kkart_get_formatted_cart_item_data( $cart_item, false, false ); // PHPCS: XSS ok.
}
// Cart items holder handler
function kkart_sc_cart_items(&$el){
global $post, $cart_item_key, $cart_item;
if(pagelayer_is_live()){
return;
}
$inner_content = '';
foreach ( KKART()->cart->get_cart() as $cart_item_key => $cart_item ) {
if(empty($cart_item['product_id'])){
continue;
}
$id = (int) $cart_item['product_id'];
$post = get_post( $id );
$product = apply_filters( 'kkart_cart_item_product', $cart_item['data'], $cart_item, $cart_item_key );
if ( $product && $product->exists() && $cart_item['quantity'] > 0 && apply_filters( 'kkart_cart_item_visible', true, $cart_item, $cart_item_key ) ) {
$inner_content .= pagelayer_render_inner_content($el);
}
}
wp_reset_query();
$el['inner_blocks'] = array();
$el['content'] = $inner_content;
}
// Cart items remove handler
function kkart_sc_cart_item_remove(&$el){
global $post, $cart_item_key;
if(empty($post)){
return;
}
// Delete items with refresh page
//$el['atts']['item_remove_link'] = '?&kkart_remove_item='.@$current_cart_item;
$el['atts']['cart_item_key'] = $cart_item_key;
}
//update the quantity of the cart
function kkart_sc_cart_item_update(&$el){
global $post, $cart_item_key, $cart_item;
$el['atts']['not_sold_individually'] = true;
if ( !empty($cart_item['data']) && $cart_item['data']->is_sold_individually() ) {
$el['atts']['not_sold_individually'] = false;
}
$el['atts']['kkart_cart_nonce'] = wp_create_nonce('kkart-cart');
$el['atts']['cart_item_key'] = $cart_item_key;
}
// Place order button
function kkart_sc_place_order(&$el){
global $post,$cart_item_key;
$el['atts']['process_checkout_nonce'] = wp_nonce_field('kkart-process_checkout', 'kkart-process-checkout-nonce', true, false);
}
// Cart item quantity handler
function kkart_sc_cart_item_quantity(&$el){
global $cart_item, $post, $cart_item_key;
if(pagelayer_is_live()){
$el['atts']['form_html'] = '<div class="kkart-product-quantity">
<i class="fas fa-minus kkart-minus"></i>
<input type="number" class="kkart-quantity-input input-text qty text" min="1" name="{{field_name}}" value="1" />
<i class="fas fa-plus kkart-plus"></i>
</div>';
return;
}
$_product = $cart_item['data'];
if ( $_product->is_sold_individually() ) {
$min_quantity = 1;
$max_quantity = 1;
} else {
$min_quantity = 0;
$max_quantity = $_product->get_max_purchase_quantity();
}
$el['atts']['form_html'] = kkart_quantity_input(
array(
'input_name' => "cart[{$cart_item_key}][qty]",
'input_value' => $cart_item['quantity'],
'max_value' => $max_quantity,
'min_value' => $min_quantity,
'product_name' => $_product->get_name(),
),
$_product,
false
);
}
// Cart items price handler
function kkart_sc_cart_price(&$el){
global $post;
// TODO: Need to currecty all code
$currency = get_kkart_currency_symbol();
if(pagelayer_is_live()){
$el['atts']['item_price'] = $currency.'20';
return;
}
if(empty($el['atts']['price_type']) ){
$el['atts']['item_price'] = 0;
return;
}
$el['atts']['item_price'] = kkart_get_prices($el['atts']['price_type']);
}
// Get cart prices
function kkart_get_prices(&$el){
global $cart_item, $post;
$currency = get_kkart_currency_symbol();
if(pagelayer_is_live()){
return;
}
$cart_ob = KKART()->cart;
if($el === 'grand_total'){
if( 'yes' === get_option( 'kkart_enable_shipping_calc' ) || 'yes' === get_option( 'kkart_shipping_cost_requires_address') ){
ob_start();
kkart_cart_totals_order_total_html();
$price = ob_get_clean();
}else{
$price = $cart_ob->get_cart_total() ;
}
return $price;
}
if($el === 'sub_total'){
$price = $cart_ob->get_cart_subtotal();
return $price;
}
if($el === 'all_items_total'){
$price = $cart_ob->get_total_ex_tax();
return $price;
}
if($el === 'discount'){
if( 'yes' == get_option( 'kkart_enable_coupons' ) ) {
return kkart_coupon_price_html();
}
}
if($el ==='delivery_charges'){
$cart_ob->calculate_totals();
if( 'yes' === get_option( 'kkart_shipping_cost_requires_address') && is_cart() ){
$price = $currency.'0';
}elseif(is_checkout()){
$price = $cart_ob->get_cart_shipping_total();
}else{
$price = kkart_cart_totals_shipping_html(true);
}
return $price;
}
if($el === 'product_sub_total'){
$product = apply_filters( 'kkart_cart_item_product', $cart_item['data'], $cart_item );
if(empty($product)){
return '';
}
$price = $cart_ob->get_product_subtotal($product, $cart_item['quantity'], $cart_item);
return $price;
}
if($el === 'tax') {
return kkart_tax_amount_html();
}
}
function kkart_sc_cart_prices(&$el){
if ( empty($el['atts']['hide_coupon'] ) && 'yes' === get_option( 'kkart_enable_coupons' ) ) {
$el['atts']['show_coupon'] = true;
}
if( is_cart() ) {
$el['atts']['checkout_proceed_link'] = esc_url(kkart_get_checkout_url());
}
}
function kkart_sc_checkout_form(&$el){
$tabs = array(
'login' => array(
'label' => (!empty($el['atts']['login_tab_text']) ? $el['atts']['login_tab_text'] : __('Login')),
'func' => 'kkart_checkout_login_form',
),
'billing' => array(
'label' => (!empty($el['atts']['login_tab_text']) ? $el['atts']['login_tab_text'] : __('Billing')),
'func' => 'kkart_checkout_billing',
),
'shipping' => array(
'label' => (!empty($el['atts']['login_tab_text']) ? $el['atts']['login_tab_text'] : __('Shipping')),
'func' => 'kkart_checkout_shipping',
),
'cart' => array(
'label' => (!empty($el['atts']['login_tab_text']) ? $el['atts']['login_tab_text'] : __('Cart')),
'func' => 'kkart_checkout_cart',
),
'payment' => array(
'label' => (!empty($el['atts']['login_tab_text']) ? $el['atts']['login_tab_text'] : __('Payment')),
'func' => 'kkart_checkout_payment',
)
);
$div = '';
$edit_tab = empty($el['atts']['edit_button_title']) ? __('Change') : $el['atts']['edit_button_title'];
$proceed = empty($el['atts']['proceed_button_title']) ? __('Proceed') : $el['atts']['proceed_button_title'];
foreach($tabs as $key => $tab){
$div .= '<div class="kkart-checkout-tab" data-checkout-tab="'.$key.'">
<div class="kkart-checkout-tab-header">
<span class="kkart-checkout-tab-title">'.$tab['label'].'</span>
<i class="fa fa-check" aria-hidden="true" style="display:none;"></i>
<button class="checkout_edit_button">'. $edit_tab .'</button>
</div>
<div class="kkart-checkout-tab-holder" data-done="false" data-touched="false">';
if(is_callable($tab['func'])){
$div .= $tab['func']($el);
}
$div .= '<button class="checkout-tabs-proceed '. @$el['atts']['proceed_button_class'] .'">'. $proceed .'</button>
</div>
</div>';
}
$el['atts']['checkout_form'] = $div;
}
/////////////////////////////////////
// KKART Shortcode Functions
/////////////////////////////////////
// Related products Handler - 2C
function pagelayer_sc_kkart_product_related(&$el){
// start output buffer
ob_start();
// If is related
if($el['atts']['select_product'] == 'related'){
$args = [
'posts_per_page' => 4,
'columns' => 4,
'orderby' => $el['atts']['orderby'],
'order' => $el['atts']['order'],
];
if ( ! empty( $el['atts']['posts_per_page'] ) ) {
$args['posts_per_page'] = $el['atts']['posts_per_page'];
}
if ( ! empty( $el['atts']['columns'] ) ) {
$args['columns'] = $el['atts']['columns'];
}
if(function_exists( 'kkart_related_products' )){
kkart_related_products($args);
}
// If is upsel;
}elseif($el['atts']['select_product'] == 'upsell'){
$limit = '-1';
$columns = 4;
$orderby = $el['atts']['orderby'];
$order = $el['atts']['order'];
if ( ! empty( $el['atts']['columns'] ) ) {
$columns = $el['atts']['columns'];
}
if(function_exists( 'kkart_upsell_display' )){
kkart_upsell_display( $limit, $columns, $orderby, $order );
}
}
// Get data and clean output buffer
$el['atts']['related_products'] = ob_get_clean();
}
// WooCommers Pages - 2C
function pagelayer_sc_kkart_pages(&$el){
// if is not empty
if(!empty($el['atts']['pages'])){
$shortcode = '['. $el['atts']['pages'] .']';
$content = pagelayer_the_content($shortcode);
// if is checkout page
if ( 'kkart_checkout' === $el['atts']['pages'] && '<div class="kkart"></div>' == $content ) {
$content = '<div class="kkart">' . __( 'Your cart is currently empty.') . '</div>';
}
}
// If the content is empty
if(empty($content)){
$content = '<div class="kkart">' . __( 'Page content not found.') . '</div>';
}
$el['atts']['page_content'] = $content;
}
// Product Pages - 2C
function pagelayer_sc_kkart_product_categories(&$el){
$attributes = '';
$attributes .= ' number="'. $el['atts']['number'] .'" ';
$attributes .= ' columns="'. $el['atts']['columns'] .'" ';
$attributes .= ' hide_empty="'. (!empty($el['atts']['hide_empty']) ? 1 : 0) .'" ';
$attributes .= ' orderby="'. $el['atts']['nuorderbymber'] .'" ';
$attributes .= ' order="'. $el['atts']['order'] .'" ';
if ( 'by_id' === $el['atts']['source'] ) {
$attributes .= ' ids="'. $el['atts']['by_id'] .'" ';
} elseif ( 'by_parent' === $el['atts']['source'] ) {
$attributes .= ' parent="'. $el['atts']['parent'] .'" ';
} elseif ( 'current_subcategories' === $el['atts']['source'] ) {
$attributes .= ' parent="'. get_queried_object_id() .'" ';
}
$shortcode = '[product_categories '. $attributes .']';
// do_shortcode the shortcode
$el['atts']['product_categories'] = pagelayer_the_content($shortcode);
}
// Products - 2C
function pagelayer_sc_kkart_products(&$el){
global $product;
if(pagelayer_is_live()){
return;
}
if( KKART()->session ){
kkart_print_notices();
}
$atts = array();
$attributes = '';
$no_found = $el['atts']['no_found'];
$type = $el['atts']['source'];
// Hide the catalog order
if( empty($el['atts']['allow_order']) ){
remove_action( 'kkart_before_shop_loop', 'kkart_catalog_ordering', 30 );
}
// Hide the result count
if( empty($el['atts']['show_result']) ){
remove_action( 'kkart_before_shop_loop', 'kkart_result_count', 20 );
}
if( $type == 'pagelayer_current_query' ){
$atts['paginate'] = (!empty($el['atts']['paginate']) ? true : false);
$atts['cache'] = false;
// Set the current query
add_action( 'kkart_shortcode_products_query', 'kkart_shortcode_current_query', 10, 10);
// If product not found
add_action( "kkart_shortcode_{$type}_loop_no_results", function ($attributes) use ($no_found){
echo '<div class="pagelayer-product-no-found">'.$no_found.'</div>';
} );
$shortcode = new KKART_Shortcode_Products( $atts, $type, $el);
$el['content'] = $shortcode->get_content();
$el['inner_blocks'] = array();
return true;
}
$atts['paginate'] = (!empty($el['atts']['paginate']) ? true : false);
$atts['orderby'] = $el['atts']['orderby'];
$atts['order'] = $el['atts']['order'];
$atts['cache'] = false;
$atts['limit'] = (!empty($el['atts']['limit']) ? $el['atts']['limit'] : 12);
switch($type){
case 'recent_products':
$atts = array_merge(
array(
'orderby' => 'date',
'order' => 'DESC',
'category' => '',
'cat_operator' => 'IN',
),
(array) $atts
);
break;
case 'sale_products':
$atts = array_merge(
array(
'orderby' => 'title',
'order' => 'ASC',
'category' => '',
'cat_operator' => 'IN',
),
(array) $atts
);
break;
case 'best_selling_products':
$atts = array_merge(
array(
'category' => '',
'cat_operator' => 'IN',
),
(array) $atts
);
break;
case 'top_rated_products':
$atts = array_merge(
array(
'orderby' => 'title',
'order' => 'ASC',
'category' => '',
'cat_operator' => 'IN',
),
(array) $atts
);
break;
case 'featured_products':
$atts = array_merge(
array(
'orderby' => 'date',
'order' => 'DESC',
'category' => '',
'cat_operator' => 'IN',
),
(array) $atts
);
break;
case 'upsell_product':
$product = kkart_get_product();
$atts = (array) $atts;
$atts['ids'] = '';
if(empty($product)){
break;
}
$atts['ids'] = implode(',', $product->get_upsell_ids());
break;
case 'cross_sell_product':
$atts = (array) $atts;
$atts['ids'] = '';
$cross_sell_ids = KKART()->cart->get_cross_sells();
if(empty($cross_sell_ids)){
break;
}
$atts['ids'] = implode(',', $cross_sell_ids);
break;
case 'related_products':
$atts = (array) $atts;
$atts['ids'] = '';
$product = kkart_get_product();
if(empty($product)){
break;
}
$atts['ids'] = implode(',', kkart_get_related_products($product->get_id(), $atts['limit'], $product->get_upsell_ids()));
break;
case 'by_id':
$atts = (array) $atts;
$type = 'products';
$atts['ids'] = (!empty($el['atts']['ids']) ? $el['atts']['ids'] : '');
break;
}
if(isset($atts['ids']) && empty($atts['ids'])){
$content = '';
}else{
$shortcode = new KKART_Shortcode_Products( $atts, $type, $el );
$content = $shortcode->get_content();
}
// If product not found
if(empty($content)){
$el['atts']['product_title'] = '';
$content = '<div class="pagelayer-product-no-found">'. __($no_found) .'</div>';
}
$el['content'] = $content;
$el['inner_blocks'] = array();
}
// Archives Product Pages
function pagelayer_sc_kkart_product_archives(&$el){
if(pagelayer_is_live()){
return;
}
if ( KKART()->session ) {
kkart_print_notices();
}
$atts['paginate'] = true;
$atts['columns'] = $el['atts']['cols'];
$atts['limit'] = 10;
$atts['cache'] = false;
$no_found = $el['atts']['no_found'];
if( empty($el['atts']['allow_order']) ){
remove_action( 'kkart_before_shop_loop', 'kkart_catalog_ordering', 30 );
}
if( empty($el['atts']['show_result']) ){
remove_action( 'kkart_before_shop_loop', 'kkart_result_count', 20 );
}
$type = 'pagelayer_current_query';
// We need to define costom
if(pagelayer_is_live_template() || (wp_doing_ajax() && @$_REQUEST['action'] == 'pagelayer_product_archives')){
$type = '';
}
// Set the current query
add_action( 'kkart_shortcode_products_query', 'kkart_shortcode_current_query', 10, 10);
// If product not found
add_action( "kkart_shortcode_{$type}_loop_no_results", function ($attributes) use ($no_found){
echo '<div class="pagelayer-product-no-found">'.$no_found.'</div>';
} );
$shortcode = new KKART_Shortcode_Products( $atts, $type, $el );
$el['content'] = $shortcode->get_content();
$el['inner_blocks'] = array();
}
function kkart_fetch_variation_image($product, $option, $attribute_name){
$variations = $product->get_available_variations();
foreach($variations as $variation){
if(array_key_exists('attribute_'.$attribute_name, $variation['attributes']) && $variation['attributes']['attribute_'.$attribute_name] == $option){
return $variation['image']['thumb_src'];
}
}
}
function kkart_sc_product_variation(&$el){
global $post;
$product = kkart_get_product($post->ID);
$el['atts']['product_variation_html'] = '';
if($product->is_type('variable')){
if($el['atts']['selection_type'] === 'dropdown'){
$el['atts']['product_variation_html'] .= '<div class="kkart-variable-product-dropdown">';
foreach($product->get_attributes() as $attribute_name => $options){
$attribute = (strpos($attribute_name,"pa_") !== false) ? explode("pa_",$attribute_name)[1]: $attribute_name;
$el['atts']['product_variation_html'] .= '<label style="display:block;">'.ucfirst($attribute).'</label>';
$el['atts']['product_variation_html'] .= '<select style="display:block;">';
$options['options'] = array_unique($options['options']);
foreach($options['options'] as $option){
if(taxonomy_exists($attribute_name)){
$term = get_term_by('id',$option,$attribute_name);
$el['atts']['product_variation_html'] .= '<option>'.$term->name.'</option>';
continue;
}
$el['atts']['product_variation_html'] .= '<option>'.$option.'</option>';
}
$el['atts']['product_variation_html'] .= '</select>';
}
}
if($el['atts']['selection_type'] === 'checkbox'){
$el['atts']['product_variation_html'] .= '</div> <div class="kkart-variable-product-checkbox">';
foreach($product->get_attributes() as $attribute_name => $options){
$attribute = (strpos($attribute_name,"pa_") !==false) ? explode("pa_",$attribute_name)[1]: $attribute_name;
$el['atts']['product_variation_html'] .= '<span style="display:block;">'.ucfirst($attribute).'</span>';
$options['options'] = array_unique($options['options']);
foreach($options['options'] as $option){
if($el['atts']['checkbox_options'] === 'text'){
if(taxonomy_exists($attribute_name)){
$term = get_term_by('id',$option,$attribute_name);
$el['atts']['product_variation_html'] .= '<input type="radio" value="'.$term->name.'" name="'.$attribute_name.'" id="'.$term->name.'"><label for="'.$term->name.'">'.$term->name.'</label>';
continue;
}
$el['atts']['product_variation_html'] .= '<input type="radio" value="'.$option.'" id="'.$option.'" name="'.$attribute_name.'"><label for="'.$option.'">'.$option.'</label>';
}else if($el['atts']['checkbox_options'] === 'image'){
if(taxonomy_exists($attribute_name)){
$term = get_term_by('id',$option,$attribute_name);
$image_url = kkart_fetch_variation_image($product,$term->name,$attribute_name);
$el['atts']['product_variation_html'] .= '<input type="radio" value="'.$term->name.'" name="'.$attribute_name.'" id="'.$term->name.'"><label for="'.$term->name.'"><img src="'.$image_url.'" style="width:100%; height: 100%;"/></label>';
continue;
}
$image_url = kkart_fetch_variation_image($product,$option,$attribute_name);
$el['atts']['product_variation_html'] .= '<input type="radio" value="'.$option.'" name="'.$attribute_name.'" id="'.$option.'"><label for="'.$option.'"><img src="'.$image_url.'" style="width:100%; height: 100%;"/></label>';
}
}
}
$el['atts']['product_variation_html'] .= '</div>';
}
}
}
// Archives Product item
function pagelayer_sc_kkart_archive_item(&$el){
// Get permalinks
$link = apply_filters( 'kkart_loop_product_link', get_the_permalink() );
$el['atts']['product_link'] = esc_url( $link );
}
// Archives Product Thumbnail
function pagelayer_sc_kkart_archive_thumb(&$el){
global $product;
$product = kkart_get_product();
$urls = [];
$all_urls = [];
$ids = [];
$size = $el['atts']['size'];
$gallery = @$el['atts']['gallery'];
$thumb = '';
if ( !empty( $product ) ) {
$image_id = $product->get_image_id();
if(!empty($gallery) && !empty($image_id)){
$attachment_ids = $product->get_gallery_image_ids();
$ids = array_merge([$image_id], $attachment_ids);
}else{
$ids = $image_id;
}
}
if(empty($ids)){
$image_id = get_option( 'kkart_placeholder_image', 0 );
$ids = $image_id;
}
if(empty($product) || pagelayer_is_live_template()){
if(!empty($gallery)){
$image_id = array(1,1,1,1,1);
}else{
$image_id = 1;
}
$ids = $image_id;
}
if(is_array($ids)){
$thumb = '<ul class="kkart-thumbnail-gallery pagelayer-owl-holder pagelayer-owl-carousel pagelayer-owl-theme">';
foreach($ids as $k => $v){
$image = pagelayer_image($v);
$thumb .= '<li class="kkart-thumb-gallery-item"><img class="kkart-thumb-img" src="'.$image['url'].'"></li>';
$urls[$k] = $image;
foreach($image as $kk => $vv){
$si = strstr($kk, '-url', true);
if(!empty($si)){
$all_urls[$k][$si] = $vv;
}
}
}
$thumb .= '</ul>';
}else{
$image = pagelayer_image($ids);
$thumb = '<img class="kkart-thumb-img" src="'.$image['url'].'"/>';
$urls = $image;
foreach($image as $kk => $vv){
$si = strstr($kk, '-url', true);
if(!empty($si)){
$all_urls[$si] = $vv;
}
}
}
//Make the TMP vars
if(!empty($urls)){
$el['tmp']['ids-urls'] = json_encode($urls);
$el['tmp']['ids-all-urls'] = json_encode($all_urls);
$el['atts']['product_thumb'] = $thumb;
if(in_array(@$el['atts']['controls'], ['arrows', 'none'])){
$el['attr'][] = ['.kkart-thumbnail-gallery' => 'data-pager="false"'];
}
if(in_array(@$el['atts']['controls'], ['pager', 'none'])){
$el['attr'][] = ['.kkart-thumbnail-gallery' => 'data-controls="false"'];
}
}
// Get permalinks
if(empty($el['atts']['unlink'])){
$link = apply_filters( 'kkart_product_link', get_the_permalink() );
$el['atts']['product_link'] = esc_url( $link );
}
}
// Product Title
function pagelayer_sc_kkart_title(&$el){
global $post;
if(pagelayer_is_live_template()){
$el['atts']['product_title'] = 'Product Title';
return;
}
// Get permalinks
$link = apply_filters( 'kkart_product_link', get_the_permalink() );
$el['atts']['product_link'] = esc_url( $link );
$el['atts']['product_title'] = get_the_title();
}
// Product Rating
function pagelayer_sc_kkart_product_rating(&$el){
global $product;
$product = kkart_get_product();
if(pagelayer_is_live_template()){
$el['atts']['product_rating'] = 2.5;
$el['atts']['product_review_count'] = 1;
return;
}
if(empty($product)){
$el['atts']['product_rating'] = 0;
$el['atts']['product_review_count'] = 0;
return;
}
$rating = $product->get_average_rating();
$count = $product->get_review_count();
// Added rating
if ( kkart_review_ratings_enabled()) {
$el['atts']['product_rating'] = $rating;
$el['atts']['product_review_count'] = $count;
}
}
// Product Rating
function pagelayer_sc_kkart_sale(&$el){
global $product;
if( pagelayer_is_live_template()){
$el['atts']['is_on_sale'] = true;
if($el['atts']['show_discount']){
$el['atts']['sale_discount'] = '13%';
}
return;
}
$product = kkart_get_product();
if( empty($product)){
return;
}
$el['atts']['is_on_sale'] = $product->is_on_sale();
if($el['atts']['show_discount'] && $el['atts']['is_on_sale']){
if($product->is_type('variable') || !$product->is_purchasable()){
$el['atts']['sale_text'] = __('Sale');
$el['atts']['sale_discount'] = '';
}else{
$regular_price = (int) $product->get_regular_price();
$sale_price = (int) $product->get_sale_price();
$discount_price = round((($regular_price - $sale_price) / $regular_price) * 100);
$el['atts']['sale_discount'] = $discount_price.'%';
}
}
// Get permalinks
$link = apply_filters( 'kkart_product_link', get_the_permalink() );
$el['atts']['product_link'] = esc_url( $link );
}
// Product Rating
function pagelayer_sc_kkart_archive_crt_btn(&$el){
global $product;
$product = kkart_get_product();
$el['atts']['kkart_quantity_holder'] = '';
if(!$product || pagelayer_is_live_template()){
return;
}
$product_id = $product->get_id();
$defaults = array(
'quantity' => 1,
'class' => implode(
' ',
array_filter(
array(
'product_type_' . $product->get_type(),
//$product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '',
$product->supports( 'ajax_add_to_cart' ) && $product->is_purchasable() && $product->is_in_stock() ? 'ajax_add_to_cart' : '',
)
)
),
'attributes' => array(
'data-product_id' => $product_id,
'data-product_sku' => $product->get_sku(),
'aria-label' => $product->add_to_cart_description(),
'rel' => 'nofollow',
),
);
$args = apply_filters( 'kkart_loop_add_to_cart_args', wp_parse_args( $args, $defaults ), $product );
$link = apply_filters( 'kkart_loop_product_link', get_the_permalink() );
$items = KKART()->cart->get_cart();
$cart_qty = 0;
$cart_key = '';
foreach($items as $key => $item){
if($item['product_id'] != $product_id){
continue;
}
$cart_qty = $item['quantity'];
$cart_key = $key;
}
if ( isset( $args['attributes']['aria-label'] ) ) {
$args['attributes']['aria-label'] = wp_strip_all_tags( $args['attributes']['aria-label'] );
}
//TODO check for variant products and out of stock
$el['atts']['archive_crt_btn_link'] = ($product->supports( 'ajax_add_to_cart') ? $link : $product->add_to_cart_url()) ;
$el['atts']['archive_crt_btn_qty'] = isset( $args['quantity'] ) ? $args['quantity'] : 1;
$el['atts']['archive_crt_btn_class'] = isset( $args['class'] ) ? $args['class'] : '';
$el['atts']['archive_crt_btn_id'] = isset( $args['attributes']['data-product_id'] ) ? $args['attributes']['data-product_id'] : '';
$el['atts']['archive_crt_btn_sku'] = isset( $args['attributes']['data-product_sku'] ) ? $args['attributes']['data-product_sku'] : '';
$el['atts']['archive_crt_btn_label'] = isset( $args['attributes']['aria-label'] ) ? $args['attributes']['aria-label'] : '';
$el['atts']['archive_crt_btn_text'] = $product->is_purchasable() && $product->is_in_stock() ? __( $el['atts']['archive_crt_btn_text'], 'kkart' ) : __( 'Read more', 'kkart' );
if($product->is_type('variable') && $product->is_purchasable() && $product->is_in_stock()){
$el['atts']['archive_crt_btn_text'] = __( 'Select options', 'kkart' );
return;
}
if(!empty($cart_qty)){
$el['atts']['kkart_quantity_holder'] = '<div class="kkart-quantity">
<i class="fas fa-minus kkart-minus"></i>
<input type="number" min="1" class="kkart-quantity-input" name="quantity" value="'.$cart_qty.'">
<i class="fas fa-plus kkart-plus"></i>
</div>
<div class="kkart-quantity-close"><i class="fas fa-times kkart-close"></i></div>';
$el['atts']['cart_item_key'] = $cart_key;
$view_cart_text = (!empty($el['atts']['view_crt_btn_text'])) ? __($el['atts']['view_crt_btn_text']) : __('View cart', 'kkart');
$el['atts']['kkart_view_cart'] = '<a href="'.kkart_get_cart_url().'" class="kkart-view-btn" title="'.$view_cart_text.'">'.$view_cart_text.'</a>';
}
}
// Cart Item Count
function pagelayer_sc_kkart_cart_item_count(&$el){
if(pagelayer_is_live()){
$el['atts']['item_count'] = 1;
return;
}
// Total Items.
$cart_html = KKART()->cart->get_cart();
$el['atts']['item_count'] = count($cart_html);
}
// Product meta render - 2C
function pagelayer_sc_kkart_meta(&$el) {
global $post;
if (pagelayer_is_live_template()) {
$el['atts']['sku_value'] = 'SKU1234';
$el['atts']['category_label'] = 'Category: ';
$el['atts']['category_value'] = '<a href="" rel="tag">product</a>';
$el['atts']['tag_label'] = 'Tag: ';
$el['atts']['tag_value'] = '<a href="" rel="tag">shop</a>';
return;
}
$product = kkart_get_product();
if ( kkart_product_sku_enabled() && ( $product->get_sku() || $product->is_type( 'variable' ) ) ){
$el['atts']['sku_value'] = ( $sku = $product->get_sku() ) ? $sku : esc_html__( 'N/A', 'kkart' );
}
if ( count( $product->get_category_ids() ) > 0 ){
$el['atts']['category_label'] = _n( 'Category:', 'Categories:', count( $product->get_category_ids() ), 'kkart' ) . ' ';
$el['atts']['category_value'] = get_the_term_list( $product->get_id(), 'product_cat', '', ',', '' );
}
if ( count( $product->get_tag_ids() ) > 0 ){
$el['atts']['tag_label'] = _n( 'Tag:', 'Tags:', count( $product->get_tag_ids() ), 'kkart' ) . ' ';
$el['atts']['tag_value'] = get_the_term_list( $product->get_id(), 'product_tag', '', ',', '' );
}
}
//Product Short Description
function pagelayer_sc_kkart_short_desc(&$el) {
global $post;
if(pagelayer_is_live_template()){
$el['atts']['product_short_desc'] = 'Demo Description';
return;
}
$el['atts']['product_short_desc'] = get_the_excerpt();
}
// KKART breadcrumb render - 2C
function kkart_sc_breadcrumb() {
ob_start();
kkart_breadcrumb();
return ob_get_clean();
}
// Get product categories - 2C
function kkart_get_product_cat() {
$categories = get_terms( 'product_cat' );
$options = [];
foreach ( $categories as $category ) {
$options[ $category->term_id ] = $category->name;
}
return $options;
}
// Get product categories - 2C
function kkart_get_product_archives_desc() {
ob_start();
do_action( 'kkart_archive_description' );
return ob_get_clean();
}
// Get product additional Information - 2C
function pagelayer_sc_kkart_addi_info(&$el) {
global $product;
$product = kkart_get_product();
if(pagelayer_is_live_template()){
$el['atts']['product_addi_info_heading'] = 'Additional Information';
$product_addi_info_html = '<tr class="kkart-product-attributes-item kkart-product-attributes-item--label">
<th class="kkart-product-attributes-item__label">label</th>
<td class="kkart-product-attributes-item__value">value</td></tr>';
$el['atts']['product_addi_info'] = $product_addi_info_html;
return;
}
if($product->has_attributes()){
$heading = apply_filters( 'kkart_product_additional_information_heading', __( 'Additional information', 'kkart' ) );
$el['atts']['product_addi_info_heading'] = $heading;
$product_attributes = $product->get_attributes();
//r_print($product_attributes);
$product_attributes_html = "";
foreach ( $product_attributes as $product_attribute_key => $product_attribute ) :
$product_attributes_html.= '<tr class="kkart-product-attributes-item kkart-product-attributes-item--'.esc_attr( $product_attribute_key ).'">
<th class="kkart-product-attributes-item__label">'.wp_kses_post( $product_attribute['name'] ).'</th>
<td class="kkart-product-attributes-item__value">'.wp_kses_post( $product_attribute['value'] ).'</td>
</tr>';
endforeach;
$el['atts']['product_addi_info'] = $product_attributes_html;
}
}
// Get product additional Information - 2C
function kkart_get_product_data_tabs() {
global $product, $post;
$product = kkart_get_product();
if ( empty( $product ) ) {
return __('Products not found');
}
// We need load Pagelayer shortcodes
pagelayer_load_shortcodes();
setup_postdata( $product->get_id());
ob_start();
kkart_output_product_data_tabs();
$data_tabs = ob_get_clean();
// If no data tabs
if(empty($data_tabs)){
$data_tabs = __('Data tab not found');
}
return $data_tabs;
}
// Get the HTML for menu cart
function kkart_sc_menu_cart_html(){
// Maybe init cart
$has_cart = is_a( KKART()->cart, 'KKART_Cart' );
if ( ! $has_cart ) {
$session_class = apply_filters( 'kkart_session_handler', 'KKART_Session_Handler' );
KKART()->session = new $session_class();
KKART()->session->init();
KKART()->cart = new \KKART_Cart();
KKART()->customer = new \KKART_Customer( get_current_user_id(), true );
}
// Get the cart values
$widget_cart_is_hidden = apply_filters( 'kkart_widget_cart_is_hidden', is_cart() || is_checkout() );
$product_count = KKART()->cart->get_cart_contents_count();
$sub_total = KKART()->cart->get_cart_subtotal();
$cart_items = KKART()->cart->get_cart();
$toggle_button_link = $widget_cart_is_hidden ? kkart_get_cart_url() : '#';
/** workaround KKART Subscriptions issue that changes the behavior of is_cart() */
$toggle_button_classes = 'pagelayer-cart-button pagelayer-size-sm';
$toggle_button_classes .= $widget_cart_is_hidden ? ' pagelayer-menu-cart-hidden' : '';
$counter_attr = 'data-counter="' . $product_count . '"';
$cart_html = '<div class="pagelayer-menu-cart-toggle">
<a href="'. esc_attr( $toggle_button_link ) .'" class="'. $toggle_button_classes .'">
<span class="pagelayer-cart-button-text">'. $sub_total .'</span>
<span class="pagelayer-cart-button-icon" '. $counter_attr .'>
<i class="{{icon_type}}" aria-hidden="true"></i>
</span>
</a>
</div>';
// If is cart and checkout page the except this
if ( ! $widget_cart_is_hidden ){
ob_start();
kkart_mini_cart();
$mini_cart_html = ob_get_clean();
$cart_html .= '<div class="pagelayer-menu-cart-container">
<form class="pagelayer-menu-cart-main kkart-cart-form" action="'. esc_url( kkart_get_cart_url() ) .'" method="post">
<div class="pagelayer-menu-cart-close">×</div>
'. $mini_cart_html .'
</form>
</div>';
}
return $cart_html;
}
function pagelayer_sc_kkart_checkout_proceed_btn(&$el){
$el['atts']['checkout_proceed_link'] = esc_url(kkart_get_checkout_url());
}
function pagelayer_sc_kkart_myaccount_tabs(&$el){
$tabs = array('dashboard' => 'Dashboard', 'downloads' => 'Downloads', 'orders' => 'Orders', 'edit-account' => 'Account Details', 'edit-address' => 'Addresses', 'support' => 'Support', 'customer-logout' => 'Logout');
$el['atts']['tab_holder'] = '';
$el['atts']['tab_content'] = '';
if(!is_user_logged_in()){
$register = get_option('kkart_enable_myaccount_registration');
$form = '<div class="kkart-login-form-holder">
<div class="kkart-login-form">';
$form .= kkart_login_form(array(), false);
$form .= '</div>';
if($register == 'yes'){
$form .= '<div class="kkart-registration-form" style="display:none">';
$form .= kkart_register_form(array(), false);
$form .= '</div>';
}
$form .= '</div>';
$el['atts']['kkart_login_form'] = $form;
}else{
foreach($tabs as $tk => $tv){
$current_user = wp_get_current_user();
if($tk == "customer-logout"){
$el['atts']['tab_holder'] .= '<a href="'.kkart_logout_url().'" class="kkart-tablinks">'.$tv.'</a>';
}else{
$el['atts']['tab_holder'] .= '<a href="#'.$tk.'" data-target="'.$tk.'" class="kkart-tablinks">'.$tv.'</a>';
$data_content .= '<div class="kkart-tab-content-holder" data-tabholder="'.$tk.'">';
switch($tk){
case 'dashboard':
$data_content .= '<p>Hello <strong>'.$current_user->display_name.'</strong>( not <strong>'.$current_user->display_name.'</strong>? <a href="'.esc_url(kkart_logout_url()).'">Logout</a>)</p><br/>
<p>'. __( 'From your account dashboard you can view your <strong>recent orders</strong>, manage your <strong>billing address</strong>, and <strong>edit your password and account details</strong>.', 'kkart' ) .'</p>';
break;
case 'orders':
$current_page = get_the_ID();
$order_col = array('order-number','order-date','order-status','order-total','order-actions');
$data_content .= '<div class="kkart-myaccount-order-holder">';
$data_content .= kkart_account_orders($current_page, $order_col);
$data_content .= '</div>';
break;
case 'downloads':
$download_col = array('download-product','download-file','download-remaining','download-expires');
$data_content .= '<div class="kkart-myaccount-download-holder">';
$data_content .= kkart_account_downloads($download_col);
$data_content .= '</div>';
break;
case 'edit-account':
$fields = array(
'account_first_name' => array(
'label' => __pl('First Name'),
'value' => (!empty($current_user) ? $current_user->first_name : '')
),
'account_last_name' => array(
'label' => __pl('Last Name'),
'value' => (!empty($current_user) ? $current_user->last_name : '')
),
'account_display_name' => array(
'label' => __pl('Display Name'),
'value' => (!empty($current_user) ? $current_user->display_name : '')
),
'account_email' => array(
'label' => __('Email-id'),
'value' => (!empty($current_user) ? $current_user->user_email : '')
),
'account_password' => array(
'password_current' => array(
'label' => __('Current Password')
),
'password_1' => array(
'label' => __('New Password')
),
'password_2' => array(
'label' => __('Confirm Password')
),
)
);
if(!empty(kkart_get_notices('success'))){
$notice = kkart_get_notices('success');
$data_content .= '<div class="kkart-message kkart-message--success kkart-Message kkart-Message--success kkart-success">'.$notice[0]['notice'].'</div>';
kkart_clear_notices();
}
if(!empty(kkart_get_notices('error'))){
$notice = kkart_get_notices('error');
$data_content .= '<div class="kkart-message kkart-message--error kkart-Message kkart-Message--error kkart-error">'.$notice[0]['notice'].'</div>';
kkart_clear_notices();
}
$data_content .= '<form class="kkart-account-form" name="" action="" method="post"><div class="kkart-account-form-holder">';
foreach($fields as $fk => $fv){
if($fk == 'account_password'){
foreach($fields[$fk] as $pk => $pv){
$data_content .= '<label>'.$pv['label'].'</label><input type="text" name="'.$pk.'" id="'.$pk.'" placeholder="'.$pv['label'].'" value="">';
}
}
else{
$data_content .= '<label>'.$fv['label'].' <span class="kkart-require-field">*</span></label><input type="text" name="'.$fk.'" id="'.$fk.'" placeholder="'.$fv['label'].'" value="'.$fv['value'].'">';
}
}
/* <i if="'.$el['atts']['icon'].'" class="'.$el['atts']['icon'].' kkart-account-btn-icon"></i> */
$data_content .= '</div>
<p>
<input type="hidden" id="save-account-details-nonce" name="save-account-details-nonce" value="'.wp_create_nonce('save_account_details').'">
<input type="hidden" name="action" value="save_account_details">
</p>
<div class="kkart-account-btn-holder">
<button name="save_account_details" value="Save Changes" type="submit" class="kkart-account-btn">
<span class="kkart-account-btn-text">Submit</span>
</button>
</div></form>';
break;
case 'support':
$support_email = get_option('kkart_store_customer_care_email');
$support_email = empty($support_email) ? get_option( 'admin_email' ) : $support_email;
$data_content .= __('You can contact us via email. Our email address is ').'<a href="mailto:'.$support_email.'">'.$support_email.'</a>'.__('. We will get back to you as soon as possible!');
break;
case 'edit-address':
$data_content .= '<div class="kkart-myaccount-address-holder">';
$data_content .= kkart_checkout_billing($el);
$data_content .= '</div>';
break;
}
$data_content .= '</div>';
}
}
$el['atts']['tab_content'] = $data_content;
}
}
// Order received information handler
function kkart_sc_order_info(&$el){
if(pagelayer_is_live()){
$el['oAtts']['editor_view'] = $el['atts']['editor_view'] = '';
$el['atts']['show_info'] = true;
return;
}
$order = false;
$order_id = @$_GET['order_id'];
// Get the order.
$order_id = apply_filters( 'kkart_thankyou_order_id', absint( $order_id ) );
$order_key = apply_filters( 'kkart_thankyou_order_key', empty( $_GET['key'] ) ? '' : kkart_clean( wp_unslash( $_GET['key'] ) ) ); // WPCS: input var ok, CSRF ok.
if ( $order_id > 0 ) {
$order = kkart_get_order( $order_id );
if ( ! $order || ! hash_equals( $order->get_order_key(), $order_key ) ) {
$order = false;
}
}
// Empty awaiting payment session.
unset( KKART()->session->order_awaiting_payment );
// In case order is created from admin, but paid by the actual customer, store the ip address of the payer
// when they visit the payment confirmation page.
if ( $order && $order->is_created_via( 'admin' ) ) {
$order->set_customer_ip_address( KKART_Geolocation::get_ip_address() );
$order->save();
}
// Empty current cart.
kkart_empty_cart();
$div = '';
if( $order ){
if( $order->has_status( 'failed' )){
$el['atts']['show_failed'] = true;
$el['atts']['failed_text'] .= '<p class="kkart-notice kkart-notice--error kkart-thankyou-order-failed-actions">
<a href="'. esc_url( $order->get_checkout_payment_url() ) .'" class="button pay">'. esc_html( 'Pay', 'kkart' ).'</a>';
if( is_user_logged_in() ){
$el['atts']['failed_text'] .= '<a href="'. esc_url( kkart_get_page_permalink( 'myaccount' ) ) .'" class="button pay">'. esc_html( 'My account', 'kkart' ) .'</a>';
}
$el['atts']['failed_text'] .= '</p>';
}else{
$vars = array(
'$order_number' => $order->get_order_number(),
'$order_date' => kkart_format_datetime( $order->get_date_created() ),
'$billing_email' => ( is_user_logged_in() && $order->get_user_id() === get_current_user_id() && $order->get_billing_email() ) ? $order->get_billing_email() : '',
'$order_total' => $order->get_formatted_order_total(),
'$payment_method' => ($order->get_payment_method_title() ? wp_kses_post( $order->get_payment_method_title() ) : '')
);
$el['atts']['show_info'] = true;
// Create the HTML object
$node = pagelayerQuery::parseStr($el['atts']['info_text']);
foreach($vars as $key => $value){
if(empty($value)){
foreach($node('[if="'.$key.'"]') as $v){
$v->remove();
}
}
}
$el['atts']['info_text'] = $node->html();
foreach($vars as $key => $value){
$el['atts']['info_text'] = str_replace($key, $value, $el['atts']['info_text']);
}
}
}else{
$el['atts']['show_not_found'] = true;
$el['atts']['order_not_found_txt'] = '<p class="kkart-notice kkart-notice--success kkart-thankyou-order-received">'. apply_filters( 'kkart_thankyou_order_not_found_text', $el['atts']['order_not_found_txt'], null ) .'</p>';
}
}
// Order received details handler
function kkart_sc_order_details(&$el){
if(pagelayer_is_live()){
$el['atts']['order_details'] = 'Order detail Holder';
return;
}
$order_id = @$_GET['order_id'];
// Get the order.
$order_id = apply_filters( 'kkart_thankyou_order_id', absint( $order_id ) );
$order = kkart_get_order( $order_id );
if ( ! $order ) {
$el['atts']['order_details'] = 'Order Not Found';
return;
}
$order_items = $order->get_items( apply_filters( 'kkart_purchase_order_item_types', 'line_item' ) );
$show_purchase_note = $order->has_status( apply_filters( 'kkart_purchase_note_order_statuses', array( 'completed', 'processing' ) ) );
$show_customer_details = is_user_logged_in() && $order->get_user_id() === get_current_user_id();
$downloads = $order->get_downloadable_items();
$show_downloads = $order->has_downloadable_item() && $order->is_download_permitted();
if ( $show_downloads ) {
$el['atts']['show_downloads'] = true;
ob_start();
echo '<table class="kkart-table kkart-table-order-downloads shop_table shop_table_responsive order_details">
<thead>
<tr>';
foreach( kkart_get_account_downloads_columns() as $column_id => $column_name ){
echo '<th class="'. esc_attr( $column_id ) .'"><span class="nobr">'. esc_html( $column_name ) .'</span></th>';
}
echo '</tr>
</thead>';
foreach( $downloads as $download ){
echo '<tr>';
foreach(kkart_get_account_downloads_columns() as $column_id => $column_name ){
echo '<td class="'. esc_attr( $column_id ).'" data-title="'. esc_attr( $column_name ).'">';
if ( has_action( 'kkart_account_downloads_column_' . $column_id ) ) {
do_action( 'kkart_account_downloads_column_' . $column_id, $download );
} else {
switch ( $column_id ) {
case 'download-product':
if ( $download['product_url'] ) {
echo '<a href="' . esc_url( $download['product_url'] ) . '">' . esc_html( $download['product_name'] ) . '</a>';
} else {
echo esc_html( $download['product_name'] );
}
break;
case 'download-file':
echo '<a href="' . esc_url( $download['download_url'] ) . '" class="kkart-MyAccount-downloads-file button alt">' . esc_html( $download['download_name'] ) . '</a>';
break;
case 'download-remaining':
echo is_numeric( $download['downloads_remaining'] ) ? esc_html( $download['downloads_remaining'] ) : esc_html__( '∞', 'kkart' );
break;
case 'download-expires':
if ( ! empty( $download['access_expires'] ) ) {
echo '<time datetime="' . esc_attr( date( 'Y-m-d', strtotime( $download['access_expires'] ) ) ) . '" title="' . esc_attr( strtotime( $download['access_expires'] ) ) . '">' . esc_html( date_i18n( get_option( 'date_format' ), strtotime( $download['access_expires'] ) ) ) . '</time>';
} else {
esc_html_e( 'Never', 'kkart' );
}
break;
}
}
echo '</td>';
}
echo '</tr>';
}
echo '</table>';
$el['atts']['download_details'] = ob_get_clean();
}
$order_details = '<table class="kkart-table kkart-table-order-details">
<thead>
<tr>
<th class="kkart-table__product-name product-name">'. esc_html( 'Product', 'kkart' ) .'</th>
<th class="kkart-table__product-table product-total">'. esc_html( 'Total', 'kkart' ) .'</th>
</tr>
</thead>
<tbody>';
ob_start();
do_action( 'kkart_order_details_before_order_table_items', $order );
foreach ( $order_items as $item_id => $item ) {
$product = $item->get_product();
$purchase_note = $product ? $product->get_purchase_note() : '';
if ( ! apply_filters( 'kkart_order_item_visible', true, $item ) ) {
continue;
}
echo '<tr claess="'. esc_attr( apply_filters( 'kkart_order_item_class', 'kkart-table__line-item order_item', $item, $order ) ) .'">
<td class="kkart-table__product-name product-name">';
$is_visible = $product && $product->is_visible();
$product_permalink = apply_filters( 'kkart_order_item_permalink', $is_visible ? $product->get_permalink( $item ) : '', $item, $order );
echo apply_filters( 'kkart_order_item_name', $product_permalink ? sprintf( '<a href="%s">%s</a>', $product_permalink, $item->get_name() ) : $item->get_name(), $item, $is_visible ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
$qty = $item->get_quantity();
$refunded_qty = $order->get_qty_refunded_for_item( $item_id );
if ( $refunded_qty ) {
$qty_display = '<del>' . esc_html( $qty ) . '</del> <ins>' . esc_html( $qty - ( $refunded_qty * -1 ) ) . '</ins>';
} else {
$qty_display = esc_html( $qty );
}
echo apply_filters( 'kkart_order_item_quantity_html', ' <strong class="product-quantity">' . sprintf( '× %s', $qty_display ) . '</strong>', $item );
do_action( 'kkart_order_item_meta_start', $item_id, $item, $order, false );
kkart_display_item_meta( $item );
do_action( 'kkart_order_item_meta_end', $item_id, $item, $order, false );
echo '</td>
<td class="kkart-table__product-total product-total">'. $order->get_formatted_line_subtotal( $item ) .'</td>
</tr>';
if( $show_purchase_note && $purchase_note ){
echo '<tr class="kkart-table__product-purchase-note product-purchase-note">
<td colspan="2">'. wpautop( do_shortcode( wp_kses_post( $purchase_note ) ) ) .'</td>
</tr>';
}
}
do_action( 'kkart_order_details_after_order_table_items', $order );
$order_details .= ob_get_clean() .'</tbody>
<tfoot>';
foreach ( $order->get_order_item_totals() as $key => $total ) {
$order_details .= '<tr>
<th scope="row">'. esc_html( $total['label'] ) .'</th>
<td>'. (( 'payment_method' === $key ) ? esc_html( $total['value'] ) : wp_kses_post( $total['value'] )) .'</td>
</tr>';
}
if($order->get_customer_note()){
$order_details .= '<tr>
<th>'. esc_html( 'Note:', 'kkart' ) .'</th>
<td>'. wp_kses_post( nl2br( wptexturize( $order->get_customer_note() ) ) ) .'</td>
</tr>';
}
$order_details .= '</tfoot>
</table>';
$el['atts']['order_details'] = $order_details;
}
// TODO improve this for live editor and parse with variables
// Order received customer handler
function kkart_sc_order_address(&$el){
if(pagelayer_is_live()){
$el['atts']['billing_details'] = 'Billing Address holder';
return;
}
$order_id = @$_GET['order_id'];
// Get the order.
$order_id = apply_filters( 'kkart_thankyou_order_id', absint( $order_id ) );
$order = kkart_get_order( $order_id );
if ( ! $order ) {
return;
}
$show_shipping = (! kkart_ship_to_billing_address_only() && $order->needs_shipping_address());
$billing_details = '<address>'. wp_kses_post( $order->get_formatted_billing_address( esc_html__( 'N/A', 'kkart' ) ) );
if($order->get_billing_phone()){
$billing_details .= '<p class="kkart-customer-details--phone">'. esc_html( $order->get_billing_phone() ) .'</p>';
}
if( $order->get_billing_email()){
$billing_details .= '<p class="kkart-customer-details--email">'. esc_html( $order->get_billing_email() ) .'</p>';
}
$billing_details .= '</address>';
$el['atts']['billing_details'] = $billing_details;
if( $show_shipping ){
$shipping_details = '<address>'. wp_kses_post( $order->get_formatted_shipping_address( esc_html__( 'N/A', 'kkart' ) ) ) .'</address>';
$el['atts']['show_shipping'] = true;
$el['atts']['shipping_details'] = $shipping_details;
}
}
// Order pay handler
function kkart_sc_order_pay(&$el){
if(pagelayer_is_live()){
$el['atts']['show_pay_form'] = true;
$el['atts']['order_pay_form'] = 'Pay Form Holder';
return;
}
$order_id = absint( @$_GET['order_id'] );
$div = '';
// Pay for existing order.
if ( isset( $_GET['pay_for_order'], $_GET['key'] ) && $order_id ) { // WPCS: input var ok, CSRF ok.
try {
$order_key = isset( $_GET['key'] ) ? kkart_clean( wp_unslash( $_GET['key'] ) ) : ''; // WPCS: input var ok, CSRF ok.
$order = kkart_get_order( $order_id );
// Order or payment link is invalid.
if ( ! $order || $order->get_id() !== $order_id || ! hash_equals( $order->get_order_key(), $order_key ) ) {
throw new Exception( __( 'Sorry, this order is invalid and cannot be paid for.', 'kkart' ) );
}
// Logged out customer does not have permission to pay for this order.
if ( ! current_user_can( 'pay_for_order', $order_id ) && ! is_user_logged_in() ) {
$el['atts']['show_login'] = true;
$el['atts']['order_pay_login'] = '<div class="kkart-info">' . esc_html__( 'Please log in to your account below to continue to the payment form.', 'kkart' ) . '</div>'.
kkart_login_form(
array(
'redirect' => $order->get_checkout_payment_url(),
),
false
);
$el['atts']['messages'] = $div;
return;
}
// Add notice if logged in customer is trying to pay for guest order.
if ( ! $order->get_user_id() && is_user_logged_in() ) {
// If order has does not have same billing email then current logged in user then show warning.
if ( $order->get_billing_email() !== wp_get_current_user()->user_email ) {
ob_start();
kkart_print_notice( __( 'You are paying for a guest order. Please continue with payment only if you recognize this order.', 'kkart' ), 'error' );
$div .= ob_get_clean();
}
}
// Logged in customer trying to pay for someone else's order.
if ( ! current_user_can( 'pay_for_order', $order_id ) ) {
throw new Exception( __( 'This order cannot be paid for. Please contact us if you need assistance.', 'kkart' ) );
}
// Does not need payment.
if ( ! $order->needs_payment() ) {
/* translators: %s: order status */
throw new Exception( sprintf( __( 'This order’s status is “%s”—it cannot be paid for. Please contact us if you need assistance.', 'kkart' ), kkart_get_order_status_name( $order->get_status() ) ) );
}
// Ensure order items are still stocked if paying for a failed order. Pending orders do not need this check because stock is held.
if ( ! $order->has_status( kkart_get_is_pending_statuses() ) ) {
$quantities = array();
foreach ( $order->get_items() as $item_key => $item ) {
if ( $item && is_callable( array( $item, 'get_product' ) ) ) {
$product = $item->get_product();
if ( ! $product ) {
continue;
}
$quantities[ $product->get_stock_managed_by_id() ] = isset( $quantities[ $product->get_stock_managed_by_id() ] ) ? $quantities[ $product->get_stock_managed_by_id() ] + $item->get_quantity() : $item->get_quantity();
}
}
foreach ( $order->get_items() as $item_key => $item ) {
if ( $item && is_callable( array( $item, 'get_product' ) ) ) {
$product = $item->get_product();
if ( ! $product ) {
continue;
}
if ( ! apply_filters( 'kkart_pay_order_product_in_stock', $product->is_in_stock(), $product, $order ) ) {
/* translators: %s: product name */
throw new Exception( sprintf( __( 'Sorry, "%s" is no longer in stock so this order cannot be paid for. We apologize for any inconvenience caused.', 'kkart' ), $product->get_name() ) );
}
// We only need to check products managing stock, with a limited stock qty.
if ( ! $product->managing_stock() || $product->backorders_allowed() ) {
continue;
}
// Check stock based on all items in the cart and consider any held stock within pending orders.
$held_stock = kkart_get_held_stock_quantity( $product, $order->get_id() );
$required_stock = $quantities[ $product->get_stock_managed_by_id() ];
if ( ! apply_filters( 'kkart_pay_order_product_has_enough_stock', ( $product->get_stock_quantity() >= ( $held_stock + $required_stock ) ), $product, $order ) ) {
/* translators: 1: product name 2: quantity in stock */
throw new Exception( sprintf( __( 'Sorry, we do not have enough "%1$s" in stock to fulfill your order (%2$s available). We apologize for any inconvenience caused.', 'kkart' ), $product->get_name(), kkart_format_stock_quantity_for_display( $product->get_stock_quantity() - $held_stock, $product ) ) );
}
}
}
}
KKART()->customer->set_props(
array(
'billing_country' => $order->get_billing_country() ? $order->get_billing_country() : null,
'billing_state' => $order->get_billing_state() ? $order->get_billing_state() : null,
'billing_postcode' => $order->get_billing_postcode() ? $order->get_billing_postcode() : null,
)
);
KKART()->customer->save();
$available_gateways = KKART()->payment_gateways->get_available_payment_gateways();
$order_button_text = apply_filters( 'kkart_pay_order_button_text', __( 'Pay for order', 'kkart' ) );
$totals = $order->get_order_item_totals();
if ( count( $available_gateways ) ) {
current( $available_gateways )->set_current();
}
$el['atts']['show_pay_form'] = true;
$el['atts']['order_pay_form'] = '<form id="order_review" method="post">
<table class="shop_table">
<thead>
<tr>
<th class="product-name">'. esc_html( 'Product', 'kkart' ) .'</th>
<th class="product-quantity">'. esc_html( 'Qty', 'kkart' ) .'</th>
<th class="product-total">'. esc_html( 'Totals', 'kkart' ) .'</th>
</tr>
</thead>
<tbody>';
ob_start();
if(count( $order->get_items() ) > 0){
foreach( $order->get_items() as $item_id => $item ){
if ( ! apply_filters( 'kkart_order_item_visible', true, $item ) ) {
continue;
}
echo '<tr class="'. esc_attr( apply_filters( 'kkart_order_item_class', 'order_item', $item, $order ) ) .'">
<td class="product-name">'.
apply_filters( 'kkart_order_item_name', esc_html( $item->get_name() ), $item, false );
do_action( 'kkart_order_item_meta_start', $item_id, $item, $order, false );
kkart_display_item_meta( $item );
do_action( 'kkart_order_item_meta_end', $item_id, $item, $order, false );
echo '</td>
<td class="product-quantity">'. apply_filters( 'kkart_order_item_quantity_html', ' <strong class="product-quantity">' . sprintf( '× %s', esc_html( $item->get_quantity() ) ) . '</strong>', $item ) .'</td>
<td class="product-subtotal">'. $order->get_formatted_line_subtotal( $item ) .'
</tr>';
}
}
$el['atts']['order_pay_form'] .= ob_get_clean() .'
</tbody>
<tfoot>';
if($totals){
foreach($totals as $total){
$el['atts']['order_pay_form'] .= '<tr>
<th scope="row" colspan="2">'. $total['label'] .'</th>
<td class="product-total">'. $total['value'] .'</td>
</tr>';
}
}
$el['atts']['order_pay_form'] .= '</tfoot>
</table>
<div id="payment">';
ob_start();
if($order->needs_payment()){
echo '<ul class="kkart_payment_methods payment_methods methods">';
if ( ! empty( $available_gateways ) ) {
foreach ( $available_gateways as $gateway ) {
echo '<li class="kkart_payment_method payment_method_'. esc_attr( $gateway->id ) .'">
<input id="payment_method_'. esc_attr( $gateway->id ) .'" type="radio" class="input-radio" name="payment_method" value="'. esc_attr( $gateway->id ) .'" '. checked( $gateway->chosen, true, false ).' data-order_button_text="'. esc_attr( $gateway->order_button_text ).'" />
<label for="payment_method_'. esc_attr( $gateway->id ).'">'.
$gateway->get_title() . $gateway->get_icon() .'
</label>';
if( $gateway->has_fields() || $gateway->get_description() ){
echo '<div class="payment_box payment_method_'. esc_attr( $gateway->id ) .'" '.
(( ! $gateway->chosen ) ? 'style="display:none;"' : '') .' >';
$gateway->payment_fields();
echo '</div>';
}
echo '</li>';
}
} else {
echo '<li class="kkart-notice kkart-notice--info kkart-info">' . apply_filters( 'kkart_no_available_payment_methods_message', esc_html__( 'Sorry, it seems that there are no available payment methods for your location. Please contact us if you require assistance or wish to make alternate arrangements.', 'kkart' ) ) . '</li>'; // @codingStandardsIgnoreLine
}
echo '</ul>';
}
echo '<div class="form-row">
<input type="hidden" name="kkart_pay" value="1" />';
kkart_checkout_terms();
do_action( 'kkart_pay_order_before_submit' );
echo apply_filters( 'kkart_pay_order_button_html', '<button type="submit" class="button alt" id="place_order" value="' . esc_attr( $order_button_text ) . '" data-value="' . esc_attr( $order_button_text ) . '">' . esc_html( $order_button_text ) . '</button>' );
do_action( 'kkart_pay_order_after_submit' );
wp_nonce_field( 'kkart-pay', 'kkart-pay-nonce' );
$el['atts']['order_pay_form'] .= ob_get_clean() .'
</div>
</div>
</form>';
} catch ( Exception $e ) {
ob_start();
kkart_print_notice( $e->getMessage(), 'error' );
$div .= ob_get_clean();
}
} elseif ( $order_id ) {
// Pay for order after checkout step.
$order_key = isset( $_GET['key'] ) ? kkart_clean( wp_unslash( $_GET['key'] ) ) : ''; // WPCS: input var ok, CSRF ok.
$order = kkart_get_order( $order_id );
if ( $order && $order->get_id() === $order_id && hash_equals( $order->get_order_key(), $order_key ) ) {
if ( $order->needs_payment() ) {
// To load payment geteways
$available_gateways = KKART()->payment_gateways->get_available_payment_gateways();
$el['atts']['show_details'] = true;
$el['atts']['order_pay_details'] = '<ul class="order_details">
<li class="order">'.
esc_html( 'Order number:', 'kkart' ) .'
<strong>'. esc_html( $order->get_order_number() ) .'</strong>
</li>
<li class="date">'.
esc_html( 'Date:', 'kkart' ) .'
<strong>'. esc_html( kkart_format_datetime( $order->get_date_created() ) ) .'</strong>
</li>
<li class="total">'.
esc_html( 'Total:', 'kkart' ).'
<strong>'. wp_kses_post( $order->get_formatted_order_total() ).'</strong>
</li>';
if($order->get_payment_method_title()){
$el['atts']['order_pay_details'] .= '<li class="method">'.
esc_html( 'Payment method:', 'kkart' ) .'
<strong>'. wp_kses_post( $order->get_payment_method_title() ) .'</strong>
</li>';
}
$el['atts']['order_pay_details'] .= '</ul>';
ob_start();
do_action( 'kkart_receipt_' . $order->get_payment_method(), $order->get_id() );
$el['atts']['order_pay_details'] .= ob_get_clean();
} else {
ob_start();
/* translators: %s: order status */
kkart_print_notice( sprintf( __( 'This order’s status is “%s”—it cannot be paid for. Please contact us if you need assistance.', 'kkart' ), kkart_get_order_status_name( $order->get_status() ) ), 'error' );
$div .= ob_get_clean();
}
} else {
ob_start();
kkart_print_notice( __( 'Sorry, this order is invalid and cannot be paid for.', 'kkart' ), 'error' );
$div .= ob_get_clean();
}
} else {
ob_start();
kkart_print_notice( __( 'Invalid order.', 'kkart' ), 'error' );
$div .= ob_get_clean();
}
$el['atts']['messages'] = $div;
}
// Buy now handler
function kkart_sc_buy_now(&$el){
$_product = kkart_get_product( get_the_ID() );
$el['atts']['buy_now_show'] = true;
if(pagelayer_is_live() || empty($_product)){
return;
}
if ( !$_product->is_type( 'simple' ) || !$_product->is_purchasable() || !$_product->is_in_stock() ) {
$el['atts']['buy_now_show'] = false;
return;
}
$el['atts']['buy_now_url'] = esc_url(
add_query_arg(
array(
'add-to-cart' => get_the_ID(),
'buy-now' => get_the_ID(),
),
kkart_get_cart_url() )
);
}