前端 AJAX 请求在 WordPress 中不起作用

问题描述 投票:0回答:1

我正在编写一个 WordPress 插件(使用官方文档中推荐的样板),我需要合并一个 AJAX 请求来填充 DataList。我遵循 WP 惯例,将 AJAX 请求发送到“admin-ajax.php”。

我的问题是,在“按照书本”完成所有操作后,我无法让它工作:服务器的响应始终为 0(默认值)。未触发处理请求的服务器端方法。我认为这根本就不是“上瘾”。我知道请求进入“admin-ajax”文件。

奇怪的是,当我将此方法挂接到“init”并在该函数中处理所有 AJAX 请求时,它工作得很好。所以,我很确定问题出在动态“wp_ajax_{$action}”和“wp_ajax_nopriv_{$action}”挂钩中。有什么想法吗?

提前致谢。

这是我的代码摘录:

PHP

<?php

private function define_public_hooks() {
    $plugin_public = new SR_Public($this->get_plugin_name(), $this->get_version());
    $this->loader->add_action('wp_enqueue_scripts', $plugin_public, 'enqueue_scripts');
    $this->loader->add_action('wp_ajax_sr_get_titles', $plugin_public, 'process_get_titles');
    $this->loader->add_action('wp_ajax_nopriv_sr_get_titles', $plugin_public, 'process_get_titles');
}

public function enqueue_scripts() {
    wp_enqueue_script(
        $this->plugin_name,
        PLUGIN_DIR_URL . 'public/js/sr-public.js',
        array('jquery'),
        $this->version
    );

    wp_localize_script(
        $this->plugin_name,
        'localizedData',
        array(
            'ajaxUrl' => admin_url('admin-ajax.php'),
            'nonce'   => wp_create_nonce('sr_get_titles'),
        )
    );
}

public function process_get_titles() {
    if ((!empty($_POST['action'])) && ($_POST['action'] === 'sr_get_titles')) {
        check_ajax_referer('sr_get_titles');

        // Load some data in $some_array...

        wp_send_json($some_array);
    }
}

JS

jQuery(document).ready(function($) {
    "use strict";

    var titleInput = $("#sr-title");
    var titleDataList = $("#sr-requested-titles");

    function ajaxRequest() {
        var userInput = titleInput.val();

        if (userInput.trim() !== "") {
            $.ajax({
                type: "POST",
                dataType: "json",
                url: localizedData.ajaxUrl,
                data: {_ajax_nonce: localizedData.nonce, action: "sr_get_titles", user_input: userInput},
                success: processSuccessResponse
            });
        }
    }

    function processSuccessResponse(data) {
        if (data) {
            titleDataList.empty();

            data.forEach(function(item) {
                titleDataList.append($("<option>").val(item));
            });
        }
    }

    titleInput.keyup(ajaxRequest);

});
php jquery ajax wordpress
1个回答
-1
投票

您可以发布您的问题的解决方案吗?为了让它发挥作用,你到底做了什么改变?请详细说明。我正在使用相同的样板......阅读你的最终评论后仍然一无所知。

© www.soinside.com 2019 - 2024. All rights reserved.