如何使用jQuery和.get访问PHP回调文件中的WC()

时间:2015-12-05 16:37:09

标签: php jquery ajax wordpress woocommerce

我需要在php jquery WC()->set函数中设置.get。我需要在php文件中做什么才能访问WC()。现在它告诉我WC未定义。

这是在显示购物车的cart.php文件中,并显示了两个用于投放选项的单选按钮。

这是处理RB更改的脚本(我简化了以便在从php查询返回时执行重新加载的函数):

<script>
    jQuery(document).ready(function($){

        $("#myid").change(function(){            

            console.log("RB Changed!"); 
            passed_variable = "1";

            $.get('http://www.example.com/test.php',
            {pass_var: passed_variable}, 
            function(data, status) {
                console.log("returned");
                location.reload();                
                });
         });
    });
</script>

这是PHP查询:

<?php

global $woocommerce;
echo "START<BR>";
$temp = $_GET["pass_var"];


WC()->session->set('_delivery_loading', $temp);
 // or 
$woocommerce->session->set('_delivery_loading', $temp);

 echo "DONE[" . $temp . "]";

?>

1 个答案:

答案 0 :(得分:2)

为什么需要致电test.php?如果您使用wp_ajax_$action回调,则您将在WP框架内并加载WC()。这是一个从codex和jQuery .ajax()拼凑而成的例子。

将您从以下位置进行ajax调用的脚本排队:

function so_34107959_enqueue_script(){
    wp_enqueue_script( 'so_34107959_script', plugins_url( '/js/so_34107959.js' , __FILE__ ), '1.0b', array('wc-add-to-cart'), true );
}
add_action( 'wp_enqueue_scripts', 'so_34107959_enqueue_script' );

请注意wc-add-to-cart脚本是依赖项。我只是这样做,所以我们可以使用WooCommerce的本地化脚本变量。如果你需要在不使用add to cart脚本的地方使用它,那么你需要wp_localize_script()并自己传入admin ajax url。

您的脚本文件so_34107959.js

jQuery(document).ready(function($){

        $("#myid").change(function(){    

            var passed_var = "1";        

            $.ajax({
                url: wc_add_to_cart_params.ajax_url, // here's the ajax url from WooCommerce
                data: { action: "add_foobar", pass_var: passed_var } // the action must match up to wp_ajax_$action
            })
            .done(function( data ) {
                if ( console && console.log ) {
                    // should return either success or fail
                    console.log( data );
                }
            });

        });
    });

最后这段代码是你的ajax“action”的回调:

function so_34107959_ajax_add_foobar() {
    $temp = isset( $_REQUEST["pass_var"] ) ? $_REQUEST["pass_var"] : '';
    if( $test ){
        WC()->session->set('_delivery_loading', $temp);
        echo 'success';
    } else {
        echo 'fail';
    }
    die();
}
add_action( 'wp_ajax_add_foobar', 'so_34107959_ajax_add_foobar' );
add_action( 'wp_ajax_nopriv_add_foobar', 'so_34107959_ajax_add_foobar' );

未经测试,请注意拼写错误。

进一步说明:

PHP代码假定您正在编写插件。你可以作弊并把它放在你的主题functions.php中,但我认为主题应该保留用于演示,任何功能都应该在插件中。

Codex对wp_ajax_$action钩子有这样的解释:

  

此钩子允许您为自己的自定义AJAX请求创建自定义处理程序。 wp_ajax_钩子遵循格式“wp_ajax_ $ youraction”,其中$ youraction是你的AJAX请求的'action'属性。

这意味着,如果您将“操作”传递给.ajax()中的“数据”,则相同的操作最终将作为wp_ajax_$youraction回调的尾部。

在我的例子中,因此这里是.ajax()脚本的数据位:      data:{action:“add_foobar”,pass_var:passed_var}

动作是“add_foobar”。它可以是任何东西。

然后将该操作“add_foobar”附加到“wp_ajax_”的末尾,以便add_action()看起来像:

add_action( 'wp_ajax_add_foobar', 'so_34107959_ajax_add_foobar' );

这适用于admin /登录用户。 “nopriv”中的:

add_action( 'wp_ajax_add_foobar', 'so_34107959_ajax_add_foobar' );

表示非登录用户可以使用ajax挂钩。

最后,so_34107959_ajax_add_foobar()是处理ajax请求的服务器端函数。