Похоже, вам все еще нужно использовать основные функции и функции WooCommerce в вашем действии Ajax.Итак, в основном вы будете использовать отдельное действие, которое не учитывает другие действия, подключенные к wp_ajax_*
.Не уверен, что это сэкономит ваше время, но вы можете попробовать:
<?php
function simple_amz_link_ajax() {
?>
<script>
jQuery( document ).on( 'ready', function () {
jQuery.ajax( {
url: "<?php echo esc_url( home_url( '?amz=get_amz_btn' ) ); ?>",
type: 'POST',
data: {
postId: <?php echo absint( get_the_ID() ); ?>,
nonce: <?php echo wp_create_nonce( 'get_amz_btn' ); ?>,
},
dataType: 'html',
success: function( response ) {
jQuery( '#buy_amz_btn_wrap' ).html( response );
}
} );
} );
</script>
<!-- end Ajax call to get_simple_amz_button -->
<div id="buy_amz_btn_wrap">
<div class="spinner">
<div class="bounce1"></div>
<div class="bounce2"></div>
<div class="bounce3"></div>
</div>
</div>
<?php
}
add_action( 'wp_footer', 'simple_amz_link_ajax' );
function simple_amz_button() {
if ( check_ajax_referer( 'get_amz_btn', 'nonce', false ) && isset( $_GET['amz'] ) && 'get_amz_btn' === $_GET['amz'] ) {
// Variables Declaration.
$postId = filter_input( INPUT_POST, 'postId', FILTER_SANITIZE_NUMBER_INT );
$de_asin = get_post_meta( $postId, 'wccaf_de_asin', true );
$country_code = $_SERVER ['HTTP_CF_IPCOUNTRY'];
$not_avilable_country = '<div id="amz_not_avilable" class="amz_not_avilable">This product is not avilable in your country yet</div>';
// Get Amazon Button Title.
if ( 'de' === ICL_LANGUAGE_CODE ) {
$amz_btn_title = 'Kaufen auf Amazon';
$not_avilable_country = '<div id="amz_not_avilable" class="amz_not_avilable">Dieses Produkt ist in Ihrem Land noch nicht verfügbar</div>';
} elseif ( 'en' === ICL_LANGUAGE_CODE ) {
$amz_btn_title = 'Buy on Amazon';
$not_avilable_country = '<div id="amz_not_avilable" class="amz_not_avilable">This product is not avilable in your country yet</div>';
}
// Geolocation Condition.
if ( 'DE' === $country_code || 'AT' === $country_code || 'CH' === $country_code || 'LI' === $country_code || 'EG' === ) {
$associate_id = 'bonstato-21';
$access_key = 'HDUHWUIDIUWJDWDWDWD';
$secret_key = 'HDUIWQDUQWUDJUIQJWDJWQD';
$amazon_domain = 'amazon.de';
$asin = $de_asin;
}
// Get price from amazon
$amazon = new AmazonAPI( $associate_id , $access_key, $secret_key , $amazon_domain );
$item = $amazon->item_lookup( $asin )->get_item_data();
if ( 0 != $item->price && null != $item->price ) {
?>
<div class="amz_price_wrap_wrap" >Price: <?php echo $item->price; ?></div>
<?php
}
global $post;
$product = wc_get_product( $postId );
$type = $product->get_type();
if ( 'simple' === $type && 0 != $item->price && null != $item->price ) {
if ( wp_is_mobile() ) {
// Amazon Link For Mobile
?>
<div class="buy_amz_btn_wrap" >
<button type="button" id="buy_amz_btn" class="buy_amz_btn" onclick="window.location='https://<?php echo $amazon_domain ?>/dp/<?php echo $asin ?>/?tag=<?php echo $associate_id ?>';"><i class="fa fa-amazon fa-amz"></i><?php echo $amz_btn_title ?></button>
</div>
<?php
} else {
// Amazon Link For PC
?>
<div class="buy_amz_btn_wrap" >
<button type="button" id="buy_amz_btn" class="buy_amz_btn" onclick="window.location='https://<?php echo $amazon_domain ?>/gp/aws/cart/add.html?AssociateTag=<?php echo $associate_id ?>&ASIN.1=<?php echo $asin ?>&Quantity.1=1';"><i class="fa fa-amazon fa-amz"></i><?php echo $amz_btn_title ?></button>
</div>
<?php
}
} elseif( 'simple' === $type && 0 == $item->price ) {
echo $not_avilable_country;
}
if ( is_null( $item->price ) ) {
echo $not_avilable_country;
}
die();
}
}
add_action( 'template_redirect', 'simple_amz_button' );
Отказ от ответственности: Этот код не был проверен!
То, что вы делаете здесь, эточтобы настроить конечную точку, которая запускает требуемое действие для вашего Ajax, как и другую страницу, но вместо использования постоянной ссылки вы должны использовать пользовательский параметр запроса amz
(практически отдельный wp-ajax.php
).Вот почему мы используем хук template_redirect
, чтобы проверить, определен ли наш пользовательский параметр запроса и имеет ли оно значение, и если это так, прекратить рендеринг чего-либо еще, кроме нашего действия Ajax.
Я также добавил одноразовый номер, потому что вы всегда должны использовать защиту ;)