You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
4.0 KiB
152 lines
4.0 KiB
<?php
|
|
|
|
namespace XTS\Modules\Layouts;
|
|
|
|
use WC_Product_Factory;
|
|
use WP_Query;
|
|
|
|
class Single_Product extends Layout_Type {
|
|
/**
|
|
* Check.
|
|
*
|
|
* @param array $condition Condition.
|
|
* @param string $type Layout type.
|
|
*/
|
|
public function check( $condition, $type = '' ) {
|
|
$is_active = false;
|
|
|
|
switch ( $condition['condition_type'] ) {
|
|
case 'all':
|
|
$is_active = is_singular( 'product' );
|
|
break;
|
|
case 'product':
|
|
$is_active = (int) woodmart_get_the_ID() === (int) $condition['condition_query'];
|
|
break;
|
|
case 'product_type':
|
|
$is_active = WC_Product_Factory::get_product_type( woodmart_get_the_ID() ) === $condition['condition_query'];
|
|
break;
|
|
case 'product_cat':
|
|
case 'product_tag':
|
|
case 'product_attr_term':
|
|
$terms = wp_get_post_terms( woodmart_get_the_ID(), get_taxonomies(), array( 'fields' => 'ids' ) );
|
|
|
|
if ( $terms ) {
|
|
$is_active = in_array( (int) $condition['condition_query'], $terms, true );
|
|
}
|
|
break;
|
|
case 'product_cat_children':
|
|
$terms = wp_get_post_terms( woodmart_get_the_ID(), get_taxonomies(), array( 'fields' => 'ids' ) );
|
|
$term_children = get_term_children( $condition['condition_query'], 'product_cat' );
|
|
|
|
if ( $terms ) {
|
|
$is_active = count( array_diff( $terms, $term_children ) ) !== count( $terms );
|
|
}
|
|
break;
|
|
}
|
|
|
|
return $is_active;
|
|
}
|
|
|
|
/**
|
|
* Override template.
|
|
*
|
|
* @param string $template Template.
|
|
*
|
|
* @return bool|string
|
|
*/
|
|
public function override_template( $template ) {
|
|
if ( woodmart_woocommerce_installed() && is_singular( 'product' ) && Main::get_instance()->has_custom_layout( 'single_product' ) ) {
|
|
$this->display_template();
|
|
|
|
return false;
|
|
}
|
|
|
|
return $template;
|
|
}
|
|
|
|
/**
|
|
* Display custom template.
|
|
*/
|
|
private function display_template() {
|
|
$this->before_template_content();
|
|
|
|
woodmart_enqueue_inline_style( 'woo-single-prod-builder' );
|
|
?>
|
|
<?php while ( have_posts() ) : ?>
|
|
<?php the_post(); ?>
|
|
<div id="product-<?php the_ID(); ?>" <?php wc_product_class( 'single-product-page' ); ?>>
|
|
<?php $this->template_content( 'single_product' ); // phpcs:ignore ?>
|
|
<?php if ( function_exists( 'WC' ) && is_object( WC()->structured_data ) ) : ?>
|
|
<?php WC()->structured_data->generate_product_data(); ?>
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php endwhile; ?>
|
|
<?php
|
|
$this->after_template_content();
|
|
}
|
|
|
|
/**
|
|
* Get preview product id.
|
|
*
|
|
* @return int
|
|
*/
|
|
public static function get_preview_product_id() {
|
|
$product_id = woodmart_get_opt( 'single_product_builder_post_data' );
|
|
|
|
if ( ! $product_id ) {
|
|
$random_product = new WP_Query(
|
|
array(
|
|
'posts_per_page' => '1',
|
|
'post_type' => 'product',
|
|
)
|
|
);
|
|
|
|
while ( $random_product->have_posts() ) {
|
|
$random_product->the_post();
|
|
$product_id = get_the_ID();
|
|
}
|
|
|
|
wp_reset_postdata();
|
|
}
|
|
|
|
return $product_id;
|
|
}
|
|
|
|
/**
|
|
* Setup post data.
|
|
*/
|
|
public static function setup_postdata( $force_product_id = false ) {
|
|
global $post, $product;
|
|
|
|
if ( ( Main::is_layout_type( 'single_product') && empty( $product ) ) || is_singular( 'woodmart_layout' ) || wp_doing_ajax() || ( isset( $_POST['action'] ) && 'editpost' === $_POST['action'] ) || $force_product_id ) { // phpcs:ignore
|
|
$product_id = $force_product_id ? $force_product_id : self::get_preview_product_id();
|
|
$post = get_post( $product_id ); // phpcs:ignore
|
|
|
|
setup_postdata( $post );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Reset post data.
|
|
*/
|
|
public static function reset_postdata( $force_product_id = false ) {
|
|
if ( is_singular( 'woodmart_layout' ) || wp_doing_ajax() || $force_product_id ) {
|
|
wp_reset_postdata();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Template content.
|
|
*
|
|
* @param string $type Template type.
|
|
*/
|
|
public function template_content( $type ) {
|
|
remove_filter( 'the_content', 'convert_smilies', 20 );
|
|
|
|
parent::template_content( $type );
|
|
|
|
add_filter( 'the_content', 'convert_smilies', 20 );
|
|
}
|
|
}
|
|
|
|
Single_Product::get_instance();
|
|
|