2016-01-27 15 views
0

我正在使用WordPress插件。在插件中有一個複選框,當用戶選中該複選框時,一個值將通過ajax保存在數據庫中,而未選中時該值將通過ajax從數據庫中刪除。所以我創建了一個複選框並寫了一個ajax代碼。WP 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)。

我檢查了每件事物,但我感到困惑,爲什麼其他條件不給我正確的價值。

有任何建議。

+1

是'delete_check_value'中的隨機'n'是故意的? – RamRaider

+0

對不起,我....我更新我的問題...現在檢查 – deemi

+0

'$ prod_user_id_delete'有價值,你回聲'$ edd_gift_prod_user_id_delete'? – Reigel

回答

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

。希望對你有意義;)

+0

thanx @omer其工作1000%完美....你救了我的一天:) – deemi

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

請問你能告訴我這是什麼「列表($ junk,$ action )= explode('_',$ gift ['action']);「因爲它給了我未定義的錯誤 – deemi

+0

在javascript函數中,您發送的參數之一是通過POST發送'action',所以這試圖將發佈的值(動作)分成兩個元素〜你只需要在下劃線之後用作php函數中的'$ action'。這可以通過簡單地發送操作爲'save'或'delete' – RamRaider

+0

抱歉...但是$ junk給了我一個未定義的錯誤 – deemi

0

我不知道這是否會導致問題,但如果你在未登錄時調用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_die();在您通過wp-ajax調用的每個php函數的末尾。

希望這會有所幫助。

編輯:

對不起,它試圖調用values_delete但由於只有email_values_delete(對於非登錄用戶)定義我猜Ajax請求可能會返回類似0

+0

檢查我更新的問題 – deemi

相關問題