Javascript 使用admin-AJAX.php的AJAX请求

Javascript 使用admin-AJAX.php的AJAX请求,javascript,php,ajax,wordpress,extjs,Javascript,Php,Ajax,Wordpress,Extjs,我正在尝试在WordPress插件中执行AJAX请求。该请求是在嵌入文章的首页上使用自定义短代码发起的 我尝试将来自和的信息结合起来 然而,在测试该方法时出现了一些问题。。。没有调用AJAX查询挂钩 以下是如何调用mypage.php脚本来进行短代码交付: add_shortcode('testshortcode', 'TestShortCodeFunction'); function TestShortCodeFunction($attributes) { ob_start();

我正在尝试在WordPress插件中执行AJAX请求。该请求是在嵌入文章的首页上使用自定义短代码发起的

我尝试将来自和的信息结合起来

然而,在测试该方法时出现了一些问题。。。没有调用AJAX查询挂钩

以下是如何调用my
page.php
脚本来进行短代码交付:

add_shortcode('testshortcode', 'TestShortCodeFunction');

function TestShortCodeFunction($attributes)
{
   ob_start();
   include(__DIR__.'/page.php');
   return ob_get_clean();
}
这是我的压缩测试脚本
page.php

<?php

    add_action('wp_ajax_test', 'Test');
    add_action('wp_ajax_nopriv_test', 'Test');

    // do_action('wp_ajax_nopriv_test'); this calls Test()

    function Test()
    {
        echo 'Hallo';
        die();
    }
?>

<script type='text/javascript'>

    jQuery(document).ready(function() {

        console.log("JS query started");

        // The following does not call test()
        jQuery.ajax({
            type: "POST",
            url: "http://127.0.0.1/wordpress/wp-admin/admin-ajax.php?action=test",
            success: function(data) {
                console.log("Query returned: "+data);
            }
        });

    });

</script>
根据PHP调试器,永远不会调用
Test()
函数

根据网络监视器(
URL)执行
admin ajax.php
http://127.0.0.1/wordpress/wp-admin/admin-ajax.php?action=test
)但返回
0


根据php调试器调用Inside
admin ajax.php
do\u action('wp\u ajax\u test')

如果您能够让这些ajax操作钩子在 好了,我们应该最后使用PHP
ob.*
函数

这是一个标准实现。一个JavaScript文件将在短代码回调函数中排队,并在其中触发一个
document.ready
Ajax调用。使用
wp\u localize\u脚本将
admin ajax.php
URL传递给JS对象。查看代码注释以了解更多信息和每个WP功能的详细信息:

<?php
/**
 * Plugin Name: (SO) Simple Ajax Shortcode
 * Description: Fire an Ajax action when rendering a shortcode
 * Author:      brasofilo
 * Plugin URL:  https://stackoverflow.com/a/22585520/1287812
 */

add_shortcode( 'testshortcode', 'shortcode_so_22579460' );
add_action( 'wp_enqueue_scripts', 'enqueue_so_22579460' );
add_action( 'wp_ajax_Test_SO', 'Test_SO' );
add_action( 'wp_ajax_nopriv_Test_SO', 'Test_SO' );

/**
 * Enqueue our script inside the shortcode 
 */
function shortcode_so_22579460($attributes)
{
    wp_enqueue_script( 'my-script' );
    return '<h1>Check the broswer console.</h1>';
}

/**
 * Register and localize our script
 */
function enqueue_so_22579460() 
{
    wp_register_script( 
         'my-script',
         plugin_dir_url( __FILE__ ) . 'ajax.js',
         array( 'jquery' ) // enqueue jQuery as dependency
    );

    // We can pass any number of PHP data to the JS 'wp_ajax' object
    // Here, only the basics, Ajax URL and a security check 
    wp_localize_script( 
        'my-script', 
        'wp_ajax',
        array( 
              'ajaxurl'     => admin_url( 'admin-ajax.php' ),
              'ajaxnonce'   => wp_create_nonce( 'ajax_post_validation' ) 
         ) 
    );
}

/**
 * Ajax callback
 */
function Test_SO()
{
    // Security check
    check_ajax_referer( 'ajax_post_validation', 'security' );

    // Demonstrative boolean value to return
    $random = ( rand() % 2 != 0 );

    if( $random )
        wp_send_json_error( array( 'error' => 'Random is ODD' ) );
    else
        wp_send_json_success( 'Random is EVEN' );
}

下面是一个使用OOP和jQuery命令触发操作的示例。还有一个。

如果您能够让这些Ajax动作挂钩在一个内部工作,我会非常惊讶。
好了,我们应该最后使用PHP
ob.*
函数

这是一个标准实现。一个JavaScript文件将在短代码回调函数中排队,并在其中触发一个
document.ready
Ajax调用。使用
wp\u localize\u脚本将
admin ajax.php
URL传递给JS对象。查看代码注释以了解更多信息和每个WP功能的详细信息:

<?php
/**
 * Plugin Name: (SO) Simple Ajax Shortcode
 * Description: Fire an Ajax action when rendering a shortcode
 * Author:      brasofilo
 * Plugin URL:  https://stackoverflow.com/a/22585520/1287812
 */

add_shortcode( 'testshortcode', 'shortcode_so_22579460' );
add_action( 'wp_enqueue_scripts', 'enqueue_so_22579460' );
add_action( 'wp_ajax_Test_SO', 'Test_SO' );
add_action( 'wp_ajax_nopriv_Test_SO', 'Test_SO' );

/**
 * Enqueue our script inside the shortcode 
 */
