Using Ajax with a Class file

时间:2013-07-13 作者:Xtremefaith

目前,我有一个可以工作的ajax(我得到了一个成功的[200]响应),但在响应上的操作挂钩有问题。相反,JSON对象不会返回I\'m getting a 0.

我有模具();我回来后,所以我想问题是钩子不起作用。

我在类构造函数中尝试了多个方法,但我不确定这种方法是否正确,我以前使用过我制作的插件,但这是在theme.

表格。php(包括在functions.php中add_action(\'after_setup_theme\')

public function __construct(){
 // Test #1
 add_action( \'wp_ajax_nopriv_process_reservation\', array( &$this, \'process_reservation\' ) );

 // Test #2 
 add_action( \'wp_ajax_process_reservation\', &$this->process_reservation ); //with and without \'&\' before $this

 // Test #3 (this is incorrect)
 add_action( \'wp_ajax_nopriv_process_reservation\', $this->process_reservation );


//If I wrap this with **add_action(\'init\',function(){... *** then it does not load
 wp_enqueue_script(\'ajax_script\',THEME_MODULES_URL.\'/Reservations/form.js\',array(\'jquery\'),TRUE);
 wp_localize_script( \'ajax_script\', \'myAjax\', array(
      \'ajaxurl\'               => admin_url( \'admin-ajax.php\' ), //don\'t change this
      \'itemNonce\'             => wp_create_nonce("ajax_nonce"), //don\'t change this
  ));
}
为了以防万一,这里还测试了我的回调函数

private function process_reservation(){
    check_ajax_referer( \'process_reservation_nonce\', \'nonce\' );

    if( true )
        wp_send_json_success( \'ok\' );
    else
        wp_send_json_error( array( \'error\' => $custom_error ) );

}
XHR控制台中的表单数据显示传递的动作和名词

action:process_reservation
ajax_nonce:6f155a1e17
我已经做了足够多的Ajax,知道应该期待什么,所以我很确定这是一个挂钩的问题,也许是主题范围的问题,我不理解,无论怎样,社区的任何建议或帮助都会很好!提前感谢

3 个回复
最合适的回答,由SO网友:Xtremefaith 整理而成

问题是in my functions.php I was loading a filereservations.php)使用after_setup_theme

add_action(\'after_setup_theme\', \'init_cpts\');
然后在加载的文件中,我要求我的类文件init 钩我以为这样就可以了init 之后加载after_setup_theme, 看起来像这样“

function load_classes(){
    require_once( PATH_TO_FILE .\'/Class.php\');
}
add_action(\'init\',\'load_classes\');
@brasofilo-thread中提到的问题是,我在类文件中尝试过的任何操作钩子都不再有效,因为此时init 已触发。

为了解决这个问题,我简单地删除了如上所示的loaded\\u classes(),取而代之的是required_once 在文件本身内(已加载after_setup_theme). 然后,brasofilo的回答很有魅力,所以要确保他的回答是+1

SO网友:brasofilo

我在您的代码中发现的错误:

一个是helgatheviking指出的in a comment: Ajax回调必须是public 方法,而不是private.

不确定如何初始化此类,但是wp_enqueue_script&;_style (单数)必须封装在wp_enqueue_scripts 挂钩(WP\\u DEBUG转储通知)。

你可以放下& 从…起$this, 这就是PHP 4。下面是一个工作示例:

class MyTheme
{
    public function __construct()
    {
        add_action( \'wp_footer\', array( $this, \'aux_function\' ) );
        add_action( \'wp_enqueue_scripts\', array( $this, \'init_plugin\' ) );
        add_action( \'wp_ajax_process_reservation\', array( $this, \'process_reservation\' ) ); 
        add_action( \'wp_ajax_nopriv_process_reservation\', array( $this, \'process_reservation\' ) );
    }

    public function aux_function()
    {
        echo \'<h4><a href="#" id="wpse">TEST AJAX</a></h4>\';
    }

    public function init_plugin()
    {
        wp_enqueue_script( 
            \'ajax_script\', 
            plugins_url( \'/test.js\',__FILE__ ), 
            array(\'jquery\'), 
            TRUE 
        );
        wp_localize_script( 
            \'ajax_script\', 
            \'myAjax\', 
            array(
                \'url\'   => admin_url( \'admin-ajax.php\' ),
                \'nonce\' => wp_create_nonce( "process_reservation_nonce" ),
            )
        );
    }

    public function process_reservation()
    {
        check_ajax_referer( \'process_reservation_nonce\', \'nonce\' );

        if( true )
            wp_send_json_success( \'Ajax here!\' );
        else
            wp_send_json_error( array( \'error\' => $custom_error ) );
    }
}
new MyTheme();

test.js

jQuery(document).ready(function($) 
{
    $(\'#wpse\').click(function(e) 
    {
        e.preventDefault();
        var data = {
            action: \'process_reservation\',
            nonce: myAjax.nonce
        };

        $.post( myAjax.url, data, function( response ) 
        {
            $(\'#wpse\').html( response.data );
        });
    });
});

SO网友:Shahinul Islam

请检查您的ajax调用

如果使用,请确保输入数据类型:“json”


$.ajax({
  dataType: "json",
  url: url,
  data: data,
  success: success
});
或使用$.getJSON() 作用

希望这能解决问题。

结束

相关推荐

Looping through tabular data

我试图创建一个包含两个不同循环结果的信息的表。第一个循环遍历自定义帖子类型列表以显示团队名称。另一个是提供关于每个团队的数据,并存储为元数据。所以我想我需要某种方法来构造一个双查询,以便创建一个循环。这就是我目前的情况:$team = new WP_Query(array(\'post_type\' => \'team_page\') ); $args = array( \'post_type\' => \'match_report\',