WP阿贾克斯在其他条件下不起作用


WP Ajax not working in else condition

我正在研究WordPress插件。在插件中有一个复选框,当用户选中复选框时,一个值将通过ajax保存在数据库中,当取消选中时,该值将通过ajax从数据库中删除。所以我创建了一个复选框并编写了一个 ajax 代码。

这是我的代码:

网页代码

<?php
    $cart_items = get_cart_contents();
    $cart_info = array();
    foreach ($cart_items as $_data) {
        $prod_id = $_data['id'];
        $cart_info[] = array(
             'prod_id' => $prod_id,
        );
    }
    $_cart_sr = serialize($cart_info);
   ?>
    <label class="label" for="purchase">
         <?php _e('Purchase', 'product'); ?>
         <input type="checkbox" id="purchase" />
    </label>
    <input type="hidden" class="cart_info" value='<?php echo $_cart_sr; ?>'>

这是我的Ajax和PHP代码:

add_action('wp_ajax_values_save', 'save_check_value');
add_action('wp_ajax_nopriv_values_save', 'save_check_value');
add_action('wp_ajax_values_delete', 'delete_check_value');
add_action('wp_ajax_nopriv_values_delete', 'delete_check_value');
add_action("wp_head", "edd_gift_email_ajax");
function edd_gift_email_ajax() {
    ?>
    <script type="text/javascript">
        jQuery(document).ready(function () {
            jQuery("#purchase").click(function () {
                if(jQuery(this).is(":checked")) {
                    var cart_info_save = jQuery('.cart_info').val();
                    var data_save = {
                        action: 'values_save',
                        cart_info_save: cart_info_save
                    }
                    jQuery.post('<?php echo admin_url('admin-ajax.php'); ?>', data_save, function (save_result) {
                        alert(save_result);
                    });
                } else {
                    var cart_info_delete = jQuery('.cart_info').val();
                    var data_delete = {
                        action: 'values_delete',
                        cart_info_delete: cart_info_delete
                    }
                    jQuery.post('<?php echo admin_url('admin-ajax.php'); ?>', data_delete, function (delete_result) {
                        alert(delete_result);
                    });
                }
            });
        });
    </script>
    <?php
}

这是我的保存和删除查询

function save_check_value() {
    global $wpdb;
    $info_save = stripcslashes($_REQUEST['cart_info_save']);
    $cart_info_un_sr_save = unserialize($info_save);
    foreach ($cart_info_un_sr_save as $user_gift_cart_save) {
        $prod_user_id_save = $user_cart_save['prod_id'];
        echo $prod_user_id_save . " _ Add This";
        //update_post_meta($prod_user_id_save, 'this_product', '1');
    }
}
function delete_check_value() {
    global $wpdb;
    $info_delete = stripcslashes($_REQUEST['cart_info_delete']);
    $cart_info_un_sr_delete = unserialize($info_delete);
    foreach ($cart_info_un_sr_delete as $user_cart_delete) {
        $prod_user_id_delete = $user_cart_delete['prod_id'];
        echo $prod_user_id_delete . " _ Delete This";
        //delete_post_meta($prod_user_id_delete, 'this_product', '1');
    }
}

因此,当我选中该复选框时,警报会168 _ Add This给我此值(这是我想要的),但是当我取消选中该复选框时,警报会0给我此值(我希望此值168 _ Delete This)。

我检查了每件事,但我感到困惑,为什么条件没有给我正确的价值。

任何建议。

不是直接的解决方案,但我忍不住认为有很多代码重复,可以稍微简化一下。

最初的javascript函数可能是这样的:

<script type="text/javascript">
    jQuery( document ).ready(function() {
        jQuery("#purchase").click( function() {
            var action=jQuery(this).is(":checked") ? 'save' : 'delete';
            var cart_info=jQuery('.cart_info').val();
            var data={
                action:'value_'+action,
                cart_info:cart_info
            };
            jQuery.post('<?php echo admin_url('admin-ajax.php'); ?>', data, function( result ) {
                    alert( result );
                });
            }
        });
    });
</script>

而不是两个共享几乎相同代码的不同函数,你可以做:

<?php
    function check_value() {
        global $wpdb;
        $info = stripcslashes( $_REQUEST['cart_info'] );
        $cart_info = unserialize( $info );
        /* To find the `action` analyse the following */
        exit( print_r( $cart_info ) );
        foreach( $cart_info as $gift ) {
            list( $junk, $action ) = explode( '_', $gift['action'] );
            $product = $gift['prod_id'];

            echo $product . " _ ".$action." this";
            switch( $action ){
                case 'save':
                    update_post_meta($product, 'this_product', '1');
                break;
                case 'delete':
                    delete_post_meta($product, 'this_product', '1');
                break;  
            }
        }
    }
?>

@RamRaider的答案很好,但是您仍然可以减少更多代码,并且可能它也适合您:)

这是jQuery:

<script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery("#purchase").click( function() {
            // Method variable will be using to define which 
            // function should trigger later in our PHP
            var cart_method = jQuery(this).is(":checked") ? 'save' : 'delete';
            var cart_info = jQuery('.cart_info').val();
            var data = {
                action: 'modify_cart',
                cart_method: cart_method,
                cart_info: cart_info
            };
            jQuery.post('<?php echo admin_url('admin-ajax.php'); ?>', data, function( result ) {
                    alert( result );
                });
            }
        });
    });
</script>

然后这是我们的PHP代码:

<?php
    function modify_cart_func() {
        global $wpdb;
        // Get method from our jQuery
        $method = $_POST['cart_method'];
        $info = stripcslashes( $_REQUEST['cart_info'] );
        $cart_info = unserialize( $info );
        foreach( $cart_info as $gift ) {
           // If method is save
           if ($method == 'save') {
               update_post_meta($gift['product_id'], 'this_product', 1);
           // If method is delete
           } else if ($method == 'delete') {
               delete_post_meta($gift['product_id'], 'this_product', 1);
           }
        }
    }
?>

最后是你的 ajax 调用:

<?php
add_action('wp_ajax_modify_cart', 'modify_cart_func');
add_action('wp_ajax_nopriv_modify_cart', 'modify_cart_func');
?>

希望这对你有意义;)

我不确定这是否会导致问题,但是如果您在未登录时调用 ajax,它会尝试使用操作调用 wp-ajax email_values_delete而不是values_delete我猜您正在尝试调用。当然,对于其他一些功能,您也可以执行该操作。

如果不是这种情况,请更改此内容

add_action('wp_ajax_nopriv_email_values_delete', 'delete_check_value');

对此

add_action('wp_ajax_nopriv_values_delete', 'delete_check_value');

您还应该在通过 wp-ajax 调用的每个 php 函数的末尾添加 wp_die()。

希望这有帮助。

编辑:

抱歉,它尝试调用values_delete但由于只定义了email_values_delete(对于未登录的用户),我猜 ajax 请求可能会返回类似 0 的内容。