register ajax calls hook

时间:2017-03-26 作者:shanebp

我在前端表单的插件中使用ajax。但只有当我把add_action("wp_ajax_..." 在插件加载程序中。我想在另一个文件中注册呼叫。

我尝试过:

function my_plugin_init() {

    if ( ! is_admin() ) {

        require( dirname( __FILE__ ) . \'/inc/my-plugin-functions.php\' );

    }

}
//add_action( \'wp_loaded\', \'my_plugin_init\' );
add_action( \'init\', \'my_plugin_init\' );
但两者都不是add_action 钩子似乎起作用了。Ajax失败,因为它在中找不到Ajax函数inc/my-plugin-functions.php.

如果我将ajax功能放在插件加载器中,一切都会正常工作:

function my_plugin_etc() {

    $title = sanitize_text_field( $_POST[\'title\'] );

    $meta = update_post_meta(1234, \'test_key\', $title);

    if ( $meta != false ) 
        echo json_encode(array(\'status\' => \'success\', \'message\' => \'Title added as postmeta.\') );
    else 
        echo json_encode(array(\'status\' => \'error\', \'message\' => \'There was a problem.\' ) );

    wp_die();    

}
add_action("wp_ajax_my_plugin_etc", "my_plugin_etc");
我不想把ajax函数放在插件加载器中。

为了注册文件中的ajax函数,应该使用什么样的钩子来包含文件?

2 个回复
最合适的回答,由SO网友:Paul \'Sparrow Hawk\' Biron 整理而成

在进行AJAX调用之前激发的任何操作都将起作用。一般来说,init 是个不错的选择。

您提到ajax调用是从“前端表单”发出的。如果最终用户可以使用该表格not 登录后,您需要使用:

add_action (\'wp_ajax_nopriv_my_plugin_etc\', \'my_plugin_etc\') ;
请参见wp_ajax_nopriv_{$_REQUEST[‘action’]}.

Edit

一定是我睡眠不足,因为我应该早点看到这一点。

is_admin() 退货false 在调用admin-ajax.php. 因此,请更改my_plugin_init() 将成为:

function my_plugin_init() {

    if ( ! is_admin() || wp_doing_ajax ()) {

        require( dirname( __FILE__ ) . \'/inc/my-plugin-functions.php\' );

    }

}
add_action( \'init\', \'my_plugin_init\' );
wp_doing_ajax() 在WP 4.7中引入。

如果您的插件在此之前需要在WP版本中工作,请将其更改为:

function my_plugin_init() {

    if ( ! is_admin() || (defined( \'DOING_AJAX\' ) && DOING_AJAX)) {

        require( dirname( __FILE__ ) . \'/inc/my-plugin-functions.php\' );

    }

}
add_action( \'init\', \'my_plugin_init\' );
的优点wp_doing_ajax() 在4.7之前的测试中(如果您只支持4.7以上),这适用于wp_doing_ajax 筛选到的值defined( \'DOING_AJAX\' ) && DOING_AJAX 这可以让您更好地控制是否要在ajax上下文中考虑自己。然而,这种额外的控制在您的情况下可能不是必需的。

最后,如果inc/my-plugin-functions.php only 包含与AJAX相关的代码,然后删除! is_admin() ||if 条件

SO网友:Sam

您是否已将脚本排队,然后在要使用ajax的文件中添加了wp\\u localize\\u脚本?

// your javascript with ajax calls must be enqueued before wp_localize_script.     
wp_enqueue_script( \'ajax-script\', plugins_url( \'file_location.js\', __FILE__ ), array(\'jquery\') );
            // Wordpress localize script
            wp_localize_script( \'ajax-script\', \'ajax_object\', array( \'ajax_url\' => admin_url( \'admin-ajax.php\' ), \'we_value\' => 1234 ) );

相关推荐

WordPress AJAX错误400向远程站点发送数据的错误请求

我正在使用发件人。net获取电子邮件订阅列表。这个网站给了我一些信息,可以将用户的电子邮件添加到订阅列表中。我想使用WordPress ajax来实现这一点。但它返回错误400错误请求。我的代码是:文件ajax新闻脚本。js公司: jQuery(document).ready(function($){ // Perform AJAX send news on form submit $(\'form#fnews\').on(\'submit\', funct