javascript - 使用 admin-ajax.php 的 AJAX 请求

标签 javascript php ajax wordpress extjs

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

我尝试合并来自 the documentation 的信息和 this tutorial .

但是,在测试该方法时出现了问题...未调用 AJAX 查询 Hook 。

这就是我的 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=测试)但返回0

根据PHP调试器调用admin-ajax.php内部的do_action('wp_ajax_test')

最佳答案

如果您设法使这些 Ajax 操作 Hook 在 Output Buffer 内工作,我会感到非常惊讶。 .
AFAIK,我们应该只使用 PHP ob_* 函数作为最后的手段。

这是一个标准实现。 JavaScript 文件将在短代码回调函数中排队,并在其中触发 document.ready Ajax 调用。 admin-ajax.php URL 使用 wp_localize_script 传递给 JS 对象。检查代码注释以获取更多信息和 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 .

关于javascript - 使用 admin-ajax.php 的 AJAX 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22579460/

相关文章:

javascript - 如果在数据库中插入新行,我如何提醒用户

javascript - 从表单在同一页面内调用 JS 函数(AJAX)

javascript - TypeError : Meteor. user(...).services 未定义

javascript - 从 jQuery 选择器创建数组

php - 用户可以使用 php 中的 session 访问管理页面

PHP IDE--想用FTP同步本地存储

javascript - 使用ajax请求的结果作为变量

javascript - 在具有粗体的文本上应用样式

javascript - Jquery 错误放置 with required from group

php - 为什么在 android 中计算与在 php 中不同?