geno/wp-content/plugins/cartflows/admin-core/inc/meta-ops.php
2024-02-01 11:54:18 +00:00

271 lines
9.8 KiB
PHP

<?php
/**
* CartFlows Step Meta Helper.
*
* @package CartFlows
*/
namespace CartflowsAdmin\AdminCore\Inc;
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Class StepMeta.
*/
class MetaOps {
/**
* Save Meta fields - Common Function.
*
* @param int $post_id post id.
* @param array $post_meta options to store.
* @param string $action action to check nonce.
*
* @return void
*/
public static function save_meta_fields( $post_id, $post_meta, $action = '' ) {
if ( ! check_ajax_referer( $action, 'security', false ) ) {
$response_data = array( 'message' => __( 'Nonce validation failed', 'cartflows' ) );
wp_send_json_error( $response_data );
}
if ( ! ( $post_id && is_array( $post_meta ) ) ) {
return;
}
$allowed_html = array(
'a' => array(
'href' => array(),
),
'br' => array(),
'strong' => array(),
'p' => array(),
'span' => array(),
);
foreach ( $post_meta as $key => $data ) {
if ( ! isset( $_POST[ $key ] ) ) {
continue;
}
$meta_value = false;
// Sanitize values.
$sanitize_filter = ( isset( $data['sanitize'] ) ) ? $data['sanitize'] : 'FILTER_DEFAULT';
switch ( $sanitize_filter ) {
case 'FILTER_SANITIZE_STRING':
$meta_value = isset( $_POST[ $key ] ) ? sanitize_text_field( wp_unslash( $_POST[ $key ] ) ) : '';
break;
case 'FILTER_SANITIZE_URL':
$meta_value = filter_input( INPUT_POST, $key, FILTER_SANITIZE_URL );
break;
case 'FILTER_SANITIZE_NUMBER_INT':
$meta_value = filter_input( INPUT_POST, $key, FILTER_SANITIZE_NUMBER_INT );
break;
case 'FILTER_CARTFLOWS_ARRAY':
if ( isset( $_POST[ $key ] ) && is_array( $_POST[ $key ] ) ) {
$meta_value = array_map( 'sanitize_text_field', wp_unslash( $_POST[ $key ] ) );
}
break;
case 'FILTER_SANITIZE_COLOR':
// Sanitizes a hex color with #.
$meta_value = sanitize_hex_color( $_POST[ $key ] );
break;
case 'FILTER_SANITIZE_FONT_FAMILY':
// FILTER_FLAG_NO_ENCODE_QUOTES - Do not encode the single and double quotes.
$meta_value = isset( $_POST[ $key ] ) ? sanitize_text_field( wp_unslash( $_POST[ $key ] ) ) : '';
break;
case 'FILTER_WP_KSES':
// It allow only tags that are defined in $allowed_html variable.
$meta_value = wp_kses( $_POST[ $key ], $allowed_html );
break;
case 'FILTER_SCRIPT':
// Reason for ignoring phpcs rule: Here we are saving the custom JS script. Encoding it before sacing to db. No escaping function working here.
$meta_value = htmlentities( wp_unslash( $_POST[ $key ] ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
break;
case 'FILTER_WP_KSES_POST':
// wp_kses_post() allow only the same tags that are allowed in WP Posts.
$meta_value = wp_kses_post( $_POST[ $key ] );
break;
case 'FILTER_CARTFLOWS_CHECKOUT_PRODUCTS':
if ( isset( $_POST[ $key ] ) && is_array( $_POST[ $key ] ) ) {
$i = 0;
$q = 0;
$post_data = wc_clean( $_POST[ $key ] );
foreach ( $post_data as $p_index => $p_data ) {
if ( ! array_key_exists( 'product', $p_data ) ) {
continue;
}
foreach ( $p_data as $i_key => $i_value ) {
if ( is_array( $i_value ) ) {
foreach ( $i_value as $q_key => $q_value ) {
$meta_value[ $i ][ $i_key ][ $q ] = array_map( 'sanitize_text_field', $q_value );
$q++;
}
} else {
$meta_value[ $i ][ $i_key ] = sanitize_text_field( $i_value );
}
}
$i++;
}
}
break;
case 'FILTER_CARTFLOWS_CHECKOUT_FIELDS':
$count = 10;
$ordered_fields = array();
$billing_shipping_fields = array();
if ( isset( $_POST[ $key ] ) && is_array( $_POST[ $key ] ) ) {
// Ignoring sanitization rule as we are here to sanitize user input.
$post_data = $_POST[ $key ]; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
if ( 'wcf_field_order_billing' == $key || 'wcf_field_order_shipping' == $key ) {
$type_of_fields = ltrim( $key, 'wcf_field_order_' );
$billing_shipping_fields = \Cartflows_Helper::get_checkout_fields( $type_of_fields, $post_id );
foreach ( $post_data as $field_key_name => $value ) {
if ( isset( $billing_shipping_fields[ $field_key_name ] ) ) {
$is_custom_field = isset( $billing_shipping_fields[ $field_key_name ]['custom'] ) ? $billing_shipping_fields[ $field_key_name ]['custom'] : false;
$ordered_fields[ $field_key_name ] = $billing_shipping_fields[ $field_key_name ];
$ordered_fields[ $field_key_name ]['priority'] = $count;
$count += 10;
$placeholder_text = ! empty( $value['placeholder'] ) ? wc_clean( stripslashes( $value['placeholder'] ) ) : '';
$ordered_fields[ $field_key_name ]['width'] = intval( $value['width'] );
$ordered_fields[ $field_key_name ]['label'] = wp_kses_post( trim( stripslashes( $value['label'] ) ) );
$ordered_fields[ $field_key_name ]['placeholder'] = $placeholder_text;
$ordered_fields[ $field_key_name ]['default'] = wp_kses_post( trim( stripslashes( $value['default'] ) ) );
$ordered_fields[ $field_key_name ]['required'] = 'yes' === $value['required'] ? true : false;
$ordered_fields[ $field_key_name ]['optimized'] = 'yes' === $value['optimized'] ? true : false;
$ordered_fields[ $field_key_name ]['enabled'] = 'yes' === $value['enabled'] ? true : false;
$ordered_fields[ $field_key_name ]['options'] = '';
if ( isset( $value['options'] ) && $value['options'] ) {
$options = explode( '|', $value['options'] );
$options = AdminHelper::sanitize_array_values( $options );
$ordered_fields[ $field_key_name ]['options'] = array_combine( array_keys( $options ), $options );
}
if ( ! empty( $value['custom_attributes'] ) ) {
$ordered_fields[ $field_key_name ]['custom_attributes'] = wc_clean( $value['custom_attributes'] );
}
if ( true === $is_custom_field ) {
$ordered_fields[ $field_key_name ]['show_in_email'] = isset( $value['show_in_email'] ) && 'yes' === $value['show_in_email'] ? true : false;
}
}
}
$meta_value = $ordered_fields;
}
}
break;
case 'FILTER_CARTFLOWS_OPTIN_FIELDS':
$count = 10;
$ordered_fields = array();
$billing_shipping_fields = array();
if ( isset( $_POST[ $key ] ) && is_array( $_POST[ $key ] ) ) {
// Ignoring sanitization rule as we are here to sanitize user input.
$post_data = $_POST[ $key ]; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
if ( 'wcf-optin-fields-billing' === $key ) {
$type_of_fields = 'billing';
$billing_shipping_fields = \Cartflows_Helper::get_optin_fields( $type_of_fields, $post_id );
foreach ( $post_data as $field_key_name => $value ) {
if ( isset( $billing_shipping_fields[ $field_key_name ] ) ) {
$is_custom_field = isset( $billing_shipping_fields[ $field_key_name ]['custom'] ) ? $billing_shipping_fields[ $field_key_name ]['custom'] : false;
$ordered_fields[ $field_key_name ] = $billing_shipping_fields[ $field_key_name ];
$placeholder_text = ! empty( $value['placeholder'] ) ? wc_clean( stripslashes( $value['placeholder'] ) ) : '';
$ordered_fields[ $field_key_name ]['priority'] = $count;
$count += 10;
$ordered_fields[ $field_key_name ]['width'] = intval( $value['width'] );
$ordered_fields[ $field_key_name ]['label'] = wp_kses_post( trim( stripslashes( $value['label'] ) ) );
$ordered_fields[ $field_key_name ]['placeholder'] = $placeholder_text;
$ordered_fields[ $field_key_name ]['default'] = wp_kses_post( trim( stripslashes( $value['default'] ) ) );
$ordered_fields[ $field_key_name ]['required'] = 'yes' === $value['required'] ? true : false;
$ordered_fields[ $field_key_name ]['enabled'] = 'yes' === $value['enabled'] ? true : false;
$ordered_fields[ $field_key_name ]['options'] = '';
if ( isset( $value['options'] ) && $value['options'] ) {
$options = explode( '|', $value['options'] );
$options = AdminHelper::sanitize_array_values( $options );
$ordered_fields[ $field_key_name ]['options'] = array_combine( array_keys( $options ), $options );
}
if ( ! empty( $value['custom_attributes'] ) ) {
$ordered_fields[ $field_key_name ]['custom_attributes'] = wc_clean( $value['custom_attributes'] );
}
if ( true === $is_custom_field ) {
$ordered_fields[ $field_key_name ]['show_in_email'] = isset( $value['show_in_email'] ) && 'yes' === $value['show_in_email'] ? true : false;
}
}
}
$meta_value = $ordered_fields;
}
}
break;
default:
if ( 'FILTER_DEFAULT' === $sanitize_filter ) {
$meta_value = isset( $_POST[ $key ] ) ? sanitize_text_field( wp_unslash( $_POST[ $key ] ) ) : '';
} else {
$meta_value = apply_filters( 'cartflows_admin_save_meta_field_values', $meta_value, $post_id, $key, $sanitize_filter, $action );
}
break;
}
if ( is_null( $meta_value ) ) {
continue;
}
if ( false !== $meta_value ) {
update_post_meta( $post_id, $key, $meta_value );
} else {
// To delete the wcf-checkout-products if empty.
delete_post_meta( $post_id, $key );
}
}
}
}