This website uses cookies to personalize your experience. By using this website you agree to our cookie policy.

Add to cart for a specific form

Home Forums Product Support Forums Ajax Search Pro for WordPress Support Add to cart for a specific form

Viewing 10 posts - 1 through 10 (of 10 total)
  • Author
    Posts
  • #52616
    samuelepellizzarisamuelepellizzari
    Participant

    Hi Ernest,

    I added the “Add to cart” button as per your instructions here: https://knowledgebase.ajaxsearchpro.com/miscellaneous/woocommerce/add-to-cart-button-for-vertical-and-horizontal-results

    Would it be possible to limit its appearance to a specific search form only?

    #52617
    Ernest MarcinkoErnest Marcinko
    Keymaster

    Hi,

    Yes, of course!

    All you have to do is modify the fist hook and function like so:

    add_filter('asp_results', 'asp_add_to_cart_data', 10, 2);
    function asp_add_to_cart_data($results, $search_id) {
    	// Apply add to cart only to search ID = 1
    	if ( $search_id != 1 ) {
    		return $results;
    	}
    
    	$product_add_to_cart_text   = 'Add to cart';
    	$variation_add_to_cart_text = 'Choose variation';   // Leave it empty to not display at all
    
    	if (class_exists("WooCommerce")) {
    		$_pf = new WC_Product_Factory();
    		foreach ($results as &$r) {
    			if (
    				$r->content_type == "pagepost" &&
    				in_array($r->post_type, array("product", "product_variation"))
    			) {
    				$product = $_pf->get_product($r->id);
    				$is_variable = $product->is_type( 'variable' ) || $r->post_type == 'product_variation';
    				$link = !$is_variable ? get_permalink(wc_get_page_id('shop')) : $product->get_permalink();
    				$ajax = !$is_variable ? ' ajax_add_to_cart' : '';
    				$text = !$is_variable ? $product_add_to_cart_text : $variation_add_to_cart_text;
    				if ( empty($text) )
    					continue;
    				ob_start();
    				?>
    				<div class="woocommerce">
    					<a href="<?php echo $link; ?>"
    					   data-quantity="1"
    					   class="button product_type_simple add_to_cart_button<?php echo $ajax; ?>"
    					   data-product_id="<?php echo $r->id; ?>" data-product_sku=""
    					   rel="nofollow"><?php echo $text; ?></a>
    				</div>
    				<?php
    				$button = ob_get_clean();
    				$r->content .= $button;
    			}
    		}
    	}
    	return $results;
    }

    This will apply the add to cart to search form with ID=1 only. You can change that on line 5 🙂

    #52627
    samuelepellizzarisamuelepellizzari
    Participant

    That’s fantastic!

    And what about including the quantity input? Is the following to be changed?

    
    				<div class="woocommerce">
    					<a href="<?php echo $link; ?>"
    					   data-quantity="1"
    					   class="button product_type_simple add_to_cart_button<?php echo $ajax; ?>"
    					   data-product_id="<?php echo $r->id; ?>" data-product_sku=""
    					   rel="nofollow"><?php echo $text; ?></a>
    				</div>

    Or also the script?

    `<script>
    jQuery(function(t){if(“undefined”==typeof wc_add_to_cart_params)return!1;var a=function(){t(“.asp_r”).on(“click”,”.add_to_cart_button”,this.onAddToCart).on(“click”,”.remove_from_cart_button”,this.onRemoveFromCart).on(“added_to_cart”,this.updateButton).on(“added_to_cart”,this.updateCartPage).on(“added_to_cart removed_from_cart”,this.updateFragments)};a.prototype.onAddToCart=function(a){var o=t(this);if(o.is(“.ajax_add_to_cart”)){if(!o.attr(“data-product_id”))return!0;a.preventDefault(),o.removeClass(“added”),o.addClass(“loading”);var r={};t.each(o.data(),function(t,a){r[t]=a}),t(document.body).trigger(“adding_to_cart”,[o,r]),t.post(wc_add_to_cart_params.wc_ajax_url.toString().replace(“%%endpoint%%”,”add_to_cart”),r,function(a){a&&(a.error&&a.product_url?window.location=a.product_url:”yes”!==wc_add_to_cart_params.cart_redirect_after_add?t(document.body).trigger(“added_to_cart”,[a.fragments,a.cart_hash,o]):window.location=wc_add_to_cart_params.cart_url)})}},a.prototype.onRemoveFromCart=function(a){var o=t(this),r=o.closest(“.woocommerce-mini-cart-item”);a.preventDefault(),r.block({message:null,overlayCSS:{opacity:.6}}),t.post(wc_add_to_cart_params.wc_ajax_url.toString().replace(“%%endpoint%%”,”remove_from_cart”),{cart_item_key:o.data(“cart_item_key”)},function(a){a&&a.fragments?t(document.body).trigger(“removed_from_cart”,[a.fragments,a.cart_hash,o]):window.location=o.attr(“href”)}).fail(function(){window.location=o.attr(“href”)})},a.prototype.updateButton=function(a,o,r,e){(e=void 0!==e&&e)&&(e.removeClass(“loading”),e.addClass(“added”),wc_add_to_cart_params.is_cart||0!==e.parent().find(“.added_to_cart”).length||e.after(‘ <a href=”‘+wc_add_to_cart_params.cart_url+'” class=”added_to_cart wc-forward” title=”‘+wc_add_to_cart_params.i18n_view_cart+'”>’+wc_add_to_cart_params.i18n_view_cart+”</a>”),t(document.body).trigger(“wc_cart_button_updated”,[e]))},a.prototype.updateCartPage=function(){var a=window.location.toString().replace(“add-to-cart”,”added-to-cart”);t(“.shop_table.cart”).load(a+” .shop_table.cart:eq(0) > *”,function(){t(“.shop_table.cart”).stop(!0).css(“opacity”,”1″).unblock(),t(document.body).trigger(“cart_page_refreshed”)}),t(“.cart_totals”).load(a+” .cart_totals:eq(0) > *”,function(){t(“.cart_totals”).stop(!0).css(“opacity”,”1″).unblock(),t(document.body).trigger(“cart_totals_refreshed”)})},a.prototype.updateFragments=function(a,o){o&&(t.each(o,function(a){t(a).addClass(“updating”).fadeTo(“400″,”0.6”).block({message:null,overlayCSS:{opacity:.6}})}),t.each(o,function(a,o){t(a).replaceWith(o),t(a).stop(!0).css(“opacity”,”1″).unblock()}),t(document.body).trigger(“wc_fragments_loaded”))},new a});
    </script>`

    (the code comes for your page, of course).

    Many thanks

    #52628
    Ernest MarcinkoErnest Marcinko
    Keymaster

    I remembered someone asked about quantity before and found this topic.

    Apparently it’s possible and it was working for him with this:

    <div class="woocommerce">
    	<div class="quantity">
    		<input type="number" step="1" min="1" max="" name="quantity" value="1" title="Quantity" class="input-text qty text" size="4" pattern="[0-9]*" inputmode="numeric">
    	</div>
    	<a href="<?php echo $link; ?>"
    	   class="button product_type_simple add_to_cart_button<?php echo $ajax; ?>"
    	   data-product_id="<?php echo $r->id; ?>" data-product_sku=""
    	   rel="nofollow"><?php echo $text; ?></a>
    </div>

    The script does not have to be changed.

    #52631
    samuelepellizzarisamuelepellizzari
    Participant

    It was still me…

    It just kind of works, in that it shows the input quantity form, however those quantities are not passed on to the cart: it’s always ‘1’ no matter the number entered in the form.

    #52632
    Ernest MarcinkoErnest Marcinko
    Keymaster

    Oh, it was you indeed, I didn’t even notice I’m so sorry.

    In that case, this must be adjusted from the script, maybe it’s possible with just a tiny bit of modification.

    I have made an issue request on this one. It’s basically almost there, so it needs a bit of work and testing, but I’m sure it’s only missing something tiny for the quantity to work. It’s going to be added in the upcoming release within 2 weeks.

    Until then, can you please try this modified script version:

    jQuery(function (t) {
    	if ("undefined" == typeof wc_add_to_cart_params) return !1;
    	var a = function () {
    		t(".asp_r")
    			.on("click", ".add_to_cart_button", this.onAddToCart)
    			.on("click", ".remove_from_cart_button", this.onRemoveFromCart)
    			.on("added_to_cart", this.updateButton)
    			.on("added_to_cart", this.updateCartPage)
    			.on("added_to_cart removed_from_cart", this.updateFragments);
    	};
    	(a.prototype.onAddToCart = function (a) {
    		var o = t(this);
    		if (o.is(".ajax_add_to_cart")) {
    			if (!o.attr("data-product_id")) return !0;
    			a.preventDefault(), o.removeClass("added"), o.addClass("loading");
    			var r = {};
    			r.quantity = parseInt( o.closest('.woocommerce').find('input[name=quantity]').val() || 1 );
    			t.each(o.data(), function (t, a) {
    				r[t] = a;
    			}),
    				t(document.body).trigger("adding_to_cart", [o, r]),
    				t.post(wc_add_to_cart_params.wc_ajax_url.toString().replace("%%endpoint%%", "add_to_cart"), r, function (a) {
    					a &&
    					(a.error && a.product_url
    						? (window.location = a.product_url)
    						: "yes" !== wc_add_to_cart_params.cart_redirect_after_add
    							? t(document.body).trigger("added_to_cart", [a.fragments, a.cart_hash, o])
    							: (window.location = wc_add_to_cart_params.cart_url));
    				});
    		}
    	}),
    		(a.prototype.onRemoveFromCart = function (a) {
    			var o = t(this),
    				r = o.closest(".woocommerce-mini-cart-item");
    			a.preventDefault(),
    				r.block({ message: null, overlayCSS: { opacity: 0.6 } }),
    				t
    					.post(wc_add_to_cart_params.wc_ajax_url.toString().replace("%%endpoint%%", "remove_from_cart"), { cart_item_key: o.data("cart_item_key") }, function (a) {
    						a && a.fragments ? t(document.body).trigger("removed_from_cart", [a.fragments, a.cart_hash, o]) : (window.location = o.attr("href"));
    					})
    					.fail(function () {
    						window.location = o.attr("href");
    					});
    		}),
    		(a.prototype.updateButton = function (a, o, r, e) {
    			(e = void 0 !== e && e) &&
    			(e.removeClass("loading"),
    				e.addClass("added"),
    			wc_add_to_cart_params.is_cart ||
    			0 !== e.parent().find(".added_to_cart").length ||
    			e.after(' <a href="' + wc_add_to_cart_params.cart_url + '" class="added_to_cart wc-forward" title="' + wc_add_to_cart_params.i18n_view_cart + '">' + wc_add_to_cart_params.i18n_view_cart + "</a>"),
    				t(document.body).trigger("wc_cart_button_updated", [e]));
    		}),
    		(a.prototype.updateCartPage = function () {
    			var a = window.location.toString().replace("add-to-cart", "added-to-cart");
    			t(".shop_table.cart").load(a + " .shop_table.cart:eq(0) > *", function () {
    				t(".shop_table.cart").stop(!0).css("opacity", "1").unblock(), t(document.body).trigger("cart_page_refreshed");
    			}),
    				t(".cart_totals").load(a + " .cart_totals:eq(0) > *", function () {
    					t(".cart_totals").stop(!0).css("opacity", "1").unblock(), t(document.body).trigger("cart_totals_refreshed");
    				});
    		}),
    		(a.prototype.updateFragments = function (a, o) {
    			o &&
    			(t.each(o, function (a) {
    				t(a)
    					.addClass("updating")
    					.fadeTo("400", "0.6")
    					.block({ message: null, overlayCSS: { opacity: 0.6 } });
    			}),
    				t.each(o, function (a, o) {
    					t(a).replaceWith(o), t(a).stop(!0).css("opacity", "1").unblock();
    				}),
    				t(document.body).trigger("wc_fragments_loaded"));
    		}),
    		new a();
    });
    
    #52718
    samuelepellizzarisamuelepellizzari
    Participant

    Hi Ernest,

    I have just tried your modified script version, to no avail: it always adds 1 item to the cart, regardless of the quantity entered.

    Am I missing anything?

    Here is the complete code:

    add_filter('asp_results', 'asp_add_to_cart_data', 10, 2);
    function asp_add_to_cart_data($results, $search_id) {
    	// Apply add to cart only to search ID = 2
    	if ( $search_id != 2 ) {
    		return $results;
    	}
    
    	$product_add_to_cart_text   = 'Add to cart';
    	$variation_add_to_cart_text = '';   // Leave it empty to not display at all
    
    	if (class_exists("WooCommerce")) {
    		$_pf = new WC_Product_Factory();
    		foreach ($results as &$r) {
    			if (
    				$r->content_type == "pagepost" &&
    				in_array($r->post_type, array("product", "product_variation"))
    			) {
    				$product = $_pf->get_product($r->id);
    				$is_variable = $product->is_type( 'variable' ) || $r->post_type == 'product_variation';
    				$link = !$is_variable ? get_permalink(wc_get_page_id('shop')) : $product->get_permalink();
    				$ajax = !$is_variable ? ' ajax_add_to_cart' : '';
    				$text = !$is_variable ? $product_add_to_cart_text : $variation_add_to_cart_text;
    				if ( empty($text) )
    					continue;
    				ob_start();
    				?>
    				<div class="woocommerce">
    					<div class="quantity">
    						<input type="number" step="1" min="1" max="" name="quantity" value="1" title="Quantity" class="input-text qty text" size="4" pattern="[0-9]*" inputmode="numeric">
    					</div>
    	<a href="<?php echo $link; ?>"
    	   class="button product_type_simple add_to_cart_button<?php echo $ajax; ?>"
    	   data-product_id="<?php echo $r->id; ?>" data-product_sku=""
    	   rel="nofollow"><?php echo $text; ?></a>
    </div>
    				<?php
    				$button = ob_get_clean();
    				$r->content .= $button;
    			}
    		}
    	}
    	return $results;
    }
    //script
    add_action('wp_footer', 'asp_add_to_cart_handler');
    function asp_add_to_cart_handler() {
        ?>
        <script>
    jQuery(function (t) {
    	if ("undefined" == typeof wc_add_to_cart_params) return !1;
    	var a = function () {
    		t(".asp_r")
    			.on("click", ".add_to_cart_button", this.onAddToCart)
    			.on("click", ".remove_from_cart_button", this.onRemoveFromCart)
    			.on("added_to_cart", this.updateButton)
    			.on("added_to_cart", this.updateCartPage)
    			.on("added_to_cart removed_from_cart", this.updateFragments);
    	};
    	(a.prototype.onAddToCart = function (a) {
    		var o = t(this);
    		if (o.is(".ajax_add_to_cart")) {
    			if (!o.attr("data-product_id")) return !0;
    			a.preventDefault(), o.removeClass("added"), o.addClass("loading");
    			var r = {};
    			r.quantity = parseInt( o.closest('.woocommerce').find('input[name=quantity]').val() || 1 );
    			t.each(o.data(), function (t, a) {
    				r[t] = a;
    			}),
    				t(document.body).trigger("adding_to_cart", [o, r]),
    				t.post(wc_add_to_cart_params.wc_ajax_url.toString().replace("%%endpoint%%", "add_to_cart"), r, function (a) {
    					a &&
    					(a.error && a.product_url
    						? (window.location = a.product_url)
    						: "yes" !== wc_add_to_cart_params.cart_redirect_after_add
    							? t(document.body).trigger("added_to_cart", [a.fragments, a.cart_hash, o])
    							: (window.location = wc_add_to_cart_params.cart_url));
    				});
    		}
    	}),
    		(a.prototype.onRemoveFromCart = function (a) {
    			var o = t(this),
    				r = o.closest(".woocommerce-mini-cart-item");
    			a.preventDefault(),
    				r.block({ message: null, overlayCSS: { opacity: 0.6 } }),
    				t
    					.post(wc_add_to_cart_params.wc_ajax_url.toString().replace("%%endpoint%%", "remove_from_cart"), { cart_item_key: o.data("cart_item_key") }, function (a) {
    						a && a.fragments ? t(document.body).trigger("removed_from_cart", [a.fragments, a.cart_hash, o]) : (window.location = o.attr("href"));
    					})
    					.fail(function () {
    						window.location = o.attr("href");
    					});
    		}),
    		(a.prototype.updateButton = function (a, o, r, e) {
    			(e = void 0 !== e && e) &&
    			(e.removeClass("loading"),
    				e.addClass("added"),
    			wc_add_to_cart_params.is_cart ||
    			0 !== e.parent().find(".added_to_cart").length ||
    			e.after(' <a href="' + wc_add_to_cart_params.cart_url + '" class="added_to_cart wc-forward" title="' + wc_add_to_cart_params.i18n_view_cart + '">' + wc_add_to_cart_params.i18n_view_cart + "</a>"),
    				t(document.body).trigger("wc_cart_button_updated", [e]));
    		}),
    		(a.prototype.updateCartPage = function () {
    			var a = window.location.toString().replace("add-to-cart", "added-to-cart");
    			t(".shop_table.cart").load(a + " .shop_table.cart:eq(0) > *", function () {
    				t(".shop_table.cart").stop(!0).css("opacity", "1").unblock(), t(document.body).trigger("cart_page_refreshed");
    			}),
    				t(".cart_totals").load(a + " .cart_totals:eq(0) > *", function () {
    					t(".cart_totals").stop(!0).css("opacity", "1").unblock(), t(document.body).trigger("cart_totals_refreshed");
    				});
    		}),
    		(a.prototype.updateFragments = function (a, o) {
    			o &&
    			(t.each(o, function (a) {
    				t(a)
    					.addClass("updating")
    					.fadeTo("400", "0.6")
    					.block({ message: null, overlayCSS: { opacity: 0.6 } });
    			}),
    				t.each(o, function (a, o) {
    					t(a).replaceWith(o), t(a).stop(!0).css("opacity", "1").unblock();
    				}),
    				t(document.body).trigger("wc_fragments_loaded"));
    		}),
    		new a();
    });
    		
        </script>
    
        <?php
    }
    #52719
    Ernest MarcinkoErnest Marcinko
    Keymaster

    No, that should do it, but I suspect there is probably more into it, but at this point I don’t exactly know what.

    Either way, this is going to be resolved very soon with the 4.27 release, as we are integrating an advanced field to the description field – so no custom code will be needed after that 🙂

    #52721
    samuelepellizzarisamuelepellizzari
    Participant

    That’s good news! So I am looking forward to the upcoming release!
    Do you have any ETA?

    Thanks again.

    #52723
    Ernest MarcinkoErnest Marcinko
    Keymaster

    Within 14 days for sure. Hoping to drop it sooner.

Viewing 10 posts - 1 through 10 (of 10 total)
  • You must be logged in to reply to this topic.