oont-contents/themes/oont-themev2/inc/classes/Wc_Product_Extend.php
2025-02-08 15:10:23 +01:00

650 lines
No EOL
25 KiB
PHP

<?php
// don't load directly
defined( 'ABSPATH' ) || exit;
/**
* Enable exchange add to cart
*
* Extend WooCommerce Product data
*/
// class SOFTOBA_Product_Data_Store_EXR extends WC_Product_Data_Store_CPT implements WC_Object_Data_Store_Interface, WC_Product_Data_Store_Interface {
// /**
// * Method to read a product from the database.
// * @param WC_Product
// */
// public function read( &$product ) {
// $product->set_defaults();
// if ( (! $product->get_id() || ! ( $post_object = get_post( $product->get_id() ) ) || 'product' !== $post_object->post_type) && 'exchange_request' !== $post_object->post_type ) {
// throw new Exception( __( 'Invalid product.', 'astra' ) );
// }
// $id = $product->get_id();
// $product->set_props( array(
// 'name' => 'Fee for '.$post_object->post_title,
// 'slug' => $post_object->post_name,
// 'date_created' => 0 < $post_object->post_date_gmt ? wc_string_to_timestamp( $post_object->post_date_gmt ) : null,
// 'date_modified' => 0 < $post_object->post_modified_gmt ? wc_string_to_timestamp( $post_object->post_modified_gmt ) : null,
// 'status' => $post_object->post_status,
// 'description' => $post_object->post_content,
// 'short_description' => $post_object->post_excerpt,
// 'parent_id' => $post_object->post_parent,
// 'menu_order' => $post_object->menu_order,
// 'reviews_allowed' => 'open' === $post_object->comment_status,
// ) );
// $this->read_attributes( $product );
// $this->read_downloads( $product );
// $this->read_visibility( $product );
// $this->read_product_data( $product );
// $this->read_extra_data( $product );
// $product->set_object_read( true );
// }
// /**
// * Get the product type based on product ID.
// *
// * @since 3.0.0
// * @param int $product_id
// * @return bool|string
// */
// public function get_product_type( $product_id ) {
// $post_type = get_post_type( $product_id );
// if ( 'product_variation' === $post_type ) {
// return 'variation';
// } elseif ( in_array( $post_type, array( 'exchange_request', 'product' ) ) ) { // change exchange_request with your post type
// $terms = get_the_terms( $product_id, 'product_type' );
// return ! empty( $terms ) ? sanitize_title( current( $terms )->name ) : 'simple';
// } else {
// return false;
// }
// }
// }
class WCCPT_Product_Data_Store_CPT extends WC_Product_Data_Store_CPT {
/**
* Method to read a product from the database.
* @param WC_Product
*/
public function read( &$product ) {
$product->set_defaults();
if ( ! $product->get_id() || ! ( $post_object = get_post( $product->get_id() ) ) || ! in_array( $post_object->post_type, array( 'exchange_request', 'product' ) ) ) { // change birds with your post type
throw new Exception( __( 'Invalid product.', 'astra' ) );
}
$id = $product->get_id();
$product->set_props( array(
'name' => $post_object->post_title. ' fee',
'slug' => $post_object->post_name,
'date_created' => 0 < $post_object->post_date_gmt ? wc_string_to_timestamp( $post_object->post_date_gmt ) : null,
'date_modified' => 0 < $post_object->post_modified_gmt ? wc_string_to_timestamp( $post_object->post_modified_gmt ) : null,
'status' => 'publish',
'description' => $post_object->post_content,
'short_description' => $post_object->post_excerpt,
'parent_id' => $post_object->post_parent,
'menu_order' => $post_object->menu_order,
'reviews_allowed' => 'open' === $post_object->comment_status,
) );
$this->read_attributes( $product );
$this->read_downloads( $product );
$this->read_visibility( $product );
$this->read_product_data( $product );
$this->read_extra_data( $product );
$product->set_object_read( true );
}
/**
* Get the product type based on product ID.
*
* @since 3.0.0
* @param int $product_id
* @return bool|string
*/
public function get_product_type( $product_id ) {
$post_type = get_post_type( $product_id );
if ( 'product_variation' === $post_type ) {
return 'variation';
} elseif ( in_array( $post_type, array( 'exchange_request', 'product' ) ) ) { // change birds with your post type
$terms = get_the_terms( $product_id, 'product_type' );
return ! empty( $terms ) ? sanitize_title( current( $terms )->name ) : 'simple';
} else {
return false;
}
}
}
// Make the custom post type 'exchange_request' purchasable
function softoba_make_exchange_request_purchasable($purchasable, $product) {
if ($product->get_type() === 'exchange_request') {
$purchasable = true;
}
return $purchasable;
}
add_filter('woocommerce_is_purchasable', 'softoba_make_exchange_request_purchasable', 10, 2);
// function softoba_custom_post_type_in_product_query( $query ) {
// if ( is_admin() || ! $query->is_main_query() ) {
// return;
// }
// $query->set( 'post_type', array( 'product', 'exchange_request' ) );
// }
// add_action( 'pre_get_posts', 'softoba_custom_post_type_in_product_query' );
// add_filter('woocommerce_get_price','softoba_woocommerce_get_price',20,2);
// function softoba_woocommerce_get_price($price, $post){
// if ($post->post->post_type === 'exchange_request') {
// $price = get_post_meta($post->id, "exchange_price", true);
// }
// return $price;
// }
add_filter('woocommerce_product_get_price', 'softoba_woocommerce_product_get_price', 10, 2);
function softoba_woocommerce_product_get_price($price, $product) {
if ( $product->get_type() == 'exchange_request' ){
$price = 3;
}
return $price;
}
// function softoba_woocommerce_data_stores( $stores ) {
// require_once WP_PLUGIN_DIR . '/woocommerce/includes/class-wc-data-store.php';
// $stores['product'] = 'SOFTOBA_Product_Data_Store_EXR';
// return $stores;
// }
// add_filter( 'woocommerce_data_stores', 'softoba_woocommerce_data_stores' );
add_filter( 'woocommerce_data_stores', 'woocommerce_data_stores' );
function woocommerce_data_stores ( $stores ) {
$stores['product'] = 'WCCPT_Product_Data_Store_CPT';
return $stores;
}
/**
* Add _price post_meta to exchange_request upon publish
*
* _pirce field is required for WooCommerce add to cart
*/
function softoba_add_price_field_to_post($post_id, $post) {
if ( 'exchange_request' === $post->post_type ) {
// Add or update custom meta key with an underscore prefix
if (get_post_meta($post_id, '_price', true) === '') {
add_post_meta($post_id, '_price', '3', true);
add_post_meta($post_id, '_product_type', 'simple', true);
} else {
update_post_meta($post_id, '_price', '3');
update_post_meta($post_id, '_product_type', 'simple');
}
}
}
add_action( 'save_post', 'softoba_add_price_field_to_post', 10, 2 );
/**
* Change cart item permalink
*/
// function softoba_cart_item_permalink( $permalink, $cart_item, $cart_item_key ) {
// $type = ! empty( $cart_item['softoba_cart_data']['order_type'] ) ? $cart_item['softoba_cart_data']['order_type'] : '';
// if ( is_cart() && $type == 'exchange_request' ) {
// $permalink = $cart_item['softoba_cart_data']['post_permalink'];
// }
// return $permalink;
// }
// add_filter( 'woocommerce_cart_item_permalink', 'softoba_cart_item_permalink', 10, 3 );
// Display custom cart item meta data (in cart and checkout)
function softoba_display_cart_item_custom_meta_data( $item_data, $cart_item ) {
if ( isset( $cart_item['softoba_cart_data']['order_type'] ) ) {
$item_data[] = array(
'key' => __( 'Type', 'astra' ),
'value' => 'Exchange Request',
);
}
if ( isset( $cart_item['softoba_cart_data']['post_id'] ) && $cart_item['softoba_cart_data']['post_id'] > 0 ) {
$item_data[] = array(
'key' => __( 'Request ID', 'astra' ),
'value' => $cart_item['softoba_cart_data']['post_id'],
);
}
if ( isset( $cart_item['softoba_cart_data']['post_author'] ) && $cart_item['softoba_cart_data']['post_author'] > 0 ) {
$item_data[] = array(
'key' => __( 'Customer ID', 'astra' ),
'value' => $cart_item['softoba_cart_data']['post_author'],
);
}
if ( isset( $cart_item['softoba_cart_data']['unique_id'] ) && $cart_item['softoba_cart_data']['unique_id'] > 0 ) {
$item_data[] = array(
'key' => __( 'Unique ID', 'astra' ),
'value' => $cart_item['softoba_cart_data']['unique_id'],
);
}
return $item_data;
}
add_filter( 'woocommerce_get_item_data', 'softoba_display_cart_item_custom_meta_data', 10, 2 );
/**
* Show custom data in order details
*/
function softoba_fee_custom_order_data( $item, $cart_item_key, $values, $order ) {
// Assigning data into variables
$order_type = !empty($values['softoba_cart_data']['order_type']) ? $values['softoba_cart_data']['order_type'] : '';
$post_author = !empty($values['softoba_cart_data']['post_author']) ? $values['softoba_cart_data']['post_author'] : '';
$post_id = !empty($values['softoba_cart_data']['post_id']) ? $values['softoba_cart_data']['post_id'] : '';
$unique_id = !empty($values['softoba_cart_data']['unique_id']) ? $values['softoba_cart_data']['unique_id'] : '';
/**
* Show data in order meta & email
*
*/
if ( $order_type ) {
$item->update_meta_data( '_order_type', $order_type );
}
if ( $post_author ) {
$item->update_meta_data( '_post_author', $post_author );
}
if ( $post_id ) {
$item->update_meta_data( '_post_id', $post_id );
}
if ( $unique_id ) {
$item->update_meta_data( '_unique_id', $unique_id );
}
}
add_action( 'woocommerce_checkout_create_order_line_item', 'softoba_fee_custom_order_data', 10, 4 );
/**
* Add order id to the exchange request meta field
*
* runs during WooCommerce checkout process
*
* @author fida
*/
function softoba_add_order_id_exchange_checkout_order_processed( $order_id, $posted_data, $order ) {
$softoba_integration_order_data = array(
'order_id' => $order_id
);
$softoba_integration_order_status = [];
# Get and Loop Over Order Line Items
foreach ( $order->get_items() as $item_id => $item ) {
$order_type = $item->get_meta( '_order_type', true );
if("exchange_request" == $order_type){
$post_id = $item->get_meta( '_post_id', true ); // Product Exchange id
$unique_id = $item->get_meta( '_unique_id', true ); // Unique id of rooms
$exchange_fee = get_post_meta( $post_id, 'softoba_exchange_fee', true ); // Exchange Request meta
update_post_meta( $post_id, 'softoba_exchange_fee', $order->get_status() );
update_post_meta( $post_id, 'softoba_exchange_fee_order_id', $order_id );
update_post_meta( $post_id, 'softoba_exchange_payment_method', $order->get_payment_method() );
}
}
}
add_action( 'woocommerce_checkout_order_processed', 'softoba_add_order_id_exchange_checkout_order_processed', 10, 4 );
/*
* Admin order status change
* @author Jahid
*/
add_action('woocommerce_order_status_changed', 'softoba_order_status_changed', 10, 4);
function softoba_order_status_changed($order_id, $old_status, $new_status, $order) {
foreach ( $order->get_items() as $item_id => $item ) {
$order_type = $item->get_meta( '_order_type', true );
if("exchange_request" == $order_type){
$post_id = $item->get_meta( '_post_id', true ); // Product Exchange id
update_post_meta( $post_id, 'softoba_exchange_fee', $order->get_status() );
update_post_meta( $post_id, 'softoba_exchange_fee_order_id', $order_id );
update_post_meta( $post_id, 'softoba_exchange_payment_method', $order->get_payment_method() );
}
}
}
/**
* Add custom fields to checkout page before phone field
*/
function softoba_add_custom_checkout_fields( $fields ) {
// Display fields only when the selected country is Kuwait
$kuwait_fields = array(
'softoba_governorate_options' => array(
'type' => 'select',
'label' => __('Governorate', 'astra'),
'required' => true,
'class' => array('form-row-wide'),
'clear' => true,
'options' => array(
'Al Asimah Governate' => __('Al Asimah Governate', 'astra'),
'Ahmadi Governorate' => __('Ahmadi Governorate', 'astra'),
'Mubarak Al-Kabeer Governorate' => __('Mubarak Al-Kabeer Governorate', 'astra'),
'Farwaniya Governorate' => __('Farwaniya Governorate', 'astra'),
'Jahra Governorate' => __('Jahra Governorate', 'astra'),
'Hawalli Governorate' => __('Hawalli Governorate', 'astra'),
),
),
'softoba_area_field' => array(
'type' => 'text',
'label' => __('Area', 'astra'),
'required' => true,
'class' => array('form-row-wide'),
'clear' => true,
),
'softoba_block_field' => array(
'type' => 'text',
'label' => __('Block', 'astra'),
'required' => true,
'class' => array('form-row-wide'),
'clear' => true,
),
'softoba_avenue' => array(
'type' => 'text',
'label' => __('Avenue', 'astra'),
'required' => false, // Set to false for optional
'class' => array('form-row-wide'),
'clear' => true,
),
'softoba_house_number' => array(
'type' => 'text',
'label' => __('House Number', 'astra'),
'required' => true,
'class' => array('form-row-wide'),
'clear' => true,
),
);
$fields['billing'] = array_merge(
array_slice($fields['billing'], 0, 4, true),
$kuwait_fields,
array_slice($fields['billing'], 4, null, true)
);
if( WC()->customer && WC()->customer->get_billing_country() !== 'KW' ) {
// Set the "required" attribute to false for specified fields
$fields['billing']['softoba_governorate_options']['required'] = false;
$fields['billing']['softoba_area_field']['required'] = false;
$fields['billing']['softoba_block_field']['required'] = false;
$fields['billing']['softoba_avenue']['required'] = false;
$fields['billing']['softoba_house_number']['required'] = false;
}
$fields['billing']['billing_address_1']['label'] = __('Street Name / Number', 'astra');
return $fields;
}
add_filter('woocommerce_checkout_fields', 'softoba_add_custom_checkout_fields');
function custom_checkout_fields( $fields ) {
// Check if the selected country is Kuwait
if ( WC()->customer && WC()->customer->get_billing_country() === 'KW' ) {
// Set fields as optional for Kuwait
// $fields['billing']['billing_address_1']['required'] = false;
$fields['billing']['billing_city']['required'] = false;
$fields['billing']['billing_postcode']['required'] = false;
}
$fields['billing']['billing_address_1']['label'] = __('Street Name / Number', 'astra');
return $fields;
}
add_filter( 'woocommerce_checkout_fields', 'custom_checkout_fields' );
/**
* Save custom field data to the order
*/
function softoba_save_custom_checkout_fields( $order_id ) {
if ( isset( $_POST['softoba_governorate_options'] ) ) {
update_post_meta( $order_id, 'oont_governorate', sanitize_text_field( $_POST['softoba_governorate_options'] ) );
}
if ( isset( $_POST['softoba_area_field'] ) ) {
update_post_meta( $order_id, 'oont_area', sanitize_text_field( $_POST['softoba_area_field'] ) );
}
if ( isset( $_POST['softoba_block_field'] ) ) {
update_post_meta( $order_id, 'oont_block', sanitize_text_field( $_POST['softoba_block_field'] ) );
}
if ( isset( $_POST['softoba_avenue'] ) ) {
update_post_meta( $order_id, 'oont_avenue', sanitize_text_field( $_POST['softoba_avenue'] ) );
}
if ( isset( $_POST['softoba_house_number'] ) ) {
update_post_meta( $order_id, 'oont_house_number', sanitize_text_field( $_POST['softoba_house_number'] ) );
}
}
add_action('woocommerce_checkout_update_order_meta', 'softoba_save_custom_checkout_fields');
/**
* Display custom field data on the order page
*/
function softoba_display_order_data( $order ) {
echo '<div class="order-custom-fields">';
$billing_address = $order->get_formatted_billing_address();
$governorate = get_post_meta( $order->get_id(), 'oont_governorate', true );
$area = get_post_meta( $order->get_id(), 'oont_area', true );
$block = get_post_meta( $order->get_id(), 'oont_block', true );
$avenue = get_post_meta( $order->get_id(), 'oont_avenue', true );
$house_number = get_post_meta( $order->get_id(), 'oont_house_number', true );
// Display combined billing address with custom fields
echo '<h2>' . __('Billing Address') . '</h2>';
echo $billing_address;
// Display custom fields if they have data
if ( $governorate ) {
echo '<br><strong>' . __('Governorate') . ':</strong> ' . esc_html( $governorate ) . '<br>';
}
if ( $area ) {
echo '<strong>' . __('Area') . ':</strong> ' . esc_html( $area ) . '<br>';
}
if ( $block ) {
echo '<strong>' . __('Block') . ':</strong> ' . esc_html( $block ) . '<br>';
}
if ( $avenue ) {
echo '<strong>' . __('Avenue') . ':</strong> ' . esc_html( $avenue ) . '<br>';
}
if ( $house_number ) {
echo '<strong>' . __('House Number') . ':</strong> ' . esc_html( $house_number ) . '<br>';
}
echo '</div>';
}
add_action('woocommerce_admin_order_data_after_billing_address', 'softoba_display_order_data', 10, 1);
function softoba_display_order_data_pdf( $order ) {
echo '<div class="order-custom-fields">';
$billing_address = $order->get_formatted_billing_address();
$governorate = get_post_meta( $order->get_id(), 'oont_governorate', true );
$area = get_post_meta( $order->get_id(), 'oont_area', true );
$block = get_post_meta( $order->get_id(), 'oont_block', true );
$avenue = get_post_meta( $order->get_id(), 'oont_avenue', true );
$house_number = get_post_meta( $order->get_id(), 'oont_house_number', true );
$billing_email = get_post_meta( $order->get_id(), '_billing_email', true );
$billing_phone = get_post_meta( $order->get_id(), '_billing_phone', true );
$billing_country = get_post_meta( $order->get_id(), '_billing_country', true );
// Get the WC_Countries instance
$countries = new WC_Countries();
// Get the full country name using the country code
$billing_country_full = $countries->get_countries()[ $billing_country ];
// Display combined billing address with custom fields
echo '<h2 style="margin-bottom:10px">' . __('Shipping Info') . '</h2>';
echo '<li><strong>'.$billing_address.'</strong></li>';
if( $billing_country ) {
echo '<li><strong>' . __('Country') . ':</strong> ' . esc_html( $billing_country_full ) . '</li>';
}
if( $billing_phone ) {
echo '<li><strong>' . __('Phone') . ':</strong> ' . esc_html( $billing_phone ) . '</li>';
}
// Display custom fields if they have data
if ( $governorate ) {
echo '<li><strong>' . __('Governorate') . ':</strong> ' . esc_html( $governorate ) . '</li>';
}
if ( $area ) {
echo '<li><strong>' . __('Area') . ':</strong> ' . esc_html( $area ) . '</li>';
}
if ( $block ) {
echo '<li><strong>' . __('Block') . ':</strong> ' . esc_html( $block ) . '</li>';
}
if ( $house_number ) {
echo '<li><strong>' . __('House Number') . ':</strong> ' . esc_html( $house_number ) . '</li>';
}
if ( $avenue ) {
echo '<li><strong>' . __('Avenue') . ':</strong> ' . esc_html( $avenue ) . '</li>';
}
echo '</div>';
}
function softoba_display_order_data_exchange( $order ) {
$billing_address_street = $order->get_billing_address_1();
$governorate = get_post_meta( $order->get_id(), 'oont_governorate', true );
$area = get_post_meta( $order->get_id(), 'oont_area', true );
$block = get_post_meta( $order->get_id(), 'oont_block', true );
$avenue = get_post_meta( $order->get_id(), 'oont_avenue', true ); // Corrected variable name
$house_number = get_post_meta( $order->get_id(), 'oont_house_number', true );
$billing_email = get_post_meta( $order->get_id(), '_billing_email', true );
$billing_phone = get_post_meta( $order->get_id(), '_billing_phone', true );
$billing_country = get_post_meta( $order->get_id(), '_billing_country', true );
// Get the WC_Countries instance
$countries = new WC_Countries();
// Get the full country name using the country code
$billing_country_full = $countries->get_countries()[ $billing_country ];
// Get the full country name using the country code
if( $billing_address_street ) {
echo $billing_address_street. ', ';
}
// Display custom fields if they have data
if ( $governorate ) {
echo esc_html( $governorate ) . ', ';
}
if ( $area ) {
echo esc_html( $area ) . ', ';
}
if ( $block ) {
echo esc_html( $block ) . ', ';
}
if ( $avenue ) { // Corrected variable name
echo esc_html( $avenue ) . ', ';
}
if( $billing_country ) {
echo esc_html( $billing_country_full );
}
}
/**
* Enqueue JavaScript to show/hide fields based on country
*/
function softoba_custom_checkout_fields_script() {
if ( is_checkout() ) {
// Only enqueue the script on the checkout page
wc_enqueue_js( "
jQuery(document).ready(function($){
var countryField = $('#billing_country');
var kuwaitFields = $('#softoba_governorate_options_field, #softoba_area_field_field, #softoba_block_field_field, #softoba_avenue_field, #softoba_house_number_field');
var kuwaitRequiredFields = $('#softoba_governorate_options_field, #softoba_area_field_field, #softoba_block_field_field, #softoba_house_number_field');
var kuwaitHideFields = $('#billing_address_2_field, #billing_city_field, #billing_postcode_field');
var billing_address_2_field = $('#billing_address_2_field');
// Initially hide the custom fields
kuwaitFields.hide();
// Show/hide the custom fields based on country selection
countryField.change(function(){
if (countryField.val() === 'KW') {
kuwaitFields.slideDown();
kuwaitHideFields.slideUp();
billing_address_2_field.hide();
kuwaitFields.removeClass('validate-required');
kuwaitFields.find(':input').prop('required', true);
kuwaitRequiredFields.find('.optional').html('*');
kuwaitRequiredFields.find('.optional').addClass('required');
} else {
kuwaitFields.slideUp();
kuwaitHideFields.slideDown();
billing_address_2_field.show();
kuwaitFields.find(':input').prop('required', false);
kuwaitFields.removeClass('validate-required');
}
}).change();
});
");
}
}
add_action('wp_enqueue_scripts', 'softoba_custom_checkout_fields_script');
function softoba_checkout_fields_label($fields) {
// Change the label for the billing address
$fields['billing']['billing_address_1']['label'] = __('Street Name / Number', 'astra');
return $fields;
}
add_filter('woocommerce_checkout_fields', 'softoba_checkout_fields_label', 999);
/**
* Remove company name field from checkout page
*/
function softoba_remove_company_field( $fields ) {
// Unset the company field from the billing section
if ( isset( $fields['billing']['billing_company'] ) ) {
unset( $fields['billing']['billing_company'] );
}
return $fields;
}
add_filter( 'woocommerce_checkout_fields', 'softoba_remove_company_field' );
add_filter('woocommerce_default_address_fields', 'custom_override_default_address_fields');
function custom_override_default_address_fields($address_fields) {
// Replace 'billing_address_1' with 'shipping_address_1' if you want to change the shipping address field
$address_fields['address_1']['placeholder'] = 'Street Number / Street Name';
$address_fields['address_1']['label'] = 'Street Number/Name';
return $address_fields;
}
add_filter( 'woocommerce_currency_symbol', 'softoba_change_uae_currency_symbol', 10, 2 );
function softoba_change_uae_currency_symbol( $currency_symbol, $currency ) {
switch ( $currency ) {
case 'KWD':
$currency_symbol = 'KWD';
break;
}
return $currency_symbol;
}
?>