geno/wp-content/plugins/cartflows/modules/thankyou/classes/class-cartflows-thankyou-markup.php
2024-02-01 11:54:18 +00:00

444 lines
13 KiB
PHP

<?php
/**
* Front end and markup
*
* @package CartFlows
*/
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Checkout Markup
*
* @since 1.0.0
*/
class Cartflows_Thankyou_Markup {
/**
* Member Variable
*
* @var object instance
*/
private static $instance;
/**
* Initiator
*/
public static function get_instance() {
if ( ! isset( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Constructor
*/
public function __construct() {
/* Downsell Shortcode */
add_shortcode( 'cartflows_order_details', array( $this, 'cartflows_order_details_shortcode_markup' ) );
add_action( 'wp_enqueue_scripts', array( $this, 'thank_you_scripts' ), 21 );
add_action( 'woocommerce_is_order_received_page', array( $this, 'set_order_received_page' ) );
/* Set is checkout flag */
add_filter( 'woocommerce_is_checkout', array( $this, 'woo_checkout_flag' ), 9999 );
/* Custom redirection of thank you page */
add_action( 'template_redirect', array( $this, 'redirect_tq_page_to_custom_url' ) );
add_action( 'cartflows_thank_you_scripts', array( $this, 'add_divi_compatibility_css' ) );
add_action( 'wp', array( $this, 'secure_thank_you_page' ), 10 );
}
/**
* Restrict users to access the thank you page directly.
*/
public function secure_thank_you_page() {
$thank_you_id = _get_wcf_thankyou_id();
// Returns false if no thank you page ID is found.
if ( ! $thank_you_id ) {
return;
}
if ( ! apply_filters( 'cartflows_thankyou_direct_access', wcf()->flow->is_flow_testmode(), $thank_you_id ) && _is_wcf_thankyou_type() && ( ! is_user_logged_in() || ! current_user_can( 'cartflows_manage_flows_steps' ) ) ) {
//phpcs:disable WordPress.Security.NonceVerification.Recommended
if ( isset( $_GET['wcf-key'] ) && isset( $_GET['wcf-order'] ) ) {
$order_id = intval( $_GET['wcf-order'] );
$order_key = wc_clean( wp_unslash( $_GET['wcf-key'] ) );
//phpcs:enable WordPress.Security.NonceVerification.Recommended
$order = wc_get_order( $order_id );
if ( ! $order || $order->get_order_key() !== $order_key ) {
wp_die( esc_html__( 'We can\'t seem to find an order for you.', 'cartflows' ) );
}
} else {
wp_die( esc_html__( 'We can\'t seem to find an order for you.', 'cartflows' ) );
}
}
}
/**
* Redirect to custom url instead of thank you page.
*/
public function redirect_tq_page_to_custom_url() {
global $post;
if ( _is_wcf_thankyou_type() ) {
$thank_you_id = $post->ID;
$enable_redirection = wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-show-tq-redirect-section' );
$redirect_link = wp_http_validate_url( wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-tq-redirect-link' ) );
if ( 'yes' === $enable_redirection && ! empty( $redirect_link ) ) {
// Reason for ignore: URL will be manually added by the admin user in the thank you page setting.
wp_redirect( esc_url_raw( $redirect_link ) ); //phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect
exit;
}
}
}
/**
* Order shortcode markup
*
* @param array $atts attributes.
* @since 1.0.0
*/
public function cartflows_order_details_shortcode_markup( $atts ) {
$output = '';
$show_demo_order = false;
// Allow to execute the order detais shortcode for modules.
if ( current_user_can( 'manage_options' ) ) {
$show_demo_order = apply_filters( 'cartflows_show_demo_order_details', false );
}
if ( _is_wcf_thankyou_type() || $show_demo_order ) {
/* Remove order item link */
add_filter( 'woocommerce_order_item_permalink', '__return_false' );
/* Change order text */
add_filter( 'woocommerce_thankyou_order_received_text', array( $this, 'custom_tq_text' ), 10, 2 );
if ( ! function_exists( 'wc_print_notices' ) ) {
$notice_out = '<p class="woocommerce-notice">' . __( 'WooCommerce functions do not exist. If you are in an IFrame, please reload it.', 'cartflows' ) . '</p>';
$notice_out .= '<button onClick="location.reload()">' . __( 'Click Here to Reload', 'cartflows' ) . '</button>';
return $notice_out;
}
$order = false;
$id_param = 'wcf-order';
$key_param = 'wcf-key';
//phpcs:disable WordPress.Security.NonceVerification.Recommended
if ( isset( $_GET['wcf-opt-order'] ) ) {
$id_param = 'wcf-opt-order';
$key_param = 'wcf-opt-key';
}
if ( ! isset( $_GET[ $id_param ] ) && ( wcf()->flow->is_flow_testmode() || $show_demo_order ) ) {
$args = array(
'limit' => 1,
'order' => 'DESC',
'post_type' => 'shop_order',
'status' => array( 'completed', 'processing' ),
);
$latest_order = wc_get_orders( $args );
$order_id = ( ! empty( $latest_order ) ) ? current( $latest_order )->get_id() : 0;
if ( $order_id > 0 ) {
$order = wc_get_order( $order_id );
if ( ! $order ) {
$order = false;
}
} else {
return '<p class="woocommerce-notice">' . __( 'No completed or processing order found to show the order details form demo.', 'cartflows' ) . '</p>';
}
} else {
if ( ! isset( $_GET[ $id_param ] ) ) {
return '<p class="woocommerce-notice">' . __( 'Order not found. You cannot access this page directly.', 'cartflows' ) . '</p>';
}
// Get the order.
$order_id = apply_filters( 'woocommerce_thankyou_order_id', empty( $_GET[ $id_param ] ) ? 0 : intval( $_GET[ $id_param ] ) );
$order_key = apply_filters( 'woocommerce_thankyou_order_key', empty( $_GET[ $key_param ] ) ? '' : wc_clean( wp_unslash( $_GET[ $key_param ] ) ) );
//phpcs:enable WordPress.Security.NonceVerification.Recommended
if ( $order_id > 0 ) {
$order = wc_get_order( $order_id );
if ( ! $order || $order->get_order_key() !== $order_key ) {
$order = false;
}
}
}
// Empty awaiting payment session.
unset( WC()->session->order_awaiting_payment );
if ( null !== WC()->session ) {
if ( ! isset( WC()->cart ) || '' === WC()->cart ) {
WC()->cart = new WC_Cart();
}
if ( ! WC()->cart->is_empty() ) {
// wc_empty_cart();
// Empty current cart.
WC()->cart->empty_cart( true );
wc_clear_notices();
}
wc_print_notices();
}
do_action( 'cartflows_thankyou_details_before', $order );
ob_start();
echo "<div class='wcf-thankyou-wrap' id='wcf-thankyou-wrap'>";
wc_get_template( 'checkout/thankyou.php', array( 'order' => $order ) );
echo '</div>';
$output = ob_get_clean();
}
return $output;
}
/**
* Load Thank You scripts.
*
* @return void
*/
public function thank_you_scripts() {
if ( _is_wcf_thankyou_type() ) {
do_action( 'cartflows_thank_you_scripts' );
$thank_you_dynamic_css = apply_filters( 'cartflows_thank_you_enable_dynamic_css', true );
if ( $thank_you_dynamic_css ) {
global $post;
$thanku_page_id = $post->ID;
$style = get_post_meta( $thanku_page_id, 'wcf-dynamic-css', true );
$css_version = get_post_meta( $thanku_page_id, 'wcf-dynamic-css-version', true );
if ( empty( $style ) || CARTFLOWS_ASSETS_VERSION !== $css_version ) {
$style = $this->generate_thank_you_style();
update_post_meta( $thanku_page_id, 'wcf-dynamic-css', wp_slash( $style ) );
update_post_meta( $thanku_page_id, 'wcf-dynamic-css-version', CARTFLOWS_ASSETS_VERSION );
}
CartFlows_Font_Families::render_fonts( $thanku_page_id );
wp_add_inline_style( 'wcf-frontend-global', $style );
}
}
}
/**
* Load DIVI compatibility Thank You style.
*
* @return void
*/
public function add_divi_compatibility_css() {
global $post;
$thank_you_id = $post->ID;
if (
Cartflows_Compatibility::get_instance()->is_divi_enabled() ||
Cartflows_Compatibility::get_instance()->is_divi_builder_enabled( $thank_you_id )
) {
wp_enqueue_style( 'wcf-frontend-global-divi', wcf()->utils->get_css_url( 'frontend-divi' ), array(), CARTFLOWS_VER );
}
}
/**
* Set thank you as a order received page.
*
* @param boolean $is_order_page order page.
* @return boolean
*/
public function set_order_received_page( $is_order_page ) {
if ( _is_wcf_thankyou_type() ) {
$is_order_page = true;
}
return $is_order_page;
}
/**
* Generate Thank You Styles.
*
* @return string
*/
public function generate_thank_you_style() {
global $post;
if ( _is_wcf_thankyou_type() ) {
$thank_you_id = $post->ID;
} else {
$thank_you_id = _get_wcf_thankyou_id( $post->post_content );
}
$output = '';
$enable_design_settings = wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-enable-design-settings' );
$hide_show_settings = array(
'show_order_review' => wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-show-overview-section' ),
'show_order_details' => wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-show-details-section' ),
'show_billing_details' => wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-show-billing-section' ),
'show_shipping_details' => wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-show-shipping-section' ),
);
if ( 'yes' === $enable_design_settings ) {
$text_color = wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-tq-text-color' );
$text_font_family = wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-tq-font-family' );
$text_font_size = wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-tq-font-size' );
$heading_text_color = wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-tq-heading-color' );
$heading_font_family = wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-tq-heading-font-family' );
$heading_font_weight = wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-tq-heading-font-wt' );
$container_width = wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-tq-container-width' );
$section_bg_color = wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-tq-section-bg-color' );
if (
Cartflows_Compatibility::get_instance()->is_divi_enabled() ||
Cartflows_Compatibility::get_instance()->is_divi_builder_enabled( $thank_you_id )
) {
include CARTFLOWS_THANKYOU_DIR . 'includes/thankyou-dynamic-divi-css.php';
} else {
include CARTFLOWS_THANKYOU_DIR . 'includes/thankyou-dynamic-css.php';
}
}
$output .= $this->get_section_hide_show_css( $output, $hide_show_settings );
return $output;
}
/**
* Generate CSS for hide/show the order sections on the thank you page.
*
* @param string $output Already generated CSS.
* @param array $hide_show_settings Enable/disable sections setting of thank page.
*
* @return string $output Modified CSS
*/
public function get_section_hide_show_css( $output, $hide_show_settings ) {
if ( 'no' == $hide_show_settings['show_order_review'] ) {
$output .= '
.woocommerce-order ul.order_details{
display: none;
}
';
}
if ( 'no' == $hide_show_settings['show_order_details'] ) {
$output .= '
.woocommerce-order .woocommerce-order-details{
display: none;
}
';
}
if ( 'no' == $hide_show_settings['show_billing_details'] ) {
$output .= '
.woocommerce-order .woocommerce-customer-details .woocommerce-column--billing-address{
display: none;
}
.woocommerce-order .woocommerce-customer-details .woocommerce-column--shipping-address{
float:left;
}
';
}
if ( 'no' == $hide_show_settings['show_shipping_details'] ) {
$output .= '
.woocommerce-order .woocommerce-customer-details .woocommerce-column--shipping-address{
display: none;
}
';
}
if ( 'no' == $hide_show_settings['show_billing_details'] && 'no' == $hide_show_settings['show_shipping_details'] ) {
$output .= '
.woocommerce-order .woocommerce-customer-details{
display: none;
}
';
}
return $output;
}
/**
* Set as a checkout page if it is thank you page.
* Thank you page need to be set as a checkout page.
* Becauye ayment gateways will not load if it is not checkout.
*
* @param bool $is_checkout is checkout.
*
* @return bool
*/
public function woo_checkout_flag( $is_checkout ) {
if ( ! is_admin() ) {
if ( _is_wcf_thankyou_type() ) {
$is_checkout = true;
}
}
return $is_checkout;
}
/**
* Add custom text on thank you page.
*
* @param string $woo_text Default text.
* @param int $order order.
*/
public function custom_tq_text( $woo_text, $order ) {
global $post;
if ( $post ) {
$thank_you_id = $post->ID;
} else {
if ( is_admin() && isset( $_POST['id'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Missing
$thank_you_id = intval( $_POST['id'] ); //phpcs:ignore WordPress.Security.NonceVerification.Missing
}
}
$new_text = wcf()->options->get_thankyou_meta_value( $thank_you_id, 'wcf-tq-text' );
if ( ! empty( $new_text ) ) {
$woo_text = do_shortcode( wp_kses_post( $new_text ) );
}
return $woo_text;
}
}
/**
* Kicking this off by calling 'get_instance()' method
*/
Cartflows_Thankyou_Markup::get_instance();