WP Ajax无法在其他条件下工作

时间:2016-01-27 08:07:17

标签: php jquery ajax wordpress wordpress-plugin

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

这是我的代码:

  

HTML代码

<?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)。

我检查过每一件事,但我很困惑,为什么其他条件不能给我正确的价值。

任何建议。

3 个答案:

答案 0 :(得分:2)

不是直接解决方案,但我无法帮助您认为有很多重复的代码可能会有所简化。

最初的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;  
            }
        }
    }
?>

答案 1 :(得分:0)

我不确定这是否会导致问题,但如果您在未登录时调用ajax,则会尝试使用 email_values_delete 而不是 values_delete 来调用wp-ajax猜你试图打电话。当然,您也可以采取其他一些功能。

如果不是这样的话,请改变这个

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的内容。 / p>

答案 2 :(得分:0)

@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');
?>

希望对你有意义;)