【问题标题】:AJAX request using admin-ajax.php使用 admin-ajax.php 的 AJAX 请求
【发布时间】:2014-04-30 01:00:54
【问题描述】:

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

我尝试合并来自the documentationthis tutorial 的信息。

但是,在测试该方法时出了点问题……没有调用 AJAX 查询挂钩。

这就是调用我的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>

控制台上的输出是:

JS query started
Query returned: 0 

根据 PHP 调试器,永远不会调用 Test() 函数。

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

admin-ajax.php里面do_action('wp_ajax_test')是根据PHP调试器调用的。

【问题讨论】:

  • 您可以编辑问题以包含您的 js 吗?
  • 查看我更新的问题。但是我不确定这是否重要,因为我的 PHP 调试器捕获了正确的 admin-ajax.php 调用。这就是为什么我认为JS没问题。你知道 do_action() 的内部结构吗?如果它在贴出的代码行返回是什么意思?
  • 如果你只是去看看 /wp-admin/admin-ajax.php?action=querydata 的任何内容,它是否有效?这并不总是正确的道路。看看 core 是怎么做的,或者用 wp_localize_script 看看流行的插件和主题。获取路径的正确 php 函数是 admin_url('admin-ajax.php') btw。如果这是在管理部分,你也只有 ajaxurl 可用。 console.log() 看看是不是一样的输出。
  • 结果是127.0.0.1/wordpress/wp-admin/admin-ajax.php?action=querydata。如果我直接调用它,则与重新加载插件页面时发生的情况相同...调用 admin-ajax.php,使用“querydata”调用 do_action(),但不调用连接的回调。这让我抓狂。我所有的钩子以前都工作过:-(
  • 把js放到一个单独的文件中,使用jQuery(document).ready(function() {});而不是 ext 的东西,并用 wp_enqueue_script 正确地包含它,那么应该可以工作。我在基本的 wordpress 安装上做到了这一点,它运行良好。我不熟悉 extjs,所以我不确定它实际上是如何处理文档准备的。

标签: javascript php ajax wordpress extjs


【解决方案1】:

如果你设法让这些 Ajax 动作挂钩在 Output Buffer 中工作,我会感到非常惊讶。
AFAIK,我们应该只使用 PHP ob_* 函数作为最后的手段。

这是一个标准实现。一个 JavaScript 文件将在短代码回调函数中排队,在其中我们触发一个 document.ready Ajax 调用。 admin-ajax.php URL 使用 wp_localize_script 传递给 JS 对象。查看代码 cmets 了解更多信息,the Codex 了解每个 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' );
}

以及与插件文件存储在同一文件夹中的 JavaScript 文件 (ajax.js):

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 );
        }
    ); 
});

这是一个similar answer of mine,使用 OOP 和 jQuery 命令来触发动作。还有一个article of interest

【讨论】:

  • 很棒的代码示例!谢谢!还有有用的链接!我按照上面的方式实现了它,除了我使用 OO 方法将代码添加到我的短代码类中。首先是好事:所有 JS 的东西现在都像一个魅力一样工作,包括单独的文件、本地化和入队。现在坏事:仍然没有调用 Test_SO()。和以前一样:一切都按预期调用(包括 do_action('wp_ajax_Test_SO'); 在 admin-ajax.php 中)但不是 Test_SO()。最后它说“AJAX 错误:无响应”。我没有任何线索。我应该在单独的答案中发布我的课程吗?
  • 很高兴知道 :) 让我看看 gist/pastebin
  • 在检查您的代码之前:Ajax 在管理端运行。如果将回调封装在if(!is_admin()) {} 中,Ajax 将无法工作。
  • 我认为add_shortcode 在后端是相当无害的。而wp_enqueue_scripts 仅在前端运行。我会将$this-&gt;shortCodeHandler = new MyShortCodeHandler; 从任何if/else 中移出。恕我直言,您正在尝试对此进行微观管理。
  • 太棒了!两周前我开始学习网络编程。我以前从未使用过 JS、PHP、JSON、AJAX、ExtJS、WP、jQuery、XAMPP 或 XDebug。如果没有你,我会迷失方向。感谢您的耐心等待!
猜你喜欢
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多