function shortcode_so_22579460($attributes)
{
    wp_enqueue_script( 'my-script' );
    return '<h1>Check the broswer console.</h1>';
}

/**
 * Register and localize our script
 */
function enqueue_so_22579460() 
{
    wp_register_script( 
         'my-script',
         plugin_dir_url( __FILE__ ) . 'ajax.js',
         array( 'jquery' ) // enqueue jQuery as dependency
    );

    // We can pass any number of PHP data to the JS 'wp_ajax' object
    // Here, only the basics, Ajax URL and a security check 
    wp_localize_script( 
        'my-script', 
        'wp_ajax',
        array( 
              'ajaxurl'     => admin_url( 'admin-ajax.php' ),
              'ajaxnonce'   => wp_create_nonce( 'ajax_post_validation' ) 
         ) 
    );
}

/**
 * Ajax callback
 */
function Test_SO()
{
    // Security check
    check_ajax_referer( 'ajax_post_validation', 'security' );

    // Demonstrative boolean value to return
    $random = ( rand() % 2 != 0 );

    if( $random )
        wp_send_json_error( array( 'error' => 'Random is ODD' ) );
    else
        wp_send_json_success( 'Random is EVEN' );
}

下面是一个使用OOP和jQuery命令触发操作的示例。和一个。

你能编辑这个问题以包括你的js吗?请看我更新的问题。但是,我不确定这是否重要,因为我的PHP调试器捕捉到了正确的admin-ajax.PHP调用。这就是为什么我认为JS是好的。你知道Do_action()的内部结构吗?如果它在发布的代码行返回,这意味着什么?如果您只是转到/wp admin/admin ajax.php中的任何内容,它会工作吗?action=querydata?这并不总是正确的道路。看看core是如何做到的,或者使用wp_本地化_脚本的流行插件和主题。获取路径的正确php函数是admin_url('admin ajax.php')。顺便说一句,如果这是在admin部分,那么您也只有可用的ajaxurl。log()并查看它是否是相同的输出。结果是。如果我直接调用它,则与重新编写插件页面时发生的情况相同。。。调用admin-ajax.php,使用'querydata'调用do_action(),但不调用连接的回调。这让我发疯。我所有的钩子以前都工作过:-(将js放在一个单独的文件中,使用jQuery(document).ready(function(){});而不是ext内容,并将其正确地包含在wp_enqueue_脚本中,然后应该可以工作。我在基本wordpress安装上这样做,并且工作正常。我不熟悉extjs,所以我不确定它实际上如何处理文档准备情况。你能编辑问题以包含你的js吗?请参阅我更新的问题。但是我不确定这是否正确这很重要,因为我的PHP调试器捕捉到了正确的admin-ajax.PHP调用。这就是为什么我认为JS是正确的。您知道Do_action()的内部结构吗?如果它在发布的代码行返回,这意味着什么?如果你只是转到/wp admin/admin ajax.php中的任何内容,它会起作用吗?action=querydata?这并不总是正确的路径。看看core是如何实现的,或者使用wp_本地化_脚本的流行插件和主题。获取路径的正确php函数是admin_url('admin ajax.php')顺便说一句,如果这是在管理部分,你也只需要有一个可用的ajaxurl.console.log()并查看它是否是相同的输出。结果是。如果我直接调用它,则与重新编辑插件页面时发生的情况相同…调用admin-ajax.php,do_action()使用'querydata'调用,但未调用连接的回调。这让我抓狂。我以前使用的所有挂钩:-(将js放在单独的文件中,使用jQuery(document).ready(function(){});而不是ext内容,并将其正确地包含在wp_enqueue_脚本中,然后应该可以工作。我在基本wordpress安装上这样做,并且工作正常。我不熟悉extjs,所以我不确定它实际上如何处理文档准备。很好的代码示例!谢谢!还有有用的链接!除了使用OO应用程序外,我以上面的方式实现了它roach将代码添加到我的短代码类中。首先,好的方面是:所有JS内容现在都像一个符咒一样工作,包括单独的文件、本地化和排队。现在,坏的方面是:Test_SO()仍然没有被调用。它和以前一样:一切都按预期调用(包括admin ajax.php中的do_操作('wp_ajax_Test_SO')),但没有Test_SO()。最后它说“AJAX错误:无响应”。我没有任何线索。我应该在单独的答案中发布我的类吗?很高兴知道:)在检查代码之前,让我看看要点/PasteBin:AJAX在管理端运行。如果您将回调封装在
If(!is_admin()){}
,Ajax不起作用。我认为
add\u shortcode
在后端是无害的。而
wp\u enqueue\u脚本只在前端运行。我会将
$this->shortCodeHandler=new MyShortCodeHandler;
从任何
if/else
中移出。我知道,你正在尝试微管理它。太好了!我开始学习网络编程两周前。我以前从未使用过JS、PHP、JSON、AJAX、ExtJS、WP、jQuery、XAMPP或XDebug。如果没有你,我可能会迷失方向。感谢你的耐心!很棒的代码示例!谢谢!还有有用的链接!我用
jQuery(document).ready( function($) 
{
    var data = {
        action: 'Test_SO',
        security: wp_ajax.ajaxnonce
    };

    $.post( 
        wp_ajax.ajaxurl, 
        data,                   
        function( response )
        {
            // Errors
            if( !response.success )
            {
                // No data came back, maybe a security error
                if( !response.data )
                    console.log( 'AJAX ERROR: no response' );
                // Error from PHP
                else
                    console.log( 'Response Error: ' + response.data.error );
            }
            // Success
            else
                console.log( 'Response Success: ' + response.data );
        }
    ); 
});