AJAX (admin_url('admin-ajax.php');?action=) Not Foun


AJAX (admin_url('admin-ajax.php');?action=) Not Found

对于我的AJAX选项卡,我有以下脚本:

<script>
    jQuery(document).ready(function() {
        jQuery('.royal_private_menu a').click(function(e) {
            e.preventDefault();
            var tab_id = jQuery('this').attr('id');
            jQuery.ajax({
                type: "GET",
                url: "wp-admin/admin-ajax.php",
                dataType: 'html',
                data: ({ action: 'my_tab_menu', id: tab_id}),
                success: function(data){
                    jQuery('#private_menu_'+tab_id).html(data);
                },
                error: function(data)
                {
                    alert("Error!");
                    return false;
                }
            });
        });
    });
</script>

我得到url: "wp-admin/admin-ajax.php"的以下错误,错误是example.com/wp-admin/admin-ajax.php?action=my_tab_menu 404 Not found

然后我把它改成下面,得到同样的错误:url: "admin_url('admin-ajax.php')"然后,example.com/admin_url('admin-ajax.php');?action=my_tab_menu 404 Not found .

发生了什么,我做错了什么?

感谢

编辑

这是我的文件:

所以我觉得我真的很接近Ajax工作,但我得到一个错误:

php:

<div class="royal_private_menu">
    <a href="#private_menu" id="items_id">Items</a>
    <a href="#private_menu_received_order_id" id="received_order_id">Received Order</a>
    <a href="#private_menu_my_orders_id" id="my_orders_id">My orders</a>
    <a href="#private_menu_points_id" id="points_id">Points</a>
    <a href="#private_menu_setting_id" id="setting_id">Setting</a>
</div>
<div id="private_menu"> <!--Default page -->
    <?php get_template_part('page-parts/03_private_items'); ?>
</div>
<div id="private_menu_received_order_id"> </div>
<div id="private_menu_my_orders_id"> </div>
<div id="private_menu_points_id"> </div>
<div id="private_menu_setting_id"> </div>
<script>
    jQuery(document).ready(function() {
        jQuery('.royal_private_menu a').click(function(e) {
            e.preventDefault();
            var tab_id = jQuery('this').attr('id');
            jQuery.ajax({
                type: "GET",
                url: "<?php echo admin_url('admin-ajax.php'); ?>",
                dataType: 'html',
                data: ({ action: 'my_tab_menu', id: tab_id}),
                success: function(data){
                    jQuery('#private_menu_'+tab_id).html(data);
                },
                error: function(data)
                {
                    alert("Error!");
                    return false;
                }
            });
        });
    });
</script>

在function。php中:

function my_tab_menu() {
    $template_part_path = 'page-parts/03_private_' . $_GET['id'];
    get_template_part($template_part_path);
}
add_action('wp_ajax_my_tab_menu', 'my_tab_menu');
add_action('wp_ajax_nopriv_my_tab_menu', 'my_tab_menu');

下面是我的文件名:

03_private_items.php
03_private_my_orders.php
03_private_points_id.php
03_private_received_order_id.php
03_private_setting_id.php

编辑2

我把success改为alert("Success!");,我得到了Success警报。所以一切都在工作,除了它不从其他php文件获取任何数据。我错过了什么?

编辑3

对于console.log(data);,这是我在控制台中看到的脚本:
    jQuery(document).ready(function() {
    jQuery('.royal_private_menu a').click(function(e) {
        e.preventDefault();
        var tab_id = jQuery('this').attr('id'); 

        jQuery.ajax({
            type: "GET",
            url: "http://example.com/wp-admin/admin-ajax.php", 
            dataType: 'html',
            data: ({ action: 'royal_private_tab', id: tab_id}),
            success: function(data){
                  jQuery('#private_menu_'+tab_id).html(data);
                  console.log(data);
        },
        error: function(data)  
        {  
        alert("Error!");
        return false;
        }  
        }); 
 }); 
 });

然后我将其更改为以下并得到相同的错误:url: "admin_url('admin-ajax.php')"然后,example.com/admin_url('admin-ajax.php');?action=my_tab_menu 404 Not found.

如果URL包含文字字符串admin_url('admin-ajax.php');,那么这意味着你的PHP没有被解析。

试题:

url: "<?php echo admin_url('admin-ajax.php'); ?>",

您也可以使用wp_localize_script设置ajax URL,当您进入一个脚本:

wp_enqueue_script( 'ajax-script', plugins_url( '/js/my_query.js', __FILE__ ), array('jquery') );
// in JavaScript, object properties are accessed as ajax_object.ajax_url, ajax_object.we_value
wp_localize_script( 'ajax-script', 'ajax_object',
        array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'we_value' => 1234 ) );

https://codex.wordpress.org/AJAX_in_Plugins Separate_Javascript_File

在这种情况下,你可以这样设置URL:

url: ajax_object.ajax_url,

这样做的好处是,你不必内联你的javascript;你可以像往常一样把JS文件排队。

从注释中:

因此,当我访问example.com/wp-admin/admin-ajax.php时,我在空白页上得到"0"。这正是ajax选项卡页上的控制台中显示的内容。这正常吗?

得到0的结果意味着你的钩子没有附加到动作上,或者你的钩子没有产生输出并且无法退出。

在你的JS中,你像这样设置你的动作:

action: 'royal_private_tab'

在PHP中像这样声明钩子:

add_action('wp_ajax_my_tab_menu', 'my_tab_menu');
add_action('wp_ajax_nopriv_my_tab_menu', 'my_tab_menu');

您需要在两个地方使用royal_private_tabmy_tab_menu,例如:

add_action('wp_ajax_royal_private_tab', 'my_tab_menu');
add_action('wp_ajax_nopriv_royal_private_tab', 'my_tab_menu');

同时,你应该在钩子的末尾加上exit:

function my_tab_menu() {
    $template_part_path = 'page-parts/03_private_' . $_GET['id'];
    get_template_part($template_part_path);
    exit;
}