【问题标题】:Ajax: Cannot read property 'type' of undefinedAjax:无法读取未定义的属性“类型”
【发布时间】:2018-09-05 15:14:27
【问题描述】:

谁能帮我解决这个问题? 我正在尝试以模态加载 WordPress 帖子(自定义帖子类型)标题/内容,但很难做到正确。我对 php 和 ajax 还很陌生,所以我从不同的教程中挑选了一些代码,并尝试将它们组合在一起。

所以首先我添加一个路径来本地化我的脚本:

wp_localize_script( 'darkam_global', 'openpost', array(
    'ajaxurl' => admin_url( 'admin-ajax.php' )
));

这是我的 php 函数的样子:

add_action( 'wp_ajax_nopriv_open_post', 'my_open_post' );
add_action( 'wp_ajax_open_post', 'my_open_post' );

function my_open_post() {
    $id = $_GET['id'];
    $post = get_post($id);

    if($post){
        wp_send_json(array('post_title' => $post->post_title, 'post_content' => $post->post_content));
    } else {
        wp_send_json(array('error' => '1'));
    }
    wp_die();
}

还有我的 jQuery:

( function( $ ) {
    var $modalTrigger = $('.js-modal-trigger');

    $modalTrigger.click( open_post_js );

    function open_post_js(id) {
        jQuery.ajax({
            url: openpost.ajaxurl,
            type: 'POST',
            data: {
                id: id,
                action: 'open_post'
            },
            success: function( result ) {
                alert( result['post_title'] );
            }
        })
    }
} )( jQuery );

当我触发模式时,我得到控制台错误:未捕获的类型错误:无法读取未定义的属性“类型”。警报结果也显示为“未定义”。

任何帮助将不胜感激:)

【问题讨论】:

  • console.log(result); 返回什么?
  • 永远不要将alert() 用于除简单类型(字符串/数字)之外的任何内容 - 始终使用console.log
  • 感谢您的提示! console.log 返回:{error: "1"}

标签: php jquery ajax wordpress


【解决方案1】:

你的 PHP 看起来不错,问题是你的 JavaScript 中的 id 没有分配任何值。

如果帖子 ID 是被点击元素上的数据属性,那么这应该可以工作(假设数据属性称为 data-id):

( function( $ ) {
var $modalTrigger = $('.js-modal-trigger');

$modalTrigger.click( open_post_js );

function open_post_js() {
    var id = $(this).data('id');
    jQuery.ajax({
        url: openpost.ajaxurl,
        type: 'POST',
        data: {
            id: id,
            action: 'open_post'
        },
        success: function( result ) {
            alert( result['post_title'] );
        }
    })
}
} )( jQuery );

【讨论】:

  • 啊,我没有看到freedomn-m在我之前给出了相同的答案
  • 您的帮助仍然非常感谢!感谢您的意见西蒙!
【解决方案2】:

在您的 php 中,您返回 {error:1} 的有效响应 - 但您没有在 jquery/ajax 中检查这一点。
所以它可能在 php.ini 中失败了。

在 php 中失败,因为您没有传递 id

在您的click 事件连线中,您有:

$modalTrigger.click(open_post_js)

所以点击和调用是一样的:

open_post_js();

但您的函数签名是:function open_post_js(id),所以它需要一个 id,例如:

open_post_js(1);

id 然后被“传递”给 php,但是因为它没有传递给 javascript,所以 php 没有得到它,所以会失败。


你如何解决这个问题?您需要将id 传递给open_post_js open_post_js 中检索id,例如:

function open_post_js() {
    var id=$(this).data("id");
    ...
}

然后

<div class='js-modal-trigger' data-id="1">...</div>

【讨论】:

  • 非常感谢@freedomn-m 的详细解释!我刚刚尝试了您的建议,即使我不再收到控制台错误,控制台日志仍然返回:{error: “1”} 这可能意味着它没有从我的 php 函数中获取帖子 ID。我该如何解决这个问题?
  • 检查你 发送 到 php.ini 的内容。看起来它仍然没有发送它(并确保你有一个匹配的 ID get_post
  • 实际上这不是我“发送”的内容,而是我应该从 php 中“获取”的内容,所以我将 ajax 类型更改为 GET,现在它就像魅力一样 :) 非常感谢你所有的帮助freen-m!非常感谢!
  • 我不知道php如何处理GETPOST的参数。 jquery 通常会在body 中为POST 发送数据,在GET 的url 中发送数据,所以也许这就是您读取POST 参数的方式。如果您实际上正在获取数据,那么最好还是使用 GET。
【解决方案3】:

你试试这个代码:

header("Access-Control-Allow-Origin: *");
    header( 'Content-Type: application/json;' );
if($post){
        wp_send_json(array('post_title' => $post->post_title, 'post_content' => $post->post_content));
    } else {
        wp_send_json(array('error' => '1'));
    }

        wp_die();

【讨论】:

  • 感谢李全的建议!我已经设法使它与接受的答案一起工作!
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 2023-03-07
  • 2021-11-20
  • 2021-06-05
  • 2019-06-03
  • 2017-02-08
  • 2021-01-15
相关资源
最近更新 更多