简体   繁体   中英

WP Ajax not working in else condition

I am working on WordPress plugin. In plugin there is a check box, when a user checked the checkbox a value will be saved in database via ajax and when its unchecked the value will be deleted from database via ajax. So I create a checkbox and write an ajax code.

Here is my code:

HTML Code

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

Here is my Ajax and PHP Code:

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
}

And here is my save and delete query

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');
    }
}

So when I checked the check box the alert gives me this value 168 _ Add This (this is what I want) but when I unchecked the check box the alert gives me this value 0 (I want this value 168 _ Delete This ).

I checked every thing but I got confused that why else condition not give me the right value.

Any suggestions.

Not directly a solution but I can't help thinking there is quite a lot of duplication of code which could be somewhat simplified.

The initial javascript function could be like:

<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>

And rather than two distinct functions that share almost the same code you could do:

<?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;  
            }
        }
    }
?>

I am not sure if this causes the problem but if you are calling ajax when not logged in it tries to call wp-ajax with action email_values_delete not values_delete which i guess you are trying to call. Of course you might have that action as well for some other functionality.

If that is not the case change this

add_action('wp_ajax_nopriv_email_values_delete', 'delete_check_value');

To this

add_action('wp_ajax_nopriv_values_delete', 'delete_check_value');

You should also add wp_die(); in the end of each php function you are calling via wp-ajax.

Hope this helps.

Edit:

Sorry, it tries to call values_delete but since there is only email_values_delete (for non logged in users) defined I would guess ajax request might return something like 0.

The answer of @RamRaider is good but You can still reduce more code and might be it will work for you as well :)

Here's the 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>

And then here is our PHP code:

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

           }

        }
    }
?>

And finally your ajax call:

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

Hope that makes sense to you ;)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM