Initial commit

This commit is contained in:
jacob.eva 2023-05-18 12:26:20 +01:00
commit cdb81a2853
No known key found for this signature in database
GPG Key ID: 0B92E083BBCCAA1E

159
les-variations-js-free.php Executable file
View File

@ -0,0 +1,159 @@
<?php
/**
* WooCommerce Variations Add to Cart JS-free
* Determines the variation ID for the user's chosen attributes on variable items server-side, so that users can shop without Javascript enabled.
* @author Jacob Eva, Liberated Embedded Systems, liberatedsystems.co.uk
* @version 1
*/
/*
Plugin Name: LES Variations Add-to-Cart JS-free
Plugin URI: https://git.liberatedsystems.co.uk
Description: This plugin determines the variation ID for a product from the server side, allowing users to shop without Javascript enabled. Inspiration taken from eggplant studios' variations add to cart plugin (www.eggplantstudios.ca).
Version: 1.0.0
Author: Jacob Eva
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
*/
/*
* Get variation ID function, uses an array of the attributes to construct an
* SQL query that can determine the correct variation ID to return, so that the
* product can be added to the user's cart
*/
function get_variation_id( $attributes, $product_id ) {
global $wpdb;
$select_from_sql = "
SELECT p.ID
FROM {$wpdb->prefix}posts as p
";
$join_sql = "
JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id
";
$where_sql = "
WHERE pm.meta_key = %s
AND pm.meta_value LIKE %s
";
$parent_sql = "
AND p.post_parent = %s
";
// add additional attributes to JOIN if there are more than 1
for ( $x = 2; $x < count( array_keys($attributes) ) + 1; $x++ ) {
$join_sql = $join_sql . "
JOIN {$wpdb->prefix}postmeta as pm{$x} ON p.ID = pm{$x}.post_id
";
}
// add additional attributes to AND section if there are more than 1
for ( $x = 2; $x < count( array_keys($attributes) ) + 1; $x++ ) {
$where_sql = $where_sql . "
AND pm{$x}.meta_key = %s
AND pm{$x}.meta_value LIKE %s
";
}
// merge attribute arrays into one for use in prepared statement
$parameters = array();
for ( $x = 0; $x < count ( array_keys($attributes) ); $x++ ) {
$parameters[] = array_keys($attributes)[$x];
$parameters[] = array_values($attributes)[$x];
}
$parameters[] = $product_id;
$sql = $select_from_sql . $join_sql . $where_sql . $parent_sql;
return $wpdb->get_var($wpdb->prepare($sql, $parameters));
}
add_filter( 'woocommerce_add_to_cart_handler', 'les_add_to_cart_handler');
/*
* Override function to change type of variable product, so custom function is
* called to handle it
*/
function les_add_to_cart_handler( $type ) {
if ( $type === "variable" || $type === "variation" ) {
return "les_variation";
}
else {
return $type;
}
}
add_action( 'woocommerce_add_to_cart_handler_les_variation', 'les_add_variation_to_cart', 10, 2 );
/*
* Add to cart function, created to allow shopping without JS
*/
function les_add_variation_to_cart() {
global $woocommerce;
$added_products = 0;
$product_id = (int) $_POST['product_id'];
$quantity = (int) $_POST['quantity'];
$product = wc_get_product( $product_id );
// do nothing if attributes were not sent
$attributes_valid = false;
// if the user has JS enabled and / or has already set the variation ID
// themselves
if ( ! empty( $_POST['variation_id'] ) ) {
$variation_id = $_POST['variation_id'];
}
else {
// create array with all attribute keys
$attributes = array();
$attr_exp = "/attribute.+/";
foreach (array_keys($_POST) as $field)
{
if ( preg_match($attr_exp, $field) ) {
$attributes[$field] = $_POST[$field];
}
}
// if there are attributes, process them to get the variation id
if ( ! empty( $attributes ) ) {
$variation_id = get_variation_id( $attributes, $product_id );
}
}
$passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity, $variation_id, $attributes );
if ( ! $passed_validation ) {
return false;
}
if( (int) $_POST['quantity'] > 0 ) {
// if no variation id was found for product
if ( empty( $variation_id ) ) {
/* translators: 1: product link, 2: product name */
wc_add_notice( sprintf( __( 'Please choose product options by visiting <a href="%1$s" title="%2$s">%2$s</a>.', 'woocommerce' ), esc_url( get_permalink( $product_id ) ), esc_html( $product->get_name() ) ), 'error' );
return false;
}
else {
$added_to_cart = $woocommerce->cart->add_to_cart(
$_POST['product_id'], // string $product_id
$_POST['quantity'], // string $quantity = 1
(int) $variation_id, // integer $variation_id = ''
false // no attributes
);
$added_products ++;
if ( $added_to_cart ) {
wp_safe_redirect( wc_get_cart_url() );
}
return $added_to_cart;
}
}
}