반응형
Woocommerce Ajax가 프로그래밍 방식으로 카트에 추가
버튼은 다음과 같습니다.
<a href="http://my-site/checkout/" target="_blank" class="dt-sc-button">bla bla</a>
이 버튼은 홈백지에 있으며 페이지 작성기에 의해 생성됩니다.제가 원하는 것은 누군가가 버튼을 클릭하면 계산대로 가져가서 카트에 상품을 추가하는 것입니다.URL로 할 수 있다는 것은 알고 있습니다만, 이 버튼은 다른 작업(클라이언트 아이디어)도 할 필요가 있습니다.
그래서 지금 난 여기 갇혔어
JQuery
jQuery(document).ready(function($){
$(".remove-all").click(function(){
$.ajax({
url: "wp-admin/admin-ajax.php",
data: 'myajax'
});
});
});
PHP
add_action('wp_ajax_myajax', 'myajax');
add_action('wp_ajax_nopriv_myajax', 'myajax');
function myajax() {
global $woocommerce;
$product_id = 264;
$woocommerce->cart->add_to_cart($product_id);
die();
}
저는 javascript noob이기 때문에 올바른 방향을 알려주시거나 아니면 제가 뭘 잘못하고 있는지 힌트를 주세요.
잘 부탁드립니다!
코멘트에서도 언급했듯이, WooCommerce의 핵심 기능으로부터 많은 것을 빌릴 수 있습니다.
먼저, 다음 버튼을 추가하려고 합니다.
<a href="http://local.wordpress.dev/checkout/" class="button test-button">bla bla</a>
다음으로 커스텀 스크립트를 로드하여 admin ajax 및 checkout url과 같은 중요한 변수를 전달합니다.
add_action( 'wp_enqueue_scripts', 'so_load_script', 20 );
function so_load_script(){
wp_enqueue_script( 'so_test', plugins_url( 'js/test.js', __FILE__ ) );
$i18n = array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'checkout_url' => get_permalink( wc_get_page_id( 'checkout' ) ) );
wp_localize_script( 'so_test', 'SO_TEST_AJAX', $i18n );
}
이제 Ajax 콜백을 쓰겠습니다.이 콜백은 WooCommerce 코어에서 거의 글자 그대로 복사되어 몇 가지 변경만 하면 됩니다.
add_action('wp_ajax_myajax', 'myajax_callback');
add_action('wp_ajax_nopriv_myajax', 'myajax_callback');
/**
* AJAX add to cart.
*/
function myajax_callback() {
ob_start();
//$product_id = 264;
$product_id = 34;
$quantity = 1;
$passed_validation = apply_filters( 'woocommerce_add_to_cart_validation', true, $product_id, $quantity );
$product_status = get_post_status( $product_id );
if ( $passed_validation && WC()->cart->add_to_cart( $product_id, $quantity ) && 'publish' === $product_status ) {
do_action( 'woocommerce_ajax_added_to_cart', $product_id );
wc_add_to_cart_message( $product_id );
} else {
// If there was an error adding to the cart, redirect to the product page to show any errors
$data = array(
'error' => true,
'product_url' => apply_filters( 'woocommerce_cart_redirect_after_error', get_permalink( $product_id ), $product_id )
);
wp_send_json( $data );
}
die();
}
그리고 마지막으로 의 내용은test.js
:
jQuery(document).ready(function($){
$(".test-button").click(function(e){
e.preventDefault(); // Prevent the click from going to the link
$.ajax({
url: wc_add_to_cart_params.ajax_url,
method: 'post',
data: {
'action': 'myajax'
}
}).done( function (response) {
if( response.error != 'undefined' && response.error ){
//some kind of error processing or just redirect to link
// might be a good idea to link to the single product page in case JS is disabled
return true;
} else {
window.location.href = SO_TEST_AJAX.checkout_url;
}
});
});
});
링크를 클릭하는 디폴트액션을 취소 또는 방지하고 AJAX 콜이 종료되면 리다이렉트해야 합니다(이것은, 1개의 방법에 지나지 않습니다).
jQuery(document).ready(function($){
$(".remove-all").click(function(e){
e.preventDefault(); // Prevent the click from going to the link
var $redirect = $(this).attr('href');
$.ajax({
url: "wp-admin/admin-ajax.php",
data: 'myajax',
success: function () {
window.location.href = $redirect;
}
});
});
});
PHP
add_action('wp_ajax_myajax', 'myajax');
add_action('wp_ajax_nopriv_myajax', 'myajax');
function myajax() {
$product_id = 264;
// Avoid using the global $woocommerce object
WC()->cart->add_to_cart($product_id);
die();
}
언급URL : https://stackoverflow.com/questions/33656739/woocommerce-ajax-add-to-cart-programmatically
반응형
'sourcecode' 카테고리의 다른 글
Wordpress Docker가 업로드 제한을 늘리지 않음 (0) | 2023.02.07 |
---|---|
업로드된 이미지와 동일한 크기의 미리 보기를 생성하도록 Wordpress를 강제 (0) | 2023.02.07 |
태그 패널을 커스텀 투고 타입으로 표시 (0) | 2023.02.07 |
Wordpress(3.8) 관리 UI 스타일 CSS 클래스 (0) | 2023.02.07 |
Python: json.loads는 'u'가 붙은 항목을 반환합니다. (0) | 2023.02.07 |