Home › Forums › Product Support Forums › Ajax Search Pro for WordPress Support › Add to cart for a specific form
- This topic has 9 replies, 2 voices, and was last updated 1 year, 4 months ago by
Ernest Marcinko.
-
AuthorPosts
-
January 24, 2025 at 8:04 am #52616
samuelepellizzari
ParticipantHi 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?
January 24, 2025 at 9:09 am #52617Ernest Marcinko
KeymasterHi,
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 🙂
January 24, 2025 at 1:15 pm #52627samuelepellizzari
ParticipantThat’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
January 24, 2025 at 1:22 pm #52628Ernest Marcinko
KeymasterI 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.
January 24, 2025 at 1:45 pm #52631samuelepellizzari
ParticipantIt 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.
January 24, 2025 at 1:59 pm #52632Ernest Marcinko
KeymasterOh, 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(); });February 3, 2025 at 9:23 am #52718samuelepellizzari
ParticipantHi 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 }February 3, 2025 at 9:41 am #52719Ernest Marcinko
KeymasterNo, 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 🙂
February 3, 2025 at 9:49 am #52721samuelepellizzari
ParticipantThat’s good news! So I am looking forward to the upcoming release!
Do you have any ETA?Thanks again.
February 3, 2025 at 9:50 am #52723Ernest Marcinko
KeymasterWithin 14 days for sure. Hoping to drop it sooner.
-
AuthorPosts
- You must be logged in to reply to this topic.