插件的AJAX调用的自定义PHP端点

时间:2016-07-27 作者:user3199063

我是第一次写插件,我有一个问题。

我在插件中使用AJAX。我的JavaScript文件位于文件夹中../wp-content/plugins/myplugin/js/ , 在其中,我试图调用一个PHP文件,它位于文件夹中../wp-content/plugins/myplugin/

jQuery.ajax({
    url: "/wp-content/plugins/myplugin/myfile.php?myparam=" + myparam,
    context: document.body
});
我的问题是:如何让这个URL引用独立于用户安装插件的位置工作。例如,当用户在http://localhost/subdir/, 参考不正确。我可以创建一个相对链接吗?

3 个回复
SO网友:Krzysztof Grabania

首先,您不应该调用自己的PHP文件。您应该使用admin-ajax 端点。Documentation

在管理方面,您可以使用ajaxurl获取AJAX调用的URL。在前端,您必须自己声明带有url的变量。这写在文档中:

Note: 与管理端不同,ajaxurl javascript全局不会自动为您定义,除非您安装了BuddyPress或其他依赖Ajax的插件。因此,与其依赖全局javascript变量,不如使用自己的属性ajaxurl声明一个javascript命名空间对象。您还可以使用wp\\u localize\\u script()使URL对脚本可用,并使用以下表达式生成URL:admin\\u URL(\'admin ajax.php\')

这应该可以解决问题:

add_action( \'wp_head\', \'front_ajaxurl\' );
function front_ajaxurl() {
    wp_register_script( \'admin_ajax_front\', plugin_dir_url(__FILE__) . \'script.js\' );
    $translation_array = array(
        \'ajaxurl\' => admin_url( \'admin-ajax.php\' )
    );
    wp_localize_script( \'admin_ajax_front\', \'front\', $translation_array );
    wp_enqueue_script( \'admin_ajax_font\', false, array(), false, true ); // last param set to true will enqueue script on footer
}
然后在JS文件中:

$.ajax({
    url: front.ajaxurl,
    ...
})

SO网友:Mzn

我是个初学者,但这对我有用

在函数中添加以下内容。php。请注意,“wp\\u ajax”是约定的前缀,“do\\u something”是我任意选择的动作名称:

add_action( \'wp_ajax_do_something\', \'do_something\' );

function do_something() {
    //really, go ahead, do something
    die("return something");
}
要从浏览器(客户端)进行ajax调用,我可以使用wp.ajax.settings.url. wp 全局变量在窗口对象上定义。

//do_something here must match above, you can add other params to this obj
var data = { action: \'do_something\' };
jQuery.post(wp.ajax.settings.url, data, function(response) {
    console.log(\'Result: \' + response);
});
我已经安装了WordPress 4.6.1(最新版本)和一些插件。我引用的这个引用错误地表示ajaxurl已经定义,但我的情况不是这样的:https://codex.wordpress.org/AJAX_in_Plugins

SO网友:gordie

我也面临同样的问题。

我想使用我自己的端点,而不是管理ajax端点,因为我已经重写了填充运行ajax操作所需的所有变量的规则。

因此,使用(如上所述in the codex)

jQuery(document).ready(function($) {
    var data = {
        \'action\': \'my_action\',
        \'whatever\': ajax_object.we_value      // We pass php values differently!
    };
    jQuery.post(ajax_object.ajax_url, data, function(response) {
        alert(\'Got this from the server: \' + response);
    });
});
以及

add_action( \'wp_ajax_my_action\', \'my_action\' );
add_action( \'wp_ajax_nopriv_my_action\', \'my_action\' );
只是让我的代码更复杂。

我最终做了这件事,似乎奏效了:

    jQuery.ajax({
        type: "post",
        url: MYCUSTOMENDPOINT?ajax_action,
        dataType: \'json\',
        ...
结合:

    add_action( \'init\', \'rewrite_rules\');
    add_filter( \'template_include\',\'handle_ajax_action\');

function rewrite_rules(){
    add_rewrite_tag(
        \'%ajax_action%\',
        \'([^&]+)\'
    );
}

function handle_ajax_action($template){

    $success = null;

    // since the "ajax" query variable does not require a value, we need to check for its existence
    if ( !$action = get_query_var( \'ajax_action\' ) ) return $template; //ajax action does not exists

    $result = array(
        \'input\' =>  $_REQUEST,
        \'message\'=> null,
        \'success\'=> null,
    );

    $success = ...

    if ( is_wp_error($success) ){
        $result[\'success\'] = false;
        $result[\'message\'] = $success->get_error_message();

    }else{
        $result[\'success\'] = $success;
    }

    header(\'Content-type: application/json\');
    send_nosniff_header();
    header(\'Cache-Control: no-cache\');
    header(\'Pragma: no-cache\');

    wp_send_json( $result );  

}

相关推荐

Select2 AJAX和WP查询返回全部,不筛选

所以我在这里有点困惑。我经常使用Select2/AJAX/WP\\u查询来搜索和检索默认的WP帖子类型和我自己的自定义帖子类型。在过去几年中,我构建的几乎每个站点都至少包含一个实现。但是,我目前正在一个网站上搜索自定义帖子类型的结果,它只是返回所有内容。没有发生过滤。这是一个计划工具,管理员正在为一年中的每个月制定一个计划(自定义帖子类型)。时间表的标题为“月-年”,即。\'January 2022\'.问题是,如果您搜索“一月”,例如,您将得到返回的每个存在的时间表。包括2022年2月、2021 6月